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

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

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

Анализируем причину проблемы: почему макет не передает данные автоматически?

Первое, что важно понять: в платформе 1С 8.3 (в отличие от версии 7.7) данные из макета не переносятся в результирующий табличный документ магическим образом. Если вы просто указали текст в свойстве Расшифровка в конфигураторе, этого недостаточно. Рассмотрим два режима работы свойства расшифровки в макете:

Проанализируем типичную ошибку: разработчик заполняет Область.Параметры.Товар = Ссылка;, ожидая, что расшифровка подтянется сама, так как в макете в поле расшифровки указано то же имя. На самом деле, расшифровка — это отдельный атрибут ячейки, который требует внимания при выводе каждой строки.

Настройка макета и программное заполнение

Разберем по шагам правильный алгоритм вывода данных. Чтобы расшифровка «ожила», мы должны работать с конкретной областью перед тем, как вывести ее в итоговый документ. Рассмотрим пример кода, который решает эту задачу:


// Получаем макет обработки
Макет = ПолучитьМакет("МойМакет");
// Получаем область строки
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

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

Обратите внимание: мы используем метод Область() внутри объекта ОбластьМакета. Это позволяет нам точечно обращаться к ячейкам до того, как они попадут в основной ТабличныйДокумент формы. Если в расшифровку нужно передать не одно значение, а структуру (например, ссылку и тип операции), вы можете смело передавать объект Структура.

Свойства поля табличного документа на форме

Даже если программный код написан верно, расшифровка может не срабатывать из-за настроек самого элемента формы. Выясним, какие свойства критически важны для корректной интерактивности:

  1. Только просмотр (ReadOnly): Для элемента формы «Поле табличного документа» это свойство должно быть установлено в значение Истина. Если оно будет ложным, то по двойному клику 1С решит, что вы хотите отредактировать текст в ячейке, и событие расшифровки не будет инициировано.
  2. Защита (Protection): Это свойство должно быть включено как у самого табличного документа (ТабДок.Защита = Истина;), так и у тех ячеек, которые должны реагировать на клик. По умолчанию у ячеек свойство защиты обычно включено, но если вы программно его отключали — расшифровка работать не будет.

Посмотрим, как это выглядит в коде инициализации формы:


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

События: «Выбор» против «ОбработкаРасшифровки»

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

1. Событие ОбработкаРасшифровки

Это специализированное событие. Оно удобно тем, что в параметрах вы сразу получаете Расшифровка (то самое значение, которое мы записывали в ячейку). Если вы установите СтандартнаяОбработка = Ложь, вы сможете подавить системное открытие карточки объекта и выполнить свой алгоритм (например, открыть другой отчет).

2. Событие Выбор

Срабатывает при двойном клике или нажатии клавиши Enter. Здесь вам придется самостоятельно определять, в какой ячейке находится пользователь. Это делается следующим образом:


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

Особенности работы с СКД

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

Нюанс с типом данных в расшифровке

Проанализируем ситуацию, когда в ячейку передается просто строка. Если в расшифровке лежит строка "Иванов", 1С не сможет автоматически открыть карточку сотрудника. Для работы стандартных механизмов (открытие ссылочных объектов) в расшифровку необходимо передавать именно Ссылку (например, СправочникСсылка.Номенклатура). Если же вам нужно передать набор параметров, используйте структуру:


ПараметрыКлик = Новый Структура;
ПараметрыКлик.Вставить("Сотрудник", Стр.Сотрудник);
ПараметрыКлик.Вставить("ДатаОтчета", Объект.Период);
ОбластьСтрока.Область("ФИО").Расшифровка = ПараметрыКлик;

В обработчике расшифровки вы сможете легко прочитать эти данные: ТипЗнч(Расшифровка) == Тип("Структура"). Это открывает широкие возможности для создания сложных интерактивных отчетов на управляемых формах.

Подведем итог: залог работающей расшифровки — это явное присвоение значения свойству Расшифровка конкретной ячейки при выводе области макета и включенные свойства защиты/просмотра у элемента формы. Следуя этим правилам, вы сможете избежать значения Неопределено и обеспечите пользователям удобную навигацию по данным.

← На главную