В практике разработчика 1С нередко возникают ситуации, когда в закрытом периоде обнаруживается ошибка в движениях регистра накопления — например, неверно заполнено измерение или ресурс. Стандартными средствами интерфейса изменить такие данные невозможно из-за установленной даты запрета редактирования. Однако, как справедливо замечено в профессиональной среде, дата запрета — это программное ограничение, накладываемое логикой конфигурации, а не жесткий платформенный запрет на уровне базы данных. Рассмотрим подробно, как программист может обойти это ограничение и какие последствия это может повлечь для системы.
Для начала разберем главный тезис: для платформы 1С:Предприятие 8 не существует понятия "закрытый период" в контексте прямого манипулирования таблицами через встроенный язык. Проверка даты запрета обычно реализована в модулях объектов документов или в подписках на события. Если мы обращаемся напрямую к регистру, мы можем управлять процессом записи более гибко.
Рассмотрим основной механизм внесения изменений через объект РегистрНакопленияНаборЗаписей. Чтобы система позволила нам записать изменения в периоде, который по логике конфигурации считается закрытым, необходимо выполнить несколько шагов, применяя универсальную обработку для работы с регистрами.
Самый эффективный способ обойти встроенные проверки конфигурации (включая проверку даты запрета в большинстве типовых решений) — это использование свойства ОбменДанными.Загрузка. Рассмотрим, как это работает на практике.
Проанализируем пример кода для изменения измерения в существующем наборе записей:
// Создаем набор записей по конкретному регистратору
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
// Прочитаем текущие движения из базы данных
НаборЗаписей.Прочитать();
// Переберем записи и внесем необходимые исправления
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.Склад = СтарыйСклад Тогда
Запись.Склад = НовыйСклад;
КонецЕсли;
КонецЦикла;
// Устанавливаем режим загрузки, чтобы обойти программные проверки
НаборЗаписей.ОбменДанными.Загрузка = Истина;
// Записываем измененный набор
Попытка
НаборЗаписей.Записать();
Сообщить("Записи успешно изменены в закрытом периоде.");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
В этом примере установка ОбменДанными.Загрузка = Истина сообщает системе, что выполняется перенос данных или загрузка из внешней системы. В этом режиме большинство подписок на события и проверок в модуле набора записей попросту игнорируются, что позволяет выполнить "тихую" запись.
Иногда проверки прав доступа или даты запрета могут быть встроены так глубоко, что обычного набора прав недостаточно. В таких случаях мы можем использовать привилегированный режим. Разберем ситуацию: если код выполняется на сервере внутри процедуры, обернутой в специальные команды, система перестает проверять права текущего пользователя на чтение или запись данных.
Рассмотрим, как это выглядит в коде:
УстановитьПривилегированныйРежим(Истина);
// Здесь выполняется код по чтению и модификации набора записей
// Платформа проигнорирует ограничения прав доступа RLS
// и встроенные проверки, зависящие от текущего пользователя
УстановитьПривилегированныйРежим(Ложь);
Важно помнить, что привилегированный режим не отменяет логику самого кода в модуле набора записей, если там явно прописана проверка даты запрета. Но в сочетании с ОбменДанными.Загрузка это дает программисту практически неограниченную власть над данными.
Несмотря на техническую простоту, прямое изменение записей регистров в закрытом периоде несет в себе серьезные риски. Проанализируем, почему профессионалы часто предостерегают от таких действий.
ТоварыНаСкладах, но не изменим его в самом документе (регистраторе), возникнет "мина замедленного действия". При любом случайном перепроведении этого документа в будущем (например, при групповом перепроведении) платформа заново сформирует движения на основе данных документа, и ваша правка будет бесследно стерта.Вместо того чтобы ломать логику системы, выясним, как решить проблему методологически правильно. Профессиональное сообщество рекомендует использовать штатные механизмы исправления ошибок:
1. Документ "Корректировка записей регистров". Для массовой работы с этим инструментом подойдет групповая корректировка записей регистров.
Это универсальный инструмент, который позволяет внести исправления в любой регистр текущей датой (в открытом периоде). Мы создаем запись, которая "сторнирует" неверные данные и вводит верные. При этом закрытый период остается нетронутым, а итоговые остатки на текущий момент становятся корректными. Это сохраняет целостность учета и аудиторский след.
2. Сторнирование и исправление документов.
Если ошибка системная, лучше воспользоваться штатной функцией "Исправить" или "Сторнировать" непосредственно в документе-источнике. Новый документ будет создан в текущем периоде, что полностью исключает риски нарушения отчетности прошлых лет.
Мы выяснили, что технически изменить любую запись в базе данных 1С возможно с помощью объекта НаборЗаписей и флага ОбменДанными.Загрузка = Истина. Это мощный инструмент в руках программиста, позволяющий исправлять ошибки без открытия периода. Однако применять его следует только в исключительных случаях, когда вы полностью осознаете структуру метаданных и уверены, что изменение не приведет к деградации данных и расхождению итогов в будущем. В 90% случаев использование документа Корректировка записей регистров будет более правильным и безопасным решением.