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