СКД в 1С

Расшифровка в СКД 1С: настройка, своя обработка и почему не работает

Коротко

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

Для собственной расшифровки в управляемой форме перехватывают событие табличного документа ОбработкаРасшифровки, устанавливают СтандартнаяОбработка = Ложь, на сервере получают объект из временного хранилища по адресу из реквизита формы ДанныеРасшифровки и обходят коллекцию ДанныеРасшифровки.Элементы[Расшифровка] через методы ПолучитьПоля() и ПолучитьРодителей() либо вызывают меню ОбработкаРасшифровкиКомпоновкиДанных.

Откуда берётся расшифровка: ДанныеРасшифровкиКомпоновкиДанных и конвейер СКД

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

Внутри платформы этот механизм разделён на две части:

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

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

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    // 1. Передаём ДанныеРасшифровки 3-м параметром в компоновщик макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(
        СхемаКомпоновкиДанных,
        Настройки,
        ДанныеРасшифровки
    );

    // 2. Передаём тот же объект ДанныеРасшифровки 3-м параметром в процессор
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(
        МакетКомпоновки,
        ,
        ДанныеРасшифровки,
        Истина
    );

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

КонецПроцедуры
КомпоновщикМакетаКомпоновкиДанных.Выполнить
СхемаСхемаКомпоновкиДанных — исходная схема отчёта
НастройкиНастройкиКомпоновкиДанных — актуальные настройки (через ПолучитьНастройки())
ДанныеРасшифровкиДанныеРасшифровкиКомпоновкиДанных — переменная, куда запишутся настройки расшифровки; без неё расшифровка не создаётся
МакетОформленияМакетОформленияКомпоновкиДанных — оформление отчёта
ТипГенератораТип — генератор макета
→ МакетКомпоновкиДанных

Обратите внимание на оба вызова: на этапе КомпоновщикМакета.Выполнить() платформа инициализирует объект ДанныеРасшифровкиКомпоновкиДанных, записывает в его свойство Настройки текущие НастройкиКомпоновкиДанных и закладывает шаблоны расшифровки в макет. А на этапе ПроцессорКомпоновки.Инициализировать() и последующего вывода ПроцессорВывода.Вывести() заполняется коллекция ДанныеРасшифровки.Элементы конкретными значениями из строк выборки. Если вы формируете отчёт собственной серверной процедурой управляемой формы (мимо ПриКомпоновкеРезультата), после вывода обязательно сохраните объект во временное хранилище: ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОбъект, УникальныйИдентификатор).

Событие табличного документа ОбработкаРасшифровки на клиенте

Когда пользователь дважды кликает левой кнопкой мыши (или нажимает Enter) по ячейке сформированного отчёта, на клиенте у элемента управляемой формы, отображающего табличный документ (обычно Результат), возникает событие ОбработкаРасшифровки. Если же пользователь вызывает контекстное меню правой кнопкой мыши и нажимает «Расшифровать...», срабатывает парное событие ОбработкаДополнительнойРасшифровки с точно такой же сигнатурой.

В процедуру приходят четыре параметра: ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры):

  • Элемент — ПолеФормы (элемент управляемой формы с видом «Поле табличного документа»).
  • Расшифровка — значение свойства Расшифровка нажатой ячейки. Для отчётов СКД это объект типа ИдентификаторРасшифровкиКомпоновкиДанных.
  • СтандартнаяОбработка — Булево (по умолчанию Истина). Если установить в Ложь непосредственно в теле клиентского обработчика, платформа не будет запускать типовой механизм расшифровки.
  • ДополнительныеПараметры — Неопределено или служебная структура контекста вызова.

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

