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

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает задача интерактивного взаимодействия с пользователем. Например, при клике по определенной ячейке отчета необходимо не просто открыть документ, а выполнить произвольный алгоритм — изменить значение реквизита документа, переключить флаг или вызвать процедуру обработки. Рассмотрим, как реализовать такую функциональность как на стандартном макете СКД, так и с использованием собственного макета ячеек.

Использование стандартного макета и события ОбработкаРасшифровки

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

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

  1. Убедимся, что у табличного документа установлено свойство ТолькоПросмотр = Истина, чтобы клик открывал расшифровку, а не переводил ячейку в режим текстового редактирования.
  2. В обработчике события ОбработкаРасшифровки установим параметр СтандартнаяОбработка = Ложь, чтобы отменить стандартное меню действий платформы.
  3. Передадим идентификатор расшифровки и адрес ДанныеРасшифровки на сервер для анализа структуры полей.

Проанализируем пример кода на клиенте и сервере для извлечения ссылки на документ из текущей строки:


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

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

На сервере считываем объект расшифровки из временного хранилища с помощью ПолучитьИзВременногоХранилища() и производим обход элементов:


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

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

Настройка через свой макет ячеек и ПараметрРасшифровки

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

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

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

Альтернативные способы перехвата действий пользователя

Рассмотрим другие варианты решения задачи взаимодействия с отчетом:

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

Важные ограничения и особенности реализации

При реализации собственного алгоритма обратите внимание на следующие нюансы:

Изменение настроек пользователем: Если пользователь исключит из выводимых полей или группировок поле ссылки на документ, в структуре расшифровки его не окажется. Обязательно добавляйте в код проверку ЗначениеЗаполнено().

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

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

← На главную