В процессе работы с конфигурацией 1С:Управление производственным предприятием ред. 1.3 часто возникает необходимость скорректировать данные в регистрах сведений за прошлые периоды. Например, это может быть табличная часть формы договора, данные которой хранятся в подсистеме бюджетирования. При попытке вручную отредактировать или перезаписать такие данные система выдает ошибку, ссылаясь на установленную дату запрета редактирования. Разберем подробнее, почему возникает эта проблема и каким образом можно программно или административно внести изменения без нарушения целостности учета.
Проанализируем механизмы, которые препятствуют прямому изменению данных в закрытом периоде:
Подчинение регистратору, его невозможно отредактировать напрямую или созданием независимого набора записей. Все изменения формируются исключительно при проведении или отмене проведения документа-регистратора.Период. В типовых конфигурациях, таких как УПП 1.3, в подписках на событие ПередЗаписью срабатывает модуль контроля дат запрета. Если дата записи попадает в закрытый период, выполнение операции прерывается.Для независимых регистров сведений наиболее эффективным программным решением является применение свойства ОбменДанными.Загрузка у объекта НаборЗаписей. Установка этого флага в значение Истина отключает выполнение прикладных обработчиков событий (таких как ПередЗаписью и ПриЗаписи), а также связанных подписок на события, в которых зашита проверка даты запрета изменений.
Рассмотрим пример кода для записи изменений в независимый регистр сведений:
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
// Устанавливаем отборы для поиска нужной записи
НаборЗаписей.Отбор.Договор.Установить(СсылкаНаДоговор);
НаборЗаписей.Отбор.Период.Установить(ЗатворенныйПериодДата);
// Отключаем выполнение прикладных проверок конфигурации
НаборЗаписей.ОбменДанными.Загрузка = Истина;
// Заполняем или корректируем записи
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Договор = СсылкаНаДоговор;
НоваяЗапись.Период = ЗатворенныйПериодДата;
НоваяЗапись.Значение = НовоеЗначение;
// Записываем набор
НаборЗаписей.Записать();
Важное замечание: Свойство ОбменДанными.Загрузка = Истина отключает только алгоритмы конфигурации. Оно не позволяет обойти ограничение прав доступа платформы (RLS). Если у пользователя нет прав на запись объекта, система вызовет ошибку прав доступа.
Если для выполнения операции не хватает прав текущего пользователя или требуются административные полномочия, проанализируем следующие варианты:
УстановитьПривилегированныйРежим(Истина) или выполнение кода в общем модуле с установленным флагом Привилегированный позволяет обойти проверки RLS и записать данные от имени системы.Если регистр сведений имеет режим записи Подчинение регистратору, отредактировать его независимым набором записей нельзя. В таком случае разберем два стандартных подхода:
СрезПоследних() на текущую дату начнет возвращать обновленные данные, а история прошлых периодов останется неизменной.Выясним, изменится ли оборотно-сальдовая ведомость (ОСВ) при изменении записей регистра сведений в закрытом периоде:
В конфигурациях 1С данные бухгалтерского и налогового учета (проводки) хранятся в регистрах бухгалтерии, а количественный и оперативный учет — в регистрах накопления. Сам по себе независимый регистр сведений не формирует проводок в бухгалтерском учете. Поэтому прямое изменение записи в регистре сведений не приводит к изменению оборотно-сальдовой ведомости и расчетов с контрагентами.
Исключение: Данные за закрытый период могут поехать только в том случае, если в будущем будет выполнено повторное перепроведение документов прошлого периода (например, документов поступления или реализации), алгоритмы которых обращаются к срезу последних или истории данного регистра сведений.