Как подключить новый документ к механизму даты запрета изменения в 1С:ЗУП 3.1

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

При разработке собственных объектов в конфигурации 1С:Зарплата и управление персоналом 3.1 (ЗУП), базирующейся на Библиотеке стандартных подсистем (БСП), разработчики часто сталкиваются с тем, что стандартный механизм даты запрета изменений игнорирует новые документы. Даже если дата запрета установлена, пользователь может беспрепятственно редактировать, записывать и проводить созданный документ. Рассмотрим подробнее, как правильно интегрировать новый объект в систему защиты данных, чтобы он подчинялся общим правилам закрытия периода.

Разберем общую схему работы механизма

Для того чтобы дата запрета «увидела» ваш документ, необходимо реализовать связь на трех уровнях системы:

  1. Программная регистрация: сообщение системе о том, какой реквизит документа отвечает за дату и к какому разделу учета относится объект.
  2. Событийный уровень: подключение документа к подпискам на события, которые срабатывают при попытке записи или удаления.
  3. Интерфейсный уровень: вызов серверных процедур в форме документа для визуальной блокировки элементов управления (сделай поля «серыми»).

Шаг 1: Программная регистрация источника данных

Первым делом нам необходимо зарегистрировать новый документ в реестре источников данных для проверки дат запрета. В современных версиях ЗУП 3.1 для этого используется общий модуль ЗарплатаКадрыРасширенный или ДатыЗапретаИзмененияПереопределяемый. Проанализируем, как это сделать правильно через расширение конфигурации.

Найдем процедуру ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения. Нам нужно добавить в таблицу источников наш документ. Рассмотрим пример кода, который следует разместить в этой процедуре:


// В процедуре ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения
// ИсточникиДанных - ТаблицаЗначений, которую мы наполняем

// Вариант для обычного документа, где проверка идет по дате документа
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.ВашНовыйДокумент", "Дата", "Зарплата", "Организация");

// Вариант для документа, где важен месяц начисления (типично для ЗУП)
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.ВашНовыйДокумент", "МесяцНачисления", "Зарплата", "Организация");

Разберем параметры функции ДобавитьСтроку:

Шаг 2: Подписка на события для физической блокировки записи

Частая ошибка разработчиков заключается в том, что они ограничиваются только программной регистрацией в модуле. Однако, если документ не включен в состав соответствующей подписки на событие, механизм проверки просто не запустится при нажатии кнопки «Провести и закрыть» или при отмене проведения из списка.

Выясним причину, почему документ может продолжать записываться. Проанализируем объект метаданных Подписки на события. Нам необходима подписка с именем ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента (в некоторых сборках ЗУП может называться ПроверитьДатуЗапретаИзмененияПередЗаписьюДокументаЗащитаПерсональныхДанных).

Выполним следующие действия:

  1. Откроем свойства указанной подписки в конфигураторе (или в расширении).
  2. В поле Источник нажмем на кнопку выбора типа.
  3. В открывшемся списке типов найдем наш новый документ и установим напротив него флажок.

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


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

Шаг 3: Настройка формы документа для визуального отображения

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

Рассмотрим процедуру ПриЧтенииНаСервере. Нам нужно добавить вызов метода БСП, который проанализирует состояние документа и заблокирует форму:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Стандартный вызов БСП для обработки дат запрета
    ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры

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

Дополнительные нюансы и типичные проблемы

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

Также стоит обратить внимание на следующие моменты:

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

← На главную