При переходе с конфигурации БГУ 1.0 на БГУ 2.0 разработчики часто сталкиваются с ситуацией, когда привычные методы разработки перестают работать. Одной из самых распространенных проблем является «исчезновение» проводок: программист создает новый документ в расширении, пишет код формирования движений по регистру бухгалтерии, в отладчике видит заполненный набор записей, но после завершения транзакции проведения регистр остается пустым. При этом система не выдает никаких ошибок.
В этой статье мы подробно разберем, почему так происходит, как устроена архитектура учета в БГУ 2.0 и какими способами можно добиться стабильного формирования движений в расширении, не снимая основную конфигурацию с поддержки.
В простых конфигурациях или в старых редакциях (как БГУ 1.0) за формирование проводок отвечает исключительно процедура ОбработкаПроведения в модуле документа. Если в коде прописано Движения.ЕдиныйПланСчетовБухгалтерскогоУчета.Записывать = Истина, система фиксирует записи в базе данных.
Однако в БГУ 2.0 реализована принципиально иная концепция — подсистема «Бухгалтерские операции». Рассмотрим основные причины, по которым ваши проводки могут затираться:
ОбработкаПроведения), которые срабатывают после выполнения кода в модуле документа. Эти подписки инициируют работу типового механизма формирования проводок. Если ваш документ не «зарегистрирован» в этой подсистеме, механизм может просто очистить движения, считая их ошибочными или неактуальными.БухгалтерскиеОперации и выбранной в документе типовой операции. Если в документе не указана операция или она не настроена, подсистема может принудительно обнулить набор записей регистра.Чтобы проводки сохранялись, документ должен «вписаться» в логику конфигурации. В БГУ 2.0 проводки — это не просто код, это результат обработки данных документа специальным движком. Проанализируем, как работает этот механизм:
Система ищет в документе реквизит (обычно это ТиповаяОперация), который ссылается на справочник БухгалтерскиеОперации. Для каждой операции настроены правила: какие счета использовать, откуда брать КБК, КОСГУ и суммы. Документ в данном случае выступает лишь источником данных.
Если мы создаем документ в расширении, он по умолчанию не является источником данных для этой подсистемы. Поэтому любые попытки записать движения «напрямую» конфликтуют с логикой «контролера» в виде глобальных подписок.
Это наиболее правильный, хоть и трудоемкий путь. Для его реализации выполним следующие шаги:
1. Добавим в наш документ в расширении реквизит ТиповаяОперация с типом ссылки на справочник БухгалтерскиеОперации. Это позволит пользователю в режиме предприятия выбирать нужную схему проводок.
2. Нам необходимо сделать документ видимым для подсистемы. Для этого нужно расширить определяемый тип ИсточникДанныхДляБухгалтерскогоУчета (или аналогичный в вашей версии БГУ), включив туда наш новый документ.
3. Вместо ручного заполнения набора записей в процедуре ОбработкаПроведения, мы должны вызвать типовой метод формирования проводок. Рассмотрим примерный код:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Подготавливаем дополнительные свойства для типового механизма
ДополнительныеСвойства.Вставить("ВыполнитьФормированиеПроводок", Истина);
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Вместо конструктора движений вызываем обработчик подсистемы
БухгалтерскиеОперацииБГУ.СформироватьПроводкиПоДаннымДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Если вы категорически не хотите использовать типовой механизм и вам нужно жестко прописать проводки кодом (как в БГУ 1.0), необходимо «сообщить» системе, что ваши движения легитимны и их не нужно трогать. Выясним, как это сделать через ДополнительныеСвойства.
Типовые подписки часто проверяют наличие определенных флагов в объекте. Чтобы запретить автоматическую очистку или пересчет, можно попробовать установить специальное свойство:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Формируем движения стандартным способом
Движение = Движения.ЕдиныйПланСчетовБухгалтерскогоУчета.Добавить();
Движение.Период = Дата;
Движение.СчетДт = ПланыСчетов.ЕдиныйПланСчетовБухгалтерскогоУчета.НайтиПоКоду("101.34");
// ... заполнение остальных реквизитов проводки ...
Движения.ЕдиныйПланСчетовБухгалтерскогоУчета.Записывать = Истина;
// Важный момент: выставляем флаг, который может анализироваться подписками
ЭтотОбъект.ДополнительныеСвойства.Вставить("ОтказОтСтандартногоФормированияПроводок", Истина);
ЭтотОбъект.ДополнительныеСвойства.Вставить("ПроводкиСформированыВручную", Истина);
КонецПроцедуры
Важное примечание: Имена свойств (например, "ОтказОтСтандартногоФормированияПроводок") могут отличаться в зависимости от конкретного релиза конфигурации. Рекомендуется найти в глобальном поиске по конфигурации (в основной базе) текст «ДополнительныеСвойства» внутри процедур, отвечающих за проведение, чтобы понять, какие именно ключи используются в вашей версии.
Часто проблема кроется не в коде, а в метаданных расширения. Даже если вы заимствовали регистр бухгалтерии, проверьте следующие моменты:
ЕдиныйПланСчетовБухгалтерскогоУчета должны быть явно проставлены галочки «Чтение», «Изменение» и «Просмотр».Проверить это можно в отладчике: если после строки Движения.Записать() в переменной Движения.МойРегистр.Количество() данные есть, а в консоли запросов после завершения транзакции их нет — это верный признак работы подписки или отсутствия прав на физическую запись в таблицу БД.
Разберем ситуацию с точки зрения долгосрочной поддержки. Как отмечалось в обсуждении на форуме, использование расширений для создания новых тяжелых объектов (документов с проводками) имеет свои риски. При обновлении конфигурации поставщика типовые механизмы могут измениться, и ваше расширение «сломается».
Если бизнес-задача позволяет, рассмотрите возможность использования типового документа «Операция (бухгалтерская)». Его можно создавать и заполнять программно из обработки, находящейся в расширении. Это гарантирует, что проводки пройдут через все типовые проверки и не будут удалены системой.
Если же создание собственного документа неизбежно, старайтесь максимально следовать архитектуре БГУ 2.0: используйте справочник типовых операций и стандартные процедуры общих модулей для формирования наборов записей. Это обеспечит корректность учета и отсутствие проблем с «исчезающими» данными.