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