Как устранить ошибки при выводе списка критерия отбора в управляемых формах 1С

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

Работа с критериями отбора в управляемом интерфейсе 1С:Предприятие часто вызывает затруднения даже у опытных разработчиков. Одной из самых распространенных проблем является ошибка: «Ошибка обработки представления "КритерийОтбора.Имя:Несоответствие типов (параметр номер 1)"». Рассмотрим подробнее, почему это происходит, и разберем пошагово несколько способов решения этой задачи, чтобы ваши списки работали стабильно и корректно отображали данные.

Почему возникает ошибка «Несоответствие типов (параметр номер 1)»?

Проанализируем ситуацию: критерий отбора — это не просто статичная таблица базы данных, а виртуальная таблица-функция. Для того чтобы она вернула данные, ей необходимо передать значение, по которому будет производиться фильтрация (например, ссылка на конкретный проект или контрагента). Когда платформа генерирует форму списка критерия отбора автоматически, она не всегда корректно связывает передаваемый параметр с запросом динамического списка. В результате система пытается выполнить запрос к таблице КритерийОтбора.ИмяКритерия без указания обязательного параметра в скобках, что и приводит к ошибке «Несоответствие типов».

Способ 1. Использование стандартных параметризуемых команд (рекомендуемый)

Выясним самый простой и «чистый» с точки зрения архитектуры платформы способ. Платформа 1С умеет сама генерировать команды для открытия связанных данных. Если мы хотим видеть документы по конкретному объекту, нам не обязательно писать код открытия формы вручную.

  1. Откроем в конфигураторе объект, который является типом значения для нашего критерия отбора (например, справочник Проекты).
  2. Перейдем на закладку «Формы» и откроем форму элемента этого справочника.
  3. В окне редактора формы перейдем на закладку «Командный интерфейс» (левый верхний угол).
  4. В правой части окна (раздел «Команды») развернем ветку «Глобальные команды» -> «Параметризуемые».
  5. Найдем там команду нашего критерия отбора (она будет называться так же, как критерий).
  6. Перетащим эту команду мышкой в дерево элементов формы (например, в Командную панель или в группу «Важное»).

При таком подходе платформа сама обеспечит передачу ссылки текущего объекта в форму критерия отбора, и никаких ошибок с параметрами не возникнет. Это штатный механизм, который работает наиболее стабильно.

Способ 2. Настройка динамического списка с произвольным запросом

Если нам необходимо создать кастомную форму списка для критерия отбора, мы столкнемся с необходимостью ручной правки запроса. Разберем, как это сделать правильно.

В свойствах динамического списка на форме нужно выполнить следующие действия:

  1. Установим флаг «Произвольный запрос».
  2. В тексте запроса заменим стандартное обращение к таблице на вызов с параметром. Вместо автоматического текста:
    
    ВЫБРАТЬ
        КритерийОтбора.ДокументыПоПроекту.Ссылка КАК Ссылка
    ИЗ
        КритерийОтбора.ДокументыПоПроекту КАК КритерийОтбораДокументыПоПроекту
    

    Напишем следующий вариант:

    
    ВЫБРАТЬ
        КритерийОтбора.ДокументыПоПроекту.Ссылка КАК Ссылка
    ИЗ
        КритерийОтбора.ДокументыПоПроекту(&Значение) КАК КритерийОтбораДокументыПоПроекту
    

    Здесь &Значение — это предопределенное имя параметра, которое платформа ожидает встретить в динамических списках критериев отбора.

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

Способ 3. Программный вызов формы с передачей параметров

Рассмотрим ситуацию, когда форму нужно открыть программно, например, по нажатию кнопки. Чтобы избежать ошибки «DataParameters.Value Равно», нам нужно четко передать структуру отбора. Посмотрим на пример кода:


&НаКлиенте
Процедура ОткрытьДокументыПоОбъекту(ПараметрСсылка)
    
    // Формируем структуру параметров для отбора
    // Ключ "Значение" критически важен для виртуальных таблиц критериев
    ПараметрыОтбора = Новый Структура("Значение", ПараметрСсылка);
    
    // Помещаем отбор в структуру параметров формы
    ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
    
    // Открываем форму списка критерия отбора
    ОткрытьФорму("КритерийОтбора.ДокументыПоПроекту.ФормаСписка", ПараметрыФормы);
    
КонецПроцедуры

Обратим внимание на важный нюанс: если мы используем имя параметра, отличное от Значение (например, Проект), то в тексте запроса динамического списка также нужно будет изменить &Значение на &Проект. Однако использование стандартного имени &Значение минимизирует количество ошибок при обновлении платформы.

Что делать, если список открывается, но он пустой?

Иногда запрос выполняется успешно, форма открывается, но данных в таблице нет, хотя в базе они точно присутствуют. Проанализируем возможные причины:

  1. Отсутствие индексов: Реквизиты объектов, входящие в состав критерия отбора, должны иметь свойство Индексировать (или Индексировать с дополнительным упорядочиванием). Критерии отбора крайне чувствительны к наличию индексов.
  2. Функциональные опции: Если документы или справочники, входящие в критерий, скрыты функциональными опциями, они не будут отображаться в списке.
  3. Свойство «Основная таблица»: Проверьте, что в настройках ДинамическогоСписка на форме выбрана основная таблица. Если она пустая, динамическое считывание данных может работать некорректно.

Важный совет: При разработке на платформе версии 8.3 (особенно в релизах ниже 8.3.14) старайтесь не удалять автоматически сгенерированные поля из запроса динамического списка. Платформа часто опирается на них для внутренней фильтрации.

Таким образом, мы разобрали основные причины возникновения ошибок при работе с критериями отбора и изучили три надежных способа их решения. Выбор конкретного метода зависит от ваших задач: для типовых решений лучше использовать параметризуемые команды, а для сложных интерфейсов — произвольный запрос с параметром &Значение.

← На главную