Как создать чекбокс в динамическом списке с переключением по одному клику?

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

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

Проблема стандартного подхода

Если мы добавляем в динамический список колонку с типом Булево и устанавливаем ей вид ПолеФлажка, платформа 1С обрабатывает её следующим образом:

  1. Режим «Только просмотр» отображает состояние, но не дает его менять.
  2. Если разрешить редактирование (свойство РежимРедактирования установлено в Непосредственно), изменение значения все равно требует активации ячейки. Это часто выливается в необходимость двойного клика или сложной навигации клавиатурой.

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

Алгоритм решения: от запроса до формы

Для реализации удобного переключателя нам потребуется отойти от стандартного типа ПолеФлажка и использовать ПолеКартинки. Рассмотрим этот процесс пошагово.

Шаг 1. Подготовка данных в запросе

Поскольку мы будем использовать поле картинки, нам нужно преобразовать булево значение в числовой индекс, соответствующий коллекции картинок (где одна картинка — пустой квадрат, а вторая — квадрат с галочкой). Обычно в коллекциях картинок индекс 0 соответствует значению Ложь, а 1 — Истина (или наоборот, зависит от вашей картинки).

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


ВЫБРАТЬ
    ...
    ВЫБОР
        КОГДА Файлы.SvnРасш_Бул = ИСТИНА ТОГДА 1 
        ИНАЧЕ 0 
    КОНЕЦ КАК ИндексКартинкиЧекбокса,
    ...
ИЗ
    Справочник.Файлы КАК Файлы

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

Шаг 2. Настройка элемента формы

Теперь перейдем к настройке колонки на форме. Если вы создаете колонку программно (как в примере автора вопроса) или визуально в конфигураторе, набор свойств будет идентичным.

Для элемента формы, связанного с нашим полем ИндексКартинкиЧекбокса, необходимо установить следующие свойства:

  1. Вид: Устанавливаем в значение ПолеКартинки. Это ключевой момент — мы отображаем не галочку, а картинку.
  2. Картинка значений: Здесь нужно выбрать библиотечную картинку или загруженную в конфигурацию коллекцию, которая содержит изображения состояния чекбокса (обычно это БиблиотекаКартинок.Чекбокс или аналог).
  3. Положение заголовка: Обычно ставим Нет, чтобы колонка была узкой и аккуратной.
  4. ГиперссылкаЯчейки: Устанавливаем в Истина.

Давайте подробно остановимся на свойстве ГиперссылкаЯчейки. Часто разработчики путают его с просто Гиперссылка. Разница критична:

Ниже представлен пример кода, иллюстрирующий программное изменение форм для добавления такой колонки:


Если Элементы.Найти("КолонкаЧекбокс") = Неопределено Тогда
    НоваяКолонка = Элементы.Добавить("КолонкаЧекбокс", Тип("ПолеФормы"), Элементы.Список);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеКартинки;
    НоваяКолонка.ПутьКДанным = "Список.ИндексКартинкиЧекбокса"; // Поле из запроса с 0 или 1
    НоваяКолонка.КартинкаЗначений = БиблиотекаКартинок.Чекбокс; // Ваша картинка
    НоваяКолонка.ГиперссылкаЯчейки = Истина; // Самое важное свойство!
    НоваяКолонка.Заголовок = " ";
    НоваяКолонка.Ширина = 2;
КонецЕсли;

Шаг 3. Обработка клика (Событие «Выбор»)

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

Рассмотрим реализацию обработчика события Выбор:


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

Шаг 4. Изменение данных на сервере

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

Разберем процедуру изменения данных:


&НаСервере
Процедура ИзменитьЗначениеФлагаНаСервере(СсылкаНаОбъект)
    
    // Получаем объект для редактирования
    // Важно: не забывайте про блокировки, если система многопользовательская
    ОбъектБазы = СсылкаНаОбъект.ПолучитьОбъект();
    
    Если ОбъектБазы <> Неопределено Тогда
        // Инвертируем булево значение
        ОбъектБазы.SvnРасш_Бул = НЕ ОбъектБазы.SvnРасш_Бул;
        
        Попытка
            ОбъектБазы.Записать();
        Исключение
            // Обработка ошибок записи (например, объект заблокирован)
            Сообщить("Не удалось переключить флаг: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    
    // Оповещаем динамический список, что данные изменились
    // Это заставит список перечитать данные и обновить картинку (с 0 на 1 или наоборот)
    Элементы.Список.Обновить();
    
КонецПроцедуры

Обратите внимание: вызов Элементы.Список.Обновить() на сервере или ОповеститьОбИзменении(СсылкаНаОбъект) на клиенте крайне важен. Без этого пользователь визуально не увидит изменения картинки до тех пор, пока список не обновится (например, при прокрутке или нажатии F5).

Альтернативный вариант: Множественный выбор

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

В платформе 1С:Предприятие 8.3 для таблиц управляемых форм существует свойство Пометки (CheckMarks).

  1. Зайдите в свойства элемента формы (Таблицы).
  2. Установите галочку в свойстве Пометки (или ПоложениеПометок).

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

Резюме

Давайте подведем итог. Чтобы создать профессионально выглядящий чекбокс в динамическом списке, который реагирует на один клик:

  1. Преобразуйте булево поле в число (0 или 1) на уровне запроса.
  2. Используйте вид колонки ПолеКартинки.
  3. Обязательно включите свойство ГиперссылкаЯчейки.
  4. В обработчике Выбор инвертируйте значение реквизита объекта БД и записывайте его.
  5. Обновляйте список после записи.

Этот подход обеспечивает наилучший пользовательский опыт (UX) и является стандартом де-факто при разработке сложных интерфейсов на 1С. Впрочем, это не единственный способ, существует и другой вариант реализации флажков в динамическом списке.

← На главную