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