Как правильно изменить проводки по счету 51 при проведении документов через расширение

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

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

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

Вариант 1. Использование расширения процедуры ОбработкаПроведения

Рассмотрим самый очевидный способ, который часто выбирают разработчики для быстрой адаптации системы. Мы создаем в расширении метод с аннотацией &После для процедуры ОбработкаПроведения конкретного документа. Логика заключается в том, чтобы после выполнения основного кода проведения перебрать коллекцию Движения.Хозрасчетный и внести правки.

Проанализируем пример кода:


&После("ОбработкаПроведения")
Процедура абБК_ОбработкаПроведения(Отказ, Режим)
    
    // Проверяем, не отказано ли уже в проведении документа
    Если Отказ Тогда
        Возврат;
    КонецЕсли;

    // Перебираем сформированные проводки
    Для Каждого СтрокаДвижения Из Движения.Хозрасчетный Цикл
        // Проверяем, относится ли проводка к счету 51
        Если СтрокаДвижения.СчетДт = ПланыСчетов.Хозрасчетный.РасчетныеСчета Тогда
             // Устанавливаем значение нового субконто (индекс зависит от настройки счета)
             СтрокаДвижения.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("НоваяАналитика")] = ЗначениеАналитики;
        КонецЕсли;
        
        Если СтрокаДвижения.СчетКт = ПланыСчетов.Хозрасчетный.РасчетныеСчета Тогда
             СтрокаДвижения.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НайтиПоНаименованию("НоваяАналитика")] = ЗначениеАналитики;
        КонецЕсли;
    КонецЦикла;    
    
КонецПроцедуры

Важный нюанс: Этот подход будет работать корректно только в том случае, если в основном коде проведения (в самой конфигурации) не вызывается явный метод Движения.Хозрасчетный.Записать(). Если метод записи был вызван внутри типовой процедуры, то изменения, внесенные в блоке &После, останутся только в памяти и не попадут в базу данных, так как платформа считает, что объект Движения уже зафиксирован. В таком случае вам придется вызывать Движения.Хозрасчетный.Записать() повторно, что существенно замедляет проведение из-за двойной записи в БД.

Вариант 2. Подписка на событие ПередЗаписью набора записей

Более универсальным и производительным методом считается использование Подписки на событие для объекта РегистрБухгалтерииНаборЗаписей.Хозрасчетный. Вместо того чтобы прописывать код в каждом документе (Поступление на расчетный счет, Списание с расчетного счета, Регламентная операция и т.д.), мы создаем один общий обработчик.

Разберем преимущества этого метода:

  1. Централизация: Код пишется один раз для всего регистра.
  2. Надежность: Аналитика заполнится независимо от того, какой документ делает проводку или был ли он проведен интерактивно или программно.
  3. Работа с ручной корректировкой: Если пользователь включил флаг РучнаяКорректировка, мы можем решить, нужно ли нам вмешиваться в его действия или оставить проводки как есть.

Пример реализации в модуле расширения:


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

    Для Каждого Запись Из Источник Цикл
        // Проверяем счет Дебета
        Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.РасчетныеСчета Тогда
            // Логика заполнения аналитики
            ЗаполнитьНовуюАналитику(Запись.СубконтоДт, Запись.Регистратор);
        КонецЕсли;
        
        // Проверяем счет Кредита
        Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.РасчетныеСчета Тогда
            ЗаполнитьНовуюАналитику(Запись.СубконтоКт, Запись.Регистратор);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Специфика конфигураций ERP и Комплексная автоматизация (КА 2.5)

Если вы работаете в 1С:ERP или 1С:КА, ситуация усложняется. В этих конфигурациях проводки по бухгалтерскому учету часто формируются не в момент проведения документа (онлайн), а через механизм отложенного отражения в регламентированном учете.

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

Для таких систем правильнее расширять модули формирования проводок, например, общие модули, содержащие логику РегламентированныйУчет, либо использовать вышеупомянутую подписку на событие регистра бухгалтерии, так как она сработает именно в момент записи набора, когда бы это ни произошло.

Проблема ручной корректировки в БП 3.0

В 1С:Бухгалтерия предприятия пользователи часто используют механизм ручной правки проводок. Выясним причину, почему это важно для программиста. Если в документе установлен признак РучнаяКорректировка = Истина, типовой механизм проведения вообще не очищает и не перезаписывает движения. Если ваш код в расширении будет слепо перетирать данные в таких документах, это вызовет конфликты с бухгалтерией.

Рекомендуем всегда добавлять проверку:


Если Источник.Отбор.Регистратор.Значение.РучнаяКорректировка Тогда
    Возврат; // Не меняем то, что бухгалтер поправил руками
КонецЕсли;

Работа с типами субконто в расширении

Когда вы добавляете новую аналитику через расширение в План Видов Характеристик ВидыСубконтоХозрасчетные, помните о следующих правилах:

Оптимизация производительности

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

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

Подведем итог: наиболее правильным и архитектурно чистым решением для изменения проводок является использование Подписки на событие регистра бухгалтерии. Это гарантирует результат вне зависимости от вида документа и способа его проведения, обеспечивая при этом стабильность работы системы в будущем.

← На главную