Как получить данные поля строки в СКД по нажатию на ячейку отчета?

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

Рассмотрим распространенную техническую задачу в 1С: в отчете, построенном на Системе компоновки данных (СКД), требуется реализовать интерактивную обработку клика по ячейке. Например, при нажатии на ячейку колонки «Установить бизнес-регион» необходимо определить, к какому «Партнеру» относится данная строка, открыть форму выбора справочника и записать выбранное значение в соответствующий объект базы данных.

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

Способ 1. Переопределение параметра расшифровки в макете СКД

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

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

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


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

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

Способ 2. Рекурсивный обход родительских элементов расшифровки

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

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


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

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

Интерактивная обработка события на клиенте

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

  1. В начале процедуры отключаем платформенное меню расшифровки: СтандартнаяОбработка = Ложь;.
  2. Передаем на сервер параметр Расшифровка и имя реквизита формы ДанныеРасшифровки (содержащий адрес хранилища).
  3. Получаем значение ссылки (например, объект СправочникСсылка.Партнеры).
  4. Открываем форму выбора нужного справочника или документа, используя функцию ОткрытьФорму() с передачей параметров и описанием оповещения о закрытии.
  5. После выбора значения записываем изменения в базу данных. Для отображения изменений в отчете обновляем текущую ячейку через свойство Элемент.ТекущаяОбласть.Текст или повторно вызываем метод отчета СкомпоноватьРезультат().
← На главную