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