Как добавить дополнительные проводки в типовой документ 1С без снятия с поддержки?

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

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

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

Решение 1: Использование Расширений Конфигурации

Расширения конфигурации – это наиболее рекомендуемый и современный способ модификации типовых конфигураций 1С без изменения их основной структуры. Мы можем рассматривать расширение как своего рода "накладку" на основную конфигурацию, которая позволяет добавлять новый функционал или изменять существующий, не затрагивая при этом исходный код.

Почему расширения предпочтительны?

  1. Легкость обновлений: При обновлении типовой конфигурации расширение "отключается", позволяя обновиться, а затем снова "накладывается". Это значительно упрощает процесс поддержки.
  2. Неинвазивность: Мы не изменяем исходный код типовой конфигурации, что минимизирует риски и облегчает отладку.
  3. Гибкость: Расширения позволяют добавлять собственные объекты, модули, формы, а также изменять существующие процедуры и функции.

Как добавить проводки с помощью расширения?

Мы можем использовать расширение для модификации процедуры ОбработкаПроведения типового документа. Для этого в расширении нам потребуется создать новый модуль объекта для нашего документа и использовать специальную аннотацию.

Рассмотрим подробнее механизм работы. В модуле объекта документа расширения мы можем переопределить стандартную процедуру проведения. Например, если нам нужно добавить свои проводки после стандартного формирования движений, мы можем использовать аннотацию &После("ОбработкаПроведения"). Если же нам требуется полностью заменить стандартную логику или вставить свои действия в середину, мы можем применить &Вместо("ОбработкаПроведения").

Давайте посмотрим на пример использования &После("ОбработкаПроведения"):


// В модуле объекта документа расширения
&После("ОбработкаПроведения")
Процедура ОбработкаПроведения_ДобавитьПроводки(Отказ, РежимПроведения)
    // Здесь мы можем получить доступ к уже сформированным движениям
    // и добавить свои собственные проводки или движения по регистрам.

    // Пример: Добавление проводки по дебету счета "МойСчетДт" и кредиту "МойСчетКт"
    Движения.Хозрасчетный.Записывать = Истина;
    НоваяПроводка = Движения.Хозрасчетный.Добавить();
    НоваяПроводка.Период = Дата;
    НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.МойСчетДт; // Предполагаем наличие такого счета
    НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.МойСчетКт; // Предполагаем наличие такого счета
    НоваяПроводка.Сумма = СуммаДокумента; // Сумма из реквизита документа
    НоваяПроводка.Содержание = "Дополнительная проводка по документу " + Ссылка;

    // Можем также добавить движения по другим регистрам, например, по регистрам накопления или сведений
    // Движения.РегистрНакопления.Записывать = Истина;
    // НовоеДвижение = Движения.РегистрНакопления.Добавить();
    // ...
КонецПроцедуры

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

Решение 2: Подписки на события

Механизм подписок на события в 1С – это еще один мощный инструмент, позволяющий выполнять необходимые операции без прямого изменения стандартных процедур и функций типовой конфигурации. Мы можем рассматривать подписки как своего рода "перехватчики" событий, которые срабатывают при выполнении определенных действий в системе.

Как работают подписки?

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

Преимущества подписок:

  1. Неинвазивность: Как и расширения, подписки не требуют изменения кода типовой конфигурации.
  2. Универсальность: Одна процедура подписки может быть "подписана" на события, принадлежащие различным объектам конфигурации. Это избавляет нас от необходимости дублировать код в нескольких местах.
  3. Централизация логики: Вся логика по добавлению проводок может быть собрана в одном общем модуле, что упрощает ее поддержку.

Как настроить подписку для добавления проводок?

Мы создадим новый объект конфигурации – ПодпискаНаСобытие. В ней мы укажем:

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

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


