В каком модуле БП 3.0 формируются проводки документа Реализации по зачету авансов и как правильно доработать этот механизм

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

При сопровождении и доработке конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) разработчики часто сталкиваются с необходимостью кастомизации проводок. Типичная ситуация: в базе существует старая доработка (например, внешняя обработка или прямое изменение конфигурации), которая переопределяет логику зачета авансов и формирование движений по счетам 62 (Расчеты с покупателями и заказчиками) и 90 (Продажи). После очередного релиза 1С типовые алгоритмы обновляются, порядок проводок меняется, счета «встают не туда», и система начинает работать некорректно.

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

Архитектура проведения документов в БП 3.0

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

В БП 3.0 архитектура претерпела кардинальные изменения. Фирма «1С» перевела большинство механизмов проведения на концепцию БСП (Библиотеки стандартных подсистем) и оптимизированное «проведение по таблицам». Теперь процедура ОбработкаПроведения в модуле объекта выполняет лишь роль диспетчера. Она не формирует проводки напрямую, а делегирует эту задачу общим модулям и модулю менеджера документа.

Рассмотрим стандартную схему, по которой работает проведение документа:

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

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

Если вам необходимо понять, как программа распределяет авансы и формирует проводки по дебету и кредиту счетов 62 и 90, анализировать модуль объекта документа практически бесполезно. Основная логика распределения сумм и подбора счетов сосредоточена в следующих местах:

1. Общий модуль УчетВзаиморасчетов

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

2. Общий модуль УчетНДС

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

Почему после обновления порядок проводок и счета «встают» иначе

Фирма «1С» регулярно оптимизирует алгоритмы проведения с целью повышения производительности (особенно для систем с большим объемом данных) и соответствия меняющемуся законодательству. При обновлениях происходят следующие изменения:

Как локализовать проблему с помощью отладчика

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

  1. Откройте конфигуратор и найдите модуль объекта документа РеализацияТоваровУслуг.
  2. Найдите процедуру ОбработкаПроведения и установите точку останова в самом начале.
  3. Запустите сеанс в режиме отладки, откройте нужный документ реализации и нажмите кнопку «Провести».
  4. После остановки системы на точке перейдите по шагам (клавиша F11) внутрь процедур проведения.
  5. Обратите внимание на вызовы методов общего модуля ПроведениеСервер и процедур формирования движений по взаиморасчетам. Вы неизбежно попадете в модуль УчетВзаиморасчетов, где сможете в реальном времени отследить, как заполняется таблица значений, содержащая будущие проводки по счету 62.

Правильные способы доработки проводок без изменения типового кода

Прямая модификация кода в общих модулях УчетВзаиморасчетов и УчетНДС — это крайне нежелательный путь (так называемый «треш-код»), который сделает каждое последующее обновление конфигурации долгим и болезненным процессом. Для безопасной кастомизации проводок в платформе «1С:Предприятие 8.3» существуют два основных инструмента: Подписки на события и Расширения конфигурации.

Способ А. Использование расширения конфигурации

Механизм расширений позволяет перехватывать выполнение типовых методов с помощью аннотаций &Перед, &После или &Вместо. Если вам нужно изменить логику проведения конкретного документа (например, Реализации), вы можете перехватить процедуру проведения в модуле объекта документа.

Рассмотрим пример кода в расширении конфигурации с использованием аннотации &После для процедуры ОбработкаПроведения. На этом этапе все типовые проводки уже сформированы и находятся в коллекции движений документа, но еще не записаны в базу данных окончательно. Мы можем программно обойти их и изменить счета или порядок:


&После("ОбработкаПроведения")
Процедура Расш_ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Если проведение уже отменено другими механизмами, ничего не делаем
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем коллекцию проводок регистра бухгалтерии Хозрасчетный
    ПроводкиБухгалтерии = ЭтотОбъект.Движения.Хозрасчетный;
    
    // Обходим проводки и корректируем счета учета или аналитику по нашей логике
    Для Каждого СтрокаПроводки Из ПроводкиБухгалтерии Цикл
        
        // Например, заменим счет расчетов с 62.01 на наш субсчет при определенных условиях
        Если СтрокаПроводки.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели Тогда
            // Проверим дополнительное условие (например, вид договора)
            Если СтрокаПроводки.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры].ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем Тогда
                // Меняем счет дебета на нужный
                // СтрокаПроводки.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.ХХ"); 
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
    // Если требуется изменить физический порядок следования проводок в наборе
    // Мы можем выгрузить их в ТаблицуЗначений, отсортировать и загрузить обратно
    ТаблицаПроводок = ПроводкиБухгалтерии.Выгрузить();
    
    // Сортируем таблицу по нужному нам алгоритму (например, по счету или сумме)
    ТаблицаПроводок.Сортировать("СчетДт Возр, Сумма Возр");
    
    // Очищаем старые движения и загружаем отсортированные
    ПроводкиБухгалтерии.Очистить();
    ПроводкиБухгалтерии.Загрузить(ТаблицаПроводок);
    
КонецПроцедуры

Способ Б. Создание подписки на событие

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

Разберем по шагам, как настроить такую подписку:

  1. В конфигураторе создайте новый объект метаданных Подписка на событие.
  2. В свойстве Источник выберите документ ДокументОбъект.РеализацияТоваровУслуг (или несколько необходимых документов).
  3. В свойстве Событие выберите ОбработкаПроведения.
  4. В качестве Обработчика укажите процедуру в вашем собственном нетиповом общем модуле (например, спВзаиморасчетыСервер.ОбработкаПроведенияКорректировкаПроводок).

Код обработчика в вашем общем модуле будет выглядеть следующим образом:


Процедура ОбработкаПроведенияКорректировкаПроводок(Источник, Отказ, РежимПроведения) Экспорт
    
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    // Движения документа доступны через параметр "Источник"
    НаборЗаписей = Источник.Движения.Хозрасчетный;
    
    // Проверяем, записаны ли уже движения в базу данных. 
    // Если нет, их нужно принудительно прочитать, если они формировались в транзакции проведения
    Если НаборЗаписей.Количество() = 0 Тогда
        НаборЗаписей.Прочитать();
    КонецЕсли;
    
    Модифицировано = Ложь;
    
    Для Каждого Запись Из НаборЗаписей Цикл
        // Пример изменения аналитики или счетов
        Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.ПродажиСубсчетВыручка Тогда
            // Наша специфическая логика распределения доходов
            // Запись.СчетКт = ...
            Модифицировано = Истина;
        КонецЕсли;
    КонецЦикла;
    
    // Записываем набор, если вносили изменения
    Если Модифицировано Тогда
        НаборЗаписей.Записать(Истина);
    КонецЕсли;
    
КонецПроцедуры

Этот подход гарантирует стабильность вашей конфигурации при обновлениях: типовые модули УчетВзаиморасчетов и УчетНДС обновляются в штатном режиме, а ваша логика отрабатывает строго в конце транзакции проведения, гарантируя корректность ваших специфических проводок.

← На главную