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

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

В разработке на платформе 1С:Предприятие часто возникает задача предоставить пользователю возможность выбора нескольких значений из заранее определенного списка (например, из Перечисления). Стандартный элемент управления Переключатель (Radio Button) по своей природе предназначен строго для выбора одного единственного значения. Если перед вами стоит задача позволить пользователю отметить «галочками» несколько пунктов, нам потребуется изменить архитектуру хранения данных и логику работы экранной формы — есть готовый инструмент настройки логики форм и обработчиков событий 1С.

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

Почему «Переключатель» не подходит для множественного выбора

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

Шаг 1: Подготовка структуры метаданных

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

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

Важный нюанс: саму табличную часть выводить на форму мы не будем. Она будет служить «тихим» хранилищем в базе данных.

Шаг 2: Создание реквизита формы

Теперь поработаем с интерфейсом. Разберем, как создать элемент, с которым будет взаимодействовать пользователь.

  1. Откроем форму объекта.
  2. На вкладке Реквизиты создадим новый реквизит формы (не путать с реквизитом объекта!). Назовем его СписокДляВыбора.
  3. Установим ему тип СписокЗначений. В свойстве Тип значения укажем наше Перечисление.
  4. Перетащим этот реквизит на рабочую область формы.
  5. В свойствах появившегося элемента формы установим Вид — Поле флажков.

Теперь на форме появился список всех элементов перечисления с возможностью установки пометок.

Шаг 3: Синхронизация данных при чтении объекта

Так как наш СписокЗначений на форме — это временный объект, который живет только пока открыто окно, нам нужно научить систему заполнять его данными из нашей Табличной части при открытии документа. Для этого воспользуемся обработчиком события ПриЧтенииНаСервере.

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


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

Для того чтобы список всегда содержал все актуальные варианты из конфигуратора, добавим вспомогательную процедуру:


&НаСервере
Процедура ЗаполнитьВозможныеВарианты()
    // Динамическое заполнение списка из метаданных перечисления
    Для Каждого ЗначениеПеречисления Из Метаданные.Перечисления.ИмяВашегоПеречисления.ЗначенияПеречисления Цикл
        ИмяЗначения = ЗначениеПеречисления.Имя;
        ЗначениеСсылка = Перечисления.ИмяВашегоПеречисления[ИмяЗначения];
        СписокДляВыбора.Добавить(ЗначениеСсылка, ЗначениеПеречисления.Синоним);
    КонецЦикла;
КонецПроцедуры

Шаг 4: Сохранение данных в базу

Когда пользователь нажимает кнопку «Записать», нам нужно выполнить обратную операцию: перенести помеченные элементы из СпискаЗначений в Табличную часть объекта — это решается через обработка управления логикой заполнения реквизитов 1С. Это делается в обработчике ПередЗаписьюНаСервере (поможет расширение для настройки произвольных проверок и контроля ввода данных).


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

Шаг 5: Вывод выбранных значений в печатную форму

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

Рассмотрим пример кода для формирования строки:


// В процедуре печати, где выполняется обход данных
МассивДляПечати = Новый Массив;
ВыборкаТЧ = ДанныеОбъекта.ВыбранныеЗначения.Выбрать();

Пока ВыборкаТЧ.Следующий() Цикл
    // Добавляем представление значения в массив
    МассивДляПечати.Добавить(Строка(ВыборкаТЧ.Значение));
КонецЦикла;

// Соединяем все элементы массива в одну строку через запятую
ИтоговаяСтрока = СтрСоединить(МассивДляПечати, ", ");

// Устанавливаем параметр области печатной формы
ОбластьМакета.Параметры.СписокВыбора = ИтоговаяСтрока;
ТабДок.Вывести(ОбластьМакета);

Альтернативные методы реализации

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

Подведем итоги

Мы проанализировали классический подход к реализации множественного выбора в 1С. Использование СпискаЗначений с видом Поле флажков в связке с Табличной частью является «золотым стандартом». Это обеспечивает:

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

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

← На главную