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