Как реализовать множественный выбор из справочника на обычных формах в 1С?

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

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

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

Шаг 1. Настройка программного открытия формы множественного выбора

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

Проанализируем типовую ошибку: если не указать владельца формы (свойство ВладелецФормы), платформа не поймет, какому именно элементу интерфейса или форме нужно передать результат выбора после нажатия кнопки «Выбрать». В результате стандартное событие ОбработкаВыбора не вызовется.

Посмотрим на пример правильного кода в событии НачалоВыбора поля ввода:


Процедура ПолеВводаСпецификаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартное открытие формы выбора для одного элемента
    СтандартнаяОбработка = Ложь;
    
    // Получаем форму выбора нужного справочника
    ФормаПодбора = Справочники.КВ_СпецификаДляСИЗ.ПолучитьФормуВыбора();
    
    ФормаПодбора.РежимВыбора = Истина;
    ФормаПодбора.ЗакрыватьПриВыборе = Истина;
    ФормаПодбора.МножественныйВыбор = Истина;
    
    // Важно: указываем поле ввода в качестве владельца формы
    ФормаПодбора.ВладелецФормы = Элемент;
    
    ФормаПодбора.Открыть();
    
КонецПроцедуры

Шаг 2. Обработка массива выбранных значений

Когда пользователь выбирает несколько строк и нажимает кнопку выбора, форма выбора отправляет результат владельцу. Если владельцем был назначен элемент управления (поле ввода), на уровне этого поля ввода вызывается событие ОбработкаВыбора.

При включенном режиме множественного выбора параметр ВыбранноеЗначение может возвращать как одиночную ссылку (если был выбран один элемент), так и объект типа Массив (если выбрано несколько элементов). Рассмотрим, как корректно обработать результат и сформировать текстовую строку для отображения:


Процедура ПолеВводаСпецификаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    // Обязательно отключаем стандартную обработку, чтобы платформа 
    // не пыталась самостоятельно присвоить массив ссылочному полю
    СтандартнаяОбработка = Ложь;
    
    МассивВыбранныхЭлементов = Новый Массив;
    
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
        МассивВыбранныхЭлементов = ВыбранноеЗначение;
    ИначеЕсли ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
        МассивВыбранныхЭлементов.Добавить(ВыбранноеЗначение);
    КонецЕсли;
    
    // Склеиваем наименования или представления элементов через запятую
    ТекстПредставления = "";
    Для Каждого ТекЭлемент Из МассивВыбранныхЭлементов Цикл
        ТекстПредставления = ТекстПредставления + ?(ПустаяСтрока(ТекстПредставления), "", ", ") + Строка(ТекЭлемент);
    КонецЦикла;
    
    // Выводим результат в поле ввода (если оно не привязано к ссылке)
    Элемент.Значение = ТекстПредставления;
    
КонецПроцедуры

Ограничения ссылочных типов и способы хранения данных

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

Рассмотрим основные способы решения этой задачи в зависимости от требований к учету и отчетности:

  1. Использование табличной части объекта.

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

  2. Строковый реквизит объекта.

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

    Важно учитывать: при хранении ссылок в виде обычного текста вы теряете возможность отслеживать переименование элементов справочника, а также не сможете соединять таблицы по ссылке в отчетах СКД.

  3. Использование подчиненного регистра сведений.

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

  4. Несвязанный элемент формы типа «СписокЗначений».

    Если поле ввода используется во внешней обработке или отчете (без прямой записи в реквизит объекта БД), свойство ТипЗначения у поля формы задают как СписокЗначений с указанием типа значений списка. Платформа 1С автоматически предоставит удобный стандартный диалог для добавления, просмотра и удаления элементов списка.

← На главную