При разработке отчетов или обработок на базе объекта ПостроительЗапроса разработчики часто сталкиваются с ошибкой «Неверный тип значения» при попытке программно установить отбор по списку значений. Давайте разберем, почему возникает этот конфликт типов и как правильно настроить фильтрацию, чтобы запрос выполнялся корректно.
Основная причина ошибки кроется в механизме валидации типов, который платформа 1С:Предприятие выполняет в момент взаимодействия с коллекцией Отбор. Когда вы добавляете новый элемент в отбор методом Добавить(), платформа по умолчанию инициализирует его с ВидСравнения, равным Равно. В этот момент система ожидает, что в свойство Значение будет передано одиночное значение, соответствующее типу поля, по которому накладывается фильтр.
Если вы сначала пытаетесь передать в это поле СписокЗначений или массив, а затем меняете ВидСравнения на ВСписке, система «спотыкается» на этапе присвоения, так как она уже «попыталась» сопоставить ваш список с типом данных, ожидаемым для сравнения «Равно». Для успешной настройки необходимо изменить последовательность операций.
Чтобы избежать ошибки и обеспечить корректную работу фильтра, следуйте строгому порядку действий при написании кода:
Добавить() для коллекции Отбор вашего ПостроительЗапроса.ВидСравнения.ВСписке (или другой групповой вид, например, ВИерархии). Это действие сообщает платформе, что в дальнейшем мы будем передавать не единичное значение, а набор данных.Значение массив, полученный из вашего списка значений.Рассмотрим пример правильного кода, который реализует данный алгоритм:
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
ОтборПоКонтрагенту = ПостроительЗапроса.Отбор.Добавить("Контрагент");
// Сначала задаем вид сравнения
ОтборПоКонтрагенту.ВидСравнения = ВидСравнения.ВСписке;
// Затем передаем массив значений из списка
ОтборПоКонтрагенту.Значение = Объект.Контрагент.ВыгрузитьЗначения();
// Активируем использование
ОтборПоКонтрагенту.Использование = Истина;
КонецЕсли;
Обратите внимание на то, какой именно объект вы передаете в свойство Значение. Хотя переменная Объект.Контрагент может быть типом СписокЗначений, сам ПостроительЗапроса ожидает на вход массив значений. Использование метода ВыгрузитьЗначения() является обязательным, так как именно массив корректно трансформируется системой в SQL-условие IN (...).
Почему это важно для стабильности системы?
Соблюдение порядка ВидСравнения -> Значение является «золотым стандартом» при работе с любыми механизмами отборов в 1С:Предприятие, включая КомпоновщикНастроекКомпоновкиДанных. Такая практика позволяет избежать непредсказуемого поведения системы, связанного с «ленивой» типизацией объектов платформы.
Помните, что ошибка «Неверный тип» — это всего лишь сигнал того, что система пытается привести данные к формату, который был задан по умолчанию при инициализации объекта отбора. Перехватывая инициативу и устанавливая параметры в нужном порядке, вы обеспечиваете чистоту и надежность вашего программного кода.
Если в процессе разработки вы меняете вид сравнения «на лету» (например, переключаетесь между «Равно» и «ВСписке» в зависимости от выбора пользователя), всегда переустанавливайте ВидСравнения до того, как обновлять свойство Значение. Это правило позволит вам создавать гибкие и безотказные интерфейсы для формирования отчетов и обработки данных.