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