Как включить расшифровку при программном выводе отчета СКД в поле табличного документа

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов и обработок в 1С часто требуется программно вывести результат компоновки данных в поле табличного документа, расположенное непосредственно на форме. Нередко разработчики сталкиваются с проблемой: отчет выводится на экран без ошибок, но при двойном щелчке мыши по ячейкам расшифровка не срабатывает. Выясним причину такого поведения и подробно разберем по шагам, как настроить полноценную работу расшифровки.

Почему не работает расшифровка при программном выводе

Рассмотрим типовой программный код формирования отчета, в котором кроется распространенная ошибка:


ЭлементыФормы.СканыДокументовЧК.Очистить();
СхемаКомпоновкиДанных = ПолучитьМакет("ОтчетПоДокументам");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию);        
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ДокументРезультат = ЭлементыФормы.СканыДокументовЧК;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Проанализируем этот фрагмент. Расшифровка оказывается неработоспособной сразу по нескольким причинам:

  1. Не инициализированы данные расшифровки: метод Выполнить объекта КомпоновщикМакетаКомпоновкиДанных вызван без третьего параметра — ДанныеРасшифровки. Если этот параметр опущен, платформа вообще не формирует служебные данные для расшифровки выводимых полей.
  2. Данные расшифровки не переданы в процессор компоновки: метод Инициализировать объекта ПроцессорКомпоновкиДанных также ожидает третьим параметром переменную данных расшифровки. Без этого ячейки отчета не связываются с идентификаторами расшифровки.
  3. Область видимости переменной: если объявить переменную данных расшифровки локально внутри процедуры формирования, она будет уничтожена сборщиком мусора сразу после завершения процедуры. В момент клика пользователя расшифровывать будет нечего.
  4. Свойство поля «ТолькоПросмотр»: если у табличного документа свойство ТолькоПросмотр установлено в значение Ложь, двойной клик переводит ячейку в режим редактирования текста, блокируя событие расшифровки.
  5. Отсутствие обработчика расшифровки: автоматическое меню расшифровки доступно по умолчанию в типовых отчетах. В произвольной форме обработки необходимо явно описать логику в событии ОбработкаРасшифровки поля табличного документа.

Шаг 1. Корректное формирование макета и вывод отчета

Разберем, как правильно организовать вывод отчета в табличный документ. Переменную, хранящую данные расшифровки, необходимо объявить в шапке модуля формы, чтобы она оставалась доступной на протяжении всей работы пользователя с формой.

Посмотрим на пример правильного кода вывода:


// В модуле формы в самом начале объявляем переменную:
Перем ДанныеРасшифровки;

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

Обратим внимание: переменная ДанныеРасшифровки передается в методы без предварительной инициализации — система сама создаст объект типа ДанныеРасшифровкиКомпоновкиДанных и заполнит его в процессе выполнения компоновки.

Шаг 2. Реализация стандартного меню расшифровки СКД

Чтобы предоставить пользователю стандартные возможности СКД (открытие значения, упорядочивание, установка отборов, группировка), используем объект ОбработкаРасшифровкиКомпоновкиДанных в событии табличного документа ОбработкаРасшифровки.

Рассмотрим подробнее реализацию этого механизма:


Процедура СканыДокументовЧКОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Если ДанныеРасшифровки = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Создаем источник настроек и объект обработки расшифровки
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИсточникНастроек);
    
    Действие = Неопределено;
    ПараметрДействия = Неопределено;
    
    // Открываем диалоговое окно выбора действия расшифровки
    ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, Действие, ПараметрДействия);
    
    Если Действие = ДействиеРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
        ОткрытьЗначение(ПараметрДействия);
    ИначеЕсли Действие = ДействиеРасшифровкиКомпоновкиДанных.Упорядочить 
        Или Действие = ДействиеРасшифровкиКомпоновкиДанных.Отфильтровать 
        Или Действие = ДействиеРасшифровкиКомпоновкиДанных.Сгруппировать Тогда
        
        // Применяем выбранное действие к настройкам и переформируем отчет
        Настройки = ОбработкаРасшифровки.ПрименитьНастройки(Действие, ПараметрДействия);
        // Здесь вызываем процедуру повторного вывода с новыми настройками
        СформироватьОтчет();
    КонецЕсли;
    
КонецПроцедуры

Шаг 3. Упрощенный вариант (только открытие ссылок)

Если для задачи не требуется открывать расширенное контекстное меню с отборами и группировками, а нужно лишь открывать карточки документов, справочников или других объектов по клику, можно напрямую извлечь значение из структуры расшифровки.

Посмотрим на пример упрощенного обработчика:


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

Особенности для управляемых форм

Если решение реализуется или переносится на управляемые формы (тонкий клиент), следует помнить о клиент-серверной архитектуре:

  1. Объект ДанныеРасшифровкиКомпоновкиДанных не может передаваться на сторону тонкого клиента напрямую.
  2. При формировании отчета на сервере объект данных расшифровки помещается во временное хранилище:
    
    АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, УникальныйИдентификатор);
    
  3. В реквизите управляемой формы сохраняется строка АдресДанныхРасшифровки, которая передается в обработчик события расшифровки для последующего извлечения данных на сервере.

Соблюдение этих правил обеспечит корректную генерацию метаданных расшифровки компоновки данных и предоставит пользователям привычный интерактивный функционал при работе с отчетом.

← На главную