Смена типа набора данных СКД с сохранением полей программно

19.02.26

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

В данной публикации рассматривается уникальный программный способ смены типа набора данных СКД с типа "Запрос" на тип "Объект". Набирать состав колонок СКД отчёта, с указанием их типов, через пользовательский интерфейс весьма муторно. И ещё более муторно, когда это надо делать при переделке существующего отчёта, базировавшегося ранее на запросе.

Прежде чем перейти к разработанному мною способу, приведу традиционный:

Алгоритм традиционного способа:

1) Создаём новый набор данных типа объект;

2) Копируем в него колонки существующего набора данных;

3) Удаляем существующий набор данных.

Ниже представлен листинг процедуры, реализующей описанный выше алгоритм:

В параметр "ИмяОбъекта" нужно передать название объекта, который будет добавлен во внешний набор данных СКД, например "тзДанныеОтчёта".

Процедура СменаТипаНабораДанныхСКДНаОбъект_ОП(ИмяОбъекта)
	
	Перем СКД, Набор, НовыйНабор, Элем, ПолеСКД;
	
	СКД = ЭтотОбъект.СхемаКомпоновкиДанных;
	
	Набор = СКД.НаборыДанных[0];
	НовыйНабор = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
	НовыйНабор.ИмяОбъекта = ИмяОбъекта;
	
	ЗаполнитьЗначенияСвойств(НовыйНабор, Набор);
	
	Для Каждого Элем Из Набор.Поля Цикл
		
		ПолеСКД = НовыйНабор.Поля.Добавить(ТипЗнч(Элем));
		ЗаполнитьЗначенияСвойств(ПолеСКД, Элем)
	КонецЦикла;
	
	СКД.НаборыДанных.Удалить(Набор);
	
КонецПроцедуры //  СменаТипаНабораДанныхСКДНаОбъект_ОП	


Традиционный программный способ имеет серьёзный недостаток - к колонкам нового набора данных не применяются параметры оформления колонок, заданные в настройках СКД.

Именно поэтому мною был разработан новый способ конвертации типа набора данных СКД, который будет представлен далее.

Конвертация типа набора данных СКД, в существующем наборе данных, без создания нового.

В рамках объектно-ориентированного подхода невозможно изменить тип набора данных, однако, платформа 1С имеет возможность сериализации своих объектов, а в сериализованном объекте ограничения логики объекта отсутствуют - ведь объект превращается просто в текст, который можно поправить так, как нам надо.

Как видите, всё гениальное - просто!

Если мы при помощи функции "ЗначениеВСтрокуВнутр" сериализуем объект схемы компоновки данных, то получим вот такую "абракадабру": 
 

{"#",dc29f857-fc4f-4cd1-a7ca-e8e71f3955b3,
{#base64:77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxTY2hl
bWFGaWxlIHhtbG5zPSIiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAx
L1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hN
TFNjaGVtYS1pbnN0YW5jZSI+DQoJPGRhdGFDb21wb3NpdGlvblNjaGVtYSB4bWxu
...

 

 
 Полная версия сериализованного объекта СКД


Очевидно, что сериализованный объект состоит из нескольких блоков данных base64.
Если извлечь первый блок base64 и декодировать его, то мы получим XML-представление схемы компоновки данных, подобное тому, что экспортируется в файл на диск, из окна редактирования СКД конфигуратора:
 

?<?xml version="1.0" encoding="UTF-8"?>
<SchemaFile xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<dataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema">
		<dataSource>
			<name>ИсточникДанных1</name>
			<dataSourceType>Local</dataSourceType>
		</dataSource>
		<dataSet xsi:type="DataSetQuery">
			<name>НаборДанных1</name>
			<field xsi:type="DataSetFieldField">
				<dataPath>Организация</dataPath>
				<field>Организация</field>
				<title xmlns:d5p1="http://v8.1c.ru/8.1/data/core" xsi:type="d5p1:LocalStringType">
					<d5p1:item>
						<d5p1:lang>ru</d5p1:lang>
						<d5p1:content>Организация</d5p1:content>
					</d5p1:item>
				</title>
				<appearance>
					<item xmlns="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xsi:type="dcsset:SettingsParameterValue">
						<parameter>МинимальнаяШирина</parameter>
						<value xsi:type="xs:decimal">35</value>
					</item>
				</appearance>
			</field>

...

 

 
 Полная версия XML-представления СКД

 

Далее "дело в шляпе" - с XML нужно программно произвести операцию, описанную в публикации:
Смена типа набора данных СКД с сохранением полей

Итак, получается следующий алгоритм:

1) Сериализуем объект СКД;

2) Извлекаем первый блок данных base64 из сериализованного объекта СКД;

