Как настроить дату запрета изменения данных со сдвигом на несколько дней в 1С:ERP?

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

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

Причина поведения системы и логика БСП

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

Основное назначение механизма отсрочки — предоставить бухгалтерии и финансовым службам льготный интервал (к примеру, 5–10 календарных дней в начале нового месяца) для сведения итогов и сдачи отчетности за прошлый период. Пока льготные дни не истекли, граница запрета удерживается на уровне предпредыдущего периода.

Для варианта Предыдущий день отчетный интервал равен одним суткам. С точки зрения разработчиков БСП понятие «отсрочки закрытия отчетного периода» к суточному интервалу не применимо, поэтому поле программно блокируется на форме настройки. В типовом функционале отсутствует концепция «скользящего окна редактирования» назад на N дней от текущей даты. Кроме того, относительные даты запрета не рассчитываются динамически «на лету» при каждой записи документа: в регистре сведений ДатыЗапретаИзменения хранятся фиксированные абсолютные значения, которые ежедневно сдвигаются регламентным заданием Пересчет текущих значений относительных дат запрета изменения.

Способ 1. Создание фоновой регламентной обработки

Рассмотрим вариант решения, предложенный на практике: создание отдельной дополнительной обработки, выполняющейся по расписанию раз в сутки (ночью). Эта обработка рассчитывает границу запрета для требуемых пользователей или групп пользователей по формуле ТекущаяДата() - КоличествоДней * 86400 и записывает значение в базу данных.

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

Разберем по шагам, как правильно выполнить программную установку даты запрета через программный интерфейс БСП:

  1. Создаем дополнительную внешнюю обработку или обработку в конфигурации, подключаемую к типовому механизму регламентных заданий.
  2. В модуле обработки формируем таблицу новых значений дат запрета для нужных пользователей.
  3. Используем служебные методы модуля ДатыЗапретаИзмененияСлужебный, чтобы обновить данные в регистре и корректно инвалидировать кэш в параметрах сеанса.

Посмотрим на пример кода, который рассчитывает и устанавливает границу запрета на 5 дней назад:


КоличествоДнейСмещения = 5;
НоваяДатаЗапрета = НачалоДня(ТекущаяДатаСеанса() - КоличествоДнейСмещения * 86400);

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

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Пользователь = ВыбранныйПользователь;
НоваяЗапись.Раздел = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка();
НоваяЗапись.ДатаЗапрета = НоваяДатаЗапрета;

НаборЗаписей.Записать();

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

Способ 2. Доработка подсистемы через расширение конфигурации

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

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

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

Способ 3. Компромиссная настройка штатными средствами

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

  1. Переход на недельный интервал: если погрешность в несколько дней допустима для бизнес-процесса, выбираем относительную дату Конец прошлой недели. Для нее поле отсрочки в днях остается активным, что позволяет настроить доступность редактирования документов текущей недели плюс заданное количество дней прошлой недели.
  2. Ограничение через профили групп доступа (RLS): если задача состоит в строгом запрете изменения конкретных документов для определенных ролей, условие проверки даты можно вынести в шаблоны ограничений доступа к данным: Где Дата >= ДобавитьКДате(ТекущаяДата(), "ДЕНЬ", -5). Однако следует помнить, что использование RLS для контроля дат документов повышает нагрузку на СУБД по сравнению со штатным механизмом дат запрета.
← На главную