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