КонструкторСхемыКомпоновкиДанных

Типы · DataCompositionSchemaWizard

Предназначен для редактирования схемы компоновки данных.

Примеры платформы

Процедура КоманднаяПанельРедактораОтчетаКонструкторОписанияОтчета(Кнопка)
    Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
    Конструктор.УстановитьСхему(ПолучитьСхемуКомпоновкиДанных());
    Конструктор.Редактировать(ЭтотОбъект);
КонецПроцедуры
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
    Если ТипЗнч(Источник) = Тип("КонструкторСхемыКомпоновкиДанных") Тогда
        СхемаКомпоновкиДанных = Источник.ПолучитьСхему();
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.УстановитьСтроку();
        СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СхемаКомпоновкиДанных, "dataCompositionSchema", "http://v8.1c.ru/8.1/data-composition-system/schema");
        ЭлементыФормы.ТекстСхемыКомпоновкиДанных.УстановитьТекст(ЗаписьXML.Закрыть());
    КонецЕсли;
КонецПроцедуры
Полное описание, параметры и ограничения

КонструкторСхемыКомпоновкиДанных (DataCompositionSchemaWizard)

КонструкторСхемыКомпоновкиДанных (DataCompositionSchemaWizard)

Доступен, начиная с версии 8.1.

Методы:
ПолучитьСхему (GetSchema)
Редактировать (Edit)
УстановитьСхему (SetSchema)

Конструкторы:
На основании схемы

Описание:

Предназначен для редактирования схемы компоновки данных.

Доступность:

Толстый клиент.

Пример:

Процедура КоманднаяПанельРедактораОтчетаКонструкторОписанияОтчета(Кнопка)

Конструктор = Новый КонструкторСхемыКомпоновкиДанных;

Конструктор.УстановитьСхему(ПолучитьСхемуКомпоновкиДанных());
Конструктор.Редактировать(ЭтотОбъект);

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

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)

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

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СхемаКомпоновкиДанных, "dataCompositionSchema", "http://v8.1c.ru/8.1/data-composition-system/schema");
ЭлементыФормы.ТекстСхемыКомпоновкиДанных.УстановитьТекст(ЗаписьXML.Закрыть());
КонецЕсли;
КонецПроцедуры

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Три настоящих конструктора СКД: свои заголовки, выбор полей и оформление отчёта

Собственная обычная форма толстого клиента открывает native конструкторы, принимает реальные результаты и перестраивает отчёт из двух собственных literal строк. Это ограниченный учебный импорт заголовков и выбора полей, не выполнение произвольной изменённой схемы.

Где и как запускать

Модуль собственной обычной формы обработки УчебныеКонструкторыСКД85. Только ТолстыйКлиентОбычноеПриложение 8.5.1.1343; настоящие события формы и кнопок. Без серверных директив, managed/form wrappers и искусственных callback.

Подготовка

  1. Вручную создайте новую отдельную пустую файловую базу платформы 8.5.1.1343. В корне конфигурации задайте Имя=УчебныеКонструкторыСКД85, основной режим запуска=Обычное приложение. Не используйте УТ, КА, УНФ, БП, расширение или рабочую базу.

  2. Создайте обработку УчебныеКонструкторыСКД85 и её Обычную форму Основная. У формы создайте реквизит Состояние85 типа Строка неограниченной длины, разместите его как многострочное поле только для просмотра. Добавьте ТабличноеПоле с именем Таблица85; его данные присваиваются собственной ТаблицаЗначений через .Значение, не managed данные формы.

  3. Добавьте командную панель и семь кнопок. Действия кнопок точно свяжите с процедурами: Сформировать85, ИзменитьЗаголовки85, ПрименитьЗаголовки85, ВыбратьПоля85, СоздатьОформление85, ИзменитьОформление85, ОтброситьКандидаты85. Код целиком вставьте в модуль этой обычной формы. События формы ПриОткрытии и ОбработкаВыбора назначьте одноимённым процедурам; не вызывайте ОбработкаВыбора вручную и не подставляйте искусственный Источник.

  4. Обновите только свою учебную конфигурацию, запустите её именно толстым клиентом в обычном приложении и откройте свою обработку. Здесь нужны модальные окна обычного клиента; код не предназначен для тонкого, web, managed формы или серверного вызова конструктора.

  5. Источник схемы создаётся кодом: Local МойLocal85, один набор МоиДвеСтроки85, поля Наименование/Количество/Цена; Альфа85=1/100 и Бета85=5/250. Нет справочников, документов, запросов к рабочим таблицам, файлов, сети или сохранения результата.

  6. Начальное оформление — отдельная XML копия native БиблиотекаМакетовОформленияКомпоновкиДанных.Основной. Исходный библиотечный макет никогда не редактируется. Все снимки и копии находятся в памяти формы, не являются резервными копиями файлов или базы. Native справка именует область ДетальныеЗаписи (Detail); чтение принимает оба этих документированных имени.

