Как настроить и обработать двойной клик на ячейке макета СКД для открытия списка документов или других действий

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

При разработке отчетов в системе компоновки данных (СКД) часто возникает необходимость кастомизировать внешний вид с помощью собственного макета ячеек. Однако при переходе на ручной вывод макета стандартные механизмы СКД, такие как расшифровка (открытие детальных записей или документов по двойному клику), перестают работать автоматически. Мы часто сталкиваемся с ситуацией, когда двойной клик по ячейке ни к чему не приводит, а привычный значок «лупы» просто не появляется.

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

Шаг 1. Настройка ячейки макета в СКД

Чтобы платформа 1С поняла, что ячейка является интерактивной и поддерживает клик, нам нужно явно указать параметр расшифровки в свойствах макета схемы компоновки данных.

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

Шаг 2. Настройка свойств Табличного Документа в форме

Выясним причину, почему даже при верно настроенном макете «лупа» может не появляться на ячейке. Платформа ожидает, что табличный документ, куда выводится результат отчета, находится в режиме просмотра, а не редактирования.

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


Результат.ТолькоПросмотр = Истина;
Результат.ИспользоватьРасшифровку = Истина;

Свойство ТолькоПросмотр = Истина блокирует редактирование ячеек пользователем, переводя документ в режим кликабельности ссылок. А свойство ИспользоватьРасшифровку = Истина отвечает за то, чтобы платформа перехватывала двойные клики по ячейкам с настроенными параметрами расшифровки.

Шаг 3. Подключение обработчика события на форме

Теперь нам нужно связать действие пользователя (двойной клик) с программным кодом в модуле формы. Проанализируем ситуацию настройки элемента формы:

  1. Откроем управляемую форму нашего отчета.
  2. Найдем элемент формы (поле табличного документа), в который выводится результат (по умолчанию он называется Результат).
  3. В палитре свойств этого элемента перейдем к списку событий и найдем событие «ОбработкаРасшифровки».
  4. Нажмем на кнопку создания процедуры. Платформа сгенерирует клиентский метод на форме отчета.

Шаг 4. Написание программного кода расшифровки на клиенте и сервере

Разберем по шагам, как устроен механизм расшифровки изнутри. В клиентский обработчик события ОбработкаРасшифровки передается параметр Расшифровка. Важно понимать, что это значение не является прямой ссылкой на документ или справочник. Это целочисленный идентификатор строки данных во временном хранилище расшифровки СКД. Для программного извлечения родительских связей текущей строки можно использовать пример отчета для получения значений группировок в обработчике расшифровки.

Посмотрим на пример реализации клиентского обработчика:


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

КонецПроцедуры

Теперь разработаем серверную функцию, которая извлечет данные компоновки по идентификатору расшифровки из временного хранилища формы:


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

КонецФункции

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


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

Шаг 5. Альтернативные способы сделать ячейку кликабельной без использования макетов

Иногда разработчики создают собственный макет СКД только ради того, чтобы сделать строковое представление данных кликабельной ссылкой (например, красивое текстовое представление номера документа). Это усложняет поддержку отчета. Проанализируем два более простых способа решить эту задачу штатными средствами СКД без переопределения макетов:

  1. Выражение представления в наборе данных: Если у вас в запросе выбрано ссылочное поле (например, Ссылка), но вы хотите выводить на экран понятный пользователю текст, задайте для этого поля в схеме свойство «Выражение представления» (например, Ссылка.Номер + " от " + Формат(Ссылка.Дата, "ДФ=dd.MM.yyyy")). На экране пользователь увидит ваш красивый текст, но системно ячейка останется ссылкой на документ, сохранив стандартную расшифровку по двойному клику.
  2. Условное оформление: Выведите в отчет само ссылочное поле. В настройках условного оформления для этого поля добавьте свойство «Текст», выбрав в качестве значения другое текстовое поле. Визуально пользователь увидит текст оформления, но расшифровка под ним останется ссылочной, и по двойному клику без написания лишнего кода откроется нужный документ.
← На главную