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