Как правильно реализовать движения по новому регистру накопления из расширения, не изменяя типовые документы?

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

При разработке расширений для типовых конфигураций 1С часто возникает вопрос: как добавить новый регистр накопления и обеспечить его заполнение движениями, не нарушая целостность типовых объектов? Давайте разберем архитектурные подходы, которые позволят сохранить возможность легкого обновления системы, следуя лучшим практикам разработки.

Вариант 1: Прямое изменение типовых документов через расширение

Самый очевидный, но не всегда предпочтительный способ — добавить типовой документ в расширение и переопределить его метод ОбработкаПроведения. В расширенном методе вы можете дописать логику формирования движений по новому регистру.

Плюсы: простота реализации, наглядность кода в модуле документа.

Минусы: при обновлении типовой конфигурации могут возникать конфликты, если логика проведения документа в основном коде была изменена разработчиком 1С. Также вы «заимствуете» объект, что усложняет обслуживание расширения.

Вариант 2: Использование подписки на событие (Рекомендуемый подход)

Более гибкий и «чистый» с точки зрения архитектуры способ — создание ПодпискиНаСобытие. Этот механизм позволяет перехватить событие ОбработкаПроведения для списка выбранных документов, не затрагивая сами объекты метаданных.

  1. Создание подписки: В расширении создаем объект ПодпискаНаСобытие. В поле «Событие» указываем ОбработкаПроведения. В поле «Источник» выбираем нужные типовые документы.
  2. Общий модуль: Создаем ОбщийМодуль в расширении (например, МойРегистр_ПроведениеСервер), в котором размещаем процедуру-обработчик.
  3. Реализация логики:
    
    Процедура ПриПроведенииДокумента(Источник, Отказ) Экспорт
        // Проверяем, нужно ли делать движения
        Если Не Отказ Тогда
            // Формируем набор записей регистра
            НаборЗаписей = РегистрыНакопления.МойНовыйРегистр.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.Регистратор.Установить(Источник.Ссылка);
            
            // Заполняем данные для записи
            НоваяЗапись = НаборЗаписей.Добавить();
            НоваяЗапись.Период = Источник.Дата;
            // ... заполнение остальных измерений и ресурсов
            
            НаборЗаписей.Записать();
        КонецЕсли;
    КонецПроцедуры
    

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

Выбор между регистром накопления и регистром сведений

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

Риски и рекомендации при работе с расширениями

При работе с расширениями необходимо учитывать специфику работы платформы:

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

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

Подводя итог, можно сказать, что подписка на событие в сочетании с РегистромНакопления является наиболее профессиональным архитектурным решением для задач расширения функционала без модификации типовых объектов системы.

← На главную