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

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

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

Для начала проанализируем структуру программных модулей документа в 1С. Логика документа может находиться в:

  1. Модуле объекта — отвечает за обработку событий конкретного экземпляра объекта и его запись в базу.
  2. Модуле менеджера — предназначен для операций с объектами данного типа без создания экземпляра в памяти, а также для процедур печати и расчета.
  3. Модуле формы — управляет интерфейсной логикой, элементами управления и событиями формы.

Вариант 1. Вызов функции из модуля объекта

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

Рассмотрим пример кода на сервере обработки:


&НаСервере
Процедура ВыполнитьРасчетНаСервере(СсылкаНаДокумент)
    
    // Получаем объект документа из ссылки
    ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    
    // Вызываем экспортную функцию модуля объекта
    Результат = ДокументОбъект.РассчитатьВзносы();
    
    // При необходимости записываем изменения
    // ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    
КонецПроцедуры

Вариант 2. Вызов функции из модуля менеджера

Наиболее правильным с точки зрения архитектуры 1С является размещение расчетных алгоритмов и процедур заполнения в модуле менеджера документа. Такие методы не требуют инициализации всего объекта и могут вызываться напрямую через менеджер документа.

Посмотрим на пример вызова экспортного метода менеджера:


&НаСервере
Процедура ВызватьМетодМенеджераНаСервере(СсылкаНаДокумент)
    
    // Обращаемся к экспортной функции модуля менеджера документа
    Результат = Документы.НачислениеЗарплаты.РассчитатьВзносы(СсылкаНаДокумент);
    
КонецПроцедуры

Вариант 3. Вызов функции из модуля формы документа

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

Разберем по шагам, как это выглядит в клиентском коде формы обработки:


&НаКлиенте
Процедура ВызватьМетодФормыДокумента(СсылкаНаДокумент)
    
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
    
    // Получаем экземпляр формы без открытия на экране
    ФормаДокумента = ПолучитьФорму("Документ.НачислениеЗарплаты.Форма.ФормаДокумента", ПараметрыФормы);
    
    // Вызываем экспортную функцию модуля формы
    Результат = ФормаДокумента.РассчитатьВзносыКлиент();
    
    // Обязательно закрываем форму, чтобы избежать утечек памяти
    ФормаДокумента.Закрыть();
    
КонецПроцедуры

Однако вызов методов формы из внешних обработок сопряжен со следующими критическими ограничениями:

  1. Несовместимость контекста: Процедуры модуля формы работают с типами ДанныеФормыСтруктура и ДанныеФормыКоллекция, а не с объектами базы данных. Если передать туда обычный ДокументОбъект, возникнет ошибка типов.
  2. Накладные расходы: При вызове ПолучитьФорму платформа полностью выполняет серверные события инициализации (ПриСозданииНаСервере, ПриЧтенииНаСервере), что создает избыточную нагрузку на сервер и СУБД.
  3. Недоступность в фоновых процессах: Данный подход принципиально не работает на сервере, в фоновых заданиях, регламентных задачах и HTTP/Web-сервисах, так как там отсутствует клиентский контекст.
  4. Утечки памяти: Не закрытые явно экземпляры форм остаются в памяти сеанса до завершения работы тонкого клиента.

Рекомендуемые архитектурные решения

Если функционал жестко «зашит» в форму типового документа, правильнее использовать один из следующих подходов:

  1. Анализ цепочки вызовов: В типовых конфигурациях (например, БП 3.0, ЗУП 3.1) процедуры формы часто являются лишь обертками, которые вызывают функции общих модулей или модуля менеджера. Проследим по коду исходную функцию — как правило, достаточно напрямую вызвать серверный общий модуль с передачей структуры параметров.
  2. Использование расширений конфигурации: Создадим расширение и вынесем необходимый алгоритм в общий модуль расширения, либо переопределим метод через аннотации &Вместо или &ИзменениеИКонтроля, сделав логику доступной для вызова из любых внешних обработок.
  3. Вынос алгоритма в модуль менеджера: При доработке нетиповых конфигураций перенесем расчетные процедуры в модуль менеджера или модуль объекта, передавая все исходные данные через параметры метода.
← На главную