Почему программно созданные проводки не записываются в регистр бухгалтерии БГУ 2.0?

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

При разработке новых документов в конфигурации «Бухгалтерия государственного учреждения 2.0» (БГУ 2.0) программисты часто сталкиваются с ситуацией, когда код формирования движений написан верно, данные в коллекции Движения заполнены, но после проведения документа регистр бухгалтерии остается пустым. Эта проблема связана не только с синтаксисом встроенного языка, но и с особенностями архитектуры БГУ 2.0, которая активно использует механизмы автоматизированного проведения через дополнительные свойства объектов.

В этой статье мы подробно разберем, почему стандартный подход к записи движений может не работать, и как правильно интегрировать самописный документ в типовой механизм проведения конфигурации.

Анализ типовой ошибки при формировании движений

Рассмотрим ситуацию, когда в модуле документа в процедуре ОбработкаПроведения написан код для заполнения регистра ЖурналПроводокЕПСБУ. На первый взгляд, алгоритм выглядит стандартно для платформы 1С:Предприятие 8.3:


Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;
Движения.ЖурналПроводокЕПСБУ.Очистить();

Для Каждого ТекСтрока Из ТаблицаДанных Цикл
    Движение = Движения.ЖурналПроводокЕПСБУ.Добавить();
    Движение.Регистратор = Ссылка;
    Движение.Период = Дата;
    Движение.Организация = Организация;
    Движение.Сумма = ТекСтрока.Сумма;
    // Заполнение счетов и аналитики
    Движение.СчетДт = ТекСтрока.СчетДт;
    Движение.СчетКт = ТекСтрока.СчетКт;
КонецЦикла;

Программист видит, что цикл отрабатывает, записи в коллекцию добавляются, однако в пользовательском интерфейсе (через кнопку Дт/Кт) данные отсутствуют. Проанализируем причины такого поведения.

Причина 1: Свойство документа «Запись движений при проведении»

Прежде всего, обратим внимание на настройки метаданных документа в конфигураторе. На закладке «Движения» есть важное свойство Запись движений при проведении. Оно может принимать три значения:

  1. Записывать выбранные — система запишет только те наборы записей, у которых свойство Записывать установлено в значение Истина.
  2. Записывать модифицированные — платформа сама попытается определить, изменились ли движения, и запишет их.
  3. Не записывать автоматически — записи не будут сохранены, пока вы явно не вызовете метод Движения.Записать().

В типовых конфигурациях, включая БГУ 2.0, чаще всего используется режим «Записывать выбранные». Это означает, что первая строка кода в нашем примере (Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;) критически важна. Если её нет, платформа проигнорирует сформированные в памяти записи.

Причина 2: Специфика БГУ 2.0 и флаг «ЭтоБухоперация»

Наиболее коварная особенность БГУ 2.0 заключается в том, что конфигурация использует общие механизмы проведения, которые анализируют структуру ДополнительныеСвойства документа. Если вы создаете документ «с нуля», система может не опознать его как источник бухгалтерских проводок.

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


// Установка флага для типовых механизмов БГУ 2.0
ЭтотОбъект.ДополнительныеСвойства.Вставить("ДанныеАвтопроведения", Новый Структура);
ЭтотОбъект.ДополнительныеСвойства.ДанныеАвтопроведения.Вставить("ЭтоБухоперация", Истина);

В некоторых версиях конфигурации структура ДанныеАвтопроведения уже может быть инициализирована, тогда достаточно просто установить значение ключа. Без этого флага механизмы подсистемы учета могут очищать движения или просто игнорировать их в процессе завершения транзакции проведения.

Причина 3: Обязательная аналитика (КФО, ИФО, КПС)

Бухгалтерский учет в государственных учреждениях гораздо строже обычного хозрасчетного учета. Даже если записи попадают в регистр, они могут «отсеиваться» или не отображаться в отчетах, если не заполнены ключевые измерения. Проанализируем ситуацию с обязательными полями:

Разбор по шагам: Правильный алгоритм формирования движений

