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