Механизм внешних источников данных (ВИД) в платформе 1С:Предприятие позволяет интегрироваться со сторонними СУБД напрямую, не прибегая к прямому использованию низкоуровневых COM-объектов или библиотек вроде ADO. Однако при вызове скалярных функций и хранимых процедур разработчики нередко сталкиваются с ситуацией, когда функция не появляется в визуальных конструкторах или вместо ожидаемой строки возвращает значение Неопределено. Разберем по шагам, как устроен этот механизм, как правильно организовать вызов из встроенного языка и почему может возвращаться пустое значение.
Рассмотрим, как платформа 1С предоставляет доступ к функциям внешней СУБД. Если в дереве метаданных в ветке конкретного внешнего источника данных добавлена функция, она становится методом этого источника данных во встроенном языке. Вызывать её можно точно так же, как обычную функцию общего модуля или менеджера объекта.
Посмотрим на пример корректного вызова скалярной функции из кода конфигурации:
ПараметрЗапроса = "01-000000000007533";
РезультатСсылки = ВнешниеИсточникиДанных.Процессинг.ПРЕФИКС_TECH_SUPPORT_GET_ACCESS_URL(ПараметрЗапроса);
Если РезультатСсылки = Неопределено Тогда
Сообщить("Функция не вернула значение или во внешней базе результат равен NULL");
Иначе
Сообщить("Полученный URL: " + РезультатСсылки);
КонецЕсли;
Обратите внимание: функция вызывается напрямую через точку от имени внешнего источника данных. Платформа берет на себя формирование корректного запроса к СУБД, передачу входного параметра и маршалинг результата в базовый тип платформы 1С (в данном случае — в строку).
Если синтаксис написан без синтаксических ошибок, но переменная получает Неопределено, проанализируем возможные источники проблемы:
NULL. Платформа 1С при объектном вызове скалярных функций преобразует значение NULL внешней базы данных в значение Неопределено. Если запрашиваемый токен, ссылка или запись имеют ограниченное время жизни (TTL) и уже удалены из таблиц СУБД, функция вернет Неопределено, хотя сама интеграция настроена корректно.Строка). Если этот флаг снят, платформа интерпретирует объект как хранимую процедуру без возвращаемого результата, и любой вызов вернет Неопределено.dbo.MyFunction(%1) или schema.func_name(%1, %2)). Если имя схемы опущено, СУБД может не найти объект в контексте пользователя подключения.Частый вопрос разработчиков: почему функция не видна в Конструкторе запроса? Рассмотрим поведение платформы в механизме запросов:
ВнешнийИсточникДанных.<ИмяВИД>.<ИмяФункции>(<Параметры>). При трансляции запроса в SQL платформа преобразует такое обращение в скалярное выражение.Выясним, с какими архитектурными ограничениями можно столкнуться при использовании функций через ВИД:
OUT или INOUT, получить результат через ВИД невозможно.INSERT, UPDATE, DELETE). Попытка вызвать функцию, меняющую состояние таблиц, приведет к ошибке уровня СУБД.RETURN), несколькими наборами строк (Recordsets), выходными параметрами или активным изменением данных, вместо стандартного ВИД целесообразно использовать прямое подключение через ADODB.Command и ADODB.Connection.Таким образом, для получения строкового результата из скалярной функции достаточно корректно объявить объект в метаданных внешнего источника, настроить типы и обращаться к ней прямо из встроенного языка 1С, учитывая, что возврат Неопределено чаще всего сигнализирует об отсутствии данных (SQL NULL) на стороне внешней системы.