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