3) Декодируем base64 и получаем XML-представление СКД;

4) В XML-представлении СКД меняем тип данных набора данных на объект, удаляем текст запроса, добавляем имя объекта;

5) Кодируем модифицированный XML в base64;

6) Заменяем первый блок данных base64 сериализованного объекта, на полученный нами в п.5.

Ниже представлен листинг процедур, реализующих описанный выше алгоритм:

В параметр "ИмяОбъекта" нужно передать название объекта, который будет добавлен во внешний набор данных СКД, например "тзДанныеОтчёта".

Процедура СменаТипаНабораДанныхСКДНаОбъект(ИмяОбъекта)
	
	Перем 	СтрокаДанных, СтрокаДанныхМД, Инд1, Инд2, Данные64,
			ДешифрованныйСКД;
	
	СтрокаДанных = ЗначениеВСтрокуВнутр(ЭтотОбъект.СхемаКомпоновкиДанных);
	
	Инд1 = СтрНайти(СтрокаДанных, "{#base64:");
	Инд1 = Инд1 + 8;
	
	СтрокаДанныхМД = Сред(СтрокаДанных,1, Инд1);
	
	Инд2 = СтрНайти(СтрокаДанных, "}",, Инд1);
	
	Инд1 = Инд1 + 1;
	Данные64 = Сред(СтрокаДанных, Инд1, Инд2 - Инд1);
	
	ДешифрованныйСКД = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Данные64));
	
	ОтредактироватьСКД(ДешифрованныйСКД, ИмяОбъекта);
	
	Данные64 = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(ДешифрованныйСКД));
	
	СтрокаДанныхМД = СтрокаДанныхМД + Данные64 + Символы.ПС + Сред(СтрокаДанных, Инд2);
	
	ЭтотОбъект.СхемаКомпоновкиДанных = ЗначениеИзСтрокиВнутр(СтрокаДанныхМД);
	
КонецПроцедуры //  СменаТипаНабораДанныхСКДНаОбъект


Процедура ОтредактироватьСКД(ДешифрованныйСКД, ИмяОбъекта)

	Перем Инд1, Инд2, НовыйСКД;
	
	Инд1 = СтрНайти(ДешифрованныйСКД, "<dataSet xsi:type=""DataSetQuery"">");
	
	НовыйСКД = Сред(ДешифрованныйСКД, 1, Инд1 - 1) + "<dataSet xsi:type=""DataSetObject"">" + 
		Символы.ПС;;
	
	Инд1 = Инд1 + 35;
	Инд2 = СтрНайти(ДешифрованныйСКД, "<query>",,Инд1);
	
	НовыйСКД = НовыйСКД + Сред(ДешифрованныйСКД, Инд1, Инд2 - Инд1) +
		СтрШаблон("<objectName>%1</objectName>", ИмяОбъекта);
	
	Инд1 = СтрНайти(ДешифрованныйСКД, "</query>",,Инд2) + 8;
	
	НовыйСКД = НовыйСКД + Сред(ДешифрованныйСКД, Инд1);	
	
	ДешифрованныйСКД = НовыйСКД;
	
КонецПроцедуры //  ОтредактироватьСКД


Пример использования:
 

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

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

КонецПроцедуры //  ПриКомпоновкеРезультата


Код тестировался на платформе 1С 8.3.27.1936, конфигурация 1С КА 2.5.22.132.

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

Смена типа набора данных СКД программно Конвертация типа набора данных СКД Смена типа набора данных СКД с сохранением полей

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

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

16500 руб.

02.09.2020    261366    1458    421    

1170

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

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

29.01.2026    7133    372    shapa_pro    27    

69

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

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

29.10.2025    20621    ovetgana    112    

115

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

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

01.07.2025    11823    krasnoshchekovpavel    7    

68

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

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

10.04.2025    11423    Neti    0    

41

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

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

27.02.2025    17038    ovetgana    50    

93

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

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

24.12.2024    14796    Akcium    17    

47

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

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

20.08.2024    11877    AlexeyPROSTO_1C    1    

32
Для отправки сообщения требуется регистрация/авторизация