Как сообщить пользователю, кто именно заблокировал необходимый для него документ.
Идея о том, что простого сообщения, что открываемый документ уже заблокирован кем-то другим, недостаточно, родилась из простого осознания того, что организация большая, и люди, которые могут работать над одним и тем же документом, будут сидеть не то, что в не одном кабинете, а вообще в разных зданиях и могут даже не подозревать друг о друге…
- Описание
- Подробнее
Описание
Вполне возможно, что я изобретал велосипед, и решение данной задачи уже было придумано кем-то до меня и проще, но… я такого не нашел, хотя признаюсь: дальше первой страницы Google не заглядывал. Итак… Есть, конечно, еще вариант создавать регистр сведений, где будет храниться информация о блокировках, но я решил не создавать подобного, а пойти через журнал регистрации 1С.
В обработчик формы ПриОткрытии() поместим следующий код
Если ЭтоНовый() тогда
//обработчик для нового элементы
Иначе
Попытка
Заблокировать();
ЭтотОбъект.Записать();
Исключение
Блокировщик = ОпределитьАвтораБлокировки();
Ответ = Вопрос(«Документ находится на редактировании другим пользователем»
+ ?(Блокировщик.Пустая(), «.» + Символы.ПС, «:» + Символы.ПС + Блокировщик.Наименование + «, тел. » + Блокировщик.Телефон)
+ Символы.ПС + «Открыть в режиме чтения?», РежимДиалогаВопрос.ДаНетОтмена);
Если Ответ = КодВозвратаДиалога.Да тогда
ТолькоПросмотр = Истина;
ИначеЕсли Ответ = КодВозвратаДиалога.Нет тогда
ЭтаФорма.Закрыть();
ИначеЕсли Ответ = КодВозвратаДиалога.Отмена тогда
ПриОткрытии();
КонецЕсли;
КонецПопытки;
КонецЕсли;
Также в модуле формы помещаем такую функцию
Функция ОпределитьАвтораБлокировки()
ЖурналРегистрации = Новый ТаблицаЗначений;
Фильтр = Новый Структура;
Фильтр.Вставить(«Данные», Ссылка);
ВыгрузитьЖурналРегистрации(ЖурналРегистрации, Фильтр, «Пользователь»,,1);
ПолноеИмяПользователя = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ЖурналРегистрации[0].Пользователь).ПолноеИмя;
Возврат Справочники.Пользователи.НайтиПоНаименованию(ПолноеИмяПользователя, Истина);
КонецФункции
Для работы в таком виде без изменений, у Вас в конфигурации должен быть справочник пользователи, куда в реквизит Наименование будет писаться полное имя ползователя ИБ и добавить реквизит Телефон в тотже справочник, тогда пользователю будет отображаться ФИО заблокировавшего и телефон по которому он может перезвонить.
Теперь, собственно о работе данного кода.
При открытии не нового документа, пользователь тут же пытается заблокировать объект. Если у него это не получается, то начинается поиск заблокировавшего объект. Если же получается, то документ тут же записывается. Важно это делать до каких-либо изменений в объекте, чтобы пользователю не выскакивало никаких сообщений, типа «Вы уверены, что хотите сохранить изменения» и не ставили его этим в тупик. Записывается объект для того, чтобы осталась запись в журнале регистрации, потому что сам факт открытия формы в нем не отображается.
Теперь, если документ заблокировать не получилось, то происходит определение автора блокировки соответствующей процедурой. По фильтру на текущие данные мы выгружаем последнюю запись с пользователем (отбор по журналу в таком случае происходит быстро даже на машине пользователя) — из журнала регистрации выгружается УИД, после чего по полному имени пользователя ИБ находим соответствие в справочники пользователи и сообщаем его имя и телефон страждущему доступа к документу.
Вопрос подразумевает три ответа: «Нет» — закрытие формы, «Да» — открытие в режиме чтение, «Отмена» — с тем чтобы пройти процедуру в надежде, что блокировка снята. Или позвонить уже использующему объект и попросить его закрыть и по кнопке «Отмена» открыть его уже в режиме для изменения. К сожалению, стандартные диалоги в 1С не подразумевают варианта «ДаНетПовторить»…
