Расшифровка в СКД 1С: настройка, своя обработка и почему не работает
В отчётах на СКД ячейка результата хранит только ИдентификаторРасшифровкиКомпоновкиДанных, а дерево значений расположено в серверном объекте ДанныеРасшифровкиКомпоновкиДанных. Если вы формируете отчёт программно в ПриКомпоновкеРезультата, этот объект необходимо явно передать третьим параметром и в КомпоновщикМакетаКомпоновкиДанных.Выполнить(), и в ПроцессорКомпоновкиДанных.Инициализировать() — иначе двойной клик по ячейкам перестанет реагировать.
Для собственной расшифровки в управляемой форме перехватывают событие табличного документа ОбработкаРасшифровки, устанавливают СтандартнаяОбработка = Ложь, на сервере получают объект из временного хранилища по адресу из реквизита формы ДанныеРасшифровки и обходят коллекцию ДанныеРасшифровки.Элементы[Расшифровка] через методы ПолучитьПоля() и ПолучитьРодителей() либо вызывают меню ОбработкаРасшифровкиКомпоновкиДанных.
Откуда берётся расшифровка: ДанныеРасшифровкиКомпоновкиДанных и конвейер СКД
Когда отчёт на системе компоновки данных формируется штатно (без переопределения процедуры ПриКомпоновкеРезультата в модуле объекта и с типовой формой отчёта), расшифровка в СКД 1С работает автоматически. По двойному щелчку мыши или клавише Enter платформа открывает карточку справочника/документа для ссылочных полей либо показывает контекстное меню с действиями «Расшифровать», «Открыть», «Отфильтровать», «Упорядочить», «Сгруппировать» и «Оформить».
Внутри платформы этот механизм разделён на две части:
- В свойство
Расшифровкакаждой ячейки результирующегоТабличныйДокументзаписывается лёгкий объектИдентификаторРасшифровкиКомпоновкиДанных(числовой индекс элемента). - Полное описание настроек, выведенных группировок и значений полей складывается в серверный объект
ДанныеРасшифровкиКомпоновкиДанных. В управляемой форме отчёта сам этот объект на клиент не передаётся: платформа помещает его во временное хранилище, а строковый адрес сохраняет в реквизите формы, связанном со свойством расширения формы «Данные расшифровки» (по умолчанию реквизитДанныеРасшифровкитипаСтрока).
Как только разработчик отключает стандартную обработку в ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) для программного вывода отчёта, обязанность заполнить параметр ДанныеРасшифровки ложится на код модуля объекта. Если пропустить его хотя бы на одном этапе конвейера, коллекция элементов останется пустой и расшифровка в отчёте перестанет работать.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// 1. Передаём ДанныеРасшифровки 3-м параметром в компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
Настройки,
ДанныеРасшифровки
);
// 2. Передаём тот же объект ДанныеРасшифровки 3-м параметром в процессор
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(
МакетКомпоновки,
,
ДанныеРасшифровки,
Истина
);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
СхемаКомпоновкиДанных — исходная схема отчётаНастройкиКомпоновкиДанных — актуальные настройки (через ПолучитьНастройки())ДанныеРасшифровкиКомпоновкиДанных — переменная, куда запишутся настройки расшифровки; без неё расшифровка не создаётсяМакетОформленияКомпоновкиДанных — оформление отчётаТип — генератор макетаОбратите внимание на оба вызова: на этапе КомпоновщикМакета.Выполнить() платформа инициализирует объект ДанныеРасшифровкиКомпоновкиДанных, записывает в его свойство Настройки текущие НастройкиКомпоновкиДанных и закладывает шаблоны расшифровки в макет. А на этапе ПроцессорКомпоновки.Инициализировать() и последующего вывода ПроцессорВывода.Вывести() заполняется коллекция ДанныеРасшифровки.Элементы конкретными значениями из строк выборки. Если вы формируете отчёт собственной серверной процедурой управляемой формы (мимо ПриКомпоновкеРезультата), после вывода обязательно сохраните объект во временное хранилище: ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОбъект, УникальныйИдентификатор).
Событие табличного документа ОбработкаРасшифровки на клиенте
Когда пользователь дважды кликает левой кнопкой мыши (или нажимает Enter) по ячейке сформированного отчёта, на клиенте у элемента управляемой формы, отображающего табличный документ (обычно Результат), возникает событие ОбработкаРасшифровки. Если же пользователь вызывает контекстное меню правой кнопкой мыши и нажимает «Расшифровать...», срабатывает парное событие ОбработкаДополнительнойРасшифровки с точно такой же сигнатурой.
В процедуру приходят четыре параметра: ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры):
Элемент—ПолеФормы(элемент управляемой формы с видом «Поле табличного документа»).Расшифровка— значение свойстваРасшифровканажатой ячейки. Для отчётов СКД это объект типаИдентификаторРасшифровкиКомпоновкиДанных.СтандартнаяОбработка—Булево(по умолчаниюИстина). Если установить вЛожьнепосредственно в теле клиентского обработчика, платформа не будет запускать типовой механизм расшифровки.ДополнительныеПараметры—Неопределеноили служебная структура контекста вызова.
Прежде чем писать код перехвата, важно понимать, какое действие платформа выполняет по умолчанию для разных ячеек отчёта и когда его нужно переопределять.
| По какой ячейке кликнул пользователь | Стандартное поведение СКД (ЛКМ / Enter) | Что хранится в элементе расшифровки | Типичная задача при своей обработке |
|---|---|---|---|
Группировка или детальная запись ссылочного типа (Контрагент, Номенклатура, Регистратор) |
Сразу выполняет ОткрытьЗначение — открывает форму элемента справочника или документа без показа меню |
ЭлементРасшифровкиКомпоновкиДанныхПоля с полем ссылки и ссылкой на родительскую группировку |
Показать меню выбора действия вместо мгновенного открытия карточки или открыть специализированную форму |
| Группировка примитивного типа или перечисления (строка, дата, вид операции) | Показывает меню стандартных действий («Расшифровать», «Отфильтровать», «Упорядочить», «Сгруппировать», «Оформить») | ЭлементРасшифровкиКомпоновкиДанныхПоля со значением группировки |
Добавить в меню собственные пункты (например, переход в связанный отчёт или журнал документов) |
| Ячейка ресурса (итог по группировке или на пересечении строк и колонок кросс-таблицы) | Показывает диалог выбора поля для расшифровки («Расшифровать по полю...») и строит вложенный отчёт с отборами | ЭлементРасшифровкиКомпоновкиДанныхПоля с полями ресурсов; значения разрезов лежат выше у родителей |
Подняться по ПолучитьРодителей(), собрать значения всех группировок строки/колонки и открыть детальный отчёт или список документов |
Ячейка собственного макета без заполненного ПараметрРасшифровки |
Курсор-лупа не появляется, событие ОбработкаРасшифровки не вызывается |
Расшифровка ячейки не заполнена (Неопределено) |
Заполнить свойство ячейки ПараметрРасшифровки и коллекцию ВыраженияПолей в макете СКД |
Структура ДанныеРасшифровки.Элементы: типы элементов, ПолучитьПоля() и ПолучитьРодителей()
Главная особенность архитектуры СКД, о которую спотыкаются при первом знакомстве с программной расшифровкой: в самом элементе расшифровки ячейки ресурса нет значений родительских группировок. Если в отчёте настроена иерархия группировок Организация → Склад → Номенклатура, а пользователь кликнул по колонке ресурса КоличествоКонечныйОстаток, то обращение к ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля() вернёт только значение самого ресурса в этой ячейке.
Чтобы получить значения Организация, Склад и Номенклатура, для которых рассчитана эта цифра, нужно знать, как процессор компоновки строит дерево в коллекции ДанныеРасшифровки.Элементы (тип ЭлементыРасшифровкиКомпоновкиДанных):
- При выводе каждой группировки процессор сначала создаёт узел типа
ЭлементРасшифровкиКомпоновкиДанныхГруппировка(хранит свойствоГруппировкаи методПолучитьРодителей(), указывающий на вышестоящую группировку). - Подчинённым к нему создаётся узел типа
ЭлементРасшифровкиКомпоновкиДанныхПоля, в который записываются значения полей самой группировки (например,Склад = Основной склад). - При выводе конкретной ячейки строки создаётся ещё один дочерний
ЭлементРасшифровкиКомпоновкиДанныхПоля, чейИдентификаторпопадает в табличный документ. Его родитель — элемент полей текущей группировки; если же ячейка находится на пересечении строк и колонокТаблицаКомпоновкиДанных(кросс-таблицы), методПолучитьРодителей()вернёт массив сразу из двух родителей — от группировки строки и от группировки колонки.
Каждый элемент коллекции ПолучитьПоля() (тип ЗначенияПолейРасшифровкиКомпоновкиДанных) представляет собой объект ЗначениеПоляРасшифровкиКомпоновкиДанных с тремя свойствами: Поле (строковый путь к данным в схеме, например "Номенклатура" или "Регистратор.Организация"), Значение (конкретная ссылка или примитив) и Иерархия (Булево — Истина, если строка выведена как иерархическая группа справочника).
Обратите внимание: в поисковых запросах и на форумах иногда ищут несуществующий тип «ЭлементРасшифровкиКомпоновкиДанныхЗапрос», пытаясь достать из расшифровки текст SQL-запроса. В платформе 1С:Предприятие 8.3 такого класса нет — коллекция ДанныеРасшифровки.Элементы содержит только два типа элементов: ЭлементРасшифровкиКомпоновкиДанныхПоля и ЭлементРасшифровкиКомпоновкиДанныхГруппировка. Исходные отборы и параметры запроса хранятся в свойстве ДанныеРасшифровки.Настройки (тип НастройкиКомпоновкиДанных).
&НаСервереБезКонтекста
Функция СобратьПоляРасшифровкиНаСервере(АдресДанныхРасшифровки, ИдентификаторРасшифровки)
РезультатПолей = Новый Соответствие;
Данные = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
Если ТипЗнч(Данные) <> Тип("ДанныеРасшифровкиКомпоновкиДанных") Тогда
Возврат РезультатПолей;
КонецЕсли;
ЭлементРасшифровки = Данные.Элементы.Получить(ИдентификаторРасшифровки);
ОбойтиРодителейРасшифровки(ЭлементРасшифровки, РезультатПолей);
Возврат РезультатПолей;
КонецФункции
&НаСервереБезКонтекста
Процедура ОбойтиРодителейРасшифровки(ЭлементРасшифровки, РезультатПолей)
Если ЭлементРасшифровки = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Для Каждого ЗначениеПоля Из ЭлементРасшифровки.ПолучитьПоля() Цикл
// Нижние уровни группировки приоритетнее верхних
Если РезультатПолей.Получить(ЗначениеПоля.Поле) = Неопределено Тогда
РезультатПолей.Вставить(ЗначениеПоля.Поле, ЗначениеПоля.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Рекурсивно поднимаемся по всем веткам (у кросс-таблицы 2 родителя)
Для Каждого Родитель Из ЭлементРасшифровки.ПолучитьРодителей() Цикл
ОбойтиРодителейРасшифровки(Родитель, РезультатПолей);
КонецЦикла;
КонецПроцедуры
ИдентификаторРасшифровкиКомпоновкиДанных — ID элемента в коллекции ЭлементыДействиеОбработкиРасшифровкиКомпоновкиДанных — действие по двойному кликуЗначенияПолейРасшифровкиКомпоновкиДанных (элементы со свойствами Поле, Значение, Иерархия)Массив родительских элементов расшифровкиПоскольку объекты ДанныеРасшифровкиКомпоновкиДанных и ЭлементРасшифровкиКомпоновкиДанныхПоля недоступны в тонком и веб-клиенте, обход дерева всегда выносят в процедуру с директивой &НаСервереБезКонтекста (передавая туда только строковый адрес хранилища и ИдентификаторРасшифровки), а на клиент возвращают лёгкую коллекцию Соответствие или Структура.
ПолучитьРодителей() и отлаживать передачу адреса временного хранилища между клиентом и сервером. Агент сам собирает схему компоновки данных по вашей базе, прописывает передачу ДанныеРасшифровки в модуле объекта и проверяет формирование и расшифровку готового внешнего отчёта .erf в 1С.
Объект ОбработкаРасшифровкиКомпоновкиДанных: меню действий и ПрименитьНастройки
Если вы хотите не просто открыть карточку объекта, а показать пользователю стандартное меню СКД («Расшифровать», «Отфильтровать», «Упорядочить», «Сгруппировать»), дополнив его своими пунктами или ограничив список доступных команд, используйте платформенный объект ОбработкаРасшифровкиКомпоновкиДанных.
Объект создаётся конструктором Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИсточникДоступныхНастроек). Первый параметр принимает либо строковый адрес во временном хранилище (на клиенте), либо сам объект ДанныеРасшифровкиКомпоновкиДанных (на сервере). Вторым параметром передаётся Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет) (или адрес схемы компоновки данных во временном хранилище).
Для интерактивного показа меню у объекта есть два метода:
ПоказатьВыборДействия(ОписаниеОповещенияОЗакрытии, ИдентификаторРасшифровки, ДоступныеДействия, ДополнительныеПунктыМеню, ИспользоватьОсновноеДействие, ЭлементФормы)— современный асинхронный метод, который работает в тонком и веб-клиенте приРежимИспользованияМодальности = НеИспользовать.ВыбратьДействие(ИдентификаторРасшифровки, ВыполненноеДействие, ПараметрВыполненногоДействия, ДоступныеДействия, ДополнительныеПунктыМеню, ИспользоватьОсновноеДействие, ЭлементФормы)— синхронный аналог для старых конфигураций с разрешённой модальностью.
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
Если ПустаяСтрока(ДанныеРасшифровки)
Или ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
ПоляЯчейки = СобратьПоляРасшифровкиНаСервере(ДанныеРасшифровки, Расшифровка);
Контрагент = ПоляЯчейки.Получить("Контрагент");
// Добавляем свои пункты в меню расшифровки СКД
ДопПункты = Новый СписокЗначений;
Если ЗначениеЗаполнено(Контрагент) Тогда
ДопПункты.Добавить("АктСверки", "Сформировать акт сверки по контрагенту");
КонецЕсли;
Контекст = Новый Структура("Расшифровка, Контрагент", Расшифровка, Контрагент);
Оповещение = Новый ОписаниеОповещения("ПослеВыбораДействияРасшифровки", ЭтотОбъект, Контекст);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(
ДанныеРасшифровки,
Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет)
);
ОбработкаРасшифровки.ПоказатьВыборДействия(Оповещение, Расшифровка, , ДопПункты);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораДействияРасшифровки(ВыполненноеДействие, ПараметрВыполненногоДействия, Контекст) Экспорт
Если ВыполненноеДействие = "АктСверки" Тогда
ОткрытьДетальныйОтчетПоКонтрагенту(Контекст.Контрагент);
ИначеЕсли ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
ПоказатьЗначение(, ПараметрВыполненногоДействия);
ИначеЕсли ТипЗнч(ВыполненноеДействие) = Тип("ДействиеОбработкиРасшифровкиКомпоновкиДанных")
И ВыполненноеДействие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет Тогда
// Применяем выбранные настройки (фильтр/группировку/сортировку) в текущем отчёте
ПрименитьРасшифровкуВТекущейФормеНаСервере(Контекст.Расшифровка, ПараметрВыполненногоДействия);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПрименитьРасшифровкуВТекущейФормеНаСервере(ИдентификаторРасшифровки, ПрименяемыеНастройки)
ДанныеОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(
ДанныеОбъект,
Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет)
);
НовыеНастройки = ОбработкаРасшифровки.ПрименитьНастройки(
ИдентификаторРасшифровки,
ПрименяемыеНастройки
);
Если ТипЗнч(НовыеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(НовыеНастройки);
ИначеЕсли ТипЗнч(НовыеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(НовыеНастройки);
КонецЕсли;
СформироватьОтчетНаСервере();
КонецПроцедуры
ОписаниеОповещенияМассив из ДействиеОбработкиРасшифровкиКомпоновкиДанныхСписокЗначений своих команд (вложенный список создаёт подменю)Обратите внимание на важный нюанс работы метода ПрименитьНастройки(ИдентификаторРасшифровки, Настройки): он может вернуть как полные НастройкиКомпоновкиДанных (например, когда добавилась новая группировка при расшифровке), так и ПользовательскиеНастройкиКомпоновкиДанных (если изменение затронуло только элементы, вынесенные в пользовательские настройки). Поэтому перед вызовом ЗагрузитьНастройки() или ЗагрузитьПользовательскиеНастройки() обязательно проверяйте ТипЗнч(НовыеНастройки). Если же вместо переформирования текущего окна требуется открыть расшифровку в новом окне того же отчёта, упакуйте выбор в Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Расшифровка, ПараметрВыполненногоДействия) и передайте его в ОткрытьФорму(ИмяФормы, Новый Структура("Расшифровка, СформироватьПриОткрытии", Описание, Истина), ЭтотОбъект, Новый УникальныйИдентификатор).
Передача параметров и отборов при расшифровке в другой отчёт или список
Частая прикладная задача — по клику на ячейку сводного отчёта («План-факт продаж», «Ведомость расчётов») открыть другой детальный отчёт СКД или форму списка документов с уже установленными отборами по измерениям выбранной строки и за тот же период.
В типовой управляемой форме отчёта 1С:Предприятие 8.3 предусмотрен стандартный параметр формы Отбор (тип Структура) и булев флаг СформироватьПриОткрытии. Если ключи структуры Отбор точно совпадают с именами полей в схеме целевого отчёта, платформа сама установит фильтр с видом сравнения Равно:
&НаКлиенте
Процедура ОткрытьДетальныйОтчетПоКонтрагенту(Контрагент)
ОтборНовогоОтчета = Новый Структура;
ОтборНовогоОтчета.Вставить("Контрагент", Контрагент);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ОтборНовогоОтчета);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму(
"Отчет.ВедомостьПоРасчетамСКонтрагентами.Форма",
ПараметрыФормы,
ЭтотОбъект,
Новый УникальныйИдентификатор
);
КонецПроцедуры
Если же во второй отчёт нужно передать параметры данных СКД (например, НачалоПериода и КонецПериода из ДанныеРасшифровки.Настройки.ПараметрыДанных) или сложные отборы со сравнением ВСписке / Больше, одного параметра формы Отбор недостаточно. В этом случае в форму второго отчёта передают произвольную структуру в параметре или устанавливают настройки на сервере после получения формы. Важное правило: в самом открываемом отчёте программно заполнять КомпоновщикНастроек.Настройки.ПараметрыДанных нужно в серверных обработчиках формы ПриЗагрузкеВариантаНаСервере или ПриЗагрузкеПользовательскихНастроекНаСервере, а не в ПриСозданииНаСервере — иначе загрузка варианта отчёта затрёт переданные вами параметры значениями по умолчанию.
Почему не работает расшифровка в собственном макете СКД (ПараметрРасшифровки)
Разработчик создаёт красивый собственный макет поля или группировки на вкладке «Макеты» конструктора СКД, запускает отчёт, наводит мышь на ячейки — а курсор остаётся обычной стрелкой вместо «лупы с плюсом», и событие ОбработкаРасшифровки вообще не вызывается. Почему так происходит?
Когда макет генерируется автоматически, платформа сама создаёт для каждой ячейки служебный параметр расшифровки. Но в пользовательском макете СКД платформа считает любую ячейку статическим оформлением, пока вы явно не свяжете её с механизмом расшифровки через свойство ячейки «Параметр расшифровки» (программный тип в макете области — ПараметрОбластиРасшифровкаКомпоновкиДанных).
Пошаговый алгоритм включения расшифровки в своём макете СКД:
- Откройте вкладку «Макеты» схемы компоновки данных и выделите нужную ячейку в табличном поле макета.
- Откройте палитру свойств ячейки: в поле
ЗаполнениевыберитеПараметр(илиШаблон), в полеПараметрукажите выводимое поле (например,СуммаОборот). - В той же палитре свойств ячейки найдите строку «Параметр расшифровки» (
ПараметрРасшифровки) и введите уникальное имя, которое не совпадает с именем обычного параметра (например,РасшифровкаСуммыилиКонтрагентРасшифровка). - Перейдите в нижнюю таблицу «Параметры макета». Там появится строка с типом
ПараметрОбластиРасшифровкаКомпоновкиДанныхи тремя настройками:Имя— введённое вами имя параметра расшифровки;ВыраженияПолей(коллекцияВыраженияПолейПараметраОбластиРасшифровкаКомпоновкиДанных) — список сопоставлений «Поле → Выражение», которые нужно положить вЭлементРасшифровкиКомпоновкиДанныхПоляпри клике на эту ячейку (например, полеКонтрагент= выражениеКонтрагент, полеДоговор= выражениеДоговор);ОсновноеДействие— действие по умолчанию при двойном клике ЛКМ (например,ОткрытьЗначениедля ссылки илиРасшифроватьдля числа).
- Проверьте, что у табличного документа на форме установлено свойство
ТолькоПросмотр = Истина. В редактируемом табличном документе (ТолькоПросмотр = Ложь) двойной щелчок переводит ячейку в режим редактирования текста и блокирует событие расшифровки.
ПараметрРасшифровки и ВыраженияПолей в макетах схемы компоновки и проверяет работу расшифровки готового отчёта .erf в 1С.
Частые ошибки при работе с расшифровкой в СКД
- Попытка прочитать
ДанныеРасшифровки.Элементынапрямую на клиенте. В управляемой форме реквизитДанныеРасшифровкиимеет типСтрокаи содержит адрес во временном хранилище (вида"e1cib/tempstorage/..."), а сам объектДанныеРасшифровкиКомпоновкиДанныхсуществует только на сервере. Обращение кДанныеРасшифровки.Элементыв процедуре&НаКлиентевызовет ошибку «Поле объекта не обнаружено (Элементы)». Всегда вызывайтеПолучитьИзВременногоХранилища(ДанныеРасшифровки)в серверной функции. - Передача
ДанныеРасшифровкитолько в один из двух объектов при программной компоновке. Если вПриКомпоновкеРезультатапередатьДанныеРасшифровкивКомпоновщикМакета.Выполнить(), но забыть передать третьим параметром вПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки), тоДанныеРасшифровки.Элементы.Количество()будет равно0, и при клике по ячейке ничего не произойдёт. - Чтение только текущего элемента
Элементы[Расшифровка]без обходаПолучитьРодителей(). При клике по ячейке с итоговой суммой текущийЭлементРасшифровкиКомпоновкиДанныхПоляхранит только значение ресурса. Чтобы узнать организацию, склад или контрагента текущей строки и колонки кросс-таблицы, нужно рекурсивно обойти всех предков черезПолучитьРодителей(). - Поиск поля в
ПолучитьПоля()по заголовку колонки, а не по системному пути поля. СвойствоЗначениеПоляРасшифровкиКомпоновкиДанных.Полевсегда содержит системное имя поля СКД (например,"Номенклатура.Производитель"или"ПользовательскиеПоля.Поле1"), а не пользовательский заголовок «Производитель товара». - Установка
СтандартнаяОбработка = Ложьвнутри процедуры-оповещенияПоказатьВыборДействия. Асинхронный вызовПоказатьВыборДействияне останавливает выполнение кода: платформа проверяет флагСтандартнаяОбработкасразу при выходе изРезультатОбработкаРасшифровки. Если не поставитьСтандартнаяОбработка = Ложьдо вызоваПоказатьВыборДействия, пользователю откроются два меню расшифровки подряд. - Одинаковое имя в свойствах «Параметр» и «Параметр расшифровки» ячейки макета. Если в собственном макете СКД назвать
ПараметрРасшифровкитак же, как текстовыйПараметрячейки, конструктор макета не создаст отдельныйПараметрОбластиРасшифровкаКомпоновкиДанных, и расшифровка в ячейке не заработает. - Перехват только
ОбработкаРасшифровкибезОбработкаДополнительнойРасшифровки. Если нужно полностью запретить расшифровку секретных показателей или переопределить меню, назначайте оба события табличного документа, иначе пользователь обойдёт ваше ограничение через правую кнопку мыши.
Частые вопросы по расшифровке в СКД 1С
Почему не работает расшифровка в СКД при программном формировании отчёта?
При переопределении события ПриКомпоновкеРезультата со значением СтандартнаяОбработка = Ложь платформа перестаёт автоматически наполнять данные расшифровки. Чтобы расшифровка заработала, необходимо передать параметр ДанныеРасшифровки третьим аргументом сразу в два метода: в КомпоновщикМакетаКомпоновкиДанных.Выполнить(Схема, Настройки, ДанныеРасшифровки) и в ПроцессорКомпоновкиДанных.Инициализировать(Макет, ВнешниеНаборы, ДанныеРасшифровки). Также убедитесь, что у табличного документа установлено свойство ТолькоПросмотр = Истина.
Как получить значения всех родительских группировок из расшифровки ячейки СКД?
Сама ячейка ресурса в ДанныеРасшифровки.Элементы[Расшифровка] содержит только значение показателя. Чтобы получить значения группировок строки и колонки, передайте адрес временного хранилища ДанныеРасшифровки и идентификатор Расшифровка на сервер, получите объект через ПолучитьИзВременногоХранилища и выполните рекурсивный обход вверх по дереву с помощью метода ПолучитьРодителей(), считывая на каждом уровне коллекцию ПолучитьПоля() у элементов типа ЭлементРасшифровкиКомпоновкиДанныхПоля.
Как вывести в отчёт номер или представление документа, но при двойном клике открывать сам документ?
Для этого не нужно писать код в модуле формы. Достаточно выводить в отчёт само ссылочное поле документа (например, Регистратор), а на вкладке «Наборы данных» конструктора СКД в колонке «Выражение представления» указать выражение для текста ячейки, например: Регистратор.Номер. Тогда в таблице отчёта пользователь увидит только номер, а в расшифровку ячейки попадёт полноценная ссылка на документ, которая откроется по двойному клику.
ИИ Консоль отчётов 1С
Старт
Популярный выборДля индивидуального использования
- Сборка и проверка отчётов СКД (.erf)
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Ранний доступ
Популярный выборТестирование продукта в режиме разработки
- Формирование панелей и виджетов в чате
- Поддержка таблиц и популярных типов диаграмм
- Приоритетный сбор обратной связи по развитию продукта
Продвинутый
Для интенсивного использования или команд
- Сборка и проверка отчётов СКД (.erf)
-
≈ 300 задач Подробнее про лимиты
- Техническая поддержка