1С 8.3 Как из СКД открыть другой СКД или обработку по щелчку на какой-либо ячейке в отчете

Дано: платформа 1С 8.3, сделан стандартный отчет на СКД (не важно внешний или встроенный).
Задача: по щелчку на ячейке в определенной колонке в таблице отчета нужно получить значение ячейки из другой колонки в этой же строке и передать его в другой отчет (т.е. сделать расшифровку значения другим отчетом).

Главный вопрос здесь - как получить значение ячейки, по которой пользователь произвел щелчок? А также как получить значение из другой ячейки в этой же строке?


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

Вот функция, которая возвращает значение текущей ячейки СКД отчета (той, по которой произведен щелчок) (куда вставлять данную функцию написано ниже):

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

Наименование колонки текущего поля (полей) нужно для того, чтобы данная функция не срабатывала на других ячейках.

Вот функция, которая возвращает значение другой ячейки из этой же строки:

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

Помимо наименования колонки текущей ячейки (ячеек), нужно задать наименование колонки той ячейки, значение которой нужно получить, а также указать - находится ли она справа или слева от текущей/текущих (это задает направление поиска).

Куда вставить данный код?
Он вставляется на форму СКД отчета (если ее нет, то нужно создать типовую форму - 1С 8.3 Как добавить типовую форму для СКД)

Чтобы воспользоваться данными функциями понадобится создать процедуру для события ОбработкаРасшифровки элемента Результат:


В данной процедуре вызываем вышеназванные функции следующим образом:

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

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

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

Пример вывода отчета:




Отчет тестировался на демо-базе БСП версии 2.4.5.
Содержимое архива:
  • ВнешнийОтчетСКДПримерРасшифровка.erf - пример внешнего отчета на СКД,  для теста нужно щелкнуть на поле "Пол" или "Дата рождения". Отчет можно открывать просто через Файл-Открыть.
  • ВнешняяОбработкаПример.epf - пример внешней обработки, принимающей параметр, переданный из СКД. Нужно загрузить в "Дополнительные отчеты и обработки" (задать имя ВнешняяОбработкаПример)



(с) Ella S.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

2 комментария :