Каталог решений - Как сообщить пользователю, кто именно заблокировал необходимый для него документ.

Как сообщить пользователю, кто именно заблокировал необходимый для него документ.

Как сообщить пользователю, кто именно заблокировал необходимый для него документ.

В наличии

Идея о том, что простого сообщения, что открываемый документ уже заблокирован кем-то другим, недостаточно, родилась из простого осознания того, что организация большая, и люди, которые могут работать над одним и тем же документом, будут сидеть не то, что в не одном кабинете, а вообще в разных зданиях и могут даже не подозревать друг о друге…

Категория:

Описание

Вполне возможно, что я изобретал велосипед, и решение данной задачи уже было придумано кем-то до меня и проще, но… я такого не нашел, хотя признаюсь: дальше первой страницы Google не заглядывал. Итак… Есть, конечно, еще вариант создавать регистр сведений, где будет храниться информация о блокировках, но я решил не создавать подобного, а пойти через журнал регистрации 1С.

В обработчик формы ПриОткрытии() поместим следующий код

Если ЭтоНовый() тогда

//обработчик для нового элементы

Иначе

  Попытка

   Заблокировать();
   ЭтотОбъект.Записать();   

  Исключение

   Блокировщик = ОпределитьАвтораБлокировки();

   Ответ = Вопрос(«Документ находится на редактировании другим пользователем»
       + ?(Блокировщик.Пустая(), «.» + Символы.ПС, «:» + Символы.ПС + Блокировщик.Наименование + «, тел. » + Блокировщик.Телефон)
       + Символы.ПС + «Открыть в режиме чтения?», РежимДиалогаВопрос.ДаНетОтмена);

   Если Ответ = КодВозвратаДиалога.Да тогда

    ТолькоПросмотр = Истина;

   ИначеЕсли Ответ = КодВозвратаДиалога.Нет тогда

    ЭтаФорма.Закрыть();

   ИначеЕсли Ответ = КодВозвратаДиалога.Отмена тогда

    ПриОткрытии();

   КонецЕсли;

  КонецПопытки;

 КонецЕсли; 

Также в модуле формы помещаем такую функцию

Функция ОпределитьАвтораБлокировки()

 ЖурналРегистрации = Новый ТаблицаЗначений;
 Фильтр = Новый Структура;
 Фильтр.Вставить(«Данные», Ссылка);
 ВыгрузитьЖурналРегистрации(ЖурналРегистрации, Фильтр, «Пользователь»,,1);
 ПолноеИмяПользователя = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ЖурналРегистрации[0].Пользователь).ПолноеИмя;
 Возврат Справочники.Пользователи.НайтиПоНаименованию(ПолноеИмяПользователя, Истина);

КонецФункции

 

Для работы в таком виде без изменений, у Вас в конфигурации должен быть справочник пользователи, куда в реквизит Наименование будет писаться полное имя ползователя ИБ и добавить реквизит Телефон в тотже справочник, тогда пользователю будет отображаться ФИО заблокировавшего и телефон по которому он может перезвонить.

Теперь, собственно о работе данного кода.

При открытии не нового документа, пользователь тут же пытается заблокировать объект. Если у него это не получается, то начинается поиск заблокировавшего объект. Если же получается, то документ тут же записывается. Важно это делать до каких-либо изменений в объекте, чтобы пользователю не выскакивало никаких сообщений, типа «Вы уверены, что хотите сохранить изменения» и не ставили его этим в тупик. Записывается объект для того, чтобы осталась запись в журнале регистрации, потому что сам факт открытия формы в нем не отображается.

Теперь, если документ заблокировать не получилось, то происходит определение автора блокировки соответствующей процедурой. По фильтру на текущие данные мы выгружаем последнюю запись с пользователем (отбор по журналу в таком случае происходит быстро даже на машине пользователя) — из журнала регистрации выгружается УИД, после чего по полному имени пользователя ИБ находим соответствие в справочники пользователи и сообщаем его имя и телефон страждущему доступа к документу.

Вопрос подразумевает три ответа: «Нет» — закрытие формы, «Да» — открытие в режиме чтение, «Отмена» — с тем чтобы пройти процедуру в надежде, что блокировка снята. Или позвонить уже использующему объект и попросить его закрыть и по кнопке «Отмена» открыть его уже в режиме для изменения. К сожалению, стандартные диалоги в 1С не подразумевают варианта «ДаНетПовторить»…

has been added to your cart:
Оформление заказа