При разработке расширений для 1С:Предприятие программисты часто сталкиваются с ситуацией, когда новые объекты (справочники, обработки, документы), добавленные в расширение, прекрасно работают в режиме обычного сеанса, но оказываются "невидимыми" при обращении к базе через COM-соединение. Попытка обращения к такому объекту через ОбъектКом.Обработки.ИмяОбработкиИзРасширения обычно заканчивается ошибкой "Поле объекта не обнаружено". Разберем подробно причины этого поведения и способы решения проблемы.
Первое, на что нам необходимо обратить внимание — это настройки самого расширения в информационной базе. В 1С существует механизм защиты, который ограничивает возможности расширений, если они работают в так называемом безопасном режиме. Рассмотрим, как это влияет на нашу задачу.
По умолчанию при подключении расширения флаг "Безопасный режим" часто оказывается включенным. В этом режиме платформа блокирует доступ к ряду потенциально опасных операций, включая корректное взаимодействие с внешними соединениями для некоторых типов объектов. Если ваша задача требует программного доступа через COM, этот флаг необходимо снять.
Для этого выполним следующие действия:
Проанализируем ситуацию, когда безопасный режим отключен, но ошибка сохраняется. Часто проблема кроется в области видимости программного кода. Если ваша обработка или другой объект расширения использует вызовы функций из общих модулей, добавленных в этом же расширении, нужно проверить их свойства.
Разберем по шагам настройку в конфигураторе:
Без этого флага код модуля просто не будет скомпилирован для контекста COM-соединения, что приведет к ошибкам инициализации объектов расширения. Это критически важный момент, так как контекст COM сильно ограничен по сравнению с обычным клиентским сеансом.
Иногда прямое обращение к метаданным расширения через коллекцию Обработки или Справочники в COM-соединении работает нестабильно из-за особенностей кэширования платформы. Рассмотрим профессиональный "обходной путь" — использование серверного модуля-посредника.
Вместо того чтобы пытаться создать объект напрямую в коде внешнего приложения, мы можем создать экспортную функцию в общем модуле расширения (с установленным флагом "Внешнее соединение"), которая будет возвращать нам нужный объект. Это гарантирует, что создание объекта произойдет внутри контекста расширения, где он точно виден.
Пример кода в общем модуле расширения:
Функция СоздатьОбработкуИзРасширения() Экспорт
Возврат Обработки.УниверсальныйОбмен_Расширение.Создать();
КонецФункции
Теперь в вызывающем коде через COM-соединение мы будем обращаться не к коллекции обработок, а к этому модулю:
// Вместо: ОбъектКом.Обработки.УниверсальныйОбмен_Расширение.Создать();
// Используем:
ОбработкаОбъект = ОбъектКом.ИмяМодуляРасширения.СоздатьОбработкуИзРасширения();
Такой подход значительно повышает надежность системы, так как мы явно управляем созданием объекта на стороне сервера.
Выясним причину, связанную с технологическим стеком. Работа с расширениями через COM-соединение активно дорабатывалась фирмой "1С" на протяжении нескольких лет. В версиях платформы ниже 8.3.14 наблюдалось множество ошибок, связанных с видимостью метаданных расширений в серверных контекстах и внешних соединениях.
Проанализируем используемую версию. Если ваша платформа — 8.3.10 (как в примере обсуждения) или 8.3.12, то "невидимость" объектов может быть следствием недоработок самой платформы. Рекомендуется обновить платформу до актуальных стабильных релизов (минимум 8.3.15 или выше), где работа с коллекциями метаданных расширений в COM стала стабильной.
Рассмотрим еще два важных параметра, которые могут блокировать доступ:
Посмотрим на проблему с точки зрения системного администрирования. COM-соединение работает в рамках процессов rphost. Если вы только что добавили расширение или изменили его состав, COM-сервер может использовать старый кэш метаданных, в котором вашего объекта еще не существует.
В случае клиент-серверного варианта базы данных попробуем выполнить следующие действия:
Подводя итог, можно сказать, что решение проблемы "невидимости" обработки из расширения через COM обычно сводится к трем основным действиям: отключению безопасного режима, проверке флага "Внешнее соединение" в модулях и, в самых сложных случаях, использованию функции-посредника для создания объекта. Правильная настройка прав доступа и использование современной версии платформы окончательно закрывают этот вопрос.