Как в 1С создать форму множественного выбора с флажками?

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

Стандартный механизм множественного выбора в 1С, когда пользователю нужно зажимать клавиши Shift или Ctrl для выделения нескольких строк, часто оказывается неудобным, особенно при работе с большими списками. Одно неверное нажатие — и все выделение сбрасывается. Это приводит к ошибкам и раздражает пользователей. Гораздо интуитивнее и надежнее использовать форму, где каждую нужную позицию можно отметить флажком (галочкой).

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

Решение: Создание собственной формы выбора с таблицей значений

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

  1. Создание управляемой формы

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

  2. Добавление реквизита "Таблица для выбора"

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

    Добавим в нашу таблицу необходимые колонки для данных (например, Серия, Характеристика) и, самое главное, колонку для флажка. К слову, программное создание колонок в табличной части может пригодиться, если состав колонок должен меняться динамически.

  3. Настройка отображения на форме

    Перетащим наш реквизит-таблицу на форму. Платформа автоматически создаст элемент "Таблица". В свойствах колонки Пометка укажем "Вид" — Поле флажка. Теперь в этой колонке будут отображаться галочки.

  4. Заполнение таблицы данными

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

    Посмотрим на пример. Допустим, нам нужно выбрать серии номенклатуры, которые есть на остатках.

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

    Это ключевой момент. Стандартные кнопки формы выбора ("Выбрать", "ОК") по умолчанию возвращают только текущую выделенную строку, а не все строки с флажками. Поэтому мы добавим на форму свою собственную кнопку, например, "Выбрать отмеченные" или "Перенести в документ".

  6. Программирование возврата отмеченных значений

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

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

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

    Пример вызова и обработки:

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

Дополнительные улучшения для удобства пользователя

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

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

Этот подход позволяет создать гибкий и понятный интерфейс. Для тех, кто часто занимается кастомизацией интерфейсов, также будет интересен модификатор форм (Yet Another Form Modificator), значительно упрощающий работу с управляемыми формами.

← На главную