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