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