Как открыть форму списка с отбором и избежать ошибки Несоответствие типов

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

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

Анализ основной проблемы: конфликт имен переменных

Рассмотрим ситуацию, с которой столкнулся автор темы. Код выглядит логично: создается структура отбора, помещается в параметры и передается в функцию ОткрытьФорму. Однако платформа выдает ошибку на этапе присваивания значения переменной. Выясним причину этого явления.

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

Проанализируем исправленный подход. Чтобы избежать конфликта, достаточно изменить имя переменной на любое уникальное, например ПараметрыОткрытия или пПараметры.

Пошаговая реализация открытия формы с отбором

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

  1. Подготовка значения отбора. Нам необходимо получить ссылку на объект, по которому будет идти фильтрация. В модуле формы элемента это может быть Объект.Ссылка.
  2. Создание структуры отбора. Ключом структуры должно выступать имя поля в динамическом списке, а значением — наша ссылка.
  3. Формирование параметров формы. Создаем общую структуру параметров, куда вставляем ключ "Отбор".
  4. Вызов функции открытия. Передаем имя формы и подготовленные параметры.

Посмотрим на пример кода, который исключает возникновение ошибок:


// Определяем ссылку, по которой будем фильтровать
НужныйСотрудник = Объект.Ссылка;

// Создаем структуру отбора. 
// "Сотрудник" — это имя реквизита в динамическом списке целевой формы
ЗначениеОтбора = Новый Структура("Сотрудник", НужныйСотрудник);

// Помещаем отбор в параметры открытия. 
// Внимание: используем имя переменной "ПараметрыФормы" вместо "ПараметрыВыбора"
ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора);

// Открываем форму списка документов
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыФормы);

Важные нюансы именования полей в динамическом списке

Часто программисты допускают ошибку, указывая в структуре отбора имя реквизита документа, а не имя поля в Динамическом списке формы. Рассмотрим подробнее, как платформа сопоставляет эти данные.

Если в форме списка, которую вы открываете, используется динамический список с произвольным запросом, вам необходимо заглянуть в текст этого запроса. Отбор будет работать только по тем полям, которые указаны в блоке ВЫБРАТЬ. Если полю назначен псевдоним (например, ВЫБРАТЬ Док.Сотрудник КАК Ответственный), то в структуре отбора нужно использовать именно псевдоним Ответственный.

Также важно учитывать тип данных. Если поле в списке имеет тип Строка (например, номер документа), а вы передаете в отбор Число или Ссылку, платформа снова вернет ошибку несоответствия типов. Всегда проверяйте типы данных с помощью отладчика перед передачей их в структуру.

Использование фиксированных настроек для жесткого отбора

Существует еще один способ установки отбора, который мы назовем «жестким». Параметр Отбор в структуре параметров формы устанавливает пользовательские настройки. Это значит, что пользователь сможет зайти в настройки списка и отключить этот фильтр или изменить его. Если же ваша задача — открыть список так, чтобы пользователь не мог снять фильтр, следует использовать ФиксированныеНастройки.

Этот метод сложнее в реализации, так как требует работы с объектами системы компоновки данных (СКД), но он гораздо надежнее в плане контроля данных. Проанализируем пример использования фиксированных настроек:


// Создаем настройки компоновки данных
Настройки = Новый НастройкиКомпоновкиДанных;

// Добавляем новый элемент отбора
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сотрудник");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Объект.Ссылка;
ЭлементОтбора.Использование = Истина;

// Подготавливаем параметры формы
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ФиксированныеНастройки", Настройки);

// Открываем форму
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыОткрытия);

Как диагностировать ошибку самостоятельно

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

Выясним причину ошибки по шагам:

Соблюдение этих простых правил именования и внимательный подход к метаданным динамического списка позволят вам быстро и корректно реализовывать сложные механизмы навигации в интерфейсе 1С:Предприятие.

← На главную