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

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

В данной статье мы детально разберем процесс подготовки данных, синтаксис объявления параметров и особенности работы с типом ТаблицаЗначений непосредственно в отладчике запросов. Вы научитесь избегать распространенных ошибок типизации и сможете гибко управлять объемом передаваемой информации.

Подготовка структуры Таблицы значений

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

Создание таблицы обычно происходит в коде управляемого приложения или в модуле объекта. Для этого используется конструктор Новый ТаблицаЗначений(). Важно заранее продумать, какие колонки будут участвовать в фильтрации или соединении (JOIN). Типы данных колонок также должны совпадать: нельзя передать строку в колонку, ожидающую число.

Рассмотрим пример инициализации. Мы создаем таблицу с двумя колонками: "Номенклатура" (тип СправочникСсылка.Номенклатура) и "Количество" (тип Число). Заполняем её тестовыми данными, которые затем будем использовать для выборки из регистра накопления.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура", ТипОписанияТипов("СправочникСсылка.Номенклатура"));

ТЗ.Колонки.Добавить("Количество", ТипОписанияТипов("Число,15,2"));

Строка = ТЗ.Добавить();

Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар А");

Строка.Количество = 10;

После формирования структуры данные готовы к передаче. Однако в самой консоли запросов процесс ввода может отличаться от программного кода, так как интерфейс инструмента имеет свои ограничения на прямое копирование объектов.

Синтаксис объявления параметров в тексте запроса

Ключевым моментом является правильное объявление параметра в теле запроса. В отличие от обычных переменных, табличные параметры требуют явного указания структуры или использования специального синтаксиса подстановки. Если вы используете параметр в операторе В или в условии соединения, движок запросов должен знать, что это таблица.

Стандартный синтаксис предполагает использование знака & перед именем параметра. Например, &ПараметрТаблица. Внутри текста запроса вы обращаетесь к колонкам этой таблицы так, как если бы это была обычная виртуальная таблица. Это позволяет строить сложные условия фильтрации на основе переданного списка.

Обратите внимание, что в некоторых версиях платформы или конкретных конфигурациях может потребоваться явное описание полей параметра в диалоговом окне консоли. Если система не может автоматически определить структуру, она запросит её у вас перед выполнением.

Особенность синтаксиса JOIN

При соединении основной таблицы с параметром-таблицей, имя параметра используется как имя виртуального источника данных. Например: ИЗ РегистрНакопления.Продажи КАК Продажи ВНУТРЕННЕЕ СОЕДИНЕНИЕ &ПараметрТаблица КАК ПТ ПО Продажи.Номенклатура = ПТ.Номенклатура

Некорректное написание имени параметра или опечатка в названии колонки внутри запроса приведет к тому, что консоль не сможет сопоставить переданные данные с текстом запроса. Всегда проверяйте соответствие имен колонок в коде 1С и в тексте SQL-подобного запроса.

Ввод данных через интерфейс Консоли запросов

Самый сложный этап для новичков — это ввод значения параметра в окне запуска консоли. Когда вы нажимаете кнопку "Выполнить", система анализирует текст и находит переменные, начинающиеся с &. Для параметра типа Таблица значений откроется отдельное окно редактирования структуры.

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

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

  • 📋 Убедитесь, что первая строка в окне параметров содержит заголовки колонок, а не данные.
  • 🔢 Проверяйте типы данных: дата должна быть в формате ДД.ММ.ГГГГ, числа — без разделителей тысяч, если это не настройки региона.
  • 🔗 Ссылки на объекты (справочники, документы) лучше вводить по наименованию, если консоль поддерживает автоподстановку, или по уникальному идентификатору (UUID).
💡

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

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

Использование параметра в операторах ВЫБОР и В

Основное назначение передачи таблицы — фильтрация больших объемов данных. Чаще всего параметр используется в операторе ГДЕ ... В. Это позволяет выбрать только те записи из регистра, которые присутствуют в переданном списке. Такой подход гораздо эффективнее, чем формирование длинного списка литералов через запятую.

Рассмотрим пример запроса, где мы выбираем остатки только по определенному списку товаров. Параметр &СписокТоваров играет роль фильтра. Если список пуст, запрос вернет пустой результат, что является корректным поведением.

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(, , , ) КАК Остатки

ГДЕ

Остатки.Номенклатура В (&СписокТоваров)

Помимо оператора В, таблицу значений можно использовать в конструкциях ВЫБОР для подстановки коэффициентов или дополнительных атрибутов. Вы можете сделать JOIN с параметром-таблицей, чтобы "обогатить" основную выборку данными, которые не хранятся в базе, но были рассчитаны клиентом.

