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