Почему возникают двойные проводки при списании РБП и как отладить регламентные операции в 1С

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

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

Понимание механизма списания РБП

Прежде чем приступать к отладке, проанализируем, как работает механизм списания. В «1С:Бухгалтерии 8» расчет списания РБП выполняется документом РегламентнаяОперация с видом операции «Списание расходов будущих периодов». Алгоритм системы опирается на два основных источника данных:

  1. Остатки по счету 97 «Расходы будущих периодов» в разрезе субконто (Контрагенты, Статьи затрат, РБП).
  2. Данные регистра накопления «Расходы будущих периодов». Именно этот регистр зачастую является первичным для расчета суммы текущего списания.

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

Настройка отладки фоновых заданий на сервере

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


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

Для того чтобы «поймать» выполнение кода внутри процедуры ЗапуститьВыполнениеИзФормы, которая исполняется в отдельном сеансе на сервере, выполним следующие шаги:

  1. Проверим параметры запуска сервера. Убедимся, что сервер «1С:Предприятия» запущен с ключом -debug. Без этого ключа отладка на сервере невозможна в принципе.
  2. Настроим автоматическое подключение. В конфигураторе перейдем в меню Отладка — Подключение.
  3. В открывшемся окне нажмем кнопку Автоматическое подключение.
  4. Установим флажок напротив пункта Фоновые задания. Это критически важно: теперь конфигуратор будет автоматически подхватывать любой новый сеанс фонового задания, инициированный сервером.
  5. Установим точку останова в общем модуле, где происходит непосредственный расчет или запись проводок.

После этого запустим закрытие месяца или перепроведение регламентной операции. Конфигуратор должен «остановиться» на выбранной строке кода, даже если она выполняется в контексте фонового процесса.

Поиск причины двойных проводок в коде

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

Анализ подписок на события

Наиболее вероятной причиной «мистического» появления лишних записей являются Подписки на события. В современных конфигурациях разработчики часто добавляют собственные механизмы для дополнительного контроля или трансляции данных. Проанализируем подписки для объекта ДокументОбъект.РегламентнаяОперация или РегистрБухгалтерииНаборЗаписей.Хозрасчетный.

Посмотрим на пример логической ошибки в подписке ПередЗаписью или ПриЗаписи:


Процедура ПриЗаписиРегламентнойОперации(Источник, Отказ) Экспорт
    // Если здесь программно вызывается запись движений без очистки старых
    // или повторно запускается алгоритм расчета, это приведет к дублированию
    Источник.Движения.Хозрасчетный.Записать(); 
КонецПроцедуры

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

Методика диагностики через консоль запросов

Если отладка кодом затруднена, проанализируем состояние данных до и после выполнения операции с помощью консоли запросов. Нам необходимо сравнить данные в следующих таблицах:

Выясним, на каком этапе происходит удвоение. Если в таблице Движения после выполнения метода Записать() строк в два раза больше, чем было в коллекции Движения в памяти перед записью, значит, работают механизмы платформы или подписки на уровне БД.

Альтернативные причины двойных записей

Проанализируем другие возможные факторы, которые могут выглядеть как двойная запись:

  1. Настройка способов отражения расходов. Зайдем в карточку конкретного РБП и проверим Способ отражения в расходах. Если в табличной части способа указаны две одинаковые статьи затрат с распределением (например, 50% на одну статью и 50% на ту же самую), система создаст две проводки. Для пользователя это может выглядеть как дублирование общей суммы.
  2. Дублирование элементов справочника РБП. Часто создаются два элемента с одинаковым названием. Один используется в документах поступления, а другой — в настройках закрытия месяца. Проверим справочник РасходыБудущихПериодов на наличие дублей через стандартный поиск или обработку «Поиск и удаление дублей».
  3. Ручные корректировки. Если в документе регламентной операции установлен флаг Ручная корректировка, система перестает автоматически обновлять движения при перепроведении. Если при этом программно вызываются какие-то обработчики, они могут наслаиваться на уже существующие ручные записи.

Итоги и рекомендации

Подведем итог нашего исследования. Для устранения двойных записей при списании РБП рекомендуем действовать по алгоритму:

Как показывает практика, в 90% случаев проблема кроется либо в некорректных доработках (подписки), либо в «мусорных» данных в справочниках и регистрах сведений. Использование инструментов отладки фоновых заданий позволяет быстро локализовать участок кода, ответственный за лишние движения, и исправить ошибку.

← На главную