💡

Использование таблицы значений в операторе В позволяет избежать ограничения на длину строки запроса и повышает читаемость кода по сравнению со списком констант.

При использовании в JOIN убедитесь, что тип соединения (Внутреннее, Левое, Правое) соответствует логике вашей задачи. Внутреннее соединение отсечет записи, для которых нет совпадений в параметре, а левое сохранит все записи основной таблицы.

Типичные ошибки и способы их устранения

При работе с табличными параметрами разработчики часто сталкиваются с рядом специфических ошибок. Самая распространенная из них — несоответствие типов колонок. Если в запросе поле имеет тип СправочникСсылка, а в параметре передано Строка, выполнение прервется.

Другая частая проблема — пустая таблица параметров. Некоторые версии платформы могут некорректно обрабатывать ситуацию, когда таблица передана, но не содержит ни одной строки. В таких случаях рекомендуется добавлять проверку на заполненность перед выполнением запроса или использовать конструкцию ЕСТЬ.

⚠️ Внимание: Если вы получаете ошибку "Неверный тип параметра", проверьте, не пытается ли система интерпретировать вашу таблицу как скалярное значение. Убедитесь, что в тексте запроса параметр используется в контексте, ожидающем таблицу (например, справа от оператора В).

Также стоит помнить о производительности. Передача огромной таблицы значений (десятки тысяч строк) через консоль может привести к зависанию интерфейса. Для отладки используйте небольшие выборки. В реальном коде механизм передачи оптимизирован, но в инструменте отладки есть ограничения.

Тип ошибки Вероятная причина Метод решения
Неверный тип значения Несовпадение типа колонки в ТЗ и в запросе Привести типы к общему виду или изменить описание параметра
Поле не найдено Опечатка в имени колонки параметра Проверить соответствие имен в коде и тексте запроса
Ошибка компиляции Параметр используется как скаляр Использовать оператор В или JOIN
📊 С какой ошибкой вы сталкивались чаще всего?
Несовпадение типов
Опечатка в имени
Пустая таблица
Зависание консоли

Анализ текста ошибки в окне сообщений консоли обычно дает прямую подсказку. Внимательно читайте номер строки и имя параметра, на которое жалуется система.

Оптимизация и лучшие практики

Для обеспечения максимальной производительности при работе с табличными параметрами следует соблюдать несколько правил. Во-первых, старайтесь передавать только необходимые колонки. Лишние данные увеличивают объем передаваемой информации и время на парсинг.

Во-вторых, используйте индексы. Если вы делаете соединение по какому-то полю, убедитесь, что в основной таблице базы данных по этому полю построен индекс. Это ускорит выборку в разы, особенно на больших объемах данных.

⚠️ Внимание: Интерфейс и возможности Консоли запросов могут незначительно отличаться в зависимости от версии платформы 1С и конфигурации. Всегда сверяйтесь с документацией к вашей конкретной версии, если стандартные приемы не работают.

Хорошей практикой является сохранение удачных запросов с настроенными параметрами в файл .txt или в обработку администратора. Это позволит быстро воспроизвести сценарий тестирования в будущем без необходимости заново вводить структуру таблицы.

☑️ Проверка перед запуском

Выполнено: 0 / 4

Помните, что консоль запросов — это мощный инструмент отладки, но финальный код должен быть написан с учетом всех ограничений производственной среды. Тестируйте запросы на реальных объемах данных, чтобы убедиться в их эффективности.

Часто задаваемые вопросы (FAQ)

Можно ли передать в параметр результат другого запроса?

Да, это возможно. Вам нужно выполнить первый запрос, получить результат в виде Таблицы значений, а затем передать эту таблицу как параметр во второй запрос. В коде это делается через свойство Результат.Выгрузить() или прямой передачей объекта таблицы.

Почему консоль не видит параметр, хотя он есть в тексте?

Проверьте, стоит ли символ & перед именем параметра. Также убедитесь, что нет лишних пробелов или символов, разделяющих имя. Если параметр находится внутри вложенного запроса (в скобках), он также должен быть корректно объявлен в области видимости.

Как передать пустую таблицу значений для проверки логики?

В окне параметров просто создайте структуру колонок, но не добавляйте ни одной строки данных. Запрос выполнится корректно и вернет пустой результат, что позволит проверить обработку граничных условий в вашей логике.

Есть ли ограничение на количество строк в таблице параметров?

Технического жесткого ограничения в самом языке запросов нет, но есть ограничения памяти клиента и времени выполнения. Для отладки в консоли рекомендуется не превышать несколько тысяч строк, чтобы интерфейс оставался отзывчивым.