Как правильно настроить отбор по списку значений в ПостроителеЗапроса?

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

При разработке отчетов или обработок на базе объекта ПостроительЗапроса разработчики часто сталкиваются с ошибкой «Неверный тип значения» при попытке программно установить отбор по списку значений. Давайте разберем, почему возникает этот конфликт типов и как правильно настроить фильтрацию, чтобы запрос выполнялся корректно.

Анализ проблемы

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

Если вы сначала пытаетесь передать в это поле СписокЗначений или массив, а затем меняете ВидСравнения на ВСписке, система «спотыкается» на этапе присвоения, так как она уже «попыталась» сопоставить ваш список с типом данных, ожидаемым для сравнения «Равно». Для успешной настройки необходимо изменить последовательность операций.

Правильная последовательность действий

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

  1. Добавление отбора: Вызовите метод Добавить() для коллекции Отбор вашего ПостроительЗапроса.
  2. Установка вида сравнения: В первую очередь установите ВидСравнения.ВСписке (или другой групповой вид, например, ВИерархии). Это действие сообщает платформе, что в дальнейшем мы будем передавать не единичное значение, а набор данных.
  3. Передача значения: Только после установки вида сравнения присвойте свойству Значение массив, полученный из вашего списка значений.

Рассмотрим пример правильного кода, который реализует данный алгоритм:


Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
    ОтборПоКонтрагенту = ПостроительЗапроса.Отбор.Добавить("Контрагент");
    // Сначала задаем вид сравнения
    ОтборПоКонтрагенту.ВидСравнения = ВидСравнения.ВСписке;
    // Затем передаем массив значений из списка
    ОтборПоКонтрагенту.Значение = Объект.Контрагент.ВыгрузитьЗначения();
    // Активируем использование
    ОтборПоКонтрагенту.Использование = Истина;
КонецЕсли;

Важные замечания по работе с типами

Обратите внимание на то, какой именно объект вы передаете в свойство Значение. Хотя переменная Объект.Контрагент может быть типом СписокЗначений, сам ПостроительЗапроса ожидает на вход массив значений. Использование метода ВыгрузитьЗначения() является обязательным, так как именно массив корректно трансформируется системой в SQL-условие IN (...).

Почему это важно для стабильности системы?

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

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

Если в процессе разработки вы меняете вид сравнения «на лету» (например, переключаетесь между «Равно» и «ВСписке» в зависимости от выбора пользователя), всегда переустанавливайте ВидСравнения до того, как обновлять свойство Значение. Это правило позволит вам создавать гибкие и безотказные интерфейсы для формирования отчетов и обработки данных.

← На главную