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

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

При переходе с конфигурации БГУ 1.0 на БГУ 2.0 разработчики часто сталкиваются с ситуацией, когда привычные методы разработки перестают работать. Одной из самых распространенных проблем является «исчезновение» проводок: программист создает новый документ в расширении, пишет код формирования движений по регистру бухгалтерии, в отладчике видит заполненный набор записей, но после завершения транзакции проведения регистр остается пустым. При этом система не выдает никаких ошибок.

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

Анализируем причину: почему стандартный подход не работает?

В простых конфигурациях или в старых редакциях (как БГУ 1.0) за формирование проводок отвечает исключительно процедура ОбработкаПроведения в модуле документа. Если в коде прописано Движения.ЕдиныйПланСчетовБухгалтерскогоУчета.Записывать = Истина, система фиксирует записи в базе данных.

Однако в БГУ 2.0 реализована принципиально иная концепция — подсистема «Бухгалтерские операции». Рассмотрим основные причины, по которым ваши проводки могут затираться:

  1. Глобальные подписки на события: В конфигурации существуют подписки (например, на событие ОбработкаПроведения), которые срабатывают после выполнения кода в модуле документа. Эти подписки инициируют работу типового механизма формирования проводок. Если ваш документ не «зарегистрирован» в этой подсистеме, механизм может просто очистить движения, считая их ошибочными или неактуальными.
  2. Централизованный механизм записи: Типовая логика БГУ 2.0 предполагает, что проводки строятся на основании справочника БухгалтерскиеОперации и выбранной в документе типовой операции. Если в документе не указана операция или она не настроена, подсистема может принудительно обнулить набор записей регистра.
  3. Права доступа в расширении: Если вы используете заимствованный регистр бухгалтерии, необходимо убедиться, что в расширении добавлены соответствующие роли с правами на «Изменение» и «Запись» для этого регистра. Без этого данные могут отображаться в памяти отладчика, но не фиксироваться в СУБД.

Разбираем архитектуру подсистемы бухгалтерских операций

Чтобы проводки сохранялись, документ должен «вписаться» в логику конфигурации. В БГУ 2.0 проводки — это не просто код, это результат обработки данных документа специальным движком. Проанализируем, как работает этот механизм:

Система ищет в документе реквизит (обычно это ТиповаяОперация), который ссылается на справочник БухгалтерскиеОперации. Для каждой операции настроены правила: какие счета использовать, откуда брать КБК, КОСГУ и суммы. Документ в данном случае выступает лишь источником данных.

Если мы создаем документ в расширении, он по умолчанию не является источником данных для этой подсистемы. Поэтому любые попытки записать движения «напрямую» конфликтуют с логикой «контролера» в виде глобальных подписок.

Решение №1: Интеграция документа в типовой механизм

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

1. Добавим в наш документ в расширении реквизит ТиповаяОперация с типом ссылки на справочник БухгалтерскиеОперации. Это позволит пользователю в режиме предприятия выбирать нужную схему проводок.

2. Нам необходимо сделать документ видимым для подсистемы. Для этого нужно расширить определяемый тип ИсточникДанныхДляБухгалтерскогоУчета (или аналогичный в вашей версии БГУ), включив туда наш новый документ.

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


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Подготавливаем дополнительные свойства для типового механизма
    ДополнительныеСвойства.Вставить("ВыполнитьФормированиеПроводок", Истина);
КонецПроцедуры

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

Решение №2: Программный «обход» очистки движений

Если вы категорически не хотите использовать типовой механизм и вам нужно жестко прописать проводки кодом (как в БГУ 1.0), необходимо «сообщить» системе, что ваши движения легитимны и их не нужно трогать. Выясним, как это сделать через ДополнительныеСвойства.

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


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Формируем движения стандартным способом
    Движение = Движения.ЕдиныйПланСчетовБухгалтерскогоУчета.Добавить();
    Движение.Период = Дата;
    Движение.СчетДт = ПланыСчетов.ЕдиныйПланСчетовБухгалтерскогоУчета.НайтиПоКоду("101.34");
    // ... заполнение остальных реквизитов проводки ...
    
    Движения.ЕдиныйПланСчетовБухгалтерскогоУчета.Записывать = Истина;
    
    // Важный момент: выставляем флаг, который может анализироваться подписками
    ЭтотОбъект.ДополнительныеСвойства.Вставить("ОтказОтСтандартногоФормированияПроводок", Истина);
    ЭтотОбъект.ДополнительныеСвойства.Вставить("ПроводкиСформированыВручную", Истина);

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

Важное примечание: Имена свойств (например, "ОтказОтСтандартногоФормированияПроводок") могут отличаться в зависимости от конкретного релиза конфигурации. Рекомендуется найти в глобальном поиске по конфигурации (в основной базе) текст «ДополнительныеСвойства» внутри процедур, отвечающих за проведение, чтобы понять, какие именно ключи используются в вашей версии.

Решение №3: Работа с правами в расширении

Часто проблема кроется не в коде, а в метаданных расширения. Даже если вы заимствовали регистр бухгалтерии, проверьте следующие моменты:

Проверить это можно в отладчике: если после строки Движения.Записать() в переменной Движения.МойРегистр.Количество() данные есть, а в консоли запросов после завершения транзакции их нет — это верный признак работы подписки или отсутствия прав на физическую запись в таблицу БД.

Рекомендации по проектированию

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

Если бизнес-задача позволяет, рассмотрите возможность использования типового документа «Операция (бухгалтерская)». Его можно создавать и заполнять программно из обработки, находящейся в расширении. Это гарантирует, что проводки пройдут через все типовые проверки и не будут удалены системой.

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

← На главную