Как правильно реализовать выбор значения из списка в 1С, чтобы данные не выводились «кашей» в одном поле?

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

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

Выясним причину проблемы: Список значений или Ссылка?

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

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

Решение №1: Использование списка выбора (ChoiceList)

Разберем самый правильный и эффективный метод. Мы оставим тип реквизита ссылочным, но наполним элемент управления (поле на форме) списком доступных значений. Для этого выполним следующие шаги:

  1. Установим тип реквизита (например, ПрикрепленныйФайл) как СправочникСсылка.ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы.
  2. На форме для соответствующего элемента (поля ввода) включим свойство РежимВыбораИзСписка (ChoiceModeFromList) в значение Истина.
  3. Программно заполним список выбора элемента формы.

Посмотрим на пример кода, который необходимо выполнить на сервере (например, в процедуре ПриСозданииНаСервере или при изменении владельца файла):


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

КонецПроцедуры

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

Решение №2: Обход ограничений через событие «НачалоВыбора»

Иногда возникают ситуации (например, при работе с расширениями), когда стандартные связи параметров выбора работают некорректно. В этом случае проанализируем альтернативный путь — использование события НачалоВыбора. Это позволит нам полностью контролировать процесс открытия списка.

Рассмотрим алгоритм действий:

  1. Установим у поля свойство КнопкаВыбора в значение Истина.
  2. Создадим обработчик события НачалоВыбора на клиенте.
  3. В обработчике отключим стандартную обработку и вызовем форму выбора с нужным нам отбором.

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

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

Дополнительные рекомендации по настройке интерфейса

Чтобы работа со списком была максимально удобной для пользователя, обратите внимание на следующие настройки свойств элемента формы в палитре свойств:

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

← На главную