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