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

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

При разработке интерфейсов в обычных формах 1С разработчики часто сталкиваются с задачей организации множественного выбора элементов из справочника. Стандартный механизм платформы при включении свойства МножественныйВыбор = Истина требует от пользователя зажатия клавиши Ctrl или Shift, что не всегда удобно. Разберем, почему при интерактивном выборе нескольких строк в реквизит попадает надпись Массив и каким образом можно организовать удобный выбор с помощью галочек (флажков).

Выясним причину появления текста «Массив»

Проанализируем ситуацию: когда в форме выбора включено свойство МножественныйВыбор = Истина, платформа 1С при завершении выбора возвращает не одну ссылку, а коллекцию типа Массив. Если поле-приемник имеет тип строки или одиночной ссылки, при попытке прямого присвоения 1С выводит его системное представление — слово Массив.

Для того чтобы вывести выбранные значения списком через запятую, необходимо обработать полученный массив в событии ОбработкаВыбора формы-приемника. Программно обходим массив в цикле и формируем итоговую строку:


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

Способ 1. Использование СпискаЗначений для небольших справочников

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

Рассмотрим порядок действий:

  1. Отменяем стандартную обработку выбора в событии НачалоВыбора.
  2. Заполняем СписокЗначений элементами справочника с помощью запроса.
  3. Вызываем метод ОтметитьЭлементы().
  4. Считываем отмеченные элементы и формируем текстовую строку через запятую.

Посмотрим на пример кода:


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

Способ 2. Добавление колонки с флажками в диначеский список «СправочникСписок»

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

Разберем реализацию по шагам:

  1. В форме выбора справочника добавляем новую колонку в ТабличноеПоле (без указания свойства Данные) и называем её, например, КолонкаФлаг.
  2. В модуле формы создаем переменную для хранения выбранных ссылок — мСписокОтмеченных (тип СписокЗначений).
  3. В событии табличного поля ПриВыводеСтроки настраиваем отображение галочки в зависимости от того, есть ли ссылка текущей строки в нашем списке отмеченных.
  4. В событии ПриИзмененииФлажка обрабатываем клики пользователя по галочке.
  5. По кнопке «Выбрать» передаем список отмеченных ссылок назад с помощью метода ОповеститьОВыборе().

Рассмотрим пример реализации кода в модуле формы выбора:


Перем мСписокОтмеченных;

Процедура ПриОткрытии()
    мСписокОтмеченных = Новый СписокЗначений;
КонецПроцедуры

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

Процедура ЭлементыФормыСправочникСписокПриИзмененииФлажка(Элемент, Колонка)
    Если Колонка.Имя = "КолонкаФлаг" И Элемент.ТекущиеДанные <> Неопределено Тогда
        ТекущаяСсылка = Элемент.ТекущиеДанные.Ссылка;
        НайденныйЭлемент = мСписокОтмеченных.НайтиПоЗначению(ТекущаяСсылка);
        
        Если НайденныйЭлемент = Неопределено Тогда
            мСписокОтмеченных.Добавить(ТекущаяСсылка);
        Иначе
            мСписокОтмеченных.Удалить(НайденныйЭлемент);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Процедура КнопкаВыбратьНажатие(Кнопка)
    МассивВыбранных = мСписокОтмеченных.ВыгрузитьЗначения();
    ОповеститьОВыборе(МассивВыбранных);
КонецПроцедуры

Способ 3. Создание произвольной формы выбора с Таблицей Значений

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

Алгоритм решения следующий:

  1. Создаем новую форму и размещаем на ней ТабличноеПоле с типом источника данных ТаблицаЗначений.
  2. Добавляем в таблицу булеву колонку Выбрать (с типом Булево) и реквизит Ссылка.
  3. Заполняем таблицу значений запросом при открытии формы: в запросе указываем булево поле ЛОЖЬ КАК Выбрать.
  4. Пользователь проставляет галочки прямо в колонке Выбрать.
  5. При нажатии на кнопку выбора обходим ТаблицуЗначений в цикле или делаем поиск строк с пометкой Выбрать = Истина и передаем результат в вызывающую форму.

Пример заполнения такой формы при открытии:


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

Таким образом, использование произвольной формы с ТаблицейЗначений или перехват событий ПриВыводеСтроки и ПриИзмененииФлажка в табличном поле позволяет полностью отказаться от зажатия клавиши Ctrl и реализовать удобный интуитивный интерфейс с галочками в обычных формах 1С.

← На главную