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

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

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

Основы работы с параметрами типа Таблица Значений

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

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

Особое внимание следует уделить именам колонок. Они должны совпадать с теми, которые вы планируете использовать в условии INNER JOIN или в конструкции В. Регистр символов в именах полей также имеет значение, так как запросы 1С чувствительны к написанию идентификаторов.

💡

При объявлении параметра в СКД всегда явно указывайте тип "Таблица значений" и задавайте структуру колонок, даже если она формируется динамически в коде. Это упростит отладку макета.

Синтаксис подключения ТЗ в тексте запроса

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

Второй способ — это соединение (INNER JOIN или LEFT JOIN). Он применяется, когда из таблицы значений нужно получить дополнительные данные или когда логика отбора сложнее простого перечисления. В обоих случаях параметр в тексте запроса обозначается знаком & (амперсанд) перед его именем.

Рассмотрим пример простого отбора. Допустим, мы передаем список документов для анализа. Синтаксис будет выглядеть следующим образом:

ВЫБРАТЬ

Документ.Ссылка,

Документ.Дата

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ГДЕ

Документ.Ссылка В (&ПараметрТЗ)

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

Ограничения размера параметра

Параметры запроса в 1С имеют техническое ограничение на размер передаваемых данных (обычно около 2 МБ). Если ваша таблица значений содержит десятки тысяч строк, рассмотрите вариант записи данных во временную таблицу перед основным запросом.

Настройка структуры параметра в СКД

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

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

  • 📁 Имя поля должно быть уникальным в рамках структуры параметра.
  • 🔗 Тип данных поля должен строго соответствовать типу данных в основной таблице запроса.
  • 🏷️ Имя параметра в макете должно совпадать с именем, используемым в тексте запроса (без учета регистра, но лучше соблюдать единообразие).

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

📊 Как вы чаще всего передаете списки в запросы 1С?
Через параметр ТЗ
Через временную таблицу
Через строку с разделителями
Через несколько отдельных параметров

Программная передача данных из кода

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

Ниже приведен пример кода, который демонстрирует правильный подход к формированию параметра. Обратите внимание на использование метода ДобавитьКолонку и заполнение через Добавить.

Параметры = Новый Структура;

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

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

Для Каждого Элемент Из СписокОтбора Цикл

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

НоваяСтрока.Номенклатура = Элемент.Ссылка;

КонецЦикла;

Параметры.Вставить("СписокНоменклатуры", ТЗ);

Отчет.УстановитьПараметры(Параметры);

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

💡

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

Оптимизация и производительность запросов

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

Для улучшения ситуации можно использовать временные таблицы. Суть метода заключается в том, чтобы сначала записать содержимое параметра-ТЗ во временную таблицу на стороне сервера 1С, а затем делать соединение с ней. Это позволяет СУБД построить более эффективные индексы.

Также стоит избегать использования ТЗ в вычисляемых полях или сложных условиях ЕСЛИ внутри запроса, если это возможно. Лучше вынести логику фильтрации на уровень соединения или предварительного отбора.

Метод использования Объем данных Рекомендация
Оператор В (&Параметр) До 10 000 строк Оптимально, просто в реализации
Временная таблица Более 10 000 строк Рекомендуется для больших объемов
INNER JOIN Любой объем Использовать для получения связанных данных
Строка с разделителями Малый объем Устаревший метод, не рекомендуется
⚠️ Внимание: Интерфейс и возможности конструктора запросов могут меняться в новых версиях платформы 1С:Предприятие. Всегда проверяйте актуальность синтаксических конструкций в справке по вашей версии платформы перед внедрением в промышленную эксплуатацию.

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

Наиболее частая ошибка при работе с ТЗ — несоответствие типов данных. Например, попытка передать в параметр, ожидающий Число, таблицу со строками, или сравнение ссылки на документ со строковым представлением GUID. Система выдаст ошибку "Неверный тип аргумента".

Вторая распространенная проблема — пустая таблица значений. Если пользователь не выбрал ни одного элемента в интерфейсе, а в запросе стоит жесткое условие В (&Параметр), результат выборки всегда будет пустым. Необходимо предусматривать логику обработки пустых параметров.

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

  • ❌ Ошибка: Передача ТЗ с колонкой "Имя" вместо "Ссылка".
  • ✅ Решение: Проверьте имена колонок в структуре параметра СКД и в коде заполнения.
  • ❌ Ошибка: Использование ТЗ в качестве скалярного значения.
  • ✅ Решение: Помните, что ТЗ — это набор данных, а не одно значение.

☑️ Диагностика проблем с ТЗ

Выполнено: 0 / 5
Можно ли передавать в ТЗ составные типы данных?

Да, в колонки таблицы значений можно добавлять поля составных типов (например, "СправочникСсылка.Номенклатура" ИЛИ "СправочникСсылка.ХарактеристикиНоменклатуры"). Однако это может усложнить написание условий запроса и потребует приведения типов при сравнении.

Что делать, если параметр ТЗ не виден в конструкторе запроса?

Убедитесь, что параметр добавлен в раздел "Параметры" макета компоновки данных, а не только в модуль объекта. Также проверьте, что имя параметра в тексте запроса начинается с символа & и совпадает с именем в макете.

Есть ли лимит на количество колонок в ТЗ параметре?

Технического жесткого лимита на количество колонок нет, но есть ограничение на общий размер передаваемого пакета данных между клиентом и сервером. Чрезмерное усложнение структуры ТЗ может привести к замедлению передачи данных.