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