Объект, доступный для формирования вложенных настроек.
Полное описание, параметры и ограничения
ДоступныйОбъектНастройкиКомпоновкиДанных (DataCompositionAvailableSettingsObject)
ДоступныйОбъектНастройкиКомпоновкиДанных (DataCompositionAvailableSettingsObject)
Доступен, начиная с версии 8.1.
Свойства:
Заголовок (Title)
Описание:
Объект, доступный для формирования вложенных настроек.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
См. также:
КоллекцияДоступныхОбъектовНастройкиКомпоновкиДанных, метод Получить
КоллекцияДоступныхОбъектовНастройкиКомпоновкиДанных, метод Индекс
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Вложенный объект СКД: доступные отчеты, загрузка настроек и пользовательский слой
Создаем собственную родительскую схему и дочерний отчет Книга/Ручка. Из реального источника выбираем вложение, впервые назначаем его ID, проверяем загруженный выбор и выводим действительные строки дочернего отчета.
Где и как запускать
Полный серверный общий модуль собственного нового учебного стенда УчебныеНастройкиВложений85; отдельный полный модуль формы ниже.
Подготовка
Создать НОВУЮ отдельную пустую учебную базу, не рабочую и не ее копию: платформа точно 8.5.1.1343; конфигурация УчебныеНастройкиВложений85, совместимость Не использовать. Без справочников, документов, регистров, подписок, заданий и расширений.
Конфигуратор → Общие → Общие модули → УчебныеНастройкиВложений85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить ВЕСЬ основной код, включая все функции и процедуры.
Конфигуратор → Обработки → УчебныеНастройкиВложений85 → Формы → Пульт: управляемая форма; команда Выполнить, кнопка с этой командой, действие команды Выполнить. Реквизиты не нужны. Полный модуль формы дан отдельно ниже.
Сохранить учебную конфигурацию и обновить конфигурацию базы данных (F7). Открыть свежий собственный клиент, Все функции → Обработки → УчебныеНастройкиВложений85 → Выполнить. Это будущие ручные шаги: здесь 1С и F7 не запускались.
Обе схемы создаются только в памяти. Каждая имеет собственный Local-источник и буквальный запрос Книга:3×250=750 / Ручка:1×50=50. Данные базы не нужны; подготовка не записывает документы или регистры.
У дочерней схемы нет структуры по умолчанию: четыре поля и одна группа деталей подготовлены именно в возвращенном Описание.Настройки. Этот источник должен загрузить их после первого назначения ID вложению.
Настройки родителя связаны с источником через Инициализировать. Не заменять их новым независимым НастройкиКомпоновкиДанных, иначе автоматическая загрузка начальных настроек перестанет быть доказуемой.
runtimeVerifiedScenarios=0. Выполнялась статическая проверка справки и кода; фактический результат будущего запуска должен пройти все встроенные проверки. Файлы, резервные копии, сеть, печать и production не затрагиваются.
Функция ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Корень = Новый СхемаКомпоновкиДанных;
ЗаполнитьСвоиДанные(Корень);
Описание = Корень.ВложенныеСхемыКомпоновкиДанных.Добавить();
Описание.Имя = "ТоварыВложения85";
Описание.Заголовок = "Товары учебного вложения";
ЗаполнитьСвоиДанные(Описание.Схема);
ЗаполнитьСвоиНачальныеНастройки(Описание.Настройки);
ПроверитьСвойДочернийВывод(Описание.Схема, Описание.Настройки);
ТекстИсходнойСхемы = СвойОбъектРасшифровкиВСтроку(Корень);
Редактор = Новый КомпоновщикНастроекКомпоновкиДанных;
Редактор.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Корень));
Редактор.ЗагрузитьНастройки(Корень.НастройкиПоУмолчанию);
Рабочие = Редактор.Настройки;
Каталог = Рабочие.ДоступныеОбъекты.Элементы;
Если ТипЗнч(Каталог) <> Тип("КоллекцияДоступныхОбъектовНастройкиКомпоновкиДанных")
Или Каталог.Количество() <> 1 Тогда
ВызватьИсключение "Источник собственной схемы должен предложить одно действительное вложение";
КонецЕсли;
ИдентификаторОбъекта = Описание.Имя;
Доступный = Каталог.Найти(ИдентификаторОбъекта);
Если Доступный = Неопределено Тогда
ВызватьИсключение "Имя собственного вложенного описания не разрешилось в источнике доступных настроек";
КонецЕсли;
Если ТипЗнч(Доступный) <> Тип("ДоступныйОбъектНастройкиКомпоновкиДанных")
Или Каталог.Получить(0) <> Доступный Или Каталог.Индекс(Доступный) <> 0
Или Доступный.Заголовок <> Описание.Заголовок Тогда
ВызватьИсключение "Заголовок, поиск и индекс должны принадлежать одному реальному доступному объекту";
КонецЕсли;
Если Каталог.Найти("НетТакогоВложения85") <> Неопределено Тогда
ВызватьИсключение "Несуществующий идентификатор не должен подменяться первым доступным объектом";
КонецЕсли;
Вложение = Рабочие.Структура.Добавить(Тип("НастройкиВложенногоОбъектаКомпоновкиДанных"));
Если Вложение.ИдентификаторОбъекта <> "" Тогда
ВызватьИсключение "Первое назначение возможно только новому собственному элементу без идентификатора объекта";
КонецЕсли;
Вложение.УстановитьИдентификатор(ИдентификаторОбъекта);
Вложение.Имя = "СтрокиУчебныхТоваров85";
Вложение.Использование = Истина;
Вложение.ИдентификаторПользовательскойНастройки = "";
Вложение.ПредставлениеПользовательскойНастройки = "Товары: книга и ручка";
Вложение.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
Если ПолучитьСвоюОсновнуюНастройку(Рабочие, ИдентификаторОбъекта) <> Вложение
Или Вложение.Имя <> "СтрокиУчебныхТоваров85" Или Не Вложение.Использование
Или Вложение.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный
Или Вложение.ПредставлениеПользовательскойНастройки <> "Товары: книга и ручка"
Или ТипЗнч(Вложение.Идентификатор) <> Тип("Строка") Тогда
ВызватьИсключение "Не совпали имя, флаг, представление, режим и тип собственного идентификатора структуры";
КонецЕсли;
ИдентификаторСтруктуры = Вложение.Идентификатор;
ПроверитьСвойДочернийВывод(Описание.Схема, Вложение.Настройки);
ТекстДочернихНастроек = СвойОбъектРасшифровкиВСтроку(Вложение.Настройки);
Вложение.Использование = Ложь;
Копия = Редактор.ПолучитьНастройки();
Используемые = 0;
Для Каждого Часть Из Копия.Структура Цикл
Если ТипЗнч(Часть) <> Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
ВызватьИсключение "В своей структуре нет групп или диаграмм вместо вложений";
КонецЕсли;
Если Часть.Использование Тогда
Используемые = Используемые + 1;
КонецЕсли;
КонецЦикла;
Если Вложение.Использование Или Используемые <> 0
Или СвойОбъектРасшифровкиВСтроку(Вложение.Настройки) <> ТекстДочернихНастроек Тогда
ВызватьИсключение "Выключение должно исключить использование, сохранив собственные дочерние настройки";
КонецЕсли;
Вложение.Использование = Истина;
ПроверитьСвойДочернийВывод(Описание.Схема, Вложение.Настройки);
ИдентификаторПользователя = "ВыборУчебныхТоваров85";
Вложение.ИдентификаторПользовательскойНастройки = ИдентификаторПользователя;
Редактор.ЗагрузитьНастройки(Редактор.ПолучитьНастройки());
Основное = ПолучитьСвоюОсновнуюНастройку(Редактор.Настройки, ИдентификаторОбъекта);
Пользовательское = Редактор.ПользовательскиеНастройки.Элементы.Найти(ИдентификаторПользователя);
Если Пользовательское = Неопределено Тогда
ВызватьИсключение "Непустой собственный пользовательский ID должен включить настройку в пользовательский состав";
КонецЕсли;
Если ТипЗнч(Пользовательское) <> Тип("НастройкиВложенногоОбъектаКомпоновкиДанных")
Или Основное.ИдентификаторПользовательскойНастройки <> ИдентификаторПользователя
Или Пользовательское.ИдентификаторПользовательскойНастройки <> ИдентификаторПользователя
Или Не Пользовательское.Использование Тогда
ВызватьИсключение "Нужны настоящие основная и пользовательская настройки одного собственного объекта";
КонецЕсли;
Эффективные = ПолучитьСвоюОсновнуюНастройку(Редактор.ПолучитьНастройки(), ИдентификаторОбъекта);
ПроверитьСвойДочернийВывод(Описание.Схема, Эффективные.Настройки);
Если СвойОбъектРасшифровкиВСтроку(Корень) <> ТекстИсходнойСхемы Тогда
ВызватьИсключение "Работа редактора и пользовательского слоя не должна изменять исходную схему";
КонецЕсли;
Возврат "Доступно: " + Доступный.Заголовок + "; объект=" + ИдентификаторОбъекта
+ "; ID структуры=" + ИдентификаторСтруктуры + "; имя=" + Основное.Имя
+ "; пользовательская настройка=" + Основное.ПредставлениеПользовательскойНастройки
+ "; количество 4; сумма 800";
КонецФункции
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьСвоиДанные(Схема)
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеТовары";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 250 КАК Цена,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 1, 50, 50";
КонецПроцедуры
Процедура ЗаполнитьСвоиНачальныеНастройки(Настройки)
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
КонецПроцедуры
Процедура ПроверитьСвойДочернийВывод(Схема, Настройки)
Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных")
Или ТипЗнч(Настройки) <> Тип("НастройкиКомпоновкиДанных")
Или Настройки.Выбор.Элементы.Количество() <> 4 Или Настройки.Структура.Количество() <> 1 Тогда
ВызватьИсключение "Нужны реально загруженные четыре поля и одна группа деталей своего вложения";
КонецЕсли;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроверитьСвойПолныйВывод(Макет, Неопределено);
КонецПроцедуры
Функция ПолучитьСвоюОсновнуюНастройку(Настройки, ИдентификаторОбъекта)
Если Настройки.Структура.Количество() <> 1 Тогда
ВызватьИсключение "В родительском отчете только одно свое вложение";
КонецЕсли;
Вложение = Настройки.Структура.Получить(0);
Если ТипЗнч(Вложение) <> Тип("НастройкиВложенногоОбъектаКомпоновкиДанных")
Или Вложение.ИдентификаторОбъекта <> ИдентификаторОбъекта Или Вложение.Родитель <> Настройки Тогда
ВызватьИсключение "Нужна основная настройка своего вложенного объекта с настоящим родителем";
КонецЕсли;
Возврат Вложение;
КонецФункции
Процедура ПроверитьСвойПолныйВывод(Макет, ВнешниеДанные)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет, ВнешниеДанные);
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Приемник = Новый ТаблицаЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Или Результат.Количество() <> 2
Или Результат.Колонки.Количество() <> 4 Тогда
ВызватьИсключение "Настоящий вывод должен дать две строки и четыре колонки";
КонецЕсли;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Если Результат.Колонки.Найти(ИмяПоля) = Неопределено Тогда
ВызватьИсключение "Потеряна ожидаемая колонка реального вывода " + ИмяПоля;
КонецЕсли;
КонецЦикла;
Книга = Результат.Найти("Книга", "Наименование");
Ручка = Результат.Найти("Ручка", "Наименование");
Если Книга = Неопределено Или Ручка = Неопределено Тогда
ВызватьИсключение "Не найдены обе реальные исходные строки результата";
КонецЕсли;
Если Книга.Количество <> 3 Или Книга.Цена <> 250 Или Книга.Сумма <> 750
Или Ручка.Количество <> 1 Или Ручка.Цена <> 50 Или Ручка.Сумма <> 50
Или Результат.Итог("Количество") <> 4 Или Результат.Итог("Сумма") <> 800 Тогда
ВызватьИсключение "Потеряны или изменены реальные ячейки собственного полного вывода";
КонецЕсли;
Сообщить("Настоящий вывод проверен: Книга 3 × 250 = 750, Ручка 1 × 50 = 50; количество 4, сумма 800.");
КонецПроцедуры
Функция СвойОбъектРасшифровкиВСтроку(Объект)
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, Объект);
Возврат Запись.Закрыть();
КонецФункцииУчебныеНастройкиВложений85.Пульт
УчебныеНастройкиВложений85 → Обработки → УчебныеНастройкиВложений85 → Формы → Пульт → Модуль
Полный модуль собственной управляемой формы; здесь не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
Сообщить(ВыполнитьНаСервере());
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
Возврат УчебныеНастройкиВложений85.ВыполнитьПример();
КонецФункцииРазбор по шагам
Заполнить настоящую дочернюю схему через readonly Описание.Схема и ее настройки через readonly Описание.Настройки. Присваивания этим свойствам целиком нет. Контрольный дочерний вывод проверяет обе строки и четыре колонки.
Построить источник из родительской схемы, инициализировать редактор и загрузить пустые настройки родителя. ДоступныеОбъекты.Элементы содержит именно объекты настройки, не описания схем и не массив названий.
ID берется из программного имени собственного вложенного описания. Перед назначением он должен разрешиться через Найти в настоящем источнике; Получить/Индекс и Заголовок сверяют тот же элемент. У доступного объекта нет свойства Идентификатор: такое свойство не выдумываем.
Добавить настоящий НастройкиВложенногоОбъектаКомпоновкиДанных в источник-связанные Рабочие.Структура. УстановитьИдентификатор вызывается только при пустом предыдущем ИдентификаторОбъекта. Именно этот переход должен загрузить четыре поля и группу из подготовленного источника.
ИдентификаторОбъекта выбирает дочерний объект; Идентификатор обозначает элемент структуры для расшифровок; ИдентификаторПользовательскойНастройки обозначает включение в пользовательский слой. Не приравнивать эти три разных строки.
Настроить собственные Имя, Использование, пользовательское представление и Обычный режим. Родитель проверяется как настоящие основные настройки. Идентификатор читается как Строка, но не используется для придуманного клика расшифровки.
Выключить использование и получить эффективную копию: использованных вложений должно быть ноль, независимо от того, оставил ли движок выключенные элементы физически. XML собственных дочерних настроек не меняется. Пустую выключенную структуру не исполняем; затем включить и повторно проверить дочерний вывод.
Назначить пользовательский ID, заново загрузить эффективные настройки и найти настоящий пользовательский элемент по этому ID. После перезагрузки основные настройки получаются заново: старые ссылки не используются как текущие.
У пользовательского элемента проверять только разрешенные ID и Использование. Имя, Родитель, Идентификатор и ПредставлениеПользовательскойНастройки читать только у основных настроек; у пользовательских эти свойства недоступны.
Вывести дочернюю схему с фактически полученными эффективными Настройки вложения. Сравнить весь XML исходной схемы с начальным снимком в памяти и вернуть информативный результат формы. Пользовательский UI редактора и полный родительский табличный отчет здесь не исполняются.
Как проверить результат
Будущий дочерний вывод во всех четырех контрольных состояниях: ТаблицаЗначений, две строки и четыре колонки; Книга: количество3, цена250, сумма750; Ручка: количество1, цена50, сумма50; итог количества4, суммы800. Приемник не заполняется ожидаемыми строками вручную.
До назначения ID новый вложенный объект имеет пустой ИдентификаторОбъекта. После назначения должен иметь действительный собственный ID, четырехпольный выбор и одну группу; отсутствие автоматической загрузки завершает опыт исключением, а не искусственным дозаполнением.
Отрицательный контроль: в отдельном будущем опыте убрать вызов Редактор.Инициализировать. Проверка доступных объектов или загруженных настроек должна отказать. Не обходить отказ прямым заполнением Вложение.Настройки после назначения ID.
Отрицательный контроль: заменить только возвращаемый запрос дочерней схемы: Книга.Количество3→30 при прежней сумме750. Проверка реальной строки должна отказать; одного количества строк или заголовка отчета недостаточно.
Исходная схема неизменна при работе редактора; XML хранится строкой в памяти, не файлом. Пользовательский элемент должен реально появиться после непустого ID и перезагрузки.
runtimeVerifiedScenarios=0. Нет утверждения о запуске в 1С, видимом редакторе пользовательских настроек, клике расшифровки или выводе полного родительского отчета.
Ожидаемый результат
Подготовлены источник-связанные настройки настоящего вложения и пользовательский элемент. Полный код проверяет фактический дочерний вывод: две строки, количество4, сумма800; здесь запуск в 1С не выполнялся.
На что обратить внимание
ДоступныйОбъектНастройкиКомпоновкиДанных предоставляет Заголовок, но не свойство Идентификатор. Строка поиска должна разрешаться в текущем источнике; нельзя выдавать заголовок или случайный номер за ID.
Автозагрузка описана для первого перехода пустого ID к настоящему ID и связи с источником. Повторный вызов с уже установленным ID не используется как способ сброса всех настроек.
Readonly Настройки/Родитель/Идентификатор/ИдентификаторОбъекта не переназначаются. Поле Имя серверное; полный общий модуль выполняется на сервере, не в клиентском обработчике кнопки.
Настройки пользовательского слоя не равны основным по доступности свойств. После ЗагрузитьНастройки пользовательский состав пересоздается; ссылки заново ищутся в новых текущих коллекциях.
РежимОтображения и представление подготовлены для редактора, но это не доказательство его внешнего вида. ID структуры читается, однако настоящий обработчик расшифровки здесь не строится.
Урок исполняет дочерний отчет с реальными настройками вложения отдельно. Поддержка вложенного вывода в выбранном генераторе полного родителя, глобальные отборы, общие параметры и несколько вложений требуют отдельной задачи; здесь эти свойства не приписываются данному выводу.
В прочитанной выгрузке КА2 ИсполнениеПланаПродаж вложенные схемы имеют программные имена ПоКлиентам/ПоПодразделениям, а objectID настроек ссылается на такое имя. Это пример структуры существующего исходника, а не проверка рабочей базы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.