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