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