По какой ячейке кликнул пользователь Стандартное поведение СКД (ЛКМ / Enter) Что хранится в элементе расшифровки Типичная задача при своей обработке
Группировка или детальная запись ссылочного типа (Контрагент, Номенклатура, Регистратор) Сразу выполняет ОткрытьЗначение — открывает форму элемента справочника или документа без показа меню ЭлементРасшифровкиКомпоновкиДанныхПоля с полем ссылки и ссылкой на родительскую группировку Показать меню выбора действия вместо мгновенного открытия карточки или открыть специализированную форму
Группировка примитивного типа или перечисления (строка, дата, вид операции) Показывает меню стандартных действий («Расшифровать», «Отфильтровать», «Упорядочить», «Сгруппировать», «Оформить») ЭлементРасшифровкиКомпоновкиДанныхПоля со значением группировки Добавить в меню собственные пункты (например, переход в связанный отчёт или журнал документов)
Ячейка ресурса (итог по группировке или на пересечении строк и колонок кросс-таблицы) Показывает диалог выбора поля для расшифровки («Расшифровать по полю...») и строит вложенный отчёт с отборами ЭлементРасшифровкиКомпоновкиДанныхПоля с полями ресурсов; значения разрезов лежат выше у родителей Подняться по ПолучитьРодителей(), собрать значения всех группировок строки/колонки и открыть детальный отчёт или список документов
Ячейка собственного макета без заполненного ПараметрРасшифровки Курсор-лупа не появляется, событие ОбработкаРасшифровки не вызывается Расшифровка ячейки не заполнена (Неопределено) Заполнить свойство ячейки ПараметрРасшифровки и коллекцию ВыраженияПолей в макете СКД

Структура ДанныеРасшифровки.Элементы: типы элементов, ПолучитьПоля() и ПолучитьРодителей()

Главная особенность архитектуры СКД, о которую спотыкаются при первом знакомстве с программной расшифровкой: в самом элементе расшифровки ячейки ресурса нет значений родительских группировок. Если в отчёте настроена иерархия группировок Организация → Склад → Номенклатура, а пользователь кликнул по колонке ресурса КоличествоКонечныйОстаток, то обращение к ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля() вернёт только значение самого ресурса в этой ячейке.

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

  1. При выводе каждой группировки процессор сначала создаёт узел типа ЭлементРасшифровкиКомпоновкиДанныхГруппировка (хранит свойство Группировка и метод ПолучитьРодителей(), указывающий на вышестоящую группировку).
  2. Подчинённым к нему создаётся узел типа ЭлементРасшифровкиКомпоновкиДанныхПоля, в который записываются значения полей самой группировки (например, Склад = Основной склад).
  3. При выводе конкретной ячейки строки создаётся ещё один дочерний ЭлементРасшифровкиКомпоновкиДанныхПоля, чей Идентификатор попадает в табличный документ. Его родитель — элемент полей текущей группировки; если же ячейка находится на пересечении строк и колонок ТаблицаКомпоновкиДанных (кросс-таблицы), метод ПолучитьРодителей() вернёт массив сразу из двух родителей — от группировки строки и от группировки колонки.

Каждый элемент коллекции ПолучитьПоля() (тип ЗначенияПолейРасшифровкиКомпоновкиДанных) представляет собой объект ЗначениеПоляРасшифровкиКомпоновкиДанных с тремя свойствами: Поле (строковый путь к данным в схеме, например "Номенклатура" или "Регистратор.Организация"), Значение (конкретная ссылка или примитив) и Иерархия (Булево — Истина, если строка выведена как иерархическая группа справочника).

Обратите внимание: в поисковых запросах и на форумах иногда ищут несуществующий тип «ЭлементРасшифровкиКомпоновкиДанныхЗапрос», пытаясь достать из расшифровки текст SQL-запроса. В платформе 1С:Предприятие 8.3 такого класса нет — коллекция ДанныеРасшифровки.Элементы содержит только два типа элементов: ЭлементРасшифровкиКомпоновкиДанныхПоля и ЭлементРасшифровкиКомпоновкиДанныхГруппировка. Исходные отборы и параметры запроса хранятся в свойстве ДанныеРасшифровки.Настройки (тип НастройкиКомпоновкиДанных).

&НаСервереБезКонтекста
Функция СобратьПоляРасшифровкиНаСервере(АдресДанныхРасшифровки, ИдентификаторРасшифровки)

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

    ЭлементРасшифровки = Данные.Элементы.Получить(ИдентификаторРасшифровки);
    ОбойтиРодителейРасшифровки(ЭлементРасшифровки, РезультатПолей);

    Возврат РезультатПолей;

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