#Если ТолстыйКлиентОбычноеПриложение Тогда

Перем СвояСхема85;
Перем СвоиНастройки85;
Перем СвойСтиль85;
Перем СхемаДоДиалогаXML85;
Перем НастройкиДоДиалогаXML85;
Перем СтильДоДиалогаXML85;
Перем КонструкторСхемы85;
Перем КонструкторСтиля85;
Перем КандидатЗаголовков85;

Процедура ПриОткрытии()
    ПроверитьСвойПустойСтенд();
    СвояСхема85 = СоздатьСвоюСхему85();
    СвоиНастройки85 = СвояСхема85.НастройкиПоУмолчанию;
    Основной = БиблиотекаМакетовОформленияКомпоновкиДанных.Основной;
    Если ТипЗнч(Основной) <> Тип("МакетОформленияКомпоновкиДанных") Тогда
        ВызватьИсключение "Основной должен быть native макетом оформления, а не предполагаемым объектом библиотеки";
    КонецЕсли;
    СвойСтиль85 = ПрочитатьСвойXML85(ЗаписатьСвойXML85(Основной), Тип("МакетОформленияКомпоновкиДанных"));
    КонструкторСхемы85 = Неопределено;
    КонструкторСтиля85 = Неопределено;
    КандидатЗаголовков85 = Неопределено;
    Состояние85 = "Свой отчёт: Альфа85=1, Бета85=5. Сначала Сформировать85, затем редактируйте свои кандидаты.";
КонецПроцедуры

Функция СоздатьСвоюСхему85()
    Схема = Новый СхемаКомпоновкиДанных;
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "МойLocal85";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Набор.Имя = "МоиДвеСтроки85";
    Набор.ИсточникДанных = Источник.Имя;
    Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
    Набор.Запрос = "ВЫБРАТЬ ""Альфа85"" КАК Наименование, 1 КАК Количество, 100 КАК Цена
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Бета85"", 5, 250";
    Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена", ",") Цикл
        Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        Поле.Поле = ИмяПоля;
        Поле.ПутьКДанным = ИмяПоля;
        Поле.Заголовок = ИмяПоля;
        Если ИмяПоля = "Наименование" Тогда
            Поле.ТипЗначения = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(32));
        Иначе
            Поле.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0));
        КонецЕсли;
        Выбранное = Схема.НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
        Выбранное.Использование = Истина;
    КонецЦикла;
    Детали = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Детали.Использование = Истина;
    АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоВыбор.Использование = Истина;
    Возврат Схема;
