Содержит описание набора данных схемы компоновки данных.
Полное описание, параметры и ограничения
НаборДанныхОбъединениеМакетаКомпоновкиДанных (DataCompositionTemplateDataSetUnion)
НаборДанныхОбъединениеМакетаКомпоновкиДанных (DataCompositionTemplateDataSetUnion)
Доступен, начиная с версии 8.1.
Свойства:
ВложенныеНаборыДанных (NestedDataSets)
Имя (Name)
Отбор (Filter)
Поля (Fields)
Элементы (Items)
Описание:
Содержит описание набора данных схемы компоновки данных.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data-composition-system/composition-template}. Имя типа XDTO: DataSetUnion.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Объединение макета СКД: собрать две собственные объектные таблицы и сохранить обе строки
Два различных внешних ключа содержат по одному товару. Схема объединения компилируется в настоящий набор-объединение с двумя объектными членами; их ссылки проверяются до настоящего вывода.
Где и как запускать
Полный серверный общий модуль УчебныеИсточникиМакета85 собственной новой базы. Отдельный полный модуль Пульт ниже; без реального запуска.
Подготовка
НОВАЯ отдельная файловая база 8.5.1.1343: имя конфигурации УчебныеИсточникиМакета85, совместимость НеИспользовать, управляемое приложение. Без рабочих справочников/документов/регистров, расширений, обменов или внешних действий. Здесь ничего не запускалось: runtimeVerifiedScenarios=0.
Создайте серверный общий модуль УчебныеИсточникиМакета85: Сервер=Да, Клиент=Нет, Вызов сервера=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте ВЕСЬ основной модуль одного урока. Не объединяйте уроки с одинаковыми именами процедур и не добавляйте свою внешнюю обёртку.
Создайте собственную обработку УчебныйПросмотрИсточников85 → управляемая форма Пульт → команда Выполнить и её кнопка. Действие команды — Выполнить. Отдельный полный модуль Пульт ниже; он вызывает общий модуль через свой серверный обработчик. F7, обновите только новый учебный стенд.
Четыре исходные колонки: Наименование/Количество/Цена/Сумма. Книга 3 × 250 = 750, Ручка 1 × 50 = 50, итог количества 4 и суммы 800. Запрос содержит только константы; объектные варианты получают только собственные ТаблицаЗначений в памяти.
Макет компилируется генератором для коллекции значений. В настройках только детальные записи без таблиц/диаграмм, поэтому настоящий вывод в ТаблицаЗначений допустим. Таблицы и макеты остаются на сервере; не возвращайте их в тонкий клиент.
В четвёртом уроке полный собственный макет переносится в XML-строку через XDTO и читается обратно только из этой своей строки. Файлы, архивы и резервные копии на диске не создаются. Неполный черновик каталога намеренно не исполняется; реально выводятся исходный и полностью восстановленный макеты.
Поставьте серверную точку останова перед последней проверкой и смотрите реальные наборы/поля и таблицу Результат внутри ПроверитьСвойПолныйВывод. Будущий ручной тест требуется отдельно: статические проверки не подтверждают фактическую компиляцию или вывод в 1С.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
Стенд = СоздатьСвоюОбъектнуюСхему(Истина);
Схема = Стенд.Схема;
ВнешниеДанные = Стенд.ВнешниеДанные;
Настройки = Схема.НастройкиПоУмолчанию;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПоказатьСвоиИсточники(Макет.НаборыДанных);
ОбъединениеМакета = ПолучитьСвойОжидаемыйНабор(Макет, Тип("НаборДанныхОбъединениеМакетаКомпоновкиДанных"));
Если ОбъединениеМакета.Элементы.Количество() <> 2 Тогда
ВызватьИсключение "Своё объединение должно содержать два настоящих дочерних набора";
КонецЕсли;
Для Каждого Дочерний Из ОбъединениеМакета.Элементы Цикл
Если ТипЗнч(Дочерний) <> Тип("НаборДанныхОбъектМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Объединяем именно две отдельные собственные таблицы в памяти";
КонецЕсли;
Таблица = Неопределено;
Если Не ВнешниеДанные.Свойство(Дочерний.ИмяОбъекта, Таблица) Тогда
ВызватьИсключение "Каждый реальный дочерний набор должен найти свой внешний ключ";
КонецЕсли;
Если ТипЗнч(Таблица) <> Тип("ТаблицаЗначений") Или Таблица.Количество() <> 1 Тогда
ВызватьИсключение "У каждого собственного внешнего члена одна реальная строка";
КонецЕсли;
КонецЦикла;
ПроверитьСвойПолныйВывод(Макет, ВнешниеДанные);
КонецПроцедуры
Процедура ПоказатьСвоиИсточники(Наборы)
Для Номер = 0 По Наборы.Количество() - 1 Цикл
Набор = Наборы.Получить(Номер);
ТипНабора = ТипЗнч(Набор);
Если ТипНабора <> Тип("НаборДанныхЗапросМакетаКомпоновкиДанных")
И ТипНабора <> Тип("НаборДанныхОбъектМакетаКомпоновкиДанных")
И ТипНабора <> Тип("НаборДанныхОбъединениеМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "В своей простой модели допустимы только запрос, объект или объединение";
КонецЕсли;
Сообщить("Настоящий набор: " + Набор.Имя + "; тип=" + Строка(ТипНабора));
Сообщить("Скомпилированный отбор: " + Набор.Отбор);
Сообщить("Вложенных зависимостей: " + Строка(Набор.ВложенныеНаборыДанных.Количество()));
ПроверитьСвойКаталогПолей(Набор.Поля);
Если ТипНабора = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
Сообщить("Логический источник: " + Набор.ИсточникДанных);
Сообщить("Настоящий запрос генератора: " + Набор.Запрос);
Сообщить("Параметров настоящего запроса: " + Строка(Набор.ЗначенияПараметров.Количество()));
ИначеЕсли ТипНабора = Тип("НаборДанныхОбъектМакетаКомпоновкиДанных") Тогда
Сообщить("Логический источник: " + Набор.ИсточникДанных + "; внешний ключ=" + Набор.ИмяОбъекта);
Иначе
ПоказатьСвоиИсточники(Набор.Элементы);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьСвойКаталогПолей(Поля)
Если ТипЗнч(Поля) <> Тип("ПоляНабораДанныхМакетаКомпоновкиДанных") Или Поля.Количество() = 0 Тогда
ВызватьИсключение "У реального набора должен быть непустой настоящий каталог полей";
КонецЕсли;
Для Номер = 0 По Поля.Количество() - 1 Цикл
Поле = Поля.Получить(Номер);
Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Нужен настоящий элемент скомпилированного каталога, не поле схемы";
КонецЕсли;
Найденное = Поля.Найти(Поле.Имя);
Если Найденное = Неопределено Тогда
ВызватьИсключение "Nullable-поиск не подтвердил фактическое имя поля";
КонецЕсли;
Если Найденное <> Поле Или ТипЗнч(Поле.Роль) <> Тип("РольПоляНабораДанныхКомпоновкиДанных") Тогда
ВызватьИсключение "Нужно то же поле и настоящий readonly-объект его роли";
КонецЕсли;
Сообщить("Имя поля=" + Поле.Имя + "; путь=" + Поле.ПутьКДанным + "; обязательно=" + Строка(Поле.Роль.Обязательное));
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСвойОжидаемыйНабор(Макет, ОжидаемыйТип)
Если Макет.НаборыДанных.Количество() <> 1 Тогда
ВызватьИсключение "В корне своего макета нужен один полный набор";
КонецЕсли;
Набор = Макет.НаборыДанных.Получить(0);
Если ТипЗнч(Набор) <> ОжидаемыйТип Тогда
ВызватьИсключение "Не получен нужный настоящий скомпилированный тип: " + Строка(ОжидаемыйТип);
КонецЕсли;
Возврат Набор;
КонецФункции
Процедура ПроверитьСвойПолныйВывод(Макет, ВнешниеДанные)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет, ВнешниеДанные);
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Приемник = Новый ТаблицаЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Или Результат.Количество() <> 2
Или Результат.Колонки.Количество() <> 4 Тогда
ВызватьИсключение "Настоящий вывод должен дать две строки и четыре колонки";
КонецЕсли;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Если Результат.Колонки.Найти(ИмяПоля) = Неопределено Тогда
ВызватьИсключение "Потеряна ожидаемая колонка реального вывода " + ИмяПоля;
КонецЕсли;
КонецЦикла;
Книга = Результат.Найти("Книга", "Наименование");
Ручка = Результат.Найти("Ручка", "Наименование");
Если Книга = Неопределено Или Ручка = Неопределено Тогда
ВызватьИсключение "Не найдены обе реальные исходные строки результата";
КонецЕсли;
Если Книга.Количество <> 3 Или Книга.Цена <> 250 Или Книга.Сумма <> 750
Или Ручка.Количество <> 1 Или Ручка.Цена <> 50 Или Ручка.Сумма <> 50
Или Результат.Итог("Количество") <> 4 Или Результат.Итог("Сумма") <> 800 Тогда
ВызватьИсключение "Потеряны или изменены реальные ячейки собственного полного вывода";
КонецЕсли;
Сообщить("Настоящий вывод проверен: Книга 3 × 250 = 750, Ручка 1 × 50 = 50; количество 4, сумма 800.");
КонецПроцедуры
Функция СоздатьСвоиТовары(ВыборСтроки)
Если ВыборСтроки <> 0 И ВыборСтроки <> 1 И ВыборСтроки <> 2 Тогда
ВызватьИсключение "Допускаются все свои строки или одна из двух";
КонецЕсли;
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
Для Каждого Имя Из СтрРазделить("Количество,Цена,Сумма", ",") Цикл
Таблица.Колонки.Добавить(Имя, Новый ОписаниеТипов("Число"));
КонецЦикла;
Для Номер = 1 По 2 Цикл
Если ВыборСтроки = 0 Или ВыборСтроки = Номер Тогда
Товар = Таблица.Добавить();
Товар.Наименование = ?(Номер = 1, "Книга", "Ручка");
Товар.Количество = ?(Номер = 1, 3, 1);
Товар.Цена = ?(Номер = 1, 250, 50);
Товар.Сумма = Товар.Количество * Товар.Цена;
КонецЕсли;
КонецЦикла;
Возврат Таблица;
КонецФункции
Процедура ДобавитьСвоиПоляСхемы(Набор)
Для Каждого Имя Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле.Поле = Имя;
Поле.ПутьКДанным = Имя;
Поле.ТипЗначения = Новый ОписаниеТипов(?(Имя = "Наименование", "Строка", "Число"));
КонецЦикла;
КонецПроцедуры
Функция СоздатьСвоюОбъектнуюСхему(Объединять)
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "СвоиОбъекты85";
Источник.ТипИсточникаДанных = "Local";
ВнешниеДанные = Новый Структура;
Если Объединять Тогда
Объединение = Схема.НаборыДанных.Добавить(Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных"));
Объединение.Имя = "СвоиОбъединенныеТовары85";
ДобавитьСвоиПоляСхемы(Объединение);
Для Номер = 1 По 2 Цикл
ИмяОбъекта = ?(Номер = 1, "ПерваяТаблица85", "ВтораяТаблица85");
Набор = Объединение.Элементы.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
Набор.Имя = ИмяОбъекта;
Набор.ИмяОбъекта = ИмяОбъекта;
Набор.ИсточникДанных = Источник.Имя;
ДобавитьСвоиПоляСхемы(Набор);
ВнешниеДанные.Вставить(ИмяОбъекта, СоздатьСвоиТовары(Номер));
КонецЦикла;
Иначе
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
Набор.Имя = "СвоиТовары85";
Набор.ИмяОбъекта = "ВнешниеТовары85";
Набор.ИсточникДанных = Источник.Имя;
ДобавитьСвоиПоляСхемы(Набор);
ВнешниеДанные.Вставить(Набор.ИмяОбъекта, СоздатьСвоиТовары(0));
КонецЕсли;
Настройки = Схема.НастройкиПоУмолчанию;
Для Каждого Имя Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(Имя);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
ВыборДеталей = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыборДеталей.Использование = Истина;
Возврат Новый Структура("Схема,ВнешниеДанные", Схема, ВнешниеДанные);
КонецФункции
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеИсточникиМакета85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыУчебныйПросмотрИсточников85.Пульт
УчебныеИсточникиМакета85 → Обработки → УчебныйПросмотрИсточников85 → Формы → Пульт → Модуль
Полный модуль собственной управляемой формы Пульт; не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеИсточникиМакета85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Схема описывает источник, поля и настройки; Компоновщик создаёт исполняемый Макет. Типы НаборДанных…Схемы и НаборДанных…Макета не взаимозаменяемы. Точный реальный тип проверяется до специального чтения свойств.
Имя, ИсточникДанных и Отбор в макете — настоящие технические определения. Их диагностируем, не меняем независимо от связанных частей. ВложенныеНаборыДанных — readonly-каталог зависимостей, не то же самое, что дочерние Элементы объединения.
Поля — readonly-свойство с редактируемым каталогом. Получить читает реальный элемент по индексу, Найти по его фактическому имени nullable и должен вернуть тот же объект. Имя/ПутьКДанным поля связывают набор с компоновкой; его readonly Роль является настоящим объектом, а не флагом Булево.
Новые конструкторы для наборов/полей макета не выдумываются. Наборы получаются из полного реального макета после компиляции; поля — из его каталога. Полное имя поля макета формируется как ИмяНабора.ИмяПоля, не только подпись колонки.
Новый процессор выводит реальные данные в собственную ТаблицаЗначений. Проверяем точный тип, две строки, все четыре колонки, каждое значение Книга/Ручка и итоги 4/800. Не заполняем результат ожидаемыми строками и не ограничиваемся количеством каталогов.
Элементы — readonly-каталог двух настоящих объектных членов объединения, не ВложенныеНаборыДанных. Каждый ИмяОбъекта разрешается в своей структуре и содержит одну строку; общий реальный вывод должен сохранить Книга и Ручка. Не подменяем отсутствующий тип просто запросом UNION ALL.
Как проверить результат
Будущий ручной тест: F7 → собственный Пульт → Выполнить. Должен обнаружиться точный заявленный тип набора, а не только совпасть текст имени.
В реальном Результат две строки и ровно четыре колонки. Книга: 3/250/750, Ручка: 1/50/50; итоги количества 4, суммы 800. Потеря строки/поля или подмена значения вызывает явное исключение.
Технические имена, текст скомпилированного запроса, каталоги и роли смотрите фактически в отладчике. Эти значения генератора не угадываются и не объявляются одинаковыми у всех конфигураций.
Ожидаемый результат
Будущий результат: настоящие определения скомпилированных источников и полный проверенный вывод двух строк, количества 4 и суммы 800. Здесь в 1С не запускалось.
На что обратить внимание
У источников схемы и макета разные классы и контракты. Не присваивайте readonly Поля/ВложенныеНаборыДанных/Роль вместо изменения допустимого собственного дочернего объекта.
Отбор готового макета — язык выражений СКД, не произвольная вставка текста SQL/BSL. Для рабочего изменения фильтра предпочтительнее менять настройки и перекомпилировать полный макет.
Native Индекс/Сдвинуть каталога полей называют в параметре коллекцию Поля…, а не элемент Поле…. Эти два несогласованных метода не вызываются и не помечаются покрытыми; не добавляем угадывания ради счётчика.
Сигнатуры сверены с установленной справкой 8.5.1.1343, но компиляция/вывод не запускались. runtimeVerifiedScenarios=0; проверки ожидаемые для своего стенда, не обещание работы на произвольной конфигурации.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.