При разработке новых объектов в расширениях для конфигураций на базе БСП (например, 1С:Бухгалтерия предприятия 3.0) программисты часто сталкиваются с парадоксальной ситуацией. Новый документ создается текущей датой, период редактирования для него открыт, однако при попытке проведения система выдает ошибку: "Редактирование данных в этом периоде запрещено. Установлена общая дата запрета изменения данных...". При этом дата запрета, на которую ссылается программа, может быть значительно раньше даты самого документа.
В этой статье мы подробно разберем, почему механизм защиты данных ведет себя подобным образом, проанализируем внутренние проверки системы и выясним, как правильно оформить программное формирование движений, чтобы избежать конфликтов с подсистемой «Даты запрета изменения».
Проанализируем механику работы 1С с регистрами. Когда документ проводится, он не просто записывает себя в базу, он формирует наборы записей в различных регистрах (бухгалтерии, накопления, сведений). Подсистема даты запрета в типовых конфигурациях настроена так, что она проверяет не только дату самого документа-регистратора, но и каждую строку в его движениях.
Если в программном коде при формировании проводок по РегистрБухгалтерии (Хозрасчетный) или любому другому регистру вы не указали явно значение поля Период, система подставляет туда значение по умолчанию — 01.01.0001 0:00:00 (пустая дата). С точки зрения логики 1С, эта дата всегда будет меньше любой установленной даты запрета в системе. В итоге проверка «спотыкается» на пустой дате в регистре и блокирует запись всего набора.
Рассмотрим пример кода, который часто приводит к такой ошибке:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Формируем проводки
Движение = Движения.Хозрасчетный.Добавить();
Движение.СчетДт = ПланыСчетов.Хозрасчетный.Касса;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПокупателями;
Движение.Сумма = Объект.СуммаДокумента;
// ОШИБКА: Забыли заполнить Движение.Период!
КонецПроцедуры
Чтобы исправить ситуацию, нам необходимо гарантировать, что во всех строках движений установлен корректный период, обычно совпадающий с датой документа:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.Хозрасчетный.Записывать = Истина;
Движение = Движения.Хозрасчетный.Добавить();
Движение.Период = Дата; // Указываем дату документа
Движение.СчетДт = ПланыСчетов.Хозрасчетный.Касса;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПокупателями;
Движение.Сумма = СуммаДокумента;
КонецПроцедуры
Разберем ситуацию, когда все даты в движениях заполнены корректно, но ошибка сохраняется. Это может происходить из-за того, что ваш новый документ, созданный в расширении, не «зарегистрирован» в логике проверки дат запрета. Система просто не знает, по какому реквизиту проверять этот объект, и может применять к нему самые жесткие правила или общую дату по умолчанию.
В составе БСП есть общий модуль ДатыЗапретаИзмененияПереопределяемый. Нам необходимо убедиться, что документ включен в источники данных для проверки. Посмотрим, как это реализуется программно:
ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения в указанном модуле.&После или &Вместо), чтобы добавить ваш документ в таблицу источников.Дата.Это позволит системе корректно сопоставлять ваш документ с настройками, заданными в интерфейсе «Даты запрета изменения» (например, если запрет установлен по пользователям или по организациям).
Проанализируем более сложные случаи. В современных версиях БП 3.0, особенно после введения Единого налогового счета (ЕНС), некоторые документы при проведении делают записи в регистры за прошлые периоды. Например, документ текущего месяца может выполнять «зачет» авансов или корректировку остатков, датированную началом года.
Если ваш документ из расширения задействует типовые механизмы (вызывает процедуры общих модулей для расчета налогов или формирования записей по ЕНС), проверьте, не создаются ли при этом записи в регистры накопления с периодом, попадающим под запрет. В таких случаях 1С будет выдавать ошибку, даже если сам документ помечен текущим числом.
Если причина ошибки неочевидна, воспользуемся проверенным алгоритмом отладки:
ДатыЗапретаИзменения. Ищите функцию, которая возвращает значение Отказ = Истина или выводит сообщение пользователю.Период заполнено во всех строках всех регистров, по которым делает движения документ.Важный момент: Помните, что для документов, созданных в расширении, иногда требуется обновить параметры сеанса или выполнить регламентное задание по обновлению настроек дат запрета, чтобы система «увидела» изменения в метаданных.
Таким образом, в большинстве случаев решение кроется в простой внимательности при заполнении реквизитов проводок. Всегда проверяйте, чтобы Движение.Период был явно назначен и соответствовал логике открытого периода в системе.