&НаСервереБезКонтекста
Процедура ОбойтиРодителейРасшифровки(ЭлементРасшифровки, РезультатПолей)

    Если ЭлементРасшифровки = Неопределено Тогда
        Возврат;
    КонецЕсли;

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

    // Рекурсивно поднимаемся по всем веткам (у кросс-таблицы 2 родителя)
    Для Каждого Родитель Из ЭлементРасшифровки.ПолучитьРодителей() Цикл
        ОбойтиРодителейРасшифровки(Родитель, РезультатПолей);
    КонецЦикла;

КонецПроцедуры
ЭлементРасшифровкиКомпоновкиДанныхПоля
ИдентификаторИдентификаторРасшифровкиКомпоновкиДанных — ID элемента в коллекции Элементы
ОсновноеДействиеДействиеОбработкиРасшифровкиКомпоновкиДанных — действие по двойному клику
ПолучитьПоля()возвращает ЗначенияПолейРасшифровкиКомпоновкиДанных (элементы со свойствами Поле, Значение, Иерархия)
ПолучитьРодителей()возвращает Массив родительских элементов расшифровки
→ Сервер, Толстый клиент

Поскольку объекты ДанныеРасшифровкиКомпоновкиДанных и ЭлементРасшифровкиКомпоновкиДанныхПоля недоступны в тонком и веб-клиенте, обход дерева всегда выносят в процедуру с директивой &НаСервереБезКонтекста (передавая туда только строковый адрес хранилища и ИдентификаторРасшифровки), а на клиент возвращают лёгкую коллекцию Соответствие или Структура.

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

Объект ОбработкаРасшифровкиКомпоновкиДанных: меню действий и ПрименитьНастройки

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

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

Для интерактивного показа меню у объекта есть два метода:

  • ПоказатьВыборДействия(ОписаниеОповещенияОЗакрытии, ИдентификаторРасшифровки, ДоступныеДействия, ДополнительныеПунктыМеню, ИспользоватьОсновноеДействие, ЭлементФормы) — современный асинхронный метод, который работает в тонком и веб-клиенте при РежимИспользованияМодальности = НеИспользовать.
  • ВыбратьДействие(ИдентификаторРасшифровки, ВыполненноеДействие, ПараметрВыполненногоДействия, ДоступныеДействия, ДополнительныеПунктыМеню, ИспользоватьОсновноеДействие, ЭлементФормы) — синхронный аналог для старых конфигураций с разрешённой модальностью.
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)

    Если ПустаяСтрока(ДанныеРасшифровки)
        Или ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
        Возврат;
    КонецЕсли;

    СтандартнаяОбработка = Ложь;

    ПоляЯчейки = СобратьПоляРасшифровкиНаСервере(ДанныеРасшифровки, Расшифровка);
    Контрагент = ПоляЯчейки.Получить("Контрагент");

    // Добавляем свои пункты в меню расшифровки СКД
    ДопПункты = Новый СписокЗначений;
    Если ЗначениеЗаполнено(Контрагент) Тогда
        ДопПункты.Добавить("АктСверки", "Сформировать акт сверки по контрагенту");
    КонецЕсли;

    Контекст = Новый Структура("Расшифровка, Контрагент", Расшифровка, Контрагент);
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораДействияРасшифровки", ЭтотОбъект, Контекст);

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

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

&НаКлиенте
Процедура ПослеВыбораДействияРасшифровки(ВыполненноеДействие, ПараметрВыполненногоДействия, Контекст) Экспорт

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

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