// В общем модуле (например, "МоиДополнительныеДвижения") с галкой "Сервер"
Процедура ДобавитьПроводкиПослеПроведения(Источник, Отказ, РежимПроведения) Экспорт
    // Источник - это сам документ, который провелся
    Если ТипЗнч(Источник) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
        // Мы можем получить доступ к данным документа
        Перем СуммаДокумента;
        СуммаДокумента = Источник.СуммаДокумента; // Пример получения данных

        // И добавить свои проводки
        Источник.Движения.Хозрасчетный.Записывать = Истина;
        НоваяПроводка = Источник.Движения.Хозрасчетный.Добавить();
        НоваяПроводка.Период = Источник.Дата;
        НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.МойСчетДт;
        НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.МойСчетКт;
        НоваяПроводка.Сумма = СуммаДокумента;
        НоваяПроводка.Содержание = "Дополнительная проводка по документу " + Источник.Номер;
    КонецЕсли;
КонецПроцедуры

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

Решение 3: Отложенные задания и Регистры сведений как очередь

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

Как это работает?

  1. Запись в регистр сведений: При проведении типового документа (например, через расширение или подписку) мы не формируем проводки сразу, а записываем информацию о том, какие проводки нужно создать, в специальный регистр сведений.
  2. Обработка регламентным заданием: Отдельное регламентное задание периодически считывает данные из этого регистра сведений и на их основе формирует необходимые движения.

Преимущества этого подхода:

Разберем по шагам реализацию:

  1. Создаем Регистр сведений "ОчередьДополнительныхПроводок":

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

    • Измерение: ДокументИсточник (Тип: ДокументСсылка.РеализацияТоваровУслуг или ДокументСсылка.ЛюбойДокумент).
    • Ресурс: СуммаПроводки (Тип: Число).
    • Ресурс: СчетДт (Тип: ПланСчетовСсылка.Хозрасчетный).
    • Ресурс: СчетКт (Тип: ПланСчетовСсылка.Хозрасчетный).
    • Ресурс: Содержание (Тип: Строка).
    • Ресурс: Обработано (Тип: Булево, для отметки, что запись обработана).
  2. Запись в регистр при проведении документа:

    В процедуре ОбработкаПроведения документа (через расширение или подписку) мы добавляем записи в наш регистр сведений.

    
    // В модуле объекта документа расширения или в обработчике подписки
    &После("ОбработкаПроведения")
    Процедура ОбработкаПроведения_ЗаписатьВОчередь(Отказ, РежимПроведения)
        // Создаем новую запись в регистре сведений
        НоваяЗапись = РегистрыСведений.ОчередьДополнительныхПроводок.СоздатьМенеджерЗаписи();
        НоваяЗапись.ДокументИсточник = Ссылка;
        НоваяЗапись.СуммаПроводки = СуммаДокумента; // Предполагаем наличие реквизита
        НоваяЗапись.СчетДт = ПланыСчетов.Хозрасчетный.МойСчетДт;
        НоваяЗапись.СчетКт = ПланыСчетов.Хозрасчетный.МойСчетКт;
        НоваяЗапись.Содержание = "Отложенная проводка по " + Ссылка;
        НоваяЗапись.Обработано = Ложь;
        НоваяЗапись.Записать();
    КонецПроцедуры
    
  3. Создание Регламентного задания:

    Мы создаем новое РегламентноеЗадание (например, "ОбработкаОчередиПроводок") и связываем его с процедурой в общем модуле.

    
    // В общем модуле (например, "МоиФоновыеПроцессы") с галкой "Сервер"
    Процедура ОбработатьОчередьПроводок() Экспорт
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |    ОчередьДополнительныхПроводок.ДокументИсточник,
            |    ОчередьДополнительныхПроводок.СуммаПроводки,
            |    ОчередьДополнительныхПроводок.СчетДт,
            |    ОчередьДополнительныхПроводок.СчетКт,
            |    ОчередьДополнительныхПроводок.Содержание
            |ИЗ
            |    РегистрСведений.ОчередьДополнительныхПроводок КАК ОчередьДополнительныхПроводок
            |ГДЕ
            |    ОчередьДополнительныхПроводок.Обработано = ЛОЖЬ";
    
        Выборка = Запрос.Выполнить().Выбрать();
    
        Пока Выборка.Следующий() Цикл
            // Получаем менеджер движений для документа-источника
            МенеджерДвижений = Выборка.ДокументИсточник.ПолучитьОбъект().Движения;
            МенеджерДвижений.Хозрасчетный.Записывать = Истина;
                    
            // Создаем новую проводку
            НоваяПроводка = МенеджерДвижений.Хозрасчетный.Добавить();
            НоваяПроводка.Период = Выборка.ДокументИсточник.Дата; // Или текущая дата
            НоваяПроводка.СчетДт = Выборка.СчетДт;
            НоваяПроводка.СчетКт = Выборка.СчетКт;
            НоваяПроводка.Сумма = Выборка.СуммаПроводки;
            НоваяПроводка.Содержание = Выборка.Содержание;
    
            // Записываем движения
            МенеджерДвижений.Записать(); // Записываем движения для данного документа
    
            // Отмечаем запись в регистре как обработанную
            МенеджерЗаписи = РегистрыСведений.ОчередьДополнительныхПроводок.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.ДокументИсточник = Выборка.ДокументИсточник;
            МенеджерЗаписи.Прочитать(); // Читаем текущую запись
            Если МенеджерЗаписи.ДокументИсточник.Пустая() Тогда
                // Запись уже удалена или изменена, пропускаем
                Продолжить;
            КонецЕсли;
            МенеджерЗаписи.Обработано = Истина;
            МенеджерЗаписи.Записать();
        КонецЦикла;
    КонецПроцедуры
    

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

