Тип: КоллекцияОбъектовМетаданных. Коллекция объектов метаданных, описывающих табличные части данного объекта метаданных. Элементами коллекции являются объекты типа ОбъектМетаданных: ТабличнаяЧасть.
Полное описание, параметры и ограничения
ОбъектМетаданных: ПланВидовХарактеристик.ТабличныеЧасти (MetadataObject: ChartOfCharacteristicTypes.TabularSections)
ОбъектМетаданных: ПланВидовХарактеристик (MetadataObject: ChartOfCharacteristicTypes)
ТабличныеЧасти (TabularSections)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: КоллекцияОбъектовМетаданных.
Коллекция объектов метаданных, описывающих табличные части данного объекта метаданных.
Элементами коллекции являются объекты типа ОбъектМетаданных: ТабличнаяЧасть.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Найти стандартный ТипЗначения и проверить состав собственной схемы
СтандартныеРеквизиты — не обычная коллекция с Найти. Перебираем описания и отдельно проверяем пустые пользовательские коллекции.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Создайте НОВУЮ пустую файловую базу и назовите корень конфигурации Учебная85. Не добавляйте учебные объекты в УТ/КА2/УНФ/БП и не подключайте расширения.
Конфигуратор → Планы видов характеристик → Добавить: имя УчебныеСвойства, синоним Учебные свойства. Укажите длину кода 10, длину наименования 100, автонумерацию и контроль уникальности включите.
Включите иерархию плана. В свойстве Тип выберите только Число (12 цифр, 2 дробных, неотрицательное) и Строка (30 символов, переменная длина). Дополнительные значения характеристик не назначайте.
Реквизиты, табличные части, предопределённые элементы, формы, команды, макеты, характеристики и дополнительные индексы не создавайте. Модуль объекта и модуль менеджера оставьте пустыми; историю данных выключите.
Создайте серверный общий модуль УчебныеЗадачи с процедурой ВыполнитьПример() Экспорт и вызывайте её из серверного обработчика учебной обработки. Обновите конфигурацию базы данных перед первым запуском.
Код этого блока не вызывает Записать, не устанавливает блокировки и не меняет настройки метаданных. Учебные виды характеристик существуют только в памяти.
Если Метаданные.ПланыВидовХарактеристик.Найти("УчебныеСвойства") = Неопределено Тогда
ВызватьИсключение "Создайте собственный план УчебныеСвойства по подготовке";
КонецЕсли;
Описание = Метаданные.ПланыВидовХарактеристик.УчебныеСвойства;
ЕстьКод = Ложь;
ЕстьНаименование = Ложь;
ЕстьТипЗначения = Ложь;
Для Каждого Стандартный Из Описание.СтандартныеРеквизиты Цикл
Если Стандартный.Имя = "Код" Тогда ЕстьКод = Истина; КонецЕсли;
Если Стандартный.Имя = "Наименование" Тогда ЕстьНаименование = Истина; КонецЕсли;
Если Стандартный.Имя = "ТипЗначения" Тогда ЕстьТипЗначения = Истина; КонецЕсли;
КонецЦикла;
Сообщить(ЕстьКод);
Сообщить(ЕстьНаименование);
Сообщить(ЕстьТипЗначения);
Сообщить(Описание.Реквизиты.Количество() = 0);
Сообщить(Описание.ТабличныеЧасти.Количество() = 0);
Сообщить(Описание.ВводитсяНаОсновании.Количество() = 0);
Сообщить(Описание.ДополнительныеИндексы.Количество() = 0);
Сообщить(Описание.Характеристики.Количество() = 0);
Сообщить(Описание.Команды.Количество() = 0);
Сообщить(Описание.Макеты.Количество() = 0);
Сообщить(Описание.ПолучитьИменаПредопределенных().Количество() = 0);
Сообщить(Описание.МодульОбъекта = Неопределено);
Сообщить(Описание.МодульМенеджера = Неопределено);
Сообщить(Описание.Справка = Неопределено);
Сообщить(Описание.Предопределенные = Неопределено);
Сообщить("Поля блокировки: " + Строка(Описание.ПоляБлокировкиДанных.Количество()));
Сообщить("Режим блокировки: " + Строка(Описание.РежимУправленияБлокировкойДанных));Разбор по шагам
Среди описаний стандартных реквизитов ищем Код, Наименование и ТипЗначения перебором по Имя.
Пользовательские реквизиты и табличные части проверяем отдельно. ТипЗначения не должен появляться в Реквизиты как созданный вручную реквизит.
Пустые команды, макеты, индексы и предопределённые имена соответствуют собственному минимальному плану.
МодульОбъекта, МодульМенеджера, Справка и Предопределенные по контракту этих свойств возвращают Неопределено. Это не API чтения исходного текста/списка; для имён предопределённых есть отдельный метод.
Поля и режим блокировки только читаем. Ни одного блокирования объектов или изменения режима не выполняется.
Как проверить результат
Пятнадцать логических проверок дают Истина.
Три обязательных стандартных поля найдены, пользовательские коллекции по подготовке пустые.
Последние два сообщения показывают фактические поля/режим блокировки, а не результат установления блокировки.
Ожидаемый результат
Проверен минимальный состав метаданных учебного ПВХ и границы доступности исходного текста.
На что обратить внимание
У ОписанияСтандартныхРеквизитов нет Найти; используйте перебор описаний.
Неопределено у МодульОбъекта не доказывает отсутствие кода: содержимое модуля читают через Конфигуратор/выгрузку, не через это свойство.
ПолучитьИменаПредопределенных возвращает имена схемы, не пользовательские записи плана.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Характеристики товаров СКД: свой ПВХ, регистр, таблицы и запросы с полным восстановлением
Описываем для собственных товаров виды числовых свойств и место хранения значений. Переключаем источники с таблиц на запросы с другими именами полей, возвращаем таблицы, удаляем и восстанавливаем описание. Семь самостоятельных разборов проверяют все11 readonly-свойств и неизменные колонки товаров.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи нового собственного стенда УчебныеХарактеристики85; только метаданные и модель в памяти, запуск в1С не проверен.
Подготовка
Создайте НОВУЮ отдельную учебную базу, не копию рабочей, на точно8.5.1.1343; имя конфигурации УчебныеХарактеристики85, совместимость Не использовать. Рабочие УТ/КА2/УНФ/БП и их расширения не меняйте. Нужны ровно три прикладных объекта ниже, без подписок, расширений, регламентных заданий или иных объектов.
Справочники → УчебныеТовары85: неиерархический, код Строка3, наименование40, без владельцев, реквизитов и табличных частей. Автонумерация выключена. Модули объекта/менеджера пусты; элементы не создавайте.
Планы видов характеристик → УчебныеВиды85: неиерархический, код Строка3, наименование40. В свойстве Тип разрешите только Число12,2; дополнительные значения характеристик не назначайте. Без реквизитов, табличных частей и предопределённых видов; модули пусты. Это допустимые ТИПЫ значений, не тип ссылки на вид свойства.
Регистры сведений → УчебныеЗначения85: независимый, непериодический. Измерение Товар: СправочникСсылка.УчебныеТовары85; измерение Вид: ПланВидовХарактеристикСсылка.УчебныеВиды85; ресурс Значение: Число12,2. Реквизитов и обработчиков нет. Записи не создавайте: данный урок редактирует модель запроса, а не значения характеристик.
Общие → Общие модули → УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной код. Создайте свою внешнюю обработку УчебныеХарактеристикиЗапроса85, управляемую Форму и команду/кнопку Выполнить с действием Выполнить, без реквизитов. Полный отдельный модуль формы дан ниже.
Вне опыта завершите прежний свой сеанс без транзакции, сохраните свою конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (F7). После успеха свежий собственный управляемый клиент и своя обработка. Здесь 1С, F7, формы и BSL не запускались.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойСтендХарактеристик();
ПроверитьСвоюМодельХарактеристик();
ЗапросВидов = ПроверитьСвойЗапросИсточника("ВЫБРАТЬ Виды.Ссылка КАК Ключ, Виды.Наименование КАК Имя, Виды.ТипЗначения КАК ТипЗначения
|ИЗ ПланВидовХарактеристик.УчебныеВиды85 КАК Виды", Истина);
ЗапросЗначений = ПроверитьСвойЗапросИсточника("ВЫБРАТЬ Значения.Товар КАК Объект, Значения.Вид КАК Характеристика, Значения.Значение КАК ЗначениеХарактеристики
|ИЗ РегистрСведений.УчебныеЗначения85 КАК Значения", Ложь);
Схема = Новый СхемаЗапроса;
Схема.РежимКомпоновкиДанных = Истина;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ Товары.Ссылка КАК Товар, Товары.Наименование КАК Наименование
|ИЗ Справочник.УчебныеТовары85 КАК Товары");
Характеристики = ПолучитьСвоиХарактеристики(Схема);
ТипТоваров = Новый ОписаниеТипов("СправочникСсылка.УчебныеТовары85");
ПроверитьСвоюХарактеристику(Схема, "Пусто", ЗапросВидов, ЗапросЗначений);
ПроверитьПовторныйРазборХарактеристик(Схема, "Пусто", ЗапросВидов, ЗапросЗначений);
Добавленная = Характеристики.Добавить(ТипТоваров, "ПланВидовХарактеристик.УчебныеВиды85", "",
"Ссылка", "Наименование", "ТипЗначения", "РегистрСведений.УчебныеЗначения85", "", "Товар", "Вид", "Значение");
Если Добавленная <> Характеристики.Получить(0) Тогда
ВызватьИсключение "Добавить должен вернуть текущую собственную характеристику";
КонецЕсли;
ПроверитьСвоюХарактеристику(Схема, "Таблицы", ЗапросВидов, ЗапросЗначений);
ПроверитьПовторныйРазборХарактеристик(Схема, "Таблицы", ЗапросВидов, ЗапросЗначений);
Изменённая = Характеристики.Изменить(0, ТипТоваров, "", ЗапросВидов, "Ключ", "Имя", "ТипЗначения",
"", ЗапросЗначений, "Объект", "Характеристика", "ЗначениеХарактеристики");
Если Изменённая <> Характеристики.Получить(0) Тогда
ВызватьИсключение "Изменить должен вернуть текущую собственную характеристику";
КонецЕсли;
ПроверитьСвоюХарактеристику(Схема, "Запросы", ЗапросВидов, ЗапросЗначений);
ПроверитьПовторныйРазборХарактеристик(Схема, "Запросы", ЗапросВидов, ЗапросЗначений);
Копия = Новый СхемаЗапроса;
Копия.РежимКомпоновкиДанных = Истина;
Копия.УстановитьТекстЗапроса(Схема.ПолучитьТекстЗапроса());
ПроверитьСвоюХарактеристику(Копия, "Запросы", ЗапросВидов, ЗапросЗначений);
Возвращённая = Характеристики.Изменить(0, ТипТоваров, "ПланВидовХарактеристик.УчебныеВиды85", "",
"Ссылка", "Наименование", "ТипЗначения", "РегистрСведений.УчебныеЗначения85", "", "Товар", "Вид", "Значение");
Если Возвращённая <> Характеристики.Получить(0) Тогда
ВызватьИсключение "Возвращение к таблицам должно дать текущую собственную характеристику";
КонецЕсли;
ПроверитьСвоюХарактеристику(Схема, "Таблицы", ЗапросВидов, ЗапросЗначений);
ПроверитьПовторныйРазборХарактеристик(Схема, "Таблицы", ЗапросВидов, ЗапросЗначений);
Характеристики.Удалить(0);
ПроверитьСвоюХарактеристику(Схема, "Пусто", ЗапросВидов, ЗапросЗначений);
ПроверитьПовторныйРазборХарактеристик(Схема, "Пусто", ЗапросВидов, ЗапросЗначений);
Восстановленная = Характеристики.Добавить(ТипТоваров, "ПланВидовХарактеристик.УчебныеВиды85", "",
"Ссылка", "Наименование", "ТипЗначения", "РегистрСведений.УчебныеЗначения85", "", "Товар", "Вид", "Значение");
Если Восстановленная <> Характеристики.Получить(0) Тогда
ВызватьИсключение "После удаления нужно новое текущее описание";
КонецЕсли;
ПроверитьСвоюХарактеристику(Схема, "Таблицы", ЗапросВидов, ЗапросЗначений);
ПроверитьПовторныйРазборХарактеристик(Схема, "Таблицы", ЗапросВидов, ЗапросЗначений);
Характеристики.Очистить();
ПроверитьСвоюХарактеристику(Схема, "Пусто", ЗапросВидов, ЗапросЗначений);
ПроверитьПовторныйРазборХарактеристик(Схема, "Пусто", ЗапросВидов, ЗапросЗначений);
ПроверитьСвоюХарактеристику(Копия, "Запросы", ЗапросВидов, ЗапросЗначений);
Сообщить("Оригинал: характеристик0, колонки товаров2; самостоятельная копия: описание своих запросов видов и значений сохранено");
КонецПроцедуры
Процедура ПроверитьСвойСтендХарактеристик()
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 1 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 1 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый стенд: один справочник, один ПВХ и один регистр значений";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойТип(Описание, ОжидаемыйТип)
Если ТипЗнч(Описание) <> Тип("ОписаниеТипов") Тогда
ВызватьИсключение "Нужно настоящее описание типа собственного поля";
КонецЕсли;
Типы = Описание.Типы();
Если Типы.Количество() <> 1 Или Типы[0] <> ОжидаемыйТип Тогда
ВызватьИсключение "Не совпал полный набор типов собственного поля";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоюМодельХарактеристик()
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Привилегированный режим для собственной модели не нужен";
КонецЕсли;
МетаТовар = Метаданные.Справочники.Найти("УчебныеТовары85");
МетаВиды = Метаданные.ПланыВидовХарактеристик.Найти("УчебныеВиды85");
МетаЗначения = Метаданные.РегистрыСведений.Найти("УчебныеЗначения85");
Если МетаТовар = Неопределено Или МетаВиды = Неопределено Или МетаЗначения = Неопределено Тогда
ВызватьИсключение "Нужны все три собственных объекта учебной модели";
КонецЕсли;
Если МетаТовар.Иерархический Или МетаВиды.Иерархический
Или МетаТовар.Реквизиты.Количество() <> 0 Или МетаТовар.ТабличныеЧасти.Количество() <> 0
Или МетаВиды.Реквизиты.Количество() <> 0 Или МетаВиды.ТабличныеЧасти.Количество() <> 0
Или МетаТовар.ДлинаКода <> 3 Или МетаТовар.ДлинаНаименования <> 40
Или МетаВиды.ДлинаКода <> 3 Или МетаВиды.ДлинаНаименования <> 40
Или МетаВиды.ДополнительныеЗначенияХарактеристик <> Неопределено Тогда
ВызватьИсключение "Не совпала собственная минимальная схема справочника и ПВХ";
КонецЕсли;
ПроверитьСвойТип(МетаВиды.Тип, Тип("Число"));
Если МетаВиды.Тип.КвалификаторыЧисла.Разрядность <> 12 Или МетаВиды.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2 Тогда
ВызватьИсключение "Свой ПВХ разрешает только Число12,2";
КонецЕсли;
Если МетаЗначения.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый
Или МетаЗначения.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический
Или МетаЗначения.Измерения.Количество() <> 2 Или МетаЗначения.Ресурсы.Количество() <> 1
Или МетаЗначения.Реквизиты.Количество() <> 0 Тогда
ВызватьИсключение "Нужен независимый непериодический собственный регистр: два измерения и один ресурс";
КонецЕсли;
МетаОбъект = МетаЗначения.Измерения.Найти("Товар");
МетаВид = МетаЗначения.Измерения.Найти("Вид");
МетаЗначение = МетаЗначения.Ресурсы.Найти("Значение");
Если МетаОбъект = Неопределено Или МетаВид = Неопределено Или МетаЗначение = Неопределено Тогда
ВызватьИсключение "Не совпали имена собственных измерений и ресурса";
КонецЕсли;
ПроверитьСвойТип(МетаОбъект.Тип, Тип("СправочникСсылка.УчебныеТовары85"));
ПроверитьСвойТип(МетаВид.Тип, Тип("ПланВидовХарактеристикСсылка.УчебныеВиды85"));
ПроверитьСвойТип(МетаЗначение.Тип, Тип("Число"));
Если МетаЗначение.Тип.КвалификаторыЧисла.Разрядность <> 12 Или МетаЗначение.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2 Тогда
ВызватьИсключение "Ресурс собственной модели должен иметь Число12,2";
КонецЕсли;
КонецПроцедуры
Функция ПроверитьСвойЗаголовок(Схема, ИсточникИмя, Псевдоним, Имена, Выражения, ИменаТипов)
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Нужна одна собственная схема без пакетных побочных операций";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Или Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один собственный запрос выбора и оператор";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Если ТипЗнч(Оператор) <> Тип("ОператорВыбратьСхемыЗапроса") Или Оператор.Источники.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один собственный физический источник";
КонецЕсли;
Таблица = Оператор.Источники.Получить(0).Источник;
Если ТипЗнч(Таблица) <> Тип("ТаблицаСхемыЗапроса") Или НРег(Таблица.ИмяТаблицы) <> НРег(ИсточникИмя)
Или Таблица.Псевдоним <> Псевдоним Тогда
ВызватьИсключение "Не совпал точный собственный источник и псевдоним";
КонецЕсли;
Если Выбор.Колонки.Количество() <> Имена.Количество() Или Оператор.ВыбираемыеПоля.Количество() <> Имена.Количество() Тогда
ВызватьИсключение "Не совпал полный размер собственного заголовка";
КонецЕсли;
Для Индекс = 0 По Имена.Количество() - 1 Цикл
Колонка = Выбор.Колонки.Получить(Индекс);
Если ТипЗнч(Колонка) <> Тип("КолонкаСхемыЗапроса") Или Колонка.Псевдоним <> Имена[Индекс]
Или Выбор.Колонки.Найти(Имена[Индекс]) <> Колонка Или Колонка.Поля.Количество() <> 1
Или ТипЗнч(Колонка.Поля.Получить(0)) <> Тип("ВыражениеСхемыЗапроса")
Или Колонка.Поля.Получить(0) <> Новый ВыражениеСхемыЗапроса(Выражения[Индекс]) Тогда
ВызватьИсключение "Не совпали все имена, порядок и полные выражения собственного заголовка";
КонецЕсли;
ПроверитьСвойТип(Колонка.ТипЗначения, Тип(ИменаТипов[Индекс]));
КонецЦикла;
Возврат Выбор;
КонецФункции
Функция ПолучитьСвоиХарактеристики(Схема)
Если Не Схема.РежимКомпоновкиДанных Тогда
ВызватьИсключение "Собственная основная схема должна быть в режиме СКД";
КонецЕсли;
Выбор = ПроверитьСвойЗаголовок(Схема, "Справочник.УчебныеТовары85", "Товары",
СтрРазделить("Товар,Наименование", ","), СтрРазделить("Товары.Ссылка,Товары.Наименование", ","),
СтрРазделить("СправочникСсылка.УчебныеТовары85,Строка", ","));
Характеристики = Выбор.Характеристики;
Если ТипЗнч(Характеристики) <> Тип("ХарактеристикиКомпоновкиДанныхСхемыЗапроса") Тогда
ВызватьИсключение "Нужна настоящая собственная коллекция характеристик";
КонецЕсли;
Возврат Характеристики;
КонецФункции
Функция ПроверитьСвойЗапросИсточника(Текст, ЭтоВиды)
Если ТипЗнч(Текст) <> Тип("Строка") Или Текст = "" Тогда
ВызватьИсключение "В режиме запроса нужен непустой текст собственного источника";
КонецЕсли;
Источник = Новый СхемаЗапроса;
Источник.РежимКомпоновкиДанных = Ложь;
Источник.УстановитьТекстЗапроса(Текст);
Если ЭтоВиды Тогда
Выбор = ПроверитьСвойЗаголовок(Источник, "ПланВидовХарактеристик.УчебныеВиды85", "Виды",
СтрРазделить("Ключ,Имя,ТипЗначения", ","), СтрРазделить("Виды.Ссылка,Виды.Наименование,Виды.ТипЗначения", ","),
СтрРазделить("ПланВидовХарактеристикСсылка.УчебныеВиды85,Строка,ОписаниеТипов", ","));
Иначе
Выбор = ПроверитьСвойЗаголовок(Источник, "РегистрСведений.УчебныеЗначения85", "Значения",
СтрРазделить("Объект,Характеристика,ЗначениеХарактеристики", ","), СтрРазделить("Значения.Товар,Значения.Вид,Значения.Значение", ","),
СтрРазделить("СправочникСсылка.УчебныеТовары85,ПланВидовХарактеристикСсылка.УчебныеВиды85,Число", ","));
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Свой источник не должен иметь объединений";
КонецЕсли;
Возврат Источник.ПолучитьТекстЗапроса();
КонецФункции
Процедура ПроверитьСвоюХарактеристику(Схема, Режим, ЗапросВидов, ЗапросЗначений)
Характеристики = ПолучитьСвоиХарактеристики(Схема);
Если Режим = "Пусто" Тогда
Если Характеристики.Количество() <> 0 Тогда
ВызватьИсключение "Должна быть пуста только собственная коллекция характеристик";
КонецЕсли;
Возврат;
КонецЕсли;
Если Характеристики.Количество() <> 1 Тогда
ВызватьИсключение "В собственном описании нужен ровно один тип товаров";
КонецЕсли;
Элемент = Характеристики.Получить(0);
Если ТипЗнч(Элемент) <> Тип("ХарактеристикаКомпоновкиДанныхСхемыЗапроса")
Или Характеристики[0] <> Элемент Или Характеристики.Индекс(Элемент) <> 0 Тогда
ВызватьИсключение "Не совпали тип, индекс и текущий элемент собственной коллекции";
КонецЕсли;
ПроверитьСвойТип(Элемент.Тип, Тип("СправочникСсылка.УчебныеТовары85"));
Если ТипЗнч(Элемент.ВидыХарактеристикЗапрос) <> Тип("Строка") Или ТипЗнч(Элемент.ВидыХарактеристикТаблица) <> Тип("Строка")
Или ТипЗнч(Элемент.ЗначенияХарактеристикЗапрос) <> Тип("Строка") Или ТипЗнч(Элемент.ЗначенияХарактеристикТаблица) <> Тип("Строка")
Или ТипЗнч(Элемент.ПолеВида) <> Тип("Строка") Или ТипЗнч(Элемент.ПолеЗначения) <> Тип("Строка")
Или ТипЗнч(Элемент.ПолеИмени) <> Тип("Строка") Или ТипЗнч(Элемент.ПолеКлюча) <> Тип("Строка")
Или ТипЗнч(Элемент.ПолеОбъекта) <> Тип("Строка") Или ТипЗнч(Элемент.ПолеТипаЗначения) <> Тип("Строка") Тогда
ВызватьИсключение "Все десять readonly-параметров источников должны иметь тип Строка";
КонецЕсли;
Если Режим = "Таблицы" Тогда
Если НРег(Элемент.ВидыХарактеристикТаблица) <> НРег("ПланВидовХарактеристик.УчебныеВиды85")
Или НРег(Элемент.ЗначенияХарактеристикТаблица) <> НРег("РегистрСведений.УчебныеЗначения85")
Или Элемент.ВидыХарактеристикЗапрос <> "" Или Элемент.ЗначенияХарактеристикЗапрос <> ""
Или Элемент.ПолеКлюча <> "Ссылка" Или Элемент.ПолеИмени <> "Наименование"
Или Элемент.ПолеОбъекта <> "Товар" Или Элемент.ПолеВида <> "Вид" Или Элемент.ПолеЗначения <> "Значение" Тогда
ВызватьИсключение "Не совпало полное собственное описание источников-таблиц";
КонецЕсли;
ИначеЕсли Режим = "Запросы" Тогда
Если Элемент.ВидыХарактеристикТаблица <> "" Или Элемент.ЗначенияХарактеристикТаблица <> ""
Или Элемент.ПолеКлюча <> "Ключ" Или Элемент.ПолеИмени <> "Имя"
Или Элемент.ПолеОбъекта <> "Объект" Или Элемент.ПолеВида <> "Характеристика" Или Элемент.ПолеЗначения <> "ЗначениеХарактеристики" Тогда
ВызватьИсключение "Не совпали полные собственные имена полей источников-запросов";
КонецЕсли;
Если ПроверитьСвойЗапросИсточника(Элемент.ВидыХарактеристикЗапрос, Истина) <> ЗапросВидов
Или ПроверитьСвойЗапросИсточника(Элемент.ЗначенияХарактеристикЗапрос, Ложь) <> ЗапросЗначений Тогда
ВызватьИсключение "Не совпали полные канонические запросы источников характеристик";
КонецЕсли;
Иначе
ВызватьИсключение "Неизвестное собственное ожидание режима характеристик";
КонецЕсли;
Если Элемент.ПолеТипаЗначения <> "ТипЗначения" Тогда
ВызватьИсключение "Тип значения берётся из своего ПВХ, не из ссылки товара или числового ресурса";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьПовторныйРазборХарактеристик(Схема, Режим, ЗапросВидов, ЗапросЗначений)
Повторная = Новый СхемаЗапроса;
Повторная.РежимКомпоновкиДанных = Истина;
Повторная.УстановитьТекстЗапроса(Схема.ПолучитьТекстЗапроса());
ПроверитьСвоюХарактеристику(Повторная, Режим, ЗапросВидов, ЗапросЗначений);
КонецПроцедурыУчебныеХарактеристикиЗапроса85.Форма
Своя внешняя обработка УчебныеХарактеристикиЗапроса85 → управляемая Форма → Модуль
Полный отдельный модуль своей управляемой формы; модель схемы работает на сервере, здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Собственное описание характеристик, изменение источников и полный повторный разбор проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Проверить точную платформу, отсутствие расширений/чужой транзакции и всю собственную модель. Регистр связывает конкретный товар с конкретным видом свойства; числовой ресурс согласован с допустимыми значениями ПВХ.
Разобрать два своих обычных запроса источников без выполнения. Виды дают Ключ/Имя/ТипЗначения; значения дают Объект/Характеристика/ЗначениеХарактеристики. Проверить каждую колонку, порядок, полное выражение и точный набор типов. Получить канонические тексты от СхемаЗапроса, не угадывая отступы.
Разобрать основную схему товаров в режиме СКД. Обычные колонки Товар и Наименование сохраняются на всех этапах. Коллекция Характеристики принадлежит ЗапросВыбораСхемыЗапроса; исходно она пуста.
Добавить описание для ОписаниеТипов собственного СправочникСсылка.УчебныеТовары85. Режим таблиц: виды — свой ПВХ, ключ Ссылка, имя Наименование, тип ТипЗначения; значения — свой регистр, объект Товар, вид Вид, значение Значение. Параметры текстов запросов пусты, поскольку имена таблиц заданы.
Проверить все11 readonly-свойств: Тип — описание ровно одного типа ссылки товара; остальные десять — строки с точными именами/пустыми текстами. Проверить Количество1, Получить(0), [], Индекс0 и совпадение возвращённого Добавить с текущим элементом. Сформировать текст и полностью проверить новую самостоятельную схему.
Изменить принимает индекс0 и ещё11 аргументов, возвращает текущее описание. Переключить обе таблицы на пустые имена и передать собственные канонические запросы; одновременно изменить имена полей на их псевдонимы Ключ/Имя и Объект/Характеристика/ЗначениеХарактеристики. Полученный элемент проверить заново, старое описание после Изменить не использовать.
В режиме запросов сверить все свойства, каждую ссылочную связь и полный канонический текст обоих источников. Отдельно сохранить Копия с этим описанием. Вернуть оригинал к таблицам через Изменить и повторно проверить все свойства и новый полный разбор.
Удалить принимает числовой индекс0, не объект. Проверить пустую коллекцию при сохранённых колонках товаров; восстановить новым Добавить и ещё раз проверить режим таблиц. Очистить только оригинал. Финально оригинал пуст, Копия продолжает хранить оба источника-запроса и все имена. Семь контрольных разборов плюс независимая сохраняемая копия.
Как проверить результат
Будущий результат: исходная схема после очистки имеет0 характеристик и2 обычные колонки. Копия имеет1 описание для собственного типа ссылки товара, таблицы-источники пусты, два запроса полностью соответствуют своим ПВХ/регистру. Имена Ключ, Имя, ТипЗначения, Объект, Характеристика, ЗначениеХарактеристики сохранены.
В режиме таблиц проверяются полные имена собственного ПВХ и регистра, поля Ссылка/Наименование/ТипЗначения и Товар/Вид/Значение, пустые тексты запросов. В режиме запросов проверяются не только непустые строки, но точные источники, выражения, типы и полный канонический текст. Ни элементы товаров/ПВХ, ни строки регистра не создаются.
Будущий отрицательный контроль вне опыта: в ожидании ПолеВида заменить Характеристика на Вид только для режима запросов. После сохранения/F7 до свежего собственного сеанса полная проверка должна отказать, хотя число характеристик1. Вернуть код и до нового сеанса снова сохранить/F7. Здесь контроль не исполнялся.
runtimeVerifiedScenarios=0. Static/native-проверки не являются выполнением в1С, отображением настроек СКД или получением настоящих значений товаров. Состояния описаны как будущие ручные проверки в собственной пустой базе.
Ожидаемый результат
Описаны обе стороны хранения характеристик и реальный жизненный цикл собственного описания СКД; все свойства проверяются после изменения и самостоятельного восстановления, без неизвестных входных объектов.
На что обратить внимание
Все свойства ХарактеристикаКомпоновкиДанныхСхемыЗапроса readonly. Для изменения используется Изменить коллекции, а не присваивание ПолеКлюча, Тип или другого свойства. После Изменить берём возвращённый/текущий элемент, после удаления старый элемент не читается.
Тип описания характеристики — тип ОБЪЕКТА, которому принадлежат свойства: ссылка своего товара. ТипЗначения в источнике видов — допустимый тип ЗНАЧЕНИЯ конкретного свойства. Ссылка вида свойства — третий отдельный тип. Их нельзя взаимозаменять.
Непустое имя таблицы имеет приоритет: соответствующий текст запроса игнорируется. Чтобы использовать запрос, имя таблицы нужно очистить и дать корректный текст; в уроке выполняется именно это. Присутствие сразу двух непустых параметров не заявляется совместным источником.
В native-описании аргумента ПолеТипаЗначения встречается указание на источник значений, но отдельное свойство и официальный пример 1С связывают его со СПИСКОМ видов характеристик. Здесь оно явно берётся из ПВХ/запроса видов. Пустая строка не используется как способ угадать числовой тип.
Схема описывает, откуда СКД сможет получать свойства, но не является выполненным отчётом и не хранит автоматически цену у товара. Здесь нет Запрос.Выполнить, записей, транзакций, сети, печати или рабочих баз. Обычные колонки и дочерние объекты копии принадлежат своим родительским схемам.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.