&НаСервере
Процедура ПрименитьРасшифровкуВТекущейФормеНаСервере(ИдентификаторРасшифровки, ПрименяемыеНастройки)

    ДанныеОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(
        ДанныеОбъект,
        Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет)
    );

    НовыеНастройки = ОбработкаРасшифровки.ПрименитьНастройки(
        ИдентификаторРасшифровки,
        ПрименяемыеНастройки
    );

    Если ТипЗнч(НовыеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
        Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(НовыеНастройки);
    ИначеЕсли ТипЗнч(НовыеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
        Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(НовыеНастройки);
    КонецЕсли;

    СформироватьОтчетНаСервере();

КонецПроцедуры
ОбработкаРасшифровкиКомпоновкиДанных
ПоказатьВыборДействия(...)асинхронно выводит меню расшифровки и передаёт выбор в ОписаниеОповещения
ВыбратьДействие(...)синхронный выбор действия (при разрешённой модальности)
ПрименитьНастройки(Идентификатор, Настройки)серверный метод: накладывает дельту настроек расшифровки на исходные настройки
ДоступныеДействияМассив из ДействиеОбработкиРасшифровкиКомпоновкиДанных
ДополнительныеПунктыМенюСписокЗначений своих команд (вложенный список создаёт подменю)
→ НастройкиКомпоновкиДанных | ПользовательскиеНастройкиКомпоновкиДанных

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

Передача параметров и отборов при расшифровке в другой отчёт или список

Частая прикладная задача — по клику на ячейку сводного отчёта («План-факт продаж», «Ведомость расчётов») открыть другой детальный отчёт СКД или форму списка документов с уже установленными отборами по измерениям выбранной строки и за тот же период.

В типовой управляемой форме отчёта 1С:Предприятие 8.3 предусмотрен стандартный параметр формы Отбор (тип Структура) и булев флаг СформироватьПриОткрытии. Если ключи структуры Отбор точно совпадают с именами полей в схеме целевого отчёта, платформа сама установит фильтр с видом сравнения Равно:

&НаКлиенте
Процедура ОткрытьДетальныйОтчетПоКонтрагенту(Контрагент)

    ОтборНовогоОтчета = Новый Структура;
    ОтборНовогоОтчета.Вставить("Контрагент", Контрагент);

    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ОтборНовогоОтчета);
    ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

    ОткрытьФорму(
        "Отчет.ВедомостьПоРасчетамСКонтрагентами.Форма",
        ПараметрыФормы,
        ЭтотОбъект,
        Новый УникальныйИдентификатор
    );

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

Если же во второй отчёт нужно передать параметры данных СКД (например, НачалоПериода и КонецПериода из ДанныеРасшифровки.Настройки.ПараметрыДанных) или сложные отборы со сравнением ВСписке / Больше, одного параметра формы Отбор недостаточно. В этом случае в форму второго отчёта передают произвольную структуру в параметре или устанавливают настройки на сервере после получения формы. Важное правило: в самом открываемом отчёте программно заполнять КомпоновщикНастроек.Настройки.ПараметрыДанных нужно в серверных обработчиках формы ПриЗагрузкеВариантаНаСервере или ПриЗагрузкеПользовательскихНастроекНаСервере, а не в ПриСозданииНаСервере — иначе загрузка варианта отчёта затрёт переданные вами параметры значениями по умолчанию.

Почему не работает расшифровка в собственном макете СКД (ПараметрРасшифровки)

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

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

Пошаговый алгоритм включения расшифровки в своём макете СКД:

  1. Откройте вкладку «Макеты» схемы компоновки данных и выделите нужную ячейку в табличном поле макета.
  2. Откройте палитру свойств ячейки: в поле Заполнение выберите Параметр (или Шаблон), в поле Параметр укажите выводимое поле (например, СуммаОборот).
  3. В той же палитре свойств ячейки найдите строку «Параметр расшифровки» (ПараметрРасшифровки) и введите уникальное имя, которое не совпадает с именем обычного параметра (например, РасшифровкаСуммы или КонтрагентРасшифровка).
  4. Перейдите в нижнюю таблицу «Параметры макета». Там появится строка с типом ПараметрОбластиРасшифровкаКомпоновкиДанных и тремя настройками:
    • Имя — введённое вами имя параметра расшифровки;
    • ВыраженияПолей (коллекция ВыраженияПолейПараметраОбластиРасшифровкаКомпоновкиДанных) — список сопоставлений «Поле → Выражение», которые нужно положить в ЭлементРасшифровкиКомпоновкиДанныхПоля при клике на эту ячейку (например, поле Контрагент = выражение Контрагент, поле Договор = выражение Договор);
    • ОсновноеДействие — действие по умолчанию при двойном клике ЛКМ (например, ОткрытьЗначение для ссылки или Расшифровать для числа).
  5. Проверьте, что у табличного документа на форме установлено свойство ТолькоПросмотр = Истина. В редактируемом табличном документе (ТолькоПросмотр = Ложь) двойной щелчок переводит ячейку в режим редактирования текста и блокирует событие расшифровки.
Поиск пропавшей расшифровки в пользовательских макетах СКД отнимает много времени на ручную проверку свойств каждой ячейки на вкладке «Макеты». В ИИ Консоли отчётов 1С агент сам настраивает ПараметрРасшифровки и ВыраженияПолей в макетах схемы компоновки и проверяет работу расшифровки готового отчёта .erf в 1С.

Частые ошибки при работе с расшифровкой в СКД

  • Попытка прочитать ДанныеРасшифровки.Элементы напрямую на клиенте. В управляемой форме реквизит ДанныеРасшифровки имеет тип Строка и содержит адрес во временном хранилище (вида "e1cib/tempstorage/..."), а сам объект ДанныеРасшифровкиКомпоновкиДанных существует только на сервере. Обращение к ДанныеРасшифровки.Элементы в процедуре &НаКлиенте вызовет ошибку «Поле объекта не обнаружено (Элементы)». Всегда вызывайте ПолучитьИзВременногоХранилища(ДанныеРасшифровки) в серверной функции.
  • Передача ДанныеРасшифровки только в один из двух объектов при программной компоновке. Если в ПриКомпоновкеРезультата передать ДанныеРасшифровки в КомпоновщикМакета.Выполнить(), но забыть передать третьим параметром в ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки), то ДанныеРасшифровки.Элементы.Количество() будет равно 0, и при клике по ячейке ничего не произойдёт.
  • Чтение только текущего элемента Элементы[Расшифровка] без обхода ПолучитьРодителей(). При клике по ячейке с итоговой суммой текущий ЭлементРасшифровкиКомпоновкиДанныхПоля хранит только значение ресурса. Чтобы узнать организацию, склад или контрагента текущей строки и колонки кросс-таблицы, нужно рекурсивно обойти всех предков через ПолучитьРодителей().
  • Поиск поля в ПолучитьПоля() по заголовку колонки, а не по системному пути поля. Свойство ЗначениеПоляРасшифровкиКомпоновкиДанных.Поле всегда содержит системное имя поля СКД (например, "Номенклатура.Производитель" или "ПользовательскиеПоля.Поле1"), а не пользовательский заголовок «Производитель товара».
  • Установка СтандартнаяОбработка = Ложь внутри процедуры-оповещения ПоказатьВыборДействия. Асинхронный вызов ПоказатьВыборДействия не останавливает выполнение кода: платформа проверяет флаг СтандартнаяОбработка сразу при выходе из РезультатОбработкаРасшифровки. Если не поставить СтандартнаяОбработка = Ложь до вызова ПоказатьВыборДействия, пользователю откроются два меню расшифровки подряд.
  • Одинаковое имя в свойствах «Параметр» и «Параметр расшифровки» ячейки макета. Если в собственном макете СКД назвать ПараметрРасшифровки так же, как текстовый Параметр ячейки, конструктор макета не создаст отдельный ПараметрОбластиРасшифровкаКомпоновкиДанных, и расшифровка в ячейке не заработает.
  • Перехват только ОбработкаРасшифровки без ОбработкаДополнительнойРасшифровки. Если нужно полностью запретить расшифровку секретных показателей или переопределить меню, назначайте оба события табличного документа, иначе пользователь обойдёт ваше ограничение через правую кнопку мыши.

Частые вопросы по расшифровке в СКД 1С

Почему не работает расшифровка в СКД при программном формировании отчёта?

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

Как получить значения всех родительских группировок из расшифровки ячейки СКД?

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

Как вывести в отчёт номер или представление документа, но при двойном клике открывать сам документ?

Для этого не нужно писать код в модуле формы. Достаточно выводить в отчёт само ссылочное поле документа (например, Регистратор), а на вкладке «Наборы данных» конструктора СКД в колонке «Выражение представления» указать выражение для текста ячейки, например: Регистратор.Номер. Тогда в таблице отчёта пользователь увидит только номер, а в расшифровку ячейки попадёт полноценная ссылка на документ, которая откроется по двойному клику.

Тарифы

ИИ Консоль отчётов 1С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Ранний доступ

Популярный выбор
Бесплатно

Тестирование продукта в режиме разработки

  • Формирование панелей и виджетов в чате
  • Поддержка таблиц и популярных типов диаграмм
  • Приоритетный сбор обратной связи по развитию продукта