При переходе с обычных форм на управляемые многие разработчики сталкиваются с проблемой: отчет на Системе компоновки данных (СКД), сформированный программно, перестает реагировать на двойной клик по ячейкам. Стандартная расшифровка, которая в обычных формах работала «из коробки», в управляемом приложении требует четкого соблюдения механизмов работы с временным хранилищем. В данной статье мы разберем, как правильно пробросить данные расшифровки, чтобы документы открывались корректно, что особенно актуально, когда выполняется подбор решений по переносу данных из 1С:УПП 1.3 в современные конфигурации.
Разберем типичную ситуацию, описанную в теме. Разработчик пытается выполнить компоновку результата на сервере и передать в методы Выполнить() и Инициализировать() переменную ДанныеРасшифровки. В управляемых формах контекст сервера не знает об этой переменной, если она не объявлена явно или не является реквизитом формы.
Важный нюанс: В управляемых формах данные расшифровки — это не просто объект в памяти, а структура, которая должна быть помещена во временное хранилище. Адрес этого хранилища передается между сервером и клиентом в виде обычной строки.
Для начала нам необходимо создать место, где будет храниться адрес данных расшифровки. Рассмотрим последовательность действий:
ДанныеРасшифровки.Именно эта строка будет содержать уникальный идентификатор (адрес) во временном хранилище, по которому платформа сможет найти связи между ячейками табличного документа и объектами базы данных (документами, справочниками).
Проанализируем правильный код формирования отчета. Основная задача — передать созданный нами реквизит формы в методы компоновки. Рассмотрим процедуру формирования, при которой автоматическая выверка проводок между базами 1С может использоваться для контроля корректности данных:
&НаСервере
Процедура СформироватьНаСервере(Результат)
// Получаем объект отчета из реквизита формы
ОбъектОтчет = РеквизитФормыВЗначение("Отчет");
// Выбираем нужную схему в зависимости от условий (логика автора темы)
Если ОбъектОтчет.ПоказыватьТолькоОтклонения Тогда
СхемаКД = ОбъектОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанныхТолькоОтклонения");
Иначе
СхемаКД = ОбъектОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КонецЕсли;
// Загружаем настройки
Настройки = ОбъектОтчет.КомпоновщикНастроек.ПолучитьНастройки();
// Очищаем поле табличного документа перед выводом
Результат.Очистить();
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// КРИТИЧЕСКИ ВАЖНЫЙ МОМЕНТ:
// Передаем ДанныеРасшифровки (реквизит формы) в третий параметр.
// Платформа сама заполнит эту строку адресом во временном хранилище.
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки, ДанныеРасшифровки);
// Инициализируем процессор компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
// Передаем адрес расшифровки в третий параметр инициализации
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
В этом примере ДанныеРасшифровки — это реквизит формы. Когда выполняется метод КомпоновщикМакета.Выполнить, система генерирует данные расшифровки и помещает их в хранилище, а в переменную записывает путь к ним. Для ознакомления с другими сценариями формирования отчетов подойдут примеры программной работы с СКД на управляемых формах.
После того как мы правильно заполнили ДанныеРасшифровки, платформа автоматически понимает, какая ссылка соответствует каждой ячейке. Если в настройках СКД (на вкладке «Наборы данных») для поля документа не установлены ограничения и тип поля — ДокументСсылка, то при двойном клике документ откроется автоматически.
Рассмотрим ситуацию, когда разработчик пытается перехватить нажатие через событие РезультатВыбор. Выясним причину, почему это не лучший вариант. Событие Выбор оперирует координатами (именами областей типа "C4", "C8"), что делает код хрупким и зависимым от структуры отчета. Вместо этого лучше использовать событие ОбработкаРасшифровки.
Если нам нужно не просто открыть документ, а выполнить какое-то действие (например, открыть форму с определенными параметрами), мы используем следующий подход в модуле формы. Для автоматизации сложных цепочек действий пользователя в интерфейсе без дополнительного программирования может применяться платформа для создания программных роботов OneRPA.
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
// Если мы хотим полностью переопределить поведение:
СтандартнаяОбработка = Ложь;
// Параметры для получения данных с сервера
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("АдресДанных", ДанныеРасшифровки);
ДополнительныеПараметры.Вставить("Идентификатор", Расшифровка);
// Вызываем серверную функцию для получения ссылки на документ
СсылкаНаДокумент = ПолучитьСсылкуИзРасшифровки(ДополнительныеПараметры);
Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
// Открываем форму документа программно
ПоказатьЗначение(, СсылкаНаДокумент);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСсылкуИзРасшифровки(Параметры)
// Получаем объект расшифровки из временного хранилища
Данные = ПолучитьИзВременногоХранилища(Параметры.АдресДанных);
// Извлекаем значение поля
Если ТипЗнч(Данные) = Тип("ДанныеРасшифровкиКомпоновкиДанных") Тогда
Поля = Данные.Элементы[Параметры.Идентификатор].ПолучитьПоля();
// Ищем нужное поле по имени (например, поле "Ссылка" в СКД)
Для Каждого Поле Из Поля Цикл
Если Поле.Поле = "Ссылка" Тогда
Возврат Поле.Значение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Для того чтобы в программно формируемом отчете на СКД в управляемом приложении работала расшифровка, необходимо выполнить три условия:
Выполнить и Инициализировать при формировании макета и процессора компоновки.Результат) нужно найти свойство «Данные расшифровки» и указать там имя нашего реквизита — ДанныеРасшифровки.Важный совет: В большинстве случаев, если вы правильно выполнили пункт 3, вам даже не придется писать код в обработчиках Выбор или ОбработкаРасшифровки. Платформа 1С:Предприятие 8.3 самостоятельно определит тип значения (Ссылка) и откроет соответствующую форму объекта по стандартным правилам.
Проанализировав ситуацию, мы видим, что основная сложность заключается в понимании того, что расшифровка в управляемых формах — это динамический объект, живущий в хранилище, а не просто переменная в модуле. Следуя этой инструкции, вы сможете создавать интерактивные и удобные отчеты для ваших пользователей.