Как методологически правильно изменить или добавить бухгалтерские проводки в 1С:ERP?

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

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

В этой статье мы подробно разберем архитектуру формирования регламентированных проводок в 1С:ERP, выясним, почему стандартные подписки здесь не работают, и рассмотрим по шагам методологически верные способы программной доработки.

---

Почему стандартная подписка на событие «ОбработкаПроведения» не подходит?

Для начала проанализируем архитектуру проведения. В классических конфигурациях (например, в «1С:Бухгалтерии») проводки формируются непосредственно в момент оперативного проведения документа пользователем. В 1С:ERP реализован принципиально иной подход — механизм отложенного отражения документов в регламентированном учете.

Когда пользователь проводит документ в ERP, система регистрирует лишь оперативные движения по регистрам накопления (товары на складах, расчеты с клиентами и т.д.). Записи в регистр бухгалтерии Хозрасчетный в этот момент вообще не создаются. Они формируются позже:

  1. Вручную пользователем через специализированное рабочее место «Отражение документов в регл. учете».
  2. Автоматически по расписанию через регламентные задания.
  3. В процессе выполнения обязательных процедур закрытия месяца.

Если мы попытаемся перехватить проведение документа через подписку на событие ОбработкаПроведения или событие ПередЗаписью регистра бухгалтерии Хозрасчетный, то столкнемся со следующими проблемами:

---

Архитектура формирования проводок в 1С:ERP

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

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

Таким образом, методологически верный путь изменения проводок — это вмешательство в процесс подготовки этих запросов внутри модуля менеджера документа.

---

Вариант 1. Использование расширения конфигурации и переопределение запросов (Рекомендуемый)

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

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

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

Посмотрим на пример кода в расширении для добавления дополнительной проводки:


&После("ДобавитьЗапросыОтраженияВРеглУчете")
Процедура ИмяРасш_ДобавитьЗапросыОтраженияВРеглУчете(СтруктураЗапросов, ПараметрыАрхитектуры)
    
    // Сформулируем текст нашего дополнительного запроса
    ТекстДополнительногоЗапроса = 
    "ВЫБРАТЬ
    |    Реализация.Ссылка КАК Регистратор,
    |    Реализация.Организация КАК Организация,
    |    &Период КАК Период,
    |    ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПрочиеРасходы) КАК СчетДт,
    |    ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Вспомогательный) КАК СчетКт,
    |    Реализация.СуммаДокумента * 0.1 КАК Сумма, // Например, выделяем 10% на доп. расходы
    |    Реализация.Валюта КАК Валюта,
    |    ЛОЖЬ КАК Активность
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК Реализация
    |ГДЕ
    |    Реализация.Ссылка = &Ссылка";
    
    // Добавляем наш запрос в общую структуру пакета запросов документа
    СтруктураЗапросов.Вставить("МояДополнительнаяПроводка", ТекстДополнительногоЗапроса);

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

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

---

Вариант 2. Использование обработчиков после формирования проводок

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

Для этого проанализируем общий модуль, отвечающий за проведение по регл. учету (например, РегламентированныйУчетПроведениеСервер или аналогичный в вашей редакции). Разберем алгоритм интеграции:

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

Посмотрим на пример реализации такого подхода:


&Перед("ЗаписатьПроводкиДокумента")
Процедура ИмяРасш_ПередЗаписатьПроводкиДокумента(ДокументСсылка, ТаблицаПроводок)
    
    // Проверяем тип обрабатываемого документа
    Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
        
        // Создаем новую строку проводки в существующей таблице проводок
        НоваяПроводка = ТаблицаПроводок.Добавить();
        НоваяПроводка.Период = ДокументСсылка.Дата;
        НоваяПроводка.Организация = ДокументСсылка.Организация;
        
        // Заполняем счета и аналитику
        НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.02");
        НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.01");
        
        // Назначаем сумму
        НоваяПроводка.Сумма = 500; // Пример фиксированной суммы или расчетного алгоритма
        
    КонецЕсли;
    
КонецПроцедуры

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

---

Вариант 3. Если необходимо добавить проводки для полностью самописного документа

Если вы создали в системе новый уникальный документ и хотите, чтобы он полноценно участвовал в контуре регламентированного учета ERP, вам нужно «подружить» его с общим движком проводок. Выполним это по шагам:

  1. В свойствах вашего нового документа в конфигураторе укажите, что он является регистратором для регистра бухгалтерии Хозрасчетный и регистра сведений ОтражениеДокументовВРеглУчете.
  2. Откройте модуль менеджера вашего документа и добавьте процедуру регистрации учетных механизмов:
    
    Процедура ЗарегистрироватьУчетныеМеханизмы(ПараметрыРегистрации) Экспорт
        ПараметрыРегистрации.Вставить("РегламентированныйУчет");
    КонецПроцедуры
    
  3. В этом же модуле менеджера опишите процедуру, которая будет возвращать структуру запросов для формирования движений (например, ДанныеДокументаДляПроведения или аналогичную, в зависимости от версии вашей БСП и ERP). Посмотрите на пример структуры:
    
    Процедура ПодготовитьДанныеДляПроведения(Ссылка, ПараметрыПроведения, ТаблицыДокумента) Экспорт
        // Здесь описывается логика формирования запросов для вашего документа
    КонецПроцедуры
    

---

Альтернативные (непрограммные) методы решения задачи

Прежде чем приступать к написанию кода и созданию расширений, мы настоятельно рекомендуем проверить, нельзя ли решить бизнес-задачу стандартными средствами ERP. В системе заложено колоссальное количество гибких настроек, которые часто делают программирование избыточным.

  1. Настройка ГФУ (Групп финансового учета): Если ваша цель состоит в том, чтобы изменить счета по умолчанию (например, вместо 41-го счета использовать 10-й при определенных условиях), код писать не нужно. Достаточно создать новые элементы в справочниках Групп финансового учета номенклатуры, расчетов или номенклатуры и привязать их к соответствующим карточкам объектов. Система сама подставит нужные счета в проводки.
  2. Использование ручной корректировки проводок: Если кастомная проводка нужна разово или в виде исключения для конкретного документа, можно воспользоваться стандартной функцией ручной корректировки.
    • Перейдите в меню: НСИ и администрирование — Настройка НСИ и разделов — Регламентированный учет — Сервисные функции.
    • Активируйте опцию «Ручное изменение проводок документов».
    • После этого в форме просмотра проводок (Дт/Кт) любого отраженного в учете документа появится флаг «Ручная корректировка». При его установке вы сможете вручную добавлять, удалять или редактировать любые проводки.
    • Важное предупреждение: после включения ручной корректировки автоматическое обновление проводок для данного документа прекращается. При перепроведении документа оперативные данные изменятся, а проводки останутся прежними (ручными), что может привести к расхождениям между оперативным и регламентированным учетом.

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

← На главную