При разработке новых документов в конфигурации «Бухгалтерия государственного учреждения 2.0» (БГУ 2.0) программисты часто сталкиваются с ситуацией, когда код формирования движений написан верно, данные в коллекции Движения заполнены, но после проведения документа регистр бухгалтерии остается пустым. Эта проблема связана не только с синтаксисом встроенного языка, но и с особенностями архитектуры БГУ 2.0, которая активно использует механизмы автоматизированного проведения через дополнительные свойства объектов.
В этой статье мы подробно разберем, почему стандартный подход к записи движений может не работать, и как правильно интегрировать самописный документ в типовой механизм проведения конфигурации.
Рассмотрим ситуацию, когда в модуле документа в процедуре ОбработкаПроведения написан код для заполнения регистра ЖурналПроводокЕПСБУ. На первый взгляд, алгоритм выглядит стандартно для платформы 1С:Предприятие 8.3:
Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;
Движения.ЖурналПроводокЕПСБУ.Очистить();
Для Каждого ТекСтрока Из ТаблицаДанных Цикл
Движение = Движения.ЖурналПроводокЕПСБУ.Добавить();
Движение.Регистратор = Ссылка;
Движение.Период = Дата;
Движение.Организация = Организация;
Движение.Сумма = ТекСтрока.Сумма;
// Заполнение счетов и аналитики
Движение.СчетДт = ТекСтрока.СчетДт;
Движение.СчетКт = ТекСтрока.СчетКт;
КонецЦикла;
Программист видит, что цикл отрабатывает, записи в коллекцию добавляются, однако в пользовательском интерфейсе (через кнопку Дт/Кт) данные отсутствуют. Проанализируем причины такого поведения.
Прежде всего, обратим внимание на настройки метаданных документа в конфигураторе. На закладке «Движения» есть важное свойство Запись движений при проведении. Оно может принимать три значения:
Записывать установлено в значение Истина.Движения.Записать().В типовых конфигурациях, включая БГУ 2.0, чаще всего используется режим «Записывать выбранные». Это означает, что первая строка кода в нашем примере (Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;) критически важна. Если её нет, платформа проигнорирует сформированные в памяти записи.
Наиболее коварная особенность БГУ 2.0 заключается в том, что конфигурация использует общие механизмы проведения, которые анализируют структуру ДополнительныеСвойства документа. Если вы создаете документ «с нуля», система может не опознать его как источник бухгалтерских проводок.
Для решения проблемы необходимо в процедуре ОбработкаПроведения (или в процедурах, вызываемых из неё) установить специальный флаг, который даст сигнал системе: данный документ действительно формирует бухгалтерские операции. Посмотрим на пример кода, который решает эту задачу:
// Установка флага для типовых механизмов БГУ 2.0
ЭтотОбъект.ДополнительныеСвойства.Вставить("ДанныеАвтопроведения", Новый Структура);
ЭтотОбъект.ДополнительныеСвойства.ДанныеАвтопроведения.Вставить("ЭтоБухоперация", Истина);
В некоторых версиях конфигурации структура ДанныеАвтопроведения уже может быть инициализирована, тогда достаточно просто установить значение ключа. Без этого флага механизмы подсистемы учета могут очищать движения или просто игнорировать их в процессе завершения транзакции проведения.
Бухгалтерский учет в государственных учреждениях гораздо строже обычного хозрасчетного учета. Даже если записи попадают в регистр, они могут «отсеиваться» или не отображаться в отчетах, если не заполнены ключевые измерения. Проанализируем ситуацию с обязательными полями:
КФО равно пустому значению, такая проводка считается некорректной. В коде это должно выглядеть так: Движение.КФО = Перечисления.КВД.Внебюджет; (или соответствующее значение из справочника/перечисления).Рассмотрим, как должен выглядеть полный и корректный блок кода для формирования проводок в самописном документе БГУ 2.0:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// 1. Обязательно указываем системе, что мы будем записывать этот регистр
Движения.ЖурналПроводокЕПСБУ.Записывать = Истина;
// 2. Очищаем движения, чтобы избежать дублей при перепроведении
Движения.ЖурналПроводокЕПСБУ.Очистить();
// 3. Устанавливаем признак бухгалтерской операции для типовых алгоритмов
Если Не ЭтотОбъект.ДополнительныеСвойства.Свойство("ДанныеАвтопроведения") Тогда
ЭтотОбъект.ДополнительныеСвойства.Вставить("ДанныеАвтопроведения", Новый Структура);
КонецЕсли;
ЭтотОбъект.ДополнительныеСвойства.ДанныеАвтопроведения.Вставить("ЭтоБухоперация", Истина);
// 4. Цикл по табличной части
Для Каждого ТекСтрока Из ТаблицаСДанными Цикл
Движение = Движения.ЖурналПроводокЕПСБУ.Добавить();
Движение.Период = Дата;
Движение.Организация = Организация;
Движение.КФО = ТекСтрока.КФО; // Проверяем заполнение!
// Заполнение стороны Дебета
Движение.СчетДт = ТекСтрока.СчетДебета;
Движение.КПСДт = ТекСтрока.КПСДебета;
Движение.КЭКДт = ТекСтрока.КЭКДебета;
// Заполнение стороны Кредита
Движение.СчетКт = ТекСтрока.СчетКредита;
Движение.КПСКт = ТекСтрока.КПСКредита;
Движение.КЭККт = ТекСтрока.КЭККредита;
Движение.Сумма = ТекСтрока.Сумма;
Движение.Содержание = "Программное формирование проводки";
// Работа с субконто (динамическое заполнение)
// Рекомендуется проверять виды субконто у счета, прежде чем заполнять
Если Движение.СчетДт.ВидыСубконто.Количество() > 0 Тогда
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрока.Номенклатура;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выясним еще одну важную деталь. В предоставленном в начале статьи примере кода часто используется метод ПланыСчетов.ЕПСБУ.НайтиПоКоду("109.61") прямо внутри цикла. Это серьезная ошибка проектирования. Рассмотрим, почему:
Метод НайтиПоКоду заставляет платформу выполнять отдельный запрос к базе данных на каждой итерации цикла. Если в документе 100 строк, система сделает 100 лишних запросов. Это существенно замедляет проведение.
Как правильно: Выносите поиск счетов за пределы цикла или используйте предопределенные счета (если они есть в конфигурации). Если счета выбираются пользователем в табличной части, обращайтесь к ним напрямую через данные строки.
// ПЛОХО
Для Каждого Стр Из ТЧ Цикл
Если Стр.Счет = ПланыСчетов.ЕПСБУ.НайтиПоКоду("106.3И") Тогда ... КонецЕсли;
КонецЦикла;
// ХОРОШО
Счет106 = ПланыСчетов.ЕПСБУ.НайтиПоКоду("106.3И");
Для Каждого Стр Из ТЧ Цикл
Если Стр.Счет = Счет106 Тогда ... КонецЕсли;
КонецЦикла;
Подведем итог. Если ваш документ в БГУ 2.0 не делает движений по регистру бухгалтерии, проверьте следующие моменты:
Движения.ЖурналПроводокЕПСБУ.Записывать = Истина; в начале процедуры проведения.ЭтоБухоперация в ДополнительныеСвойства.ДанныеАвтопроведения. Это ключевой момент для БГУ 2.0.Отказ = Истина) в конце процедуры из-за каких-либо проверок, что автоматически отменяет запись всех движений.Следуя этим правилам и соблюдая структуру типовых механизмов, вы обеспечите корректное отражение операций вашего документа в бухгалтерском учете учреждения.