Как выполнить одну и ту же функцию при открытии всех документов в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке и сопровождении конфигураций часто возникает задача централизованного выполнения проверок при открытии документов — например, контроля даты запрета редактирования. Если период закрыт, пользователю не следует давать возможность редактировать реквизиты и табличные части, чтобы исключить ситуацию, когда после длительного заполнения формы документ невозможно провести из-за блокировки периода.

Рассмотрим особенности работы платформы «1С:Предприятие» в режиме обычных форм, проанализируем ограничения механизма подписок на события и разберем возможные способы реализации универсальной проверки.

Ограничения платформы на обычных формах

В платформе «1С:Предприятие» механизм подписок на события ориентирован на серверные события данных и менеджеров объектов (такие как ПередЗаписью, ПриЗаписи, ОбработкаПроведения). Глобальных клиентских событий на открытие или закрытие интерактивных окон платформы не предусмотрено, поэтому создать подписку на событие ПриОткрытии невозможно.

Кроме того, в обычном приложении (толстый клиент) механизм расширений конфигурации не позволяет перехватывать обработчики событий форм директивами &Вместо, &Перед или &После, как это реализовано для управляемых форм. Выясним, какие альтернативные подходы существуют для решения данной задачи.

Вариант 1. Использование подписки на событие ОбработкаПолученияФормы

Если требуется запретить редактирование существующих документов без ручной модификации сотен форм, можно использовать подписку на событие менеджера ОбработкаПолученияФормы. Разберем по шагам, как устроен этот механизм:

  1. Создаем подписку на событие для всех необходимых типов документов с источником ДокументМенеджер.*.
  2. Выбираем событие ОбработкаПолученияФормы.
  3. В обработчике подписки проверяем параметры открытия. Если документ уже записан в информационной базе, получаем форму программно, анализируем дату документа на попадание в закрытый период и устанавливаем режим просмотра.

Посмотрим на пример реализации процедуры в общем модуле:


Процедура ДокументыОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт

    Если ВидФормы = "ФормаДокумента" И Параметры.Свойство("Ключ") И ЗначениеЗаполнено(Параметры.Ключ) Тогда
        
        ДокументСсылка = Параметры.Ключ;
        
        Если РаботаСДиапазонами.ПериодЗапрещен(ДокументСсылка.Дата) Тогда
            СтандартнаяОбработка = Ложь;
            Форма = ДокументСсылка.ПолучитьФорму();
            Форма.ТолькоПросмотр = Истина;
            ВыбраннаяФорма = Форма;
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Важный нюанс: Установка свойства ТолькоПросмотр = Истина автоматически блокирует все элементы управления, включая командные кнопки проведения и сохранения, без необходимости вручную скрывать кнопки на форме. Однако данный метод применим только к уже созданным и записанным документам, у которых известна точная дата.

Вариант 2. Использование сквозных процедур типовых конфигураций

Если база данных создана на основе типовой конфигурации (или содержит фрагменты типовой архитектуры), во многих формах документов уже присутствуют стандартные вызовы процедур общего назначения при инициализации.

Проанализируем модули существующих форм: если в процедуре ПриОткрытии вызываются методы общих модулей (например, модуля управления доступностью или интерфейсом), достаточно добавить проверку даты запрета непосредственно в тело соответствующей общей процедуры. В этом случае изменения затронут только один общий модуль.

Вариант 3. Автоматизированное пакетное внедрение вызова в исходный код

Если конфигурация сильно доработана или является самописной, и вызовы общих модулей в формах отсутствуют, внедрение строки кода вручную во все формы документов может быть трудоемким. Для ускорения процесса можно применить пакетную обработку исходных файлов конфигурации:

  1. Выгружаем конфигурацию в файлы исходного кода через меню конфигуратора.
  2. С помощью внешнего скрипта или регулярных выражений выполняем поиск файлов описания модулей форм документов.
  3. Автоматически добавляем вызов централизованной процедуры общего модуля в обработчик ПриОткрытии (или создаем такой обработчик, если он отсутствует).
  4. Загружаем обновленные исходные файлы обратно в конфигурацию и выполняем проверку синтаксиса.

Таким образом, сочетание серверной проверки в подписке ПередЗаписью для контроля целостности данных и блокировки формы через ТолькоПросмотр при получении или открытии формы обеспечивает надежную защиту закрытого периода и комфортную работу пользователей.

← На главную