Разработка и Конфигурация · 10 мин
Консоль запросов 1С: таблица значений как параметр
Как передать таблицу значений как параметр в консоль запросов 1С: создание временной таблицы, индексация, соединения, типичные ошибки и проверка результата.
Передача таблицы значений в запрос — стандартный приём при отладке и разработке в 1С. В типовом запросе нельзя напрямую сослаться на таблицу значений: сначала её передают как параметр, помещают во временную таблицу, а затем используют в соединениях и отборах. Консоль запросов упрощает эту задачу, позволяя сформировать параметр прямо в интерфейсе инструмента.
Такой подход нужен, когда данные уже выбраны кодом (например, список документов из обработки), а дальше требуется соединить их с данными базы, наложить отбор или сгруппировать. Без временной таблицы пришлось бы перечислять значения через ИЛИ или В, что неудобно и медленно при больших объёмах.
Ниже разобрано, как устроен механизм передачи таблицы значений, как настроить параметр в консоли запросов, как индексировать временную таблицу и каких ошибок чаще всего допускаются на этом пути.
Как работает передача таблицы значений в запрос
Объект «Запрос» в 1С не умеет читать таблицу значений напрямую. Вместо этого таблица передаётся через Запрос.УстановитьПараметр("ТЗ", ТаблицаЗначений), а в тексте запроса первый пакет выбирает из неё поля и помещает результат во временную таблицу. Дальше эта временная таблица доступна внутри пакета запроса как обычная таблица.
Типичный текст запроса выглядит так:
ВЫБРАТЬ
ТЗ.Номенклатура КАК Номенклатура,
ТЗ.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Данные
ИЗ
&ТЗ КАК ТЗ
;
ВЫБРАТЬ
ВТ.Номенклатура,
ВТ.Количество,
Остатки.КоличествоОстаток
ИЗ
ВТ_Данные КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО ВТ.Номенклатура = Остатки.Номенклатура
Важно понимать: временная таблица живёт внутри менеджера временных таблиц запроса и исчезает после его выполнения (или уничтожения). Консоль запросов создаёт менеджер автоматически, поэтому в инструменте достаточно написать текст и заполнить параметр.
Настройка параметра в консоли запросов
В большинстве консолей запросов (типовой с диска ИТС, а также популярных альтернативных) параметры объявляются автоматически при разборе текста запроса. Если в тексте встречается &ТЗ, консоль добавит параметр с этим именем, и для него нужно выбрать тип «Таблица значений».
Дальше требуется заполнить саму таблицу. В зависимости от версии консоли доступны ручной ввод строк, вставка из буфера обмена, загрузка из mxls-файла или табличного документа. Порядок действий в типичном случае:
- 1Вставьте текст запроса с ПОМЕСТИТЬ для параметра &ТЗ
- 2Откройте список параметров и найдите параметр ТЗ
- 3Установите тип значения «Таблица значений»
- 4Добавьте колонки с теми же именами, что и в запросе, и укажите тип каждой колонки
- 5Заполните строки данными вручную или загрузите из файла
- 6Выполните запрос и проверьте содержимое временной таблицы отдельным пакетом
Имена колонок в таблице значений должны совпадать с именами полей в секции ВЫБРАТЬ первого пакета. Если в запросе написано ТЗ.Номенклатура, а колонка названа «Товар», запрос завершится с ошибкой о ненайденном поле.
Индексация временной таблицы
Когда во временную таблицу помещается заметное количество строк и она участвует в соединениях, стоит добавить индекс. Для этого после ПОМЕСТИТЬ используется конструкция ИНДЕКСИРОВАТЬ ПО с перечислением полей соединения:
ПОМЕСТИТЬ ВТ_Данные
ИЗ
&ТЗ КАК ТЗ
ИНДЕКСИРОВАТЬ ПО
Номенклатура
Без индекса СУБД может строить план с полным перебором, что на больших таблицах ощутимо замедляет выполнение. С индексом соединение по ключевому полю выполняется быстрее. Для таблиц в несколько строк разницы практически нет, поэтому индексирование оправдано при сотнях и тысячах строк.
Проверить эффект можно, выполнив запрос в консоли с замером времени (многие консоли показывают длительность выполнения) до и после добавления ИНДЕКСИРОВАТЬ ПО.
Типичные ошибки при передаче таблицы значений
Отдельно стоит сказать о дублях. Таблица значений не гарантирует уникальность строк, и если в ней одна и та же номенклатура встречается дважды, соединение с виртуальной таблицей остатков даст две строки. Лечится добавлением РАЗЛИЧНЫЕ или группировкой в первом пакете:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ТЗ.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_Данные
ИЗ
&ТЗ КАК ТЗ
Как проверить результат
Прежде чем строить сложный запрос, полезно убедиться, что временная таблица заполнилась корректно. Для этого в консоли выполняют отдельный пакет ВЫБРАТЬ * ИЗ ВТ_Данные после основного пакета помещения — многие консоли позволяют просматривать временные таблицы.
Как проверить результат
Число строк совпадает с числом строк исходной таблицы значений
Строк меньше или больше — проверьте отбор и дубли
К ключевым строкам подтянулись данные, NULL только там, где записей действительно нет
Все поля соединения пустые — вероятно, несовместимы типы колонки и поля
Суммы совпадают с контрольным расчётом по исходным данным
Суммы завышены кратно — во временной таблице дубли
Если запрос выполняется без ошибок, но возвращает пустой результат, первым делом проверяйте типы колонок. Это самая коварная ситуация: платформа не сообщает об ошибке, потому что формально запрос корректен — просто условие соединения никогда не выполняется.
Ограничения и альтернативные подходы
Передача таблицы значений — не единственный способ отфильтровать данные по списку значений. Для небольших списков однотипных элементов проще использовать параметр-массив и условие В (&Список). Для иерархических отборов — В ИЕРАРХИИ. Таблица значений нужна, когда передаётся несколько связанных колонок (например, пары «номенклатура + характеристика» или «документ + количество»).
Сравнение вариантов
Подходит для отбора по одному полю: список ссылок, артикулов, дат. Проще в настройке, но не передаёт связанные пары значений.
Нужна для составных ключей и дополнительных данных (количество, цена) рядом с ключом. Требует аккуратной работы с типами и дублями.
Работает как массив, но менее удобен при программном заполнении; обычно используют массив.
Ограничения механизма: временные таблицы потребляют память сервера, при очень больших объёмах возможно временное размещение на диске СУБД и замедление. Если таблица значений содержит сотни тысяч строк, стоит пересмотреть логику — возможно, данные правильнее сначала записать в базу или сократить объём отборами.
Отладка в коде после консоли
После успешной отработки в консоли запрос переносится в модуль. При переносе важно не потерять установку параметра: Запрос.УстановитьПараметр("ТЗ", ТаблицаЗначений) должна идти до Запрос.Выполнить(). Если запрос пакетный и нужен результат последнего пакета, используют ВыполнитьПакет() или Выполнить().Выгрузить() в зависимости от структуры текста.
Удобно хранить отлаженный текст запроса вместе с примером таблицы значений в макете обработки. Тогда при доработках можно быстро вернуться в консоль, загрузить сохранённые данные и воспроизвести ситуацию без повторного сбора параметров вручную.
Если в коде запрос не находит временную таблицу, проверьте, что используется тот же объект запроса и тот же менеджер временных таблиц. При выносе частей логики в отдельные запросы менеджер нужно передавать явно: Запрос2.МенеджерВременныхТаблиц = Запрос1.МенеджерВременныхТаблиц.
Что важно запомнить
Таблица значений передаётся параметром, помещается во временную таблицу первым пакетом и дальше используется в соединениях. Контролируйте имена и типы колонок, убирайте дубли, индексируйте большие таблицы и проверяйте содержимое временной таблицы отдельным запросом перед анализом итогового результата.
Частые вопросы
Почему запрос с параметром-таблицей возвращает пустой результат без ошибки?
Чаще всего тип колонки таблицы значений не совпадает с типом поля базы: например, в колонке строка, а в базе ссылка на справочник. Условие соединения формально корректно, но никогда не выполняется. Проверьте типы колонок и приведите их к ссылочным типам.
Можно ли передать таблицу значений без создания временной таблицы?
Нет, прямого обращения к параметру-таблице в соединениях нет — стандартный путь именно через ПОМЕСТИТЬ во временную таблицу. Это не лишний шаг: временная таблица дополнительно позволяет индексировать данные и убирать дубли.
Как увидеть содержимое временной таблицы в консоли запросов?
Добавьте после пакета с ПОМЕСТИТЬ отдельный пакет вида ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы и выполните его. Многие консоли также имеют отдельную команду просмотра временных таблиц текущего менеджера.
Что делать, если строки результата задваиваются после соединения?
Проверьте временную таблицу на дубли ключевых полей. Добавьте РАЗЛИЧНЫЕ или группировку в пакет помещения. Также убедитесь, что соединяемая таблица сама не содержит нескольких записей на один ключ — тогда нужна группировка или виртуальная таблица итогов.
Нужно ли индексировать временную таблицу всегда?
Нет. Для таблиц из нескольких десятков строк индекс почти не влияет на скорость. ИНДЕКСИРОВАТЬ ПО имеет смысл при заметных объёмах и соединениях по конкретным полям — указывайте в индексе именно поля соединения.
Можно ли использовать временную таблицу в другом запросе?
Да, если обоим запросам назначен один и тот же менеджер временных таблиц. В консоли запросов это происходит автоматически в рамках одного текста; в коде менеджер нужно передавать явно через свойство МенеджерВременныхТаблиц.