Как сохранить текст в несвязанной колонке табличного поля при начале редактирования в обычных формах 1С

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

При разработке интерфейсов в обычном приложении 1С:Предприятия часто возникает задача добавления в табличное поле (например, с типом РегистрСведенийСписок) вычисляемых колонок, не связанных напрямую с полями базы данных. Такие колонки обычно служат для индикации статусов или управления строкой: в них выводятся поясняющий текст и кнопки выбора, открытия или очистки.

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

Почему очищается текст в ячейке табличного поля

Проанализируем механику отрисовки табличного поля в обычном приложении:

  1. В режиме просмотра табличное поле отображает визуальное оформление ячеек, сформированное через свойство ОформлениеСтроки.Ячейки в процедурах ПриВыводеСтроки или ПриПолученииДанных.
  2. При получении ячейкой фокуса табличное поле передает управление физическому элементу управления колонки — объекту ПолеВвода.
  3. Поскольку у колонки не заполнено свойство Данные, элемент управления не связан с источником строки и не знает, какая строка отображалась в ячейке. В момент активации он считывает собственное свойство Значение, которое по умолчанию не заполнено, из-за чего видимый текст ячейки стирается.
  4. Свойство ТекстРедактирования доступно только в интерактивных событиях ввода текста (например, АвтоПодбор) и недоступно для прямой инициализации при старте редактирования строки. Установка же свойства колонки ТолькоПросмотр = Истина не подходит, так как она блокирует работу кнопок выбора и очистки.

Основное решение: установка значения элемента управления колонки

Разберем по шагам, как правильно инициализировать поле ввода, чтобы сохранить текст и оставить функциональные кнопки доступными.

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

Посмотрим на пример реализации в модуле формы:


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

Важный нюанс: чтобы пользователь не мог случайно затереть сгенерированный текст с клавиатуры, но при этом кнопки выбора оставались активными, рекомендуется для элемента управления колонки выставить свойство РедактированиеТекста = Ложь. Это позволит нажимать кнопки выбора и открытия без возможности ручного набора произвольного текста.

Хранение состояний и обработка нажатия кнопок

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

Рассмотрим комплексный пример реализации с выводом текста и обработкой кнопок:


// В модуле формы определяем переменную для кэша статусов
Перем мКэшСтатусов;

Процедура ПриОткрытии()
    мКэшСтатусов = Новый Соответствие;
КонецПроцедуры

Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Получаем статус из кэша по ключевым полям записи
    КлючЗаписи = ДанныеСтроки.Период; // Пример ключа
    ТекстСтатуса = мКэшСтатусов[КлючЗаписи];
    
    Если ТекстСтатуса = Неопределено Тогда
        ТекстСтатуса = "Не обработан";
    КонецЕсли;
    
    ОформлениеСтроки.Ячейки.Колонка1.УстановитьТекст(ТекстСтатуса);
    
КонецПроцедуры

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

Альтернативный вариант: отказ от режима редактирования ячейки

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

  1. Для колонки отключаем режим редактирования.
  2. В событии табличного поля Выбор проверяем имя активной колонки.
  3. Если клик произошел по целевой колонке, отменяем стандартную обработку и открываем нужное окно или меняем статус записи.

Посмотрим на пример реализации данного подхода:


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

Таким образом, для сохранения видимости текста при интерактивном редактировании несвязанной ячейки достаточно перед началом редактирования передать строку в свойство ЭлементУправления.Значение соответствующей колонки.

← На главную