КонецФункции

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

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
    ПроверитьСвойПустойСтенд();
    Если ТипЗнч(Источник) = Тип("КонструкторСхемыКомпоновкиДанных") Тогда
        Если КонструкторСхемы85 = Неопределено Или Источник <> КонструкторСхемы85 Тогда
            Возврат;
        КонецЕсли;
        КонструкторСхемы85 = Неопределено;
        Если ЗаписатьСвойXML85(СвояСхема85) <> СхемаДоДиалогаXML85 Тогда
            ВызватьИсключение "Кандидат неожиданно изменил принятую схему";
        КонецЕсли;
        Полученная = Источник.ПолучитьСхему();
        КандидатЗаголовков85 = ПеренестиТолькоСвоиЗаголовки85(Полученная);
        Состояние85 = "Native callback дал кандидат. Ничего ещё не принято: ПрименитьЗаголовки85 либо ОтброситьКандидаты85. Весь исходный запрос останется собственным.";
    ИначеЕсли ТипЗнч(Источник) = Тип("КонструкторМакетаОформленияКомпоновкиДанных") Тогда
        Если КонструкторСтиля85 = Неопределено Или Источник <> КонструкторСтиля85 Тогда
            Возврат;
        КонецЕсли;
        КонструкторСтиля85 = Неопределено;
        Если ЗаписатьСвойXML85(СвойСтиль85) <> СтильДоДиалогаXML85 Тогда
            ВызватьИсключение "Кандидат неожиданно изменил принятое оформление";
        КонецЕсли;
        ПолученныйСтиль = Источник.ПолучитьМакет();
        Цвет = ПолучитьСвойЦветДеталей85(ПолученныйСтиль);
        КопияСтиля = ПрочитатьСвойXML85(ЗаписатьСвойXML85(ПолученныйСтиль), Тип("МакетОформленияКомпоновкиДанных"));
        Если ПолучитьСвойЦветДеталей85(КопияСтиля) <> Цвет Тогда
            ВызватьИсключение "Цвет собственного макета не прошёл XML readback";
        КонецЕсли;
        Результат = ПостроитьСвойРезультат85(СвояСхема85, СвоиНастройки85, КопияСтиля);
        СвойСтиль85 = КопияСтиля;
        ПоказатьСвойРезультат85(Результат);
        Состояние85 = "Собственное оформление принято по native OK callback; цвет прочитан обратно и макет реально передан компоновщику.";
    КонецЕсли;
КонецПроцедуры

