Почему затираются программно добавленные проводки в 1С:ERP и КА 2 и как это исправить?

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

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

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

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

Причина проблемы: архитектура отложенного проведения в 1С:ERP и КА 2

Для начала рассмотрим, как устроена современная ERP-платформа изнутри. В отличие от простых конфигураций, в 1С:ERP и 1С:Комплексной автоматизации 2.0 разделены оперативный и регламентированный учеты.

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

Формированием бухгалтерских проводок занимается специальный фоновый механизм — отложенное отражение в регламентированном учете. Этот процесс может запускаться вручную пользователем по кнопке «Отразить в регл. учете» из формы проводки документа, либо регламентным заданием по расписанию, либо в рамках процедуры закрытия месяца.

В момент запуска этого механизма система обращается к общему модулю РеглУчетПроведениеСервер. Алгоритм полностью очищает все движения по регистру Хозрасчетный для данного документа-регистратора и формирует их заново на основе правил, прописанных в системе, и данных оперативных регистров. Любые движения, которые вы записали напрямую в обход этого механизма, стираются без предупреждения.

Как же обойти это ограничение? Рассмотрим подробнее три практических метода реализации.

Вариант 1. Декларативный метод через расширение (Рекомендуемый)

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

Система 1С:ERP строит проводки на основе SQL-запросов, которые собирают данные во временные таблицы. Для каждого документа правила формирования этих таблиц описаны в модуле его менеджера (или в специализированных модулях локализации, например, РеализацияТоваровУслугЛокализация).

В модуле менеджера документа за это отвечают две ключевые экспортные функции:

  1. ТекстЗапросаВТОтраженияВРеглУчете() — подготавливает временные таблицы с данными документа (аналитика, суммы, направления деятельности).
  2. ТекстОтраженияВРеглУчете() — описывает правила генерации дебетовых и кредитовых записей на основе подготовленных временных таблиц.

Давайте разберем по шагам, как добавить свои проводки с использованием этого механизма через расширение конфигурации:

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

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


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

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

Вариант 2. Метод с использованием дополнительных свойств и общих модулей

Бывают ситуации, когда логика расчета суммы проводки или подбора аналитики слишком сложна и ее невозможно (или крайне трудоемко) описать в виде чистого SQL-запроса внутри ТекстОтраженияВРеглУчете. Если вам жизненно необходимо рассчитать проводку на встроенном языке 1С и записать ее "руками", выполните следующие действия.

Во-первых, при записи набора записей в процедуре проведения (или в подписке на событие) передайте системе специальный сигнал о том, что этот набор трогать не нужно. Для этого используется коллекция ДополнительныеСвойства набора записей.

Рассмотрим пример кода, который необходимо разместить в обработчике проведения документа:


// Сформируем проводку программно
НаборЗаписей = Движения.Хозрасчетный;
НоваяСтрока = НаборЗаписей.Добавить();
НоваяСтрока.Период = Дата;
НоваяСтрока.Регистратор = Ссылка;
НоваяСтрока.Организация = Организация;
// Заполнение счетов и субконто...
НоваяСтрока.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");
НоваяСтрока.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
НоваяСтрока.Сумма = 15000;

// Устанавливаем флаг отмены перезаписи для конкретного набора
НаборЗаписей.ДополнительныеСвойства.Вставить("НеВыполнятьДопОбработкуПроводок", Истина);
НаборЗаписей.Записывать = Истина;

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

Этот запрос отвечает за сбор уже существующих ручных и кастомных проводок в регистре, которые система должна объединить с автоматически сгенерированными движениями, а не перезаписать их. Вам потребуется добавить в этот запрос условие выбора ваших программных проводок (например, идентифицируя их по типу документа-регистратора и уникальному значению в поле "Содержание" или "Комментарий").

Вариант 3. Пользовательское ручное изменение проводок (Без программирования)

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

Разберем по шагам, как его активировать и использовать:

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

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

Резюме и рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от ваших бизнес-требований:

Применяйте правильные архитектурные шаблоны проектирования в 1С:ERP и Комплексной автоматизации 2.0, и ваши проводки больше никогда не пропадут!

← На главную