Почему COM-соединение не видит обработку из расширения 1С и как это исправить

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

При разработке расширений для 1С:Предприятие программисты часто сталкиваются с ситуацией, когда новые объекты (справочники, обработки, документы), добавленные в расширение, прекрасно работают в режиме обычного сеанса, но оказываются "невидимыми" при обращении к базе через COM-соединение. Попытка обращения к такому объекту через ОбъектКом.Обработки.ИмяОбработкиИзРасширения обычно заканчивается ошибкой "Поле объекта не обнаружено". Разберем подробно причины этого поведения и способы решения проблемы.

Проверка безопасного режима расширения

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

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

Для этого выполним следующие действия:

  1. Зайдем в информационную базу в режиме "1С:Предприятие".
  2. Перейдем в раздел "Администрирование" — "Печать, формы и обработки" — "Расширения" (путь может отличаться в зависимости от конфигурации).
  3. Найдем наше расширение в списке.
  4. Снимем галочку в колонке "Безопасный режим".
  5. Перезапустим сеанс COM-соединения и проверим доступность объекта.

Настройка свойств общего модуля расширения

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

Разберем по шагам настройку в конфигураторе:

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

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

Использование функции-посредника (Wrapper)

Иногда прямое обращение к метаданным расширения через коллекцию Обработки или Справочники в COM-соединении работает нестабильно из-за особенностей кэширования платформы. Рассмотрим профессиональный "обходной путь" — использование серверного модуля-посредника.

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

Пример кода в общем модуле расширения:


Функция СоздатьОбработкуИзРасширения() Экспорт
    Возврат Обработки.УниверсальныйОбмен_Расширение.Создать();
КонецФункции

Теперь в вызывающем коде через COM-соединение мы будем обращаться не к коллекции обработок, а к этому модулю:


// Вместо: ОбъектКом.Обработки.УниверсальныйОбмен_Расширение.Создать();
// Используем:
ОбработкаОбъект = ОбъектКом.ИмяМодуляРасширения.СоздатьОбработкуИзРасширения();

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

Влияние версии платформы 1С

Выясним причину, связанную с технологическим стеком. Работа с расширениями через COM-соединение активно дорабатывалась фирмой "1С" на протяжении нескольких лет. В версиях платформы ниже 8.3.14 наблюдалось множество ошибок, связанных с видимостью метаданных расширений в серверных контекстах и внешних соединениях.

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

Назначение расширения и права доступа

Рассмотрим еще два важных параметра, которые могут блокировать доступ:

  1. Назначение расширения: В свойствах расширения в Конфигураторе есть поле "Назначение". Для полноценного использования новых объектов рекомендуется устанавливать значение "Дополнение" (Add-on). Режим "Исправление" (Patch) предназначен для корректировки существующих объектов и может иметь ограничения при работе с новыми метаданными через внешние интерфейсы.
  2. Роли и права: Убедимся, что у пользователя, под которым осуществляется COM-подключение, достаточно прав на работу с объектом из расширения. Важно помнить: наличие роли "Полные права" в основной конфигурации не всегда автоматически дает права на новые объекты расширения. Мы должны добавить в расширение свою роль, дать в ней права на чтение/просмотр/использование обработки и назначить эту роль пользователю (или включить её в профиль групп доступа).

Особенности кэширования COM-сервера

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

В случае клиент-серверного варианта базы данных попробуем выполнить следующие действия:

Резюме

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

← На главную