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