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