Как добавить свою проводку при проведении документа в 1С:Комплексная автоматизация 2 и 1С:ERP

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

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

Выясним причину: почему стандартный подход не работает?

В обычных конфигурациях проводки формируются непосредственно в момент проведения документа. В КА 2 и ERP реализован механизм отложенного проведения по регл. учету. Это означает следующее:

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

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

Проанализируем архитектуру формирования проводок

Чтобы наша проводка стала «родной» для системы, нам нужно вклиниться в процесс подготовки данных для отражения в регламентированном учете. В современных версиях КА и ERP этот процесс вынесен в менеджер документа. Именно там находятся функции, которые формируют тексты запросов для сбора данных, на основании которых система «рисует» проводки.

Рассмотрим основные функции в менеджере документа, которые нас интересуют:

Решение 1: Использование расширения для изменения запроса в менеджере

Это самый правильный и «чистый» способ. Мы создадим расширение и добавим в него метод менеджера документа, используя аннотацию &После или &Вместо. Наша задача — изменить текст запроса так, чтобы в выборку попали данные для нашей новой проводки.

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


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

Важно: При таком подходе система сама создаст проводку, заполнит субконто и обеспечит сохранность записи при перепроведении.

Решение 2: Использование механизма ручной корректировки

Если задача разовая или крайне специфичная, можно программно установить флаг ручной корректировки. В ERP-системах это свойство РучнаяКорректировка. Если оно установлено в значение Истина, типовой механизм отражения в регл. учете перестает трогать этот документ.

Рассмотрим, как это выглядит в коде ОбработкаПроведения (в расширении):


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

Внимание: У этого способа есть огромный минус. После установки РучнаяКорректировка = Истина типовые проводки документа больше не будут обновляться автоматически при изменении сумм или номенклатуры. Пользователю придется либо обновлять их руками, либо снимать флаг, что удалит вашу кастомную проводку.

Решение 3: Подключение к общему модулю отражения

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

Рассмотрим преимущества этого метода:

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

Подведем итоги

Выбор метода зависит от ваших целей. Если вы хотите глубоко интегрировать свою логику в систему — используйте Решение №1 (изменение запросов в менеджере). Это гарантирует, что проводки будут вести себя так же, как типовые. Если нужно быстро «приклеить» проводку и вы готовы пожертвовать автоматическим обновлением — используйте Решение №2.

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

← На главную