При сопровождении и доработке конфигураций 1С разработчики часто сталкиваются с необходимостью массовой корректировки данных бухгалтерского учета: исправлением аналитики субконто, подразделений или счетов учета за прошлые месяцы или годы. Однако при попытке записать изменения в периоде, закрытом датой запрета изменения данных, платформа или алгоритмы Библиотеки стандартных подсистем (БСП) вызывают исключение и блокируют запись.
Разберем, как правильно отключить прикладные проверки при записи набора записей регистра бухгалтерии, разберем типичную ошибку обращения к контексту объектов и рассмотрим сопутствующие риски прямой модификации проводок.
Для документов разработчики привыкли использовать конструкцию ДокументОбъект.ОбменДанными.Загрузка = Истина. При переходе к регистрам бухгалтерии нередко совершают ошибку, пытаясь обратиться к менеджеру регистра напрямую:
// Ошибочный вариант:
РегистрыБухгалтерии.Хозрасчетный.ОбменДанными.Загрузка = Истина;
При выполнении такого кода платформа выдает ошибку: Поле объекта не обнаружено (ОбменДанными). Это происходит потому, что коллекция РегистрыБухгалтерии.Хозрасчетный является менеджером регистра, у которого нет свойства ОбменДанными.
Свойство ОбменДанными принадлежит конкретному экземпляру объекта РегистрБухгалтерииНаборЗаписей.<ИмяРегистра>. Соответственно, режим загрузки данных необходимо устанавливать именно для созданного набора записей перед его сохранением в базу данных.
Рассмотрим практический пример, в котором требуется отобрать проводки по определенному счету за закрытый период и скорректировать их аналитику.
ОбменДанными.Загрузка = Истина для набора записей, чтобы обойти проверку даты запрета изменения данных.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ХозрасчетныйОбороты.Регистратор КАК Регистратор,
| ХозрасчетныйОбороты.Период КАК Период
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОбороты
|УПОРЯДОЧИТЬ ПО
| ХозрасчетныйОбороты.Период";
Счет10 = ПланыСчетов.Хозрасчетный.Материалы;
Запрос.УстановитьПараметр("ДатаНачала", Дата(2017, 01, 01));
Запрос.УстановитьПараметр("ДатаОкончания", Дата(2017, 08, 20));
Запрос.УстановитьПараметр("Счет", Счет10);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем набор записей по конкретному документу-регистратору
ПроводкиБУ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
ПроводкиБУ.Отбор.Регистратор.Установить(Выборка.Регистратор);
ПроводкиБУ.Прочитать();
// Включаем режим загрузки для обхода даты запрета и прикладных проверок
ПроводкиБУ.ОбменДанными.Загрузка = Истина;
Модифицирован = Ложь;
Для Каждого Проводка Из ПроводкиБУ Цикл
Если Проводка.СчетДт = Счет10 Тогда
// Выполняем требуемые действия с аналитикой или реквизитами проводки
// Например, заполняем пустое субконто или подразделение
Модифицирован = Истина;
КонецЕсли;
КонецЦикла;
Если Модифицирован Тогда
ПроводкиБУ.Записать();
КонецЕсли;
КонецЦикла;
Применение свойства ОбменДанными.Загрузка = Истина имеет ряд особенностей, о которых необходимо помнить при разработке:
УстановитьПривилегированныйРежим(Истина).Прямое вмешательство в регистр бухгалтерии задним числом несет риски нарушения целостности учета:
ДополнительныеСвойства набора.Для сохранения целостности информационной базы рекомендуется использовать один из следующих подходов:
РучнаяКорректировка = Истина, чтобы заблокировать автоматическую перезапись движений при будущем перепроведении.