Как вызвать функцию с параметрами через внешние источники данных в 1С и почему она возвращает Неопределено

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

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

Особенности синтаксиса вызова скалярных функций через ВИД

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

Посмотрим на пример корректного вызова скалярной функции из кода конфигурации:


ПараметрЗапроса = "01-000000000007533";
РезультатСсылки = ВнешниеИсточникиДанных.Процессинг.ПРЕФИКС_TECH_SUPPORT_GET_ACCESS_URL(ПараметрЗапроса);

Если РезультатСсылки = Неопределено Тогда
    Сообщить("Функция не вернула значение или во внешней базе результат равен NULL");
Иначе
    Сообщить("Полученный URL: " + РезультатСсылки);
КонецЕсли;

Обратите внимание: функция вызывается напрямую через точку от имени внешнего источника данных. Платформа берет на себя формирование корректного запроса к СУБД, передачу входного параметра и маршалинг результата в базовый тип платформы 1С (в данном случае — в строку).

Почему функция возвращает Неопределено: анализ причин

Если синтаксис написан без синтаксических ошибок, но переменная получает Неопределено, проанализируем возможные источники проблемы:

  1. Преобразование внешнего SQL NULL: Внешние СУБД при отсутствии данных, завершении срока действия временной записи или пустой выборке внутри функции возвращают значение NULL. Платформа 1С при объектном вызове скалярных функций преобразует значение NULL внешней базы данных в значение Неопределено. Если запрашиваемый токен, ссылка или запись имеют ограниченное время жизни (TTL) и уже удалены из таблиц СУБД, функция вернет Неопределено, хотя сама интеграция настроена корректно.
  2. Настройки метаданных (флаг возврата значения): В свойствах функции внешнего источника данных обязательно должен быть установлен признак Возвращает значение и указан соответствующий тип (например, Строка). Если этот флаг снят, платформа интерпретирует объект как хранимую процедуру без возвращаемого результата, и любой вызов вернет Неопределено.
  3. Шаблон «Выражение в источнике данных»: Для корректного сопоставления важно проверить свойство функции Выражение в источнике данных. В нем должен быть указан корректный синтаксис диалекта СУБД с позиционными параметрами (например, dbo.MyFunction(%1) или schema.func_name(%1, %2)). Если имя схемы опущено, СУБД может не найти объект в контексте пользователя подключения.

Использование функций ВИД в запросах и Конструкторе

Частый вопрос разработчиков: почему функция не видна в Конструкторе запроса? Рассмотрим поведение платформы в механизме запросов:

  1. Ограничения Конструктора запросов: Скалярные функции внешних источников данных не выводятся визуально в дереве таблиц и полей Конструктора запросов. Визуально доступны только таблицы внешнего источника.
  2. Ручное указание в тексте запроса: Несмотря на отсутствие в визуальном конструкторе, скалярные функции ВИД можно прописывать в тексте запроса вручную по правилу: ВнешнийИсточникДанных.<ИмяВИД>.<ИмяФункции>(<Параметры>). При трансляции запроса в SQL платформа преобразует такое обращение в скалярное выражение.
  3. Табличные функции (Table-Valued Functions): Если функция на стороне СУБД возвращает не единичное значение, а набор строк (таблицу), её нельзя настраивать как скалярную функцию. Для неё в ветке «Таблицы» внешнего источника создается отдельная таблица со свойством Вид таблицы = Выражение, где прописывается вызов функции с параметрами. Такие таблицы полностью поддерживаются Конструктором запроса.

Ограничения и альтернативные подходы

Выясним, с какими архитектурными ограничениями можно столкнуться при использовании функций через ВИД:

  1. Отсутствие выходных параметров: Механизм внешних источников данных поддерживает только входящие параметры. Если хранимая процедура или функция использует модификаторы OUT или INOUT, получить результат через ВИД невозможно.
  2. Запрет DML-операций: Скалярные функции в большинстве СУБД (например, в MS SQL Server) не имеют права выполнять команды модификации данных (INSERT, UPDATE, DELETE). Попытка вызвать функцию, меняющую состояние таблиц, приведет к ошибке уровня СУБД.
  3. Альтернатива через прямое соединение (ADO/COM): Если логика интеграции требует вызова процедур с кодами возврата (RETURN), несколькими наборами строк (Recordsets), выходными параметрами или активным изменением данных, вместо стандартного ВИД целесообразно использовать прямое подключение через ADODB.Command и ADODB.Connection.

Таким образом, для получения строкового результата из скалярной функции достаточно корректно объявить объект в метаданных внешнего источника, настроить типы и обращаться к ней прямо из встроенного языка 1С, учитывая, что возврат Неопределено чаще всего сигнализирует об отсутствии данных (SQL NULL) на стороне внешней системы.

← На главную