Рассмотрим, как должен выглядеть полный и корректный блок кода для формирования проводок в самописном документе БГУ 2.0:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // 1. Обязательно указываем системе, что мы будем записывать этот регистр
    Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;
    
    // 2. Очищаем движения, чтобы избежать дублей при перепроведении
    Движения.ЖурналПроводокЕПСБУ.Очистить();
    
    // 3. Устанавливаем признак бухгалтерской операции для типовых алгоритмов
    Если Не ЭтотОбъект.ДополнительныеСвойства.Свойство("ДанныеАвтопроведения") Тогда
        ЭтотОбъект.ДополнительныеСвойства.Вставить("ДанныеАвтопроведения", Новый Структура);
    КонецЕсли;
    ЭтотОбъект.ДополнительныеСвойства.ДанныеАвтопроведения.Вставить("ЭтоБухоперация", Истина);
    
    // 4. Цикл по табличной части
    Для Каждого ТекСтрока Из ТаблицаСДанными Цикл
        
        Движение = Движения.ЖурналПроводокЕПСБУ.Добавить();
        Движение.Период      = Дата;
        Движение.Организация = Организация;
        Движение.КФО         = ТекСтрока.КФО; // Проверяем заполнение!
        
        // Заполнение стороны Дебета
        Движение.СчетДт = ТекСтрока.СчетДебета;
        Движение.КПСДт  = ТекСтрока.КПСДебета;
        Движение.КЭКДт  = ТекСтрока.КЭКДебета;
        
        // Заполнение стороны Кредита
        Движение.СчетКт = ТекСтрока.СчетКредита;
        Движение.КПСКт  = ТекСтрока.КПСКредита;
        Движение.КЭККт  = ТекСтрока.КЭККредита;
        
        Движение.Сумма  = ТекСтрока.Сумма;
        Движение.Содержание = "Программное формирование проводки";
        
        // Работа с субконто (динамическое заполнение)
        // Рекомендуется проверять виды субконто у счета, прежде чем заполнять
        Если Движение.СчетДт.ВидыСубконто.Количество() > 0 Тогда
            Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрока.Номенклатура;
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

Оптимизация производительности: Поиск счетов

Выясним еще одну важную деталь. В предоставленном в начале статьи примере кода часто используется метод ПланыСчетов.ЕПСБУ.НайтиПоКоду("109.61") прямо внутри цикла. Это серьезная ошибка проектирования. Рассмотрим, почему:

Метод НайтиПоКоду заставляет платформу выполнять отдельный запрос к базе данных на каждой итерации цикла. Если в документе 100 строк, система сделает 100 лишних запросов. Это существенно замедляет проведение.

Как правильно: Выносите поиск счетов за пределы цикла или используйте предопределенные счета (если они есть в конфигурации). Если счета выбираются пользователем в табличной части, обращайтесь к ним напрямую через данные строки.


// ПЛОХО
Для Каждого Стр Из ТЧ Цикл
    Если Стр.Счет = ПланыСчетов.ЕПСБУ.НайтиПоКоду("106.3И") Тогда ... КонецЕсли;
КонецЦикла;

// ХОРОШО
Счет106 = ПланыСчетов.ЕПСБУ.НайтиПоКоду("106.3И");
Для Каждого Стр Из ТЧ Цикл
    Если Стр.Счет = Счет106 Тогда ... КонецЕсли;
КонецЦикла;

Заключение

Подведем итог. Если ваш документ в БГУ 2.0 не делает движений по регистру бухгалтерии, проверьте следующие моменты:

  1. Установлено ли свойство Движения.ЖурналПроводокЕПСБУ.Записывать = Истина; в начале процедуры проведения.
  2. Добавлен ли флаг ЭтоБухоперация в ДополнительныеСвойства.ДанныеАвтопроведения. Это ключевой момент для БГУ 2.0.
  3. Заполнены ли все обязательные измерения регистра: КФО, Организация, Период, а также аналитика счетов (КПС и КЭК).
  4. Не происходит ли отказ от проведения (Отказ = Истина) в конце процедуры из-за каких-либо проверок, что автоматически отменяет запись всех движений.

Следуя этим правилам и соблюдая структуру типовых механизмов, вы обеспечите корректное отражение операций вашего документа в бухгалтерском учете учреждения.

← На главную