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