Разработка и Конфигурация · 14 мин
Внешнее соединение 1С и общий модуль: что это значит и как использовать
Разбираем, что значит внешнее соединение 1С и вызов общего модуля через COM-коннектор: настройка флагов, примеры кода, типичные ошибки и проверка результата.
Внешнее соединение 1С — это способ обратиться к информационной базе извне: из другой базы 1С, из скрипта, из программы на другом языке, не запуская полноценный клиент. Чаще всего для этого используется COM-объект V83.COMConnector, который устанавливает сеанс с базой и позволяет выполнять код в её контексте. Общий модуль в этой схеме — это контейнер процедур и функций конфигурации, к которым можно обратиться через установленное соединение.
Фраза «внешнее соединение 1С общий модуль» обычно возникает в двух ситуациях. Первая — разработчик хочет вызвать готовую процедуру общего модуля удалённой базы, но получает ошибку «Метод объекта не обнаружен». Вторая — нужно понять, почему один общий модуль доступен через внешнее соединение, а другой нет. Ответ в обоих случаях лежит в свойствах модуля и в особенностях контекста внешнего соединения.
Ниже разобрано, как устроен механизм, какие флаги нужно установить в свойствах общего модуля, как выглядит рабочий код подключения и вызова, какие ограничения накладывает внешнее соединение и как диагностировать типовые ошибки.
Что такое внешнее соединение 1С и зачем оно нужно
Внешнее соединение — это программный сеанс с информационной базой, установленный через COM-интерфейс. В отличие от запуска тонкого или толстого клиента, здесь не открывается интерфейс пользователя: код выполняется на стороне базы, а вызывающая программа получает только результаты — значения, таблицы, ссылки на объекты.
Типовые сценарии использования:
- обмен данными между двумя базами 1С напрямую, без файлов и веб-сервисов;
- регламентные операции из планировщика: скрипт подключается к базе и запускает выгрузку, проверку или обработку;
- интеграция с внешними системами, где 1С выступает источником данных (справочники, остатки, документы);
- административные задачи — массовая обработка объектов, тестирование логики на копии базы.
Важно понимать: внешнее соединение создаёт полноценный сеанс в базе. Оно занимает лицензию, отображается в консоли кластера (для клиент-серверного варианта) и выполняется с правами указанного пользователя. Это не «лёгкий» способ доступа — по нагрузке сеанс сопоставим с работой обычного пользователя без интерфейса.
Какую роль играет общий модуль при внешнем подключении
Общий модуль — это объект конфигурации, хранящий процедуры и функции, доступные из разных мест системы. При внешнем соединении именно общие модули становятся основной «точкой входа»: через COM-объект нельзя напрямую выполнить произвольный код модуля документа или формы, но можно вызвать экспортную процедуру разрешённого общего модуля.
Чтобы процедура общего модуля была доступна извне, должны совпасть три условия:
- В свойствах общего модуля установлен флаг «Внешнее соединение» (галка в палитре свойств).
- Установлен флаг «Вызов сервера» — в клиент-серверном режиме код выполняется на сервере, и без этого флага обращение невозможно.
- Сама процедура или функция объявлена с ключевым словом
Экспорт— иначе она видна только внутри модуля.
Если хотя бы одно условие не выполнено, при попытке вызова возникнет ошибка вида «Метод объекта не обнаружен (ИмяПроцедуры)» или «Попытка передачи с клиента на сервер мутабельного значения». Это самая частая причина, по которой «общий модуль не виден» через внешнее соединение.
Как настроить общий модуль для работы через внешнее соединение
Настройка выполняется в конфигураторе и занимает несколько минут. Порядок действий:
- Откройте конфигуратор, найдите нужный общий модуль в ветке «Общие → Общие модули» (или создайте новый, например
ОбменВнешний). - Откройте палитру свойств модуля (правый клик → «Свойства»).
- Установите флаги: Сервер, Внешнее соединение, Вызов сервера. Флаг «Привилегированный режим» ставьте только если процедурам действительно нужен обход прав — это снижает безопасность.
- Напишите экспортную процедуру или функцию с параметрами и возвращаемым значением.
- Обновите конфигурацию базы данных (F7), иначе изменения не попадут в рабочую базу.
Пример минимального общего модуля:
Функция ПолучитьОстатокТовара(НоменклатураСсылка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ЕСТЬNULL(СУММА(Остатки.КоличествоОстаток), 0) КАК Остаток
|ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК Остатки";
Запрос.УстановитьПараметр("Номенклатура", НоменклатураСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Остаток;
КонецФункции
Обратите внимание: функция возвращает простое значение (число). Это осознанное решение — через COM безопасно передавать примитивные типы, строки, даты, ссылки и сериализуемые структуры. Сложные объекты вроде таблиц значений лучше преобразовывать в массив структур или сериализовать, чтобы избежать ошибок маршалинга.
- 1Создайте или откройте общий модуль в конфигураторе
- 2В свойствах включите флаги «Сервер», «Внешнее соединение», «Вызов сервера»
- 3Объявите процедуру или функцию с ключевым словом Экспорт
- 4Обновите конфигурацию базы данных (F7)
- 5Проверьте вызов через тестовый скрипт подключения
Как подключиться и вызвать процедуру: пример кода
Подключение из другой базы 1С выполняется через COM-коннектор. Типовой код выглядит так:
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""Server1C""; Ref=""TradeBase""; Usr=""Обмен""; Pwd=""Пароль"";";
Соединение = Коннектор.Connect(СтрокаПодключения);
Остаток = Соединение.ОбменВнешний.ПолучитьОстатокТовара(СсылкаНаТовар);
Сообщить("Остаток: " + Остаток);
Для файловой базы строка подключения другая: File="C:\Bases\Trade"; Usr="Обмен"; Pwd="Пароль";. Для подключения из внешних скриптов (например, VBScript или PowerShell) используется тот же COM-объект — CreateObject("V83.COMConnector").
Несколько практических правил вызова:
- Обращение к модулю идёт по цепочке
Соединение.ИмяМодуля.ИмяПроцедуры(Параметры)— без создания экземпляров. - Параметры-ссылки передаются как COM-объекты ссылок той же базы; ссылку из «своей» базы передать нельзя — ищите объект по GUID или по реквизитам (код, наименование).
- Каждое обращение через COM — это сетевой вызов. Цикл из тысячи обращений по одному элементу работает на порядки медленнее, чем один вызов, обрабатывающий пакет данных целиком.
Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("File=""C:\Bases\Trade""; Usr=""Обмен""; Pwd=""123"";");
Результат = Соединение.ОбменВнешний.ПолучитьОстатокТовара(Ссылка);
Соединение = Неопределено; // закрытие сеансаОграничения и риски внешнего соединения
Внешнее соединение — мощный, но небезопасный при неосторожном применении механизм. Основные ограничения:
- Лицензии. Каждое соединение занимает клиентскую лицензию. Скрипт, забывший закрыть соединение, держит лицензию до завершения процесса.
- Версии платформы. Имя COM-класса зависит от версии платформы (V83 для 8.3). Если на машине несколько версий, регистрируется та, чья компонента зарегистрирована последней — возможны подключения «не к той» версии.
- Интерактивные вызовы. В контексте внешнего соединения недоступны модальные окна, предупреждения, оповещения пользователя — код с такими вызовами завершится ошибкой.
- Права. Процедуры выполняются с правами пользователя, указанного в строке подключения. Создавать для обмена отдельного пользователя с минимально необходимыми правами — обязательная практика.
Отдельный риск — хранение пароля в тексте скрипта. Если скрипт лежит в общедоступной папке, учётные данные базы фактически раскрыты. Минимизируйте риск: ограничьте доступ к файлу скрипта на уровне файловой системы, используйте учётную запись с узкими правами, по возможности — аутентификацию операционной системы.
Диагностика типичных ошибок
Большинство проблем при работе через внешнее соединение сводится к нескольким узнаваемым сообщениям:
| Ошибка | Причина | Что делать |
|---|---|---|
| Метод объекта не обнаружен | Нет флага «Внешнее соединение» у модуля или «Экспорт» у процедуры | Проверить свойства модуля, обновить конфигурацию БД |
| Ошибка при вызове конструктора COMОбъект | Не зарегистрирована компонента comcntr.dll | Зарегистрировать компоненту от имени администратора |
| Информационная база не обнаружена | Неверная строка подключения, имя сервера или базы | Сверить параметры с консолью кластера или путём к файловой базе |
| Нарушение прав доступа | У пользователя нет прав на вызываемые объекты | Расширить роль пользователя или использовать привилегированный модуль |
| Ошибка передачи данных между клиентом и сервером | Попытка передать несериализуемый объект | Возвращать примитивы, массивы структур, строки |
Если соединение устанавливается, но вызов «молча» возвращает не то, что ожидалось, добавьте в общий модуль временное логирование — запись в журнал регистрации или в файл. Отладчиком внешнее соединение ловить сложнее: сеанс нужно явно разрешить для отладки в свойствах базы (флаг «Отладка разрешена» и протокол отладки).
Альтернативы внешнему COM-соединению
COM-подключение — не единственный и не всегда лучший способ интеграции. В зависимости от задачи рассмотрите варианты:
- HTTP-сервисы и веб-сервисы — платформа позволяет опубликовать собственные HTTP/ SOAP-сервисы. Подходит для интеграции с не-Windows системами и через интернет; COM в таких сценариях не работает.
- Стандартный REST-интерфейс (OData) — автоматически генерируемый доступ к данным базы без написания кода, но с ограниченной логикой.
- Планы обмена и файловый обмен — надёжнее для регулярной синхронизации: данные передаются пакетами с подтверждением, сбой не рушит процесс.
- Фоновые задания и регламентные операции — если задача выполняется внутри одной базы, внешнее соединение вообще не нужно.
COM-коннектор остаётся оправданным, когда нужна прямая двусторонняя логика между двумя базами 1С в одной сети, быстрый доступ к произвольным серверным функциям и нет возможности публиковать веб-сервисы.
Сравнение вариантов
Прямой вызов серверной логики между базами 1С в локальной сети. Ограничение: только Windows, занимает лицензию, хрупкая регистрация компоненты.
Универсальная интеграция с любыми системами, работает через интернет. Ограничение: нужна публикация на веб-сервере и разработка API.
Надёжная регулярная синхронизация с гарантией доставки. Ограничение: не подходит для мгновенных запросов «здесь и сейчас».
Как проверить, что всё работает правильно
После настройки выполните контрольную проверку по трём точкам: соединение устанавливается, процедура вызывается, результат соответствует данным в базе. Простейший тест — функция, возвращающая константу или текущую дату сервера: если она отработала, цепочка «коннектор → соединение → общий модуль → экспортная функция» исправна целиком.
Затем проверьте функцию с реальными данными и сверьте результат с тем, что показывает база в интерфейсе. Расхождение обычно означает, что запрос внутри процедуры считает не то (например, без отбора по периоду или организации), а не проблему соединения.
Как проверить результат
Connect() возвращает объект без исключений
Ошибка создания COM-объекта или «база не обнаружена»
Функция возвращает значение ожидаемого типа
«Метод объекта не обнаружен» — проверить флаги модуля
Результат совпадает с данными в интерфейсе базы
Пустые или неверные значения — ошибка в логике запроса
После завершения сеанс исчезает из консоли кластера
Сеанс «висит» — соединение не закрыто в коде
Что важно запомнить
Внешнее соединение — это COM-сеанс с базой 1С без клиентского приложения. Общий модуль доступен через него только при флагах «Сервер», «Внешнее соединение», «Вызов сервера» и ключевом слове «Экспорт» у процедуры. Используйте отдельного пользователя с минимальными правами, передавайте данные пакетами, закрывайте соединение и тестируйте обработки на копии базы.
Частые вопросы
Почему общий модуль не виден через внешнее соединение, хотя в толстом клиенте работает?
Почти всегда причина в отсутствии флага «Внешнее соединение» в свойствах модуля или отсутствии слова «Экспорт» у процедуры. В клиент-серверном режиме дополнительно нужен флаг «Вызов сервера». После изменения свойств обязательно обновите конфигурацию базы данных.
Можно ли через внешнее соединение вызвать процедуру модуля документа?
Напрямую — нет. Через COM доступны общие модули, менеджеры объектов (например, Соединение.Документы.РеализацияТоваровУслуг) и сами объекты данных. Если нужна логика из модуля документа, вынесите её в общий модуль и вызывайте оттуда.
Занимает ли внешнее соединение лицензию 1С?
Да. Сеанс внешнего соединения расходует клиентскую лицензию так же, как обычный пользователь. Поэтому важно явно освобождать объект соединения в коде и не оставлять скрипты «висеть» после завершения работы.
Как передать в чужую базу ссылку на элемент справочника?
Ссылку из своей базы передать нельзя — она невалидна в другой базе. Передайте уникальный идентификатор строкой и найдите элемент через ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)) на той стороне, либо выполняйте поиск по коду или наименованию внутри вызываемой функции.
Что безопаснее для интеграции через интернет — COM или HTTP-сервис?
HTTP-сервис. COM-коннектор рассчитан на локальную сеть, требует регистрации компоненты и не имеет встроенных механизмов шифрования и аутентификации уровня веба. HTTP-сервис публикуется через веб-сервер с TLS и токенами, что корректнее для внешнего доступа.
Почему обмен через COM работает очень медленно?
Типовая причина — построчные вызовы: каждый вызов через COM это отдельное сетевое обращение. Перенесите цикл внутрь процедуры общего модуля: передайте туда массив параметров одним вызовом, обработайте всё на стороне базы и верните результат пакетом.