Как реализовать интерактивное изменение данных в табличном документе 1С в один клик?

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

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

Почему не работают стандартные элементы управления в ячейках

Типичная ошибка начинающего разработчика — попытка программно вставить объект ПолеФлажка в каждую ячейку табличного документа с помощью метода УстановитьЭлементУправления. Проанализируем, почему этот путь ведет в тупик, особенно в управляемых формах:

  1. Производительность: Если в таблице 50 строк и 31 день, системе придется отрисовать более 1500 отдельных объектов управления. Это вызывает значительные задержки при открытии и прокрутке формы.
  2. Ограничения платформы: В управляемом приложении элементы управления в ячейках табличного документа часто отображаются некорректно или требуют двойного клика для активации, что противоречит задаче «в один клик».
  3. Сложность управления: Программное добавление сотен именованных элементов управления (как пробовал автор вопроса) перегружает память и усложняет код обработки событий.

Решение №1: Использование спецсимволов и шрифта Wingdings

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

Рассмотрим алгоритм реализации:

  1. При заполнении табличного документа установим для ячеек шрифт Wingdings.
  2. Если значение Истина, выводим символ "þ" (галочка в квадрате), если Ложь — "o" (пустой квадрат).

Пример кода при заполнении макета:


ОбластьЯчейка = Макет.ПолучитьОбласть("Строка|Колонка");
ОбластьЯчейка.Параметры.ЗначениеФлажка = ?(Данные.Отработано, "þ", "o");
ОбластьЯчейка.Область().Шрифт = Новый Шрифт("Wingdings", 12);
ТабДок.Вывести(ОбластьЯчейка);

Решение №2: Форматирование булевых значений

Выясним, как использовать штатные механизмы платформы 1С для отображения логических данных. Каждая ячейка табличного документа может содержать значение (свойство СодержитЗначение). Если установить тип значения Булево, можно воспользоваться свойством Формат.

Проанализируем строку формата: "БЛ=' '; БИ='☑'". Здесь БЛ — текст для ложного значения, БИ — для истинного. Мы можем использовать юникод-символы галочек, которые поддерживаются большинством современных шрифтов (Arial, Calibri).

Пример настройки ячейки:


Область = ТабДок.Область(НомСтр, НомКол);
Область.СодержитЗначение = Истина;
Область.ТипЗначения = Новый ОписаниеТипов("Булево");
Область.Значение = Стр.Смена1; 
Область.Формат = "БЛ='☐'; БИ='☑'";

Решение №3: Обработка клика пользователя (интерактивность)

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

Для имитации одиночного клика используем событие ПриАктивизацииОбласти. Однако важно помнить, что оно срабатывает и при перемещении по таблице стрелками клавиатуры. Рассмотрим классический надежный вариант с событием Выбор:

  1. Установим у поля табличного документа свойство ТолькоПросмотр = Истина. Это предотвратит стандартное редактирование текста в ячейке.
  2. В обработчике события напишем код инверсии значения:

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

Использование расшифровки для связи с данными

Чтобы понять, какой именно день и какой ТМЦ нужно изменить при клике, мы рекомендуем использовать свойство Расшифровка. При формировании таблицы в каждую ячейку записывается структура или фиксированный массив с идентификаторами.

Разберем пример заполнения расшифровки:


ДанныеЯчейки = Новый Структура;
ДанныеЯчейки.Вставить("ТМЦ", ТекущийТМЦ);
ДанныеЯчейки.Вставить("Дата", ТекущаяДата);

Область.Расшифровка = ДанныеЯчейки;

Теперь в обработчике выбора нам не нужно вычислять номер строки и колонки, мы сразу получаем готовый объект данных из свойства Область.Расшифровка.

Дополнительная оптимизация: Групповое изменение

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

Проанализируем код для обхода выделенных ячеек:


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

Резюме

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

← На главную