Как в 1С настроить внешний источник данных для получения таблицы из хранимой процедуры?

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

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

Понятие таблицы-выражения во внешних источниках данных

Для начала проанализируем, что представляет собой таблица вида «Выражение» (Expression). В отличие от обычных таблиц ВИД, которые напрямую маппятся на физические таблицы или представления (view) в сторонней базе, таблица-выражение позволяет нам самим определить SQL-запрос, который будет выполнен для получения данных. Платформа 1С воспринимает текст, написанный в поле «Выражение в источнике данных», как подзапрос. При выполнении запроса в 1С итоговая SQL-конструкция будет выглядеть примерно так: SELECT ... FROM (Текст_Вашего_Выражения) AS Subquery.

Рассмотрим по шагам, как правильно настроить этот механизм в конфигураторе и коде 1С.

Шаг 1. Импорт метаданных и создание функции

Прежде чем приступать к созданию таблицы, необходимо зафиксировать структуру данных. Разберем последовательность действий:

  1. Переходим в ветку конфигурации ВнешниеИсточникиДанных и открываем нужный источник.
  2. В ветке Функции можно импортировать описание хранимой процедуры из внешней базы. Это поможет платформе понять, какие параметры принимает процедура.
  3. После импорта в свойствах функции сформируется выражение вида: Имя_Процедуры(&Параметр1, &Параметр2).

Важно понимать, что на уровне СУБД (например, MS SQL Server или PostgreSQL) хранимые процедуры и функции работают по-разному. Если ваша задача — получить таблицу, то наиболее стабильным вариантом будет использование Table-Valued Functions (TVF). Если же вы ограничены использованием именно Stored Procedure, нам придется прибегнуть к специфическим конструкциям SQL.

Шаг 2. Настройка таблицы вида «Выражение»

Теперь создадим саму таблицу, которая будет отображать результат выполнения процедуры:

  1. В ветке Таблицы нашего внешнего источника добавим новую таблицу.
  2. В свойстве Вид таблицы обязательно выберем значение Выражение.
  3. В поле Выражение в источнике данных впишем SQL-запрос для вызова процедуры.

Проанализируем синтаксис для разных СУБД. Если мы работаем с PostgreSQL, вызов функции, возвращающей таблицу, выглядит максимально просто:

get_report_data(&ДатаНачала, &ДатаОкончания)

Для MS SQL Server ситуация сложнее, так как стандартный вызов EXEC нельзя вставить в подзапрос SELECT FROM (...). В этом случае мы рекомендуем либо переделать процедуру в функцию (TVF), либо использовать конструкцию OPENQUERY. Рассмотрим пример с функцией:

dbo.fn_GetSalesByPeriod(&StartDate, &EndDate)

Шаг 3. Описание полей и типов данных

Выясним критически важный момент: 1С не умеет динамически определять состав колонок, возвращаемых выражением. Нам необходимо вручную описать все поля в ветке Поля созданной таблицы ВИД.

Важные требования к полям:

Шаг 4. Передача динамических параметров из кода 1С

Одной из главных сложностей является передача параметров «на лету». Мы не можем просто менять текст выражения в конфигураторе во время работы пользователя. Для этого используется механизм параметров запроса.

Разберем, как это работает. В поле «Выражение в источнике данных» мы указали параметры через амперсанд (например, &StartDate). Теперь посмотрим, как обратиться к этой таблице из встроенного языка 1С:


// Создаем новый запрос к внешнему источнику
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВнешняяТаблица.НоменклатураНаименование КАК Наименование,
    |	ВнешняяТаблица.КоличествоОстаток КАК Остаток
    |ИЗ
    |	ВнешнийИсточникДанных.МояВнешняяБаза.Таблица.ПродажиПоПроцедуре КАК ВнешняяТаблица
    |ГДЕ
    |	ВнешняяТаблица.StartDate = &ДатаНач
    |	И ВнешняяТаблица.EndDate = &ДатаКон";

// Устанавливаем значения параметров
Запрос.УстановитьПараметр("ДатаНач", Объект.ДатаНачала);
Запрос.УстановитьПараметр("ДатаКон", Объект.ДатаОкончания);

// Выполняем запрос и получаем результат
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Обработка данных
    Сообщить("Товар: " + Выборка.Наименование + " Остаток: " + Выборка.Остаток);
КонецЦикла;

Обратите внимание: Платформа 1С самостоятельно сопоставит параметры запроса &ДатаНач с параметрами, указанными в выражении ВИД. Это позволяет выполнять динамические вызовы хранимых процедур с разными условиями фильтрации.

Особенности и ограничения метода

Проанализируем ситуацию с производительностью и ограничениями, чтобы избежать ошибок при проектировании системы:

  1. Только чтение: Таблицы, основанные на выражениях, всегда открываются в режиме «Только чтение». Вы не сможете использовать методы СоздатьОбъект() или Записать() для изменения данных во внешней базе через этот механизм. Для записи данных придется использовать либо стандартные таблицы ВИД, либо прямой SQL.
  2. Сложные соединения (JOIN): Будьте осторожны при соединении таблиц-выражений ВИД с внутренними таблицами 1С (например, со справочниками). Платформа может сначала получить весь результат выполнения процедуры во временную таблицу на сервере 1С, а только потом выполнить соединение. Если процедура возвращает сотни тысяч строк, это вызовет серьезные задержки.
  3. Отсутствие типизации в Конфигураторе: При написании SQL-кода в поле «Выражение» конфигуратор не проверяет синтаксис вашей СУБД. Ошибку вы увидите только в режиме «1С:Предприятие» при попытке обращения к данным. Пользуйтесь внешними инструментами (например, SSMS для MS SQL) для предварительной отладки запроса.
  4. NULL значения: Всегда проверяйте, как ваша процедура обрабатывает пустые значения. Несоответствие NULL в SQL и NULL в 1С иногда приводит к неожиданному исчезновению строк из выборки.

Альтернативный подход: Прямой запрос (Native SQL)

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

Посмотрим на пример использования:


// Пример прямого запроса без описания таблиц в конфигураторе
СтрокаЗапроса = "EXEC GetReportData '" + Формат(ДатаНач, "ДФ=yyyyMMdd") + "', 10";
Результат = ВнешниеИсточникиДанных.МояВнешняяБаза.ВыполнитьЗапрос(СтрокаЗапроса);

// Результат будет возвращен в виде стандартного объекта РезультатЗапроса
Выборка = Результат.Выбрать();

Этот метод значительно гибче, так как позволяет отправлять любой текст запроса напрямую. Однако он лишает вас возможности использовать визуальный конструктор запросов 1С и типизацию полей, настроенную в метаданных.

Таким образом, мы рассмотрели основной механизм работы с хранимыми процедурами через ВИД. Использование таблиц-выражений является наиболее «правильным» с точки зрения архитектуры 1С методом, так как он позволяет интегрировать внешние данные в общую структуру метаданных и использовать стандартный механизм запросов платформы.

← На главную