При разработке и отладке сложных запросов в платформе 1С:Предприятие часто возникает необходимость передать коллекцию значений в качестве параметра. В программном коде разработчик может легко передать объект типа Массив или СписокЗначений. Однако при попытке выполнить тот же самый запрос в интерактивной Консоли запросов можно столкнуться с ситуацией, когда запрос возвращает 0 записей или выгружает ошибку типов.
Рассмотрим подробно причины такого поведения платформы, разберем ключевые технические различия между объектами Массив и СписокЗначений и изучим варианты решения данной задачи при отладке.
Выясним причину, почему в коде запрос работает корректно, а в консоли запросов выдает пустой результат. В платформе 1С:Предприятие эти два объекта выполняют принципиально разные функции:
Массив) — это базовая последовательная коллекция значений любого типа (ссылки, строки, числа). Элементы массива содержат исключительно чистые данные.СписокЗначений) — это специализированный объект интерфейса, предназначенный для интерактивного выбора элементов пользователем. Каждый элемент списка представляет собой составную структуру со свойствами Значение, Представление, Пометка, Картинка.При использовании стандартного оператора В (&Параметр) платформа 1С автоматически умеет считывать значения как из массива, так и из списка значений. Однако существуют специфические параметры, где платформа требует строго определенный тип данных.
Проанализируем ситуацию с виртуальными таблицами. Некоторые параметры виртуальных таблиц (например, список измерений или разрезов в регистрах расчета) на уровне платформы **строго требуют тип Массив** (например, массив строк с именами измерений).
Разберем по шагам, почему возникает ошибка при отладке в консоли:
СписокЗначений для интерактивного ввода коллекций, так как в платформе нет встроенной формы редактирования объектов типа Массив.СписокЗначений напрямую в метод Запрос.УстановитьПараметр(), платформа 1С не может корректно прочитать структуру параметров виртуальной таблицы.Рассмотрим несколько способов, которые позволяют успешно отладить запрос с параметрами-коллекциями.
Если параметр передается в обычное условие ГДЕ Ссылка В (&Параметр), достаточно выбрать в консоли запросов тип параметра Список значений и заполнить его нужными элементами. Убедитесь, что типы значений в списке строго соответствуют типам полей в базе данных (например, конкретная ссылка справочника, а не ее строковое представление).
Продвинутые консоли запросов (например, из состава Универсальных инструментов разработчика) позволяют задавать параметры с помощью кода 1С. В таком случае список значений перед передачей в параметр можно выгрузить в чистый массив с помощью метода ВыгрузитьЗначения().
Посмотрим на пример кода обработки параметров:
// Создаем список значений
СписокИзмерений = Новый СписокЗначений;
СписокИзмерений.Добавить("Сотрудник");
СписокИзмерений.Добавить("Подразделение");
// Выгружаем чистый массив значений из списка
МассивДляЗапроса = СписокИзмерений.ВыгрузитьЗначения();
// Передаем массив в параметр запроса
Запрос.УстановитьПараметр("Измерения", МассивДляЗапроса);
Если используемая консоль не позволяет передать чистый массив, а отладить запрос необходимо, проанализируем простой вариант обхода. На время отладки в консоли можно заменить имя параметра конкретной строкой или значением прямо в тексте запроса.
Рассмотрим пример подстановки в виртуальную таблицу:
// В коде программы используется параметр:
// РегистрРасчета.ОсновныеНачисления.Авторасчет(&Измерения)
// На время отладки в консоли запросов меняем параметр на значение:
РегистрРасчета.ОсновныеНачисления.Авторасчет("Сотрудник")
Для сравнения рассмотрим, как передача массива в параметры запроса выглядит в рабочем программном коде 1С:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОсновныеНачисления.Сотрудник КАК Сотрудник,
| ОсновныеНачисления.Результат КАК Результат
|ИЗ
| РегистрРасчета.ОсновныеНачисления.СоздатьЗаписи() КАК ОсновныеНачисления";
// Формируем массив строк с именами измерений
МассивИзмерений = Новый Массив;
МассивИзмерений.Добавить("Сотрудник");
// Передаем массив в параметр
Запрос.УстановитьПараметр("Измерения", МассивИзмерений);
РезультатЗапроса = Запрос.Выполнить();
При работе с параметрами запросов рекомендуется придерживаться следующих правил:
Массив.