Еще раз о расшифровке для СКД

15.01.19

Разработка - СКД

Программное управление расшифровкой для отчета, сформированного с помощью Системы Компоновки Данных.

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

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

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

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

&НаСервере
Функция ЗапросСКДНаСервере()
	перем мРасшифровка;
	// Вставить содержимое обработчика.
	Lib=РеквизитФормыВЗначение("Объект");
	TD=Lib.СгенерироватьОтчет(мРасшифровка);
	
	ТД.Очистить();
	ТД.Вывести(TD);
        
        //подготовим данные расшифровки для сохранения на клиенте   
	WriteXML = Новый ЗаписьXML                         ;
	WriteXML.УстановитьСтроку()                        ;
	СериализаторXDTO.ЗаписатьXML(WriteXML,мРасшифровка);
	
	
	сообщение=WriteXML.Закрыть();
	возврат сообщение;
КонецФункции

&НаКлиенте
Процедура ЗапросСКД(Команда)
	ДанныеРасшифровкиXML=ЗапросСКДНаСервере();
КонецПроцедуры

Строковое представление данных расшифровки сохраним в реквизит формы ДанныеРасшифровкиXML с типом строка.

Первая часть нашего плана выполнена, мы сохранили данные расшифровки на клиенте. На следующем шаге создадим для поля табличного документа, в который выводится отчет, обработчик события ОбработкаРасшифровки.

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


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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

СКД расшифровка управляемые формы

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    254158    1401    421    

1153

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6238    327    shapa_pro    25    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    18404    ovetgana    112    

110

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    10702    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10231    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

27.02.2025    16361    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    14005    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10762    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. theWriter 6 02.01.19 11:41 Сейчас в теме
Здравствуйте!

В свое время столкнулись с такой же проблемой.
Но учитывая, что для работы в нашем случае нужен УОС , решили другим путем:

1. На форме Создали реквизит типа "КомпоновщикНастроекКомпоновкиДанных" и реквизит ДанныеРасшифровки произвольного типа.

2.Заполняем ТабДок:
	
	уос_ТиповыеОтчеты.ВывестиРезультатВТабличныйДокумент(ТабличныйДокумент, ДанныеРасшифровки, ОтчетОбъект);
	
	РезультатКомпоновкиОтчета = Новый Структура("ДанныеРасшифровки, ТабличныйДокумент, КомпоновщикНастроек", ДанныеРасшифровки, ТабличныйДокумент, ОтчетОбъект.КомпоновщикНастроек);


3. Запись значений
ДанныеРасшифровки 	= ЗначениеВСтрокуВнутр(СтруктураРезультат.ДанныеРасшифровки);		
	КомпоновщикУОС 		= СтруктураРезультат.КомпоновщикНастроек;


4. Получение обратно:
&НаСервере
Функция ПолучитьРасшифровку()
	
	ДанныеРасшифровки_ = ЗначениеИзСтрокиВнутр(ДанныеРасшифровки);

	ДанныеРасшифровки_.Настройки = КомпоновщикУОС.Настройки;
	
	Возврат ДанныеРасшифровки_;
	
КонецФункции
Показать
Восьмой; modernexpo; +2 Ответить
2. herfis 522 02.01.19 12:27 Сейчас в теме
Возможно, я после НГ еще в танке, но я не понял, какая вообще проблема решается (хотя статьи обычно с этого начинаются) и зачем нужно данные расшифровки запихивать в контекст формы. Почему их не держать во временном хранилище, аналогично тому как это делается "из коробки" для отчетов, а в контексте формы хранить только адрес?
Восьмой; Dilise; par_62; Olenevod; +4 Ответить
3. scientes 297 18.07.21 10:49 Сейчас в теме
(2)Я в ту пору мало общался с типовыми конфигурациями.Это велосипед собственного изобретения. Оказывается, что можно и так.
Для отправки сообщения требуется регистрация/авторизация