При изучении методической литературы по платформе «1С:Предприятие» разработчики часто сталкиваются с неочевидными формулировками, которые вызывают массу вопросов. Один из классических примеров — описание работы модуля внешнего соединения. В официальных руководствах и книгах по конфигурированию можно встретить фразу: «Если переменные, процедуры или функции модуля внешнего соединения определены как экспортируемые, то они будут доступны другим модулям внешнего соединения».
Эта формулировка мгновенно создает логический тупик. Ведь чуть выше в том же учебнике четко написано: в конфигурации всегда существует единственный модуль внешнего соединения. Как же экспортируемые методы могут быть доступны «другим» модулям внешнего соединения, если такой модуль всего один? В этой статье мы подробно разберем природу этой загадочной фразы, исправим методологические неточности книги и детально изучим реальную область видимости контекста внешнего соединения.
Давайте сразу снимем завесу тайны. Фраза про «другие модули внешнего соединения» — это классическая опечатка, возникшая из-за копирования текста (копипаста) в методических материалах фирмы «1С». Этот фрагмент кочует из одного издания в другое еще со времен ранних версий платформы 1С:Предприятие 8.0 и даже присутствует в некоторых статьях на ИТС.
Проанализируем, как зародилась эта ошибка. Изначально данный раздел документации писался для модуля управляемого (или обычного) приложения. В оригинале фраза выглядела так: «...они будут доступны другим модулям прикладного решения...». При подготовке главы, посвященной внешнему соединению, авторы адаптировали текст и механически заменили слова «прикладного решения» на «внешнего соединения», не обратив внимания на возникшее логическое противоречие. В более старых и качественных редакциях методичек эту фразу исправляли на более корректную: «...будут доступны другим модулям объектов...».
Таким образом, никаких «других» модулей внешнего соединения в рамках одной информационной базы не существует. Модуль внешнего соединения всегда один.
Давайте разберем по шагам, где на самом деле видны переменные, процедуры и функции модуля внешнего соединения, если они объявлены с ключевым словом Экспорт. В рамках активного сеанса внешнего соединения (COM-соединения) правила видимости работают следующим образом:
Все экспортируемые методы и переменные модуля внешнего соединения проецируются наружу и становятся методами и свойствами самого COM-объекта соединения. Это ключевая точка интеграции. Если внешнее приложение (например, написанное на C#, Python, C++ или VBA) подключается к 1С через V83.COMConnector, оно может напрямую обращаться к этим методам.
Экспортные процедуры и функции модуля внешнего соединения полностью видны внутри модулей документов, справочников, обработок и других объектов метаданных, которые создаются, записываются или обрабатываются в рамках этого же COM-сеанса.
Здесь поведение платформы зависит от свойств конкретного общего модуля:
Проанализируем ситуацию на конкретном примере. Предположим, у нас в модуле внешнего соединения определена экспортная функция, возвращающая приветствие, и экспортная переменная:
Перем ИмяТекущегоПользователя Экспорт;
Функция ПолучитьПриветствие(ИмяКлиента) Экспорт
Возврат "Приветствуем Вас в системе 1С, " + ИмяКлиента + "!";
КонецФункции
Если мы подключаемся к базе данных 1С из внешнего скрипта (например, на языке VBScript), мы можем напрямую вызвать эту функцию у объекта соединения:
' Создаем объект подключения
Set Connector = CreateObject("V83.COMConnector")
' Устанавливаем соединение с базой данных
Set Connection = Connector.Connect("File=""C:\Db\Trade"";Usr=""Администратор"";")
' Напрямую вызываем экспортный метод модуля внешнего соединения
Greeting = Connection.ПолучитьПриветствие("Александр")
WScript.Echo Greeting
' Обращаемся к экспортной переменной модуля внешнего соединения
Connection.ИмяТекущегоПользователя = "Александр"
Внутри самой конфигурации 1С мы также можем обращаться к этим экспортным методам из неглобального общего модуля (например, с именем ОбщегоНазначенияКлиентСервер), если у него установлен флаг «Внешнее соединение»:
Процедура ВыполнитьДействиеПриПодключении() Экспорт
#Если ВнешнееСоединение Тогда
// Прямое обращение к методу модуля внешнего соединения
ТекстПриветствия = ПолучитьПриветствие("Робот-Интегратор");
ЗаписатьВЛог(ТекстПриветствия);
#КонецЕсли
КонецПроцедуры
При работе в режиме внешнего соединения крайне важно понимать физический смысл этого процесса. Модуль внешнего соединения — это специализированная «легковесная» альтернатива модулям приложений (управляемого и обычного). Он компилируется и инициализируется исключительно тогда, когда к информационной базе обращаются программно через механизм COM-соединения.
Поскольку этот сеанс ориентирован исключительно на программную обработку данных без участия человека, в нем действуют жесткие ограничения:
Предупреждение(), Вопрос(), ОткрытьФорму() и другие клиентские UI-методы. Попытка их вызова приведет к аварийному завершению работы COM-соединения.Чтобы избежать путаницы с областями видимости, дублированием кода и сложной отладкой контекста, современные стандарты разработки фирмы «1С» настоятельно не рекомендуют перегружать модуль внешнего соединения сложной бизнес-логикой и хранить в его переменных глобальные состояния.
Вместо этого рекомендуется использовать более надежные и структурированные подходы:
Соединение.ИмяОбщегоМодуля.ИмяФункции(). Это сохраняет чистоту архитектуры и упрощает дальнейшую поддержку и чтение кода другими разработчиками.