Функция ПеренестиТолькоСвоиЗаголовки85(Кандидат)
    Если ТипЗнч(Кандидат) <> Тип("СхемаКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужна настоящая схема из native callback";
    КонецЕсли;
    Если Кандидат.ИсточникиДанных.Количество() <> 1 Или Кандидат.НаборыДанных.Количество() <> 1 Тогда
        ВызватьИсключение "Разрешён ровно свой Local и свой единственный набор";
    КонецЕсли;
    Источник = Кандидат.ИсточникиДанных.Получить(0);
    Набор = Кандидат.НаборыДанных.Получить(0);
    СвояЧистая = СоздатьСвоюСхему85();
    СвойНабор = СвояЧистая.НаборыДанных.Получить(0);
    Если Источник.Имя <> "МойLocal85" Или Источник.ТипИсточникаДанных <> "Local"
        Или ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Подмена своего источника или типа набора запрещена";
    КонецЕсли;
    Если Набор.ИсточникДанных <> Источник.Имя Или Набор.Имя <> "МоиДвеСтроки85"
        Или Набор.Запрос <> СвойНабор.Запрос Или Набор.Поля.Количество() <> 3 Тогда
        ВызватьИсключение "Запрос, состав и привязку своего набора менять нельзя";
    КонецЕсли;
    Для Каждого СвоеПоле Из СвойНабор.Поля Цикл
        Поле = Набор.Поля.Найти(СвоеПоле.ПутьКДанным);
        Если Поле = Неопределено Или ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Потеряно одно из своих точных полей";
        КонецЕсли;
        Если Поле.Поле <> СвоеПоле.Поле Или Поле.ПутьКДанным <> СвоеПоле.ПутьКДанным Тогда
            ВызватьИсключение "Имя и путь собственного поля не совпали";
        КонецЕсли;
        Если ТипЗнч(Поле.Заголовок) <> Тип("Строка") Или СтрДлина(Поле.Заголовок) = 0
            Или СтрДлина(Поле.Заголовок) > 80 Тогда
            ВызватьИсключение "Свой заголовок должен быть непустой строкой до 80 символов";
        КонецЕсли;
        СвоеПоле.Заголовок = Поле.Заголовок;
    КонецЦикла;
    Возврат СвояЧистая;
КонецФункции

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

Процедура ВыбратьПоля85(Кнопка)
    ПроверитьСвойПустойСтенд();
    ПроверитьНетОткрытогоКонструктора85();
    НастройкиДоДиалогаXML85 = ЗаписатьСвойXML85(СвоиНастройки85);
    Копия = ПрочитатьСвойXML85(НастройкиДоДиалогаXML85, Тип("НастройкиКомпоновкиДанных"));
    КонструкторНастроек = Новый КонструкторНастроекКомпоновкиДанных;
    Доступные = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СвояСхема85);
    КонструкторНастроек.Инициализировать(Доступные);
    ОписаниеОграничения = "";
    ТребуетсяУсечение = КонструкторНастроек.УстановитьНастройки(Копия, ОписаниеОграничения);
    Если ТребуетсяУсечение Тогда
        Состояние85 = "Конструктор требует усечения: " + ОписаниеОграничения + ". Ничего не применено.";
        Возврат;
    КонецЕсли;
    Если Не КонструкторНастроек.ОткрытьМодально() Тогда
        Если ЗаписатьСвойXML85(СвоиНастройки85) <> НастройкиДоДиалогаXML85 Тогда
            ВызватьИсключение "Отмена не должна изменять принятую настройку";
        КонецЕсли;
        Состояние85 = "Отмена выбора полей: принятые настройки и предыдущий результат сохранены.";
        Возврат;
    КонецЕсли;
    Кандидат = КонструкторНастроек.ПолучитьНастройки();
    НовыеНастройки = ПеренестиТолькоСвойВыбор85(Кандидат);
    Если ЗаписатьСвойXML85(СвоиНастройки85) <> НастройкиДоДиалогаXML85 Тогда
        ВызватьИсключение "Кандидат изменил принятую настройку";
    КонецЕсли;
    Результат = ПостроитьСвойРезультат85(СвояСхема85, НовыеНастройки, СвойСтиль85);
    СвоиНастройки85 = НовыеНастройки;
    ПоказатьСвойРезультат85(Результат);
    Состояние85 = "Принят только явный выбор своих полей; фильтры, сортировки, параметры и выражения конструктора не импортируются.";
КонецПроцедуры

