Как программно изменить проводки и аналитику в регистре бухгалтерии в закрытом периоде?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При сопровождении и доработке конфигураций 1С разработчики часто сталкиваются с необходимостью массовой корректировки данных бухгалтерского учета: исправлением аналитики субконто, подразделений или счетов учета за прошлые месяцы или годы. Однако при попытке записать изменения в периоде, закрытом датой запрета изменения данных, платформа или алгоритмы Библиотеки стандартных подсистем (БСП) вызывают исключение и блокируют запись.

Разберем, как правильно отключить прикладные проверки при записи набора записей регистра бухгалтерии, разберем типичную ошибку обращения к контексту объектов и рассмотрим сопутствующие риски прямой модификации проводок.

Причина ошибки и правильный контекст свойства ОбменДанными

Для документов разработчики привыкли использовать конструкцию ДокументОбъект.ОбменДанными.Загрузка = Истина. При переходе к регистрам бухгалтерии нередко совершают ошибку, пытаясь обратиться к менеджеру регистра напрямую:


// Ошибочный вариант:
РегистрыБухгалтерии.Хозрасчетный.ОбменДанными.Загрузка = Истина;

При выполнении такого кода платформа выдает ошибку: Поле объекта не обнаружено (ОбменДанными). Это происходит потому, что коллекция РегистрыБухгалтерии.Хозрасчетный является менеджером регистра, у которого нет свойства ОбменДанными.

Свойство ОбменДанными принадлежит конкретному экземпляру объекта РегистрБухгалтерииНаборЗаписей.<ИмяРегистра>. Соответственно, режим загрузки данных необходимо устанавливать именно для созданного набора записей перед его сохранением в базу данных.

Пошаговый пример корректировки проводок

Рассмотрим практический пример, в котором требуется отобрать проводки по определенному счету за закрытый период и скорректировать их аналитику.

  1. Формируем запрос для получения списка регистраторов, движения которых подлежат изменению.
  2. Создаем набор записей регистра бухгалтерии по каждому регистратору.
  3. Устанавливаем свойство ОбменДанными.Загрузка = Истина для набора записей, чтобы обойти проверку даты запрета изменения данных.
  4. Выполняем модификацию субконто или реквизитов проводки и записываем набор.

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ХозрасчетныйОбороты.Регистратор КАК Регистратор,
    |    ХозрасчетныйОбороты.Период КАК Период
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОбороты
    |УПОРЯДОЧИТЬ ПО
    |    ХозрасчетныйОбороты.Период";

Счет10 = ПланыСчетов.Хозрасчетный.Материалы;

Запрос.УстановитьПараметр("ДатаНачала", Дата(2017, 01, 01));
Запрос.УстановитьПараметр("ДатаОкончания", Дата(2017, 08, 20));
Запрос.УстановитьПараметр("Счет", Счет10);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Создаем набор записей по конкретному документу-регистратору
    ПроводкиБУ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    ПроводкиБУ.Отбор.Регистратор.Установить(Выборка.Регистратор);
    ПроводкиБУ.Прочитать();
    
    // Включаем режим загрузки для обхода даты запрета и прикладных проверок
    ПроводкиБУ.ОбменДанными.Загрузка = Истина;
    
    Модифицирован = Ложь;
    Для Каждого Проводка Из ПроводкиБУ Цикл
        Если Проводка.СчетДт = Счет10 Тогда
            // Выполняем требуемые действия с аналитикой или реквизитами проводки
            // Например, заполняем пустое субконто или подразделение
            Модифицирован = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Если Модифицирован Тогда
        ПроводкиБУ.Записать();
    КонецЕсли;
КонецЦикла;

Ограничения платформы и важные нюансы

Применение свойства ОбменДанными.Загрузка = Истина имеет ряд особенностей, о которых необходимо помнить при разработке:

  1. Права доступа (RLS): Режим загрузки отключает обработчики событий в коде конфигурации (включая проверку дат запрета), но не отменяет платформенные ограничения прав на уровне записей (RLS). Если у пользователя нет административных прав, код завершится ошибкой нарушения прав доступа. Для гарантированного выполнения под ограниченными учетными записями процедуру следует выполнять с вызовом УстановитьПривилегированныйРежим(Истина).
  2. Контроль типов субконто: В режиме загрузки платформа может ослабить контроль заполнения обязательных реквизитов. Разработчик обязан самостоятельно следить за тем, чтобы передаваемые значения субконто строго соответствовали типам, заданным на плане счетов.

Возможные риски прямой перезаписи наборов записей

Прямое вмешательство в регистр бухгалтерии задним числом несет риски нарушения целостности учета:

  1. Стирание изменений при перепроведении: При прямой записи набора записей в документе не устанавливается флаг ручной корректировки. Если пользователь или регламентное задание (например, процедура закрытия месяца) перепроведет этот документ, типовой модуль проведения полностью сотрет внесенные вручную правки.
  2. Рассинхронизация регистров: В типовых конфигурациях документы формируют движения не только по бухгалтерскому регистру, но и по вспомогательным регистрам накопления (учет НДС, себестоимость, взаиморасчеты, партии). Изменение аналитики только в регистре бухгалтерии без корректировки параллельных регистров приведет к расхождению отчетов.
  3. Смещение границы последовательности: Запись движений задним числом в некоторых системах сдвигает границу последовательности документов назад, что может потребовать от бухгалтерии повторного перепроведения цепочки документов.
  4. Регистрация в планах обмена: По умолчанию запись набора регистрирует изменения в узлах распределенной информационной базы (РИБ). Если перегрузка исправленных проводок в другие узлы не планируется, регистрацию следует подавлять через ДополнительныеСвойства набора.

Альтернативные способы корректировки

Для сохранения целостности информационной базы рекомендуется использовать один из следующих подходов:

  1. Исправление текущим периодом (методологический стандарт): Создание документа «Операция, введенная вручную» датой открытого периода. С помощью сторнирующих или корректирующих записей аналитика переносится на правильные значения без изменения закрытых периодов и искажения сданной отчетности.
  2. Включение ручной корректировки: Если изменения вносятся именно в исходный документ, необходимо программно или интерактивно включить признак РучнаяКорректировка = Истина, чтобы заблокировать автоматическую перезапись движений при будущем перепроведении.
← На главную