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