Решение 4: Использование документа "Типовая операция" (для пользовательских проводок)

Для бухгалтеров, которым необходимо часто вводить однотипные, но нестандартные проводки, не реализованные в типовых документах, 1С:Бухгалтерия 8.3 предлагает инструмент – документ "Типовая операция". Это не способ программного добавления проводок в *существующий* документ, но очень полезный механизм для автоматизации *ручного* ввода проводок.

Что такое "Типовая операция"?

Это шаблон для создания бухгалтерских и налоговых проводок, а также движений по регистрам накопления и сведений. Пользователь может настроить этот шаблон один раз, а затем быстро создавать на его основе документы "Операция (бухгалтерский и налоговый учет)", которые будут автоматически формировать заданные движения.

Преимущества для пользователей:

Как использовать "Типовую операцию":

  1. Создание шаблона: Мы переходим в раздел "Операции" – "Типовые операции" и создаем новый шаблон.
  2. Настройка проводок: В шаблоне мы указываем необходимые дебеты, кредиты, субконто, суммы (можно использовать формулы или параметры, которые будут запрашиваться при создании документа).
  3. Настройка движений по регистрам: Помимо проводок, мы можем настроить движения по регистрам накопления и сведений, если это необходимо.
  4. Использование шаблона: При необходимости создать операцию, бухгалтер выбирает нужный шаблон, заполняет параметры (если они есть) и нажимает "Заполнить", после чего проводки и движения формируются автоматически.

Важно понимать, что "Типовая операция" создает *отдельный* документ "Операция (бухгалтерский и налоговый учет)", а не добавляет проводки непосредственно в типовой документ, который был проведен. Этот метод подходит, если дополнительные проводки должны быть логически отделены или если их формирование не привязано строго к моменту проведения основного документа, а происходит, например, раз в день или раз в месяц.

Мы рассмотрели несколько подходов к решению задачи добавления проводок в типовой документ 1С. Каждый из них имеет свои особенности и оптимален в различных ситуациях. Расширения конфигурации и Подписки на события являются предпочтительными для глубокой интеграции с документом и сохранения конфигурации на поддержке. Метод с Отложенными заданиями и Регистром сведений предоставляет гибкость и производительность для асинхронной обработки. А "Типовые операции" – это мощный инструмент для автоматизации ручного ввода проводок на уровне пользователя. Выбирайте тот метод, который наилучшим образом соответствует вашим требованиям к функциональности, производительности и удобству поддержки.

← К списку