Как изменить реквизиты проводок в 1С:ERP 2.5 через расширение?

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

Разработка в системе 1С:ERP Управление предприятием 2 существенно отличается от классической 1С:Бухгалтерии. Одной из самых частых проблем для начинающих разработчиков является попытка изменить проводки в процедуре ОбработкаПроведения. Проанализируем, почему стандартный подход "заполнить набор записей и записать" здесь не работает, и разберем правильные методы модификации движений регистра Хозрасчетный.

Почему Движения.Хозрасчетный пустые при проведении документа?

Первое, что мы должны понять: в 1С:ERP реализован механизм отложенного формирования проводок. Когда пользователь нажимает кнопку "Провести", документ делает движения только по оперативным регистрам накопления (например, выручка, себестоимость, расчеты с клиентами). Регистр бухгалтерии в этот момент остается пустым.

Процесс отражения в регламентированном учете запускается либо вручную из специального рабочего места, либо регламентным заданием. Именно поэтому попытка перехватить движения через &После("ОбработкаПроведения") в расширении не приносит результата — данных в регистре Хозрасчетный на этот момент просто нет. Выясним, где на самом деле рождаются проводки и как вклиниться в этот процесс.

Способ 1: Модификация текстов запросов в модуле менеджера

В ERP 2.5 логика формирования проводок вынесена в модуль менеджера каждого конкретного документа. Рассмотрим область ПроведениеПоРеглУчету. Система собирает данные из оперативных регистров самого документа с помощью сложных запросов и на их основе формирует таблицу проводок.

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

Разберем по шагам алгоритм действий в расширении:

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

Посмотрим на пример кода, который модифицирует текст запроса:


&Вместо("ТекстЗапросаТаблицаПрочиеДоходыРасходы")
Функция Расш1_ТекстЗапросаТаблицаПрочиеДоходыРасходы(ПараметрыЗапроса)
    ТекстЗапроса = ПродолжитьВызов(ПараметрыЗапроса);
    
    // Заменяем стандартную подстановку статьи на логику с доп. реквизитом
    СтараяСтрока = "Операция.СтатьяРасходов КАК СубконтоКт1,";
    НоваяСтрока = 
        "ВЫБОР 
        |   КОГДА Документ.ДополнительныйРеквизит_НужнаяСтатья <> ЗНАЧЕНИЕ(ПланВидовХарактеристик.СтатьиРасходов.ПустаяСсылка) 
        |   ТОГДА Документ.ДополнительныйРеквизит_НужнаяСтатья 
        |   ИНАЧЕ Операция.СтатьяРасходов 
        |КОНЕЦ КАК СубконтоКт1,";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, СтараяСтрока, НоваяСтрока);
    
    Возврат ТекстЗапроса;
КонецФункции

Этот метод является наиболее корректным, так как он не нарушает логику системы: проводка сразу формируется с правильными данными.

Способ 2: Использование точки расширения в модуле менеджера регистра Хозрасчетный

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

Проанализируем ситуацию: этот метод проще в реализации, но требует осторожности, так как он срабатывает при проведении любого документа в системе. Обязательно нужно проверять тип регистратора.

Пример реализации в расширении для модуля менеджера регистра Хозрасчетный:


&После("ВыполнитьДопОбработкуПроводок")
Процедура Расш1_ВыполнитьДопОбработкуПроводок(Проводки)
    // Проверяем, что работаем именно с нужным документом
    Если ТипЗнч(Проводки.Отбор.Регистратор.Значение) <> Тип("ДокументСсылка.КорректировкаРеализации") Тогда
        Возврат;
    КонецЕсли;

    // Читаем значение доп. реквизита из документа
    СсылкаНаДок = Проводки.Отбор.Регистратор.Значение;
    НоваяСтатья = СсылкаНаДок.ДополнительныйРеквизит_НужнаяСтатья;

    Если ЗначениеЗаполнено(НоваяСтатья) Тогда
        Для Каждого СтрокаПроводки Из Проводки Цикл
            // Проверяем условия счета (например, 91.02)
            Если СтрокаПроводки.СчетДт = ПланыСчетов.Хозрасчетный.ПрочиеРасходы Тогда
                // Заменяем Субконто1 (обычно это Статьи расходов)
                СтрокаПроводки.СубконтоДт[ПланыВидовХарактеристик.СтатьиДоходовИРасходов.СтатьиРасходов] = НоваяСтатья;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

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

Синхронизация БУ и оперативного учета

В ERP 2.5 принцип "двойной записи" поддерживается не только в бухгалтерии, но и в оперативных данных. Если вы меняете аналитику в проводке, проанализируем, не нужно ли поменять её и в источнике данных — регистрах накопления.

Именно поэтому Способ 1 (через запросы в модуле менеджера) считается приоритетным. Когда вы меняете запрос, система часто берет измененные данные не "с потолка", а из тех же временных таблиц, которые использовались для формирования движений по регистрам ПрочиеРасходы или ВыручкаИСебестоимостьПродаж. Это гарантирует сходимость данных.

Как эффективно отлаживать формирование проводок?

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

  1. Перейдите в раздел Регламентированный учет — Отражение документов в регл. учете.
  2. В списке найдите ваш документ (он должен быть в статусе "Ожидает отражения" или уже отражен).
  3. Установите точку остановки в модуле менеджера документа в области ПроведениеПоРеглУчету.
  4. В форме "Отражение документов в регл. учете" выберите ваш документ и нажмите кнопку Отразить в учете.

Только при таком сценарии отладчик остановится в нужном месте, и вы сможете просмотреть содержимое временных таблиц и тексты запросов, которые формирует система. Обратите внимание на объект МенеджерВременныхТаблиц — в ERP он активно используется для передачи данных между различными этапами формирования движений.

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

Если вы добавили реквизит через механизм Дополнительных реквизитов и сведений (без изменения метаданных в конфигураторе), то обращение к нему в запросе будет выглядеть иначе. Вам придется соединяться с табличной частью документа ДополнительныеРеквизиты, фильтруя по конкретному значению свойства.

Если же вы используете расширение для добавления физического реквизита в объект Документ, убедитесь, что в свойствах расширения не стоит галочка "Использовать только в БСП", иначе реквизит может быть недоступен в сложных запросах формирования проводок.

Подведем итог: замена реквизитов в проводках ERP 2.5 — задача не "глупая", а требующая понимания архитектуры отложенного проведения. Использование &Вместо для функций, возвращающих тексты запросов в модуле менеджера документа, является "золотым стандартом" разработки для данной конфигурации. В качестве готового решения для настройки аналитики проводок по документам можно использовать расширение для формирования проводок с детализацией в 1С:ERP.

← На главную