Как найти момент формирования проводок в документе Авансовый отчет в 1С:Комплексная автоматизация 1.1

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

При работе с конфигурациями на базе УПП 1.3 (к которым относится и Комплексная автоматизация 1.1) программисты часто сталкиваются с тем, что привычные методы отладки проводок не работают. Вы ставите точку останова в процедуре ОбработкаПроведения, проверяете коллекцию Движения.Хозрасчетный, но она оказывается пустой, хотя после закрытия документа проводки в базе появляются. Разберем подробно, почему это происходит и где именно «ловить» момент формирования записей в регистре бухгалтерии.

Особенности архитектуры проведения в КА 1.1

В отличие от более простых конфигураций (например, «Бухгалтерия предприятия»), в Комплексной автоматизации 1.1 используется механизм централизованного проведения. Основная логика вынесена из модулей документов в общие модули. Это сделано для унификации учета затрат, партионного учета и взаиморасчетов. Рассмотрим основные причины, по которым коллекция движений внутри документа может быть пустой:

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

Где искать код формирования проводок

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

В процедуре ОбработкаПроведения модуля документа АвансовыйОтчет обычно вызывается цепочка процедур из общих модулей. Ключевым местом для формирования проводок по складским операциям (закладка «Товары») является общий модуль УправлениеЗапасамиПартионныйУчет.

Найдем в этом модуле процедуру СформироватьПроводкиВсеВидыУчета(). В ней происходит перебор движений и их фактическая запись в базу данных. Рассмотрим пример кода, который отвечает за запись сформированных данных:


Для Каждого ТекущееДвижение Из Движения Цикл
    Если ТекущееДвижение.Значение.Модифицированность() Тогда
        // Именно здесь проводки улетают в базу данных
        ТекущееДвижение.Значение.Записать(Ложь);
    КонецЕсли;
КонецЦикла;

Если вы поставите точку останова на строке ТекущееДвижение.Значение.Записать(Ложь), то сможете увидеть содержимое набора записей регистра бухгалтерии непосредственно перед фиксацией в БД.

Метод отладки через модуль регистра

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

Проанализируем ситуацию: если вы зашли в ПередЗаписью и видите, что количество записей равно нулю, не спешите закрывать отладчик. Пропустите этот шаг (F5) и дождитесь следующего захода в эту же процедуру. В высоконагруженных механизмах КА 1.1 запись часто происходит «пачками» в самом конце процесса проведения.

Проводки по взаиморасчетам и затратам

Для Авансового отчета критически важны проводки по счету 71 («Расчеты с подотчетными лицами»). Они могут формироваться в других модулях в зависимости от содержания документа:

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

Почему количество движений в документе равно 0?

Выясним причину, почему Источник.Движения.Хозрасчетный.Количество() в подписках на события выдает ноль. В конфигурации Комплексная автоматизация 1.1 многие документы используют свойство ЗаписыватьДвиженияПриПроведении = Ложь или управляют записью вручную. Это означает, что стандартная коллекция Движения объекта документа может вообще не заполняться привычным способом Движения.Хозрасчетный.Добавить().

Вместо этого используется объект типа Набор записей, который создается программно внутри общих модулей. Этот набор записей «не знает» о коллекции Движения, которая находится в памяти у объекта ДокументОбъект, он оперирует напрямую с данными регистра в транзакции.

Итоговый алгоритм поиска:

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

Важный момент: Если в базе включен режим РАУЗ, помните, что часть проводок по себестоимости может формироваться не в момент проведения документа, а позже — при выполнении регламентной операции «Расчет себестоимости выпуска» в конце месяца. Однако сам факт задолженности перед подотчетным лицом (счет 71) всегда фиксируется сразу при проведении Авансового отчета.

← На главную