Функция ПеренестиТолькоСвойВыбор85(Кандидат)
    Если ТипЗнч(Кандидат) <> Тип("НастройкиКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужны native настройки после настоящего OK";
    КонецЕсли;
    Если Кандидат.Структура.Количество() <> 1 Тогда
        ВызватьИсключение "В уроке разрешён только список с одной детальной группой";
    КонецЕсли;
    Детали = Кандидат.Структура.Получить(0);
    Если ТипЗнч(Детали) <> Тип("ГруппировкаКомпоновкиДанных") Тогда
        ВызватьИсключение "Таблица и диаграмма здесь не импортируются";
    КонецЕсли;
    Если Детали.ПоляГруппировки.Элементы.Количество() <> 0 Или Детали.Структура.Количество() <> 0 Тогда
        ВызватьИсключение "Для этого урока оставьте детальные записи без группировок";
    КонецЕсли;
    ЧистаяСхема = ПрочитатьСвойXML85(ЗаписатьСвойXML85(СвояСхема85), Тип("СхемаКомпоновкиДанных"));
    Чистые = ЧистаяСхема.НастройкиПоУмолчанию;
    Чистые.Выбор.Элементы.Очистить();
    Встреченные = Новый Массив;
    Для Каждого Поле Из Кандидат.Выбор.Элементы Цикл
        Если ТипЗнч(Поле) <> Тип("ВыбранноеПолеКомпоновкиДанных") Тогда
            ВызватьИсключение "Выберите явные поля, не авто-поле или группу выбора";
        КонецЕсли;
        Если Поле.Использование Тогда
            Путь = Строка(Поле.Поле);
            Если Путь <> "Наименование" И Путь <> "Количество" И Путь <> "Цена" Тогда
                ВызватьИсключение "Разрешены только три поля собственного literal запроса";
            КонецЕсли;
            Если Встреченные.Найти(Путь) <> Неопределено Тогда
                ВызватьИсключение "Одно собственное поле нельзя выбирать дважды";
            КонецЕсли;
            Встреченные.Добавить(Путь);
            Выбранное = Чистые.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
            Выбранное.Поле = Новый ПолеКомпоновкиДанных(Путь);
            Выбранное.Использование = Истина;
        КонецЕсли;
    КонецЦикла;
    Если Встреченные.Найти("Наименование") = Неопределено Или Встреченные.Найти("Количество") = Неопределено Тогда
        ВызватьИсключение "Для readback оставьте Наименование и Количество; Цена — по желанию";
    КонецЕсли;
    Возврат Чистые;
КонецФункции

Процедура СоздатьОформление85(Кнопка)
    ПроверитьСвойПустойСтенд();
    ПроверитьНетОткрытогоКонструктора85();
    СтильДоДиалогаXML85 = ЗаписатьСвойXML85(СвойСтиль85);
    Копия = ПрочитатьСвойXML85(СтильДоДиалогаXML85, Тип("МакетОформленияКомпоновкиДанных"));
    КонструкторСтиля85 = Новый КонструкторМакетаОформленияКомпоновкиДанных();
    КонструкторСтиля85.УстановитьМакет(Копия);
    Состояние85 = "Настройте собственное оформление на основе копии Основной: ДетальныеЗаписи, уровень 0, ЦветФона=RGB(230,245,255), OK. Отмена ничего не применит.";
    КонструкторСтиля85.Редактировать(ЭтотОбъект);
КонецПроцедуры

Процедура ИзменитьОформление85(Кнопка)
    ПроверитьСвойПустойСтенд();
    ПроверитьНетОткрытогоКонструктора85();
    ПолучитьСвойЦветДеталей85(СвойСтиль85);
    СтильДоДиалогаXML85 = ЗаписатьСвойXML85(СвойСтиль85);
    Копия = ПрочитатьСвойXML85(СтильДоДиалогаXML85, Тип("МакетОформленияКомпоновкиДанных"));
    КонструкторСтиля85 = Новый КонструкторМакетаОформленияКомпоновкиДанных(Копия);
    Состояние85 = "Измените свою область ДетальныеЗаписи: уровень 0, ЦветФона=RGB(255,245,220). OK перестроит свой отчёт, Отмена оставит прежний.";
    КонструкторСтиля85.Редактировать(ЭтотОбъект);
КонецПроцедуры

Функция ПолучитьСвойЦветДеталей85(Стиль)
    Если ТипЗнч(Стиль) <> Тип("МакетОформленияКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен настоящий макет оформления из своего конструктора";
    КонецЕсли;
    Для Каждого Область Из Стиль Цикл
        Если Строка(Область.Параметр) = "ДетальныеЗаписи" Или Строка(Область.Параметр) = "Detail" Тогда
            Если ТипЗнч(Область.Значение) <> Тип("ОбластьМакетаОформленияКомпоновкиДанных") Тогда
                ВызватьИсключение "ДетальныеЗаписи должны содержать native область";
            КонецЕсли;
            Для Каждого Уровень Из Область.Значение Цикл
                Если Уровень.Уровень = 0 Тогда
                    Цвет = Уровень.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"));
                    Если Цвет = Неопределено Тогда
                        ВызватьИсключение "Задайте ЦветФона в области ДетальныеЗаписи уровня 0";
                    КонецЕсли;
                    Если Не Цвет.Использование Или ТипЗнч(Цвет.Значение) <> Тип("Цвет") Тогда
                        ВызватьИсключение "ЦветФона должен быть включён и содержать настоящий Цвет";
                    КонецЕсли;
                    Возврат Цвет.Значение;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    ВызватьИсключение "Нет своей области ДетальныеЗаписи с уровнем 0";
КонецФункции

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

Процедура ПроверитьНетОткрытогоКонструктора85()
    Если КонструкторСхемы85 <> Неопределено Или КонструкторСтиля85 <> Неопределено Тогда
        ВызватьИсключение "Сначала закройте свой конструктор; после Отмены нажмите ОтброситьКандидаты85";
    КонецЕсли;
КонецПроцедуры

Процедура Сформировать85(Кнопка)
    ПроверитьСвойПустойСтенд();
    ПроверитьНетОткрытогоКонструктора85();
    Результат = ПостроитьСвойРезультат85(СвояСхема85, СвоиНастройки85, СвойСтиль85);
    ПоказатьСвойРезультат85(Результат);
    Состояние85 = "Реальный двойной вывод: таблица для числового readback и табличный документ со своим оформлением. Две строки, количество 6.";
КонецПроцедуры

Функция ПостроитьСвойРезультат85(Схема, Настройки, Стиль)
    Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКоллекции = Компоновщик.Выполнить(Схема, Настройки, , Стиль, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПроцессорКоллекции = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКоллекции.Инициализировать(МакетКоллекции, , , Ложь);
    Таблица = Новый ТаблицаЗначений;
    ВыводКоллекции = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ВыводКоллекции.ОтображатьПроцентВывода = Ложь;
    ВыводКоллекции.УстановитьОбъект(Таблица);
    ВыводКоллекции.Вывести(ПроцессорКоллекции, Ложь);
    Если Таблица.Количество() <> 2 Или Таблица.Колонки.Найти("Наименование") = Неопределено
        Или Таблица.Колонки.Найти("Количество") = Неопределено Тогда
        ВызватьИсключение "Реальная компоновка должна вернуть ровно две свои строки с обязательными полями";
    КонецЕсли;
    Альфа = Таблица.Найти("Альфа85", "Наименование");
    Бета = Таблица.Найти("Бета85", "Наименование");
    Если Альфа = Неопределено Или Бета = Неопределено Тогда
        ВызватьИсключение "Результат не содержит обе собственные строки";
    КонецЕсли;
    Если Альфа.Количество <> 1 Или Бета.Количество <> 5 Или Таблица.Итог("Количество") <> 6 Тогда
        ВызватьИсключение "Числовой readback своих строк не совпал";
    КонецЕсли;
    Если Таблица.Колонки.Найти("Цена") <> Неопределено Тогда
        Если Альфа.Цена <> 100 Или Бета.Цена <> 250 Тогда
            ВызватьИсключение "Цена собственных строк не совпала";
        КонецЕсли;
    КонецЕсли;
    МакетДокумента = Компоновщик.Выполнить(Схема, Настройки, , Стиль);
    ПроцессорДокумента = Новый ПроцессорКомпоновкиДанных;
    ПроцессорДокумента.Инициализировать(МакетДокумента, , , Ложь);
    Документ = Новый ТабличныйДокумент;
    ВыводДокумента = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ВыводДокумента.ОтображатьПроцентВывода = Ложь;
    ВыводДокумента.УстановитьДокумент(Документ);
    ВыводДокумента.Вывести(ПроцессорДокумента, Ложь);
    Если Документ.ВысотаТаблицы = 0 Или Документ.ШиринаТаблицы = 0 Тогда
        ВызватьИсключение "Реальный табличный документ пуст";
    КонецЕсли;
    Возврат Новый Структура("Таблица,Документ", Таблица, Документ);
КонецФункции

Процедура ПоказатьСвойРезультат85(Результат)
    ЭлементыФормы.Таблица85.Значение = Результат.Таблица;
    ЭлементыФормы.Таблица85.СоздатьКолонки();
    Результат.Документ.Показать("Собственный отчёт конструкторов СКД85");
КонецПроцедуры

Функция ЗаписатьСвойXML85(Значение)
    Если ТипЗнч(Значение) <> Тип("СхемаКомпоновкиДанных") И ТипЗнч(Значение) <> Тип("НастройкиКомпоновкиДанных")
        И ТипЗнч(Значение) <> Тип("МакетОформленияКомпоновкиДанных") Тогда
        ВызватьИсключение "В этот собственный XML helper разрешены только три native типа СКД";
    КонецЕсли;
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Значение, НазначениеТипаXML.Явное);
    Возврат Запись.Закрыть();
КонецФункции

Функция ПрочитатьСвойXML85(Текст, ОжидаемыйТип)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(Текст);
    Копия = СериализаторXDTO.ПрочитатьXML(Чтение, ОжидаемыйТип);
    Чтение.Закрыть();
    Если ТипЗнч(Копия) <> ОжидаемыйТип Тогда
        ВызватьИсключение "Тип собственной XML копии не совпал";
    КонецЕсли;
    Возврат Копия;
КонецФункции

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

#КонецЕсли

Разбор по шагам

  1. Сформировать85 выполняет настоящую компоновку дважды: в ТаблицаЗначений для readback и в ТабличныйДокумент для оформления. Таблица85 покажет свои две строки, отдельное native окно — отчёт. Это не ручное заполнение ожидаемого результата.

  2. ИзменитьЗаголовки85 передаёт независимую XML копию собственной схемы в КонструкторСхемыКомпоновкиДанных. В наборе МоиДвеСтроки85 на вкладке полей измените только Заголовок поля Количество на Количество штук, завершите конструктор. Native ОбработкаВыбора проверяет фактический тип и identity Источник, читает ПолучитьСхему и строит новую чистую собственную схему, импортируя лишь непустые заголовки до 80 символов.

  3. Callback конструктора схемы не считается доказательством OK: native справка обещает вызов при завершении, но отдельно не описывает отмену. Нажмите ПрименитьЗаголовки85 для явного принятия, либо ОтброситьКандидаты85 для отказа. Принятие сбрасывает выбор к трём своим полям. Ни чужой источник, ни изменённый запрос, ни вычисляемые поля кандидата не выполняются.

  4. ВыбратьПоля85 создаёт native источник доступных настроек из принятой собственной схемы, инициализирует КонструкторНастроекКомпоновкиДанных и передаёт XML копию настроек. Второй обязательный параметр УстановитьНастройки получает описание ограничения. Истина означает необходимость усечения: урок прекращает импорт, не открывая конструктор.

  5. Если усечения нет, в ОткрытьМодально выберите отчёт Список, оставьте Наименование и Количество, уберите Цена, не задавайте группировки. Подтвердите OK. Из реальных ПолучитьНастройки импортируется только верхнеуровневый явный выбор этих трёх собственных полей; после проверок чистые настройки реально компонуются. Иные фильтры, параметры, выражения и сортировки намеренно не импортируются. Повторно верните Цена и убедитесь, что она снова появится.

  6. СоздатьОформление85 использует настоящий default ctor и УстановитьМакет с независимой собственной копией. В редакторе выберите область ДетальныеЗаписи, уровень 0, включите ЦветФона и задайте RGB 230,245,255; если области/уровня нет, добавьте их средствами самого конструктора. Нажмите OK. Только родной Источник и native OK callback дают ПолучитьМакет; тип, область, включённый цвет и XML readback проверяются до принятия.

  7. ИзменитьОформление85 использует другой настоящий ctor На основании макета оформления: в него передаётся копия уже принятого собственного макета. Измените тот же фон на RGB 255,245,220 и подтвердите OK. Новый макет передаётся четвёртым аргументом КомпоновщикМакетаКомпоновкиДанных.Выполнить; именно tabular вывод предназначен для визуального оформления.

  8. После Отмены схемы или оформления закройте конструктор и нажмите ОтброситьКандидаты85. Это только забывает свои pending references и проверяет неизменность принятого объекта; оно не закрывает native окно насильно. Поздний callback старого конструктора игнорируется по identity Источник. Для настроек native modal Ложь обрабатывается немедленно как нормальная отмена.

Как проверить результат

  1. Начальная и каждая принятая компоновка должны дать именно Альфа85 с Количество=1 и Бета85 с Количество=5, итог количества 6. Если Цена выбрана, обязаны вернуться 100 и 250. Нарушение вызывает исключение до принятия кандидата.

  2. После принятия схемы в native табличном документе проверьте заголовок Количество штук; после OK выбора полей сравните число колонок 3→2→3. Числа и обе собственные строки должны остаться неизменны.

  3. После двух OK оформлений визуально сравните фон детальных строк: голубой, затем кремовый. XML readback подтверждает цвет native объекта; точный вид, тему и применение макета к выводу проверяет пользователь в учебном клиенте, эти static тесты не являются UI доказательством.

  4. Нажмите Отмена в настройках: ни XML принятых настроек, ни таблица, ни документ не должны поменяться. Отмените оформление: native OK callback не ожидается; после ручного ОтброситьКандидаты85 принятый XML оформления и прежний результат должны сохраниться.

  5. В конструкторе схемы попробуйте изменить literal запрос или имя Local: после завершения импорт должен быть отклонён ещё до компоновки, рабочая схема остаётся прежней. Не подставляйте реальную таблицу даже в учебный негативный тест: достаточно изменить literal число 1 на 2.

  6. В настройках выберите диаграмму, группировку или уберите Количество: импорт отклоняется до принятия. Закройте диалог, снова откройте его из принятого состояния и восстановите свой простой Список. При ошибке цвета оформление остаётся предыдущим: заново СоздатьОформление85 и задайте настоящую область, уровень и включённый ЦветФона.

Ожидаемый результат

Реальный учебный цикл native конструкторов с isolated кандидатами, явным принятием схемы, честной отменой, проверкой возвращённых объектов, числовым readback и табличным выводом своего оформления.

На что обратить внимание

  1. Это ограниченный импорт: из конструктора схемы берутся только заголовки собственных полей; из конструктора настроек — только явный выбор полей. Остальные изменения намеренно не принимаются, поэтому пример нельзя выдавать за универсальный дизайнер любых отчётов.

  2. Для КонструкторНастроекКомпоновкиДанных.УстановитьНастройки Булево Истина означает необходимость усечения, а не успех. Для ОткрытьМодально Истина уже означает OK. Эти два результата имеют разный смысл.

  3. Schema constructor в exporter именуется По умолчанию, а native страница называется На основании схемы. Используем документированное отсутствие необязательного аргумента, затем реальный УстановитьСхему. Для оформления оба разных ctor используются в настоящих фазах первоначальной настройки и правки принятого макета.

  4. Схема/настройки/макет оформления документированно сериализуются в XML. XML строки создаются только этим модулем из своих объектов; helper не является загрузчиком недоверенного произвольного XML.

  5. Показать открывает только собственный табличный документ без имени файла. Не сохраняйте его вручную в рабочие каталоги и не печатайте на настоящий принтер. Выполнение приведённого кода в 1С и визуальная проверка не выполнялись агентом.

  6. После отмены немодального конструктора может остаться собственная pending ссылка, потому что нет документированного cancel callback. Ручная команда отказа не имитирует закрытие окна. Закройте сам native конструктор, затем отбросьте кандидата.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.