Как вызвать функцию формы отчета через внешнее соединение в 1С?

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

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

Архитектурные ограничения внешнего соединения

Проанализируем контекст выполнения внешнего соединения. При подключении через COM-коннектор создается специальный серверный сеанс без инициализации пользовательского интерфейса. В этом сеансе действуют строгие ограничения платформы:

  1. Отсутствие клиентского контекста: во внешнем соединении недоступны любые конструкции, директивы и методы с пометкой &НаКлиенте.
  2. Недоступность объектов графического интерфейса: объект формы в платформе не может быть создан во внешнем соединении. Попытки вызова методов ПолучитьФорму() или ОткрытьФорму() вызывают фатальное исключение времени выполнения.
  3. Недоступность модуля формы: логика управляемой формы жестко привязана к ее жизненному циклу. Ни клиентские, ни серверные методы модуля формы (включая директивы &НаСервере и &НаСервереБезКонтекста) вызвать из внешнего соединения невозможно, даже если они объявлены с ключевым словом Экспорт.
  4. Свойства общих модулей: любой общий модуль, к которому происходит обращение в рамках внешнего сеанса, обязан иметь установленный флаг Внешнее соединение.

Таким образом, вызвать функцию формы напрямую через COM-соединение нельзя ни стандартными, ни обходными путями. Разберем рабочие варианты решения поставленной задачи.

Решение 1. Перенос логики в модуль менеджера отчета

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

Объявим функцию как экспортную в модуле менеджера:


Функция ПолучитьЗапрещенныеПоля(Режим = "") Экспорт
    
    ЗапрещенныеПоля = Новый Массив;
    // Алгоритм заполнения списка полей
    ЗапрещенныеПоля.Добавить("Контрагент");
    ЗапрещенныеПоля.Добавить("Договор");
    
    Возврат ЗапрещенныеПоля;
    
КонецФункции

Теперь во внешнем соединении мы можем вызвать метод напрямую через менеджер отчетов без создания объекта формы:


// В коде внешней системы или вызывающей базы
Соединение = Новый COMОбъект("V83.COMConnector");
База = Соединение.Connect("Srvr=""Server1C"";Ref=""BaseName"";Usr=""User"";Pwd=""Pass"";");

Результат = База.Отчеты.ОборотноСальдоваяВедомость.ПолучитьЗапрещенныеПоля();

Решение 2. Перенос логики в модуль объекта отчета

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

В модуле объекта разместим следующий код:


Функция ПолучитьНастройкиФормирования() Экспорт
    
    Настройки = Новый Структура;
    Настройки.Вставить("Схема", ЭтотОбъект.СхемаКомпоновкиДанных);
    Настройки.Вставить("Компоновщик", ЭтотОбъект.КомпоновщикНастроек);
    
    Возврат Настройки;
    
КонецФункции

Вызовем метод через создание объекта отчета во внешнем соединении:


ОтчетОбъект = База.Отчеты.ОборотноСальдоваяВедомость.Создать();
Результат = ОтчетОбъект.ПолучитьНастройкиФормирования();

Решение 3. Использование расширения конфигурации

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

Решение 4. Дублирование функции на стороне вызывающего кода

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

Рекомендации по интеграции

В современных конфигурациях для межсистемного взаимодействия рекомендуется отказываться от использования внешнего COM-соединения в пользу протоколов HTTP-сервисов (REST API) или Web-сервисов. Это позволяет избежать ограничений платформы, связанных с разрядностью библиотек comcntr.dll, и безопасно инкапсулировать любую серверную логику базы данных.

← На главную