Содержит описания характеристик.
Полное описание, параметры и ограничения
ОписаниеХарактеристик (CharacteristicsDescription)
ОписаниеХарактеристик (CharacteristicsDescription)
Доступен, начиная с версии 8.2.
Свойства:
ВидыХарактеристик (CharacteristicTypes)
ЗначениеОтбораВидов (TypesFilterValue)
ЗначенияХарактеристик (CharacteristicValues)
ПолеВида (TypeField)
ПолеЗначения (ValueField)
ПолеИспользованияМножественныхЗначений (MultipleValuesUseField)
ПолеКлюча (KeyField)
ПолеКлючаМножественныхЗначений (MultipleValuesKeyField)
ПолеОбъекта (ObjectField)
ПолеОтбораВидов (TypesFilterField)
ПолеПорядкаМножественныхЗначений (MultipleValuesOrderField)
ПолеПутиКДанным (DataPathField)
Описание:
Содержит описания характеристик.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Проверить описание одиночных и множественных характеристик своей Книги
Описание берётся из реально подготовленных собственных метаданных. Проверяем все связи плана/регистра/полей, булевый отбор, одиночный Цвет и две упорядоченные Метки; код только читает свой стенд.
Где и как запускать
Полный серверный общий модуль УчебныеХарактеристики85 собственной конфигурации УчебноеОписаниеХарактеристик85 и отдельный полный модуль формы. В1С не запускался.
Подготовка
НОВАЯ отдельная пустая файловая база8.5.1.1343, Имя конфигурации УчебноеОписаниеХарактеристик85, совместимость Не использовать, Русский. Только свой один справочник, один план характеристик и один регистр сведений ниже. Без расширений, подписок, заданий, общих реквизитов и рабочей информации. Все модули вручную пусты, кроме собственного общего модуля.
Конфигуратор → Справочники → УчебныеКниги85: без иерархии, Код Строка10, автонумерация выключена, Наименование100. План видов характеристик УчебныеВиды85: без иерархии, Код Строка10 без автонумерации, Наименование100, тип значения характеристик только Строка100. Его собственные реквизиты: ДляКниг Булево, Множественный Булево, Путь Строка100.
Регистр сведений УчебныеЗначения85: независимый, непериодический. Измерения Книга СправочникСсылка.УчебныеКниги85, Вид ПланВидовХарактеристикСсылка.УчебныеВиды85, КлючЧасти Число10.0 неотрицательное. Ресурсы Значение Строка100 и Порядок Число6.0 неотрицательное. КлючЧасти включён в ключ записи: двум Меткам нужны разные значения1/2; одиночному Цвету нужно значение0 по умолчанию.
Справочник УчебныеКниги85 → вкладка Данные → Характеристики: добавьте РОВНО ОДНО описание. Источник видов=ПланВидовХарактеристик.УчебныеВиды85; поле ключа=Ссылка; поле отбора видов=ДляКниг, значение отбора=БулевоИстина; поле пути к данным=Путь; поле использования множественных значений=Множественный. Источник значений=РегистрСведений.УчебныеЗначения85; поле объекта=Книга; поле вида=Вид; поле значения=Значение; поле ключа множественных значений=КлючЧасти; поле порядка множественных значений=Порядок. Выбирайте реальные поля, не вводите их как фиктивные строки в BSL.
Общий модуль УчебныеХарактеристики85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Своя внешняя обработка УчебныеХарактеристики85 → управляемая Форма: команда/кнопка Выполнить, действие Выполнить; полный отдельный модуль формы ниже. Будущая ручная подготовка: сохранить и обновить собственную базу F7.
Будущая ручная подготовка только своей базы: один элемент книги, Код BOOK, Наименование Книга. Два вида: CLR/Цвет, ДляКниг=Истина, Множественный=Ложь; TAG/Метки, ДляКниг=Истина, Множественный=Истина. Для обоих Путь пустой: поле в описании настроено, но привязку к прямому пути этот опыт не использует.
Ровно три записи собственного регистра для этой книги: CLR/КлючЧасти0/Порядок1/ЗначениеКрасный; TAG/КлючЧасти1/Порядок1/ЗначениеУчебник; TAG/КлючЧасти2/Порядок2/ЗначениеБумага. Вставка записей — будущая ручная подготовка, не действие кода. Никакая рабочая конфигурация не меняется.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Если Метаданные.Справочники.Найти("УчебныеКниги85") = Неопределено
Или Метаданные.ПланыВидовХарактеристик.Найти("УчебныеВиды85") = Неопределено
Или Метаданные.РегистрыСведений.Найти("УчебныеЗначения85") = Неопределено Тогда
ВызватьИсключение "Нужны только три собственных объекта подготовленного стенда";
КонецЕсли;
Описания = Метаданные.Справочники.УчебныеКниги85.Характеристики;
Если ТипЗнч(Описания) <> Тип("ОписанияХарактеристик") Или Описания.Количество() <> 1 Тогда
ВызватьИсключение "В своём справочнике должна быть одна полностью настроенная схема характеристик";
КонецЕсли;
Описание = Описания.Получить(0);
Если ТипЗнч(Описание) <> Тип("ОписаниеХарактеристик") Или Описания.Индекс(Описание) <> 0 Тогда
ВызватьИсключение "Нужно реальное описание из собственного объекта метаданных";
КонецЕсли;
Если Описание.ВидыХарактеристик <> Метаданные.ПланыВидовХарактеристик.УчебныеВиды85 Тогда
ВызватьИсключение "Виды должны браться только из собственного плана УчебныеВиды85";
КонецЕсли;
Если Описание.ЗначенияХарактеристик <> Метаданные.РегистрыСведений.УчебныеЗначения85 Тогда
ВызватьИсключение "Значения должны браться только из собственного регистра УчебныеЗначения85";
КонецЕсли;
Если ТипЗнч(Описание.ЗначениеОтбораВидов) <> Тип("Булево") Или Не Описание.ЗначениеОтбораВидов Тогда
ВызватьИсключение "Значение отбора видов должно быть именно БулевоИстина, не строка";
КонецЕсли;
ПроверитьСвоёПоле(Описание.ПолеКлюча, "Ссылка");
ПроверитьСвоёПоле(Описание.ПолеОтбораВидов, "ДляКниг");
ПроверитьСвоёПоле(Описание.ПолеПутиКДанным, "Путь");
ПроверитьСвоёПоле(Описание.ПолеИспользованияМножественныхЗначений, "Множественный");
ПроверитьСвоёПоле(Описание.ПолеОбъекта, "Книга");
ПроверитьСвоёПоле(Описание.ПолеВида, "Вид");
ПроверитьСвоёПоле(Описание.ПолеЗначения, "Значение");
ПроверитьСвоёПоле(Описание.ПолеКлючаМножественныхЗначений, "КлючЧасти");
ПроверитьСвоёПоле(Описание.ПолеПорядкаМножественныхЗначений, "Порядок");
Книга = Справочники.УчебныеКниги85.НайтиПоКоду("BOOK");
Цвет = ПланыВидовХарактеристик.УчебныеВиды85.НайтиПоКоду("CLR");
Метки = ПланыВидовХарактеристик.УчебныеВиды85.НайтиПоКоду("TAG");
Если Не ЗначениеЗаполнено(Книга) Или Не ЗначениеЗаполнено(Цвет) Или Не ЗначениеЗаполнено(Метки) Тогда
ВызватьИсключение "Вручную подготовьте только собственную Книгу, Цвет и Метки";
КонецЕсли;
Если Книга.Наименование <> "Книга" Или Цвет.Наименование <> "Цвет" Или Метки.Наименование <> "Метки"
Или Не Цвет.ДляКниг Или Не Метки.ДляКниг Или Цвет.Множественный Или Не Метки.Множественный
Или Цвет.Путь <> "" Или Метки.Путь <> "" Тогда
ВызватьИсключение "Два собственных вида должны иметь точные исходные признаки и пустой необязательный путь";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ З.Вид.Код КАК КодВида, З.КлючЧасти КАК КлючЧасти,
|З.Порядок КАК Порядок, З.Значение КАК Значение
|ИЗ РегистрСведений.УчебныеЗначения85 КАК З
|ГДЕ З.Книга = &Книга И З.Вид.ДляКниг = &ДляКниг
|УПОРЯДОЧИТЬ ПО КодВида, Порядок";
Запрос.УстановитьПараметр("Книга", Книга);
Запрос.УстановитьПараметр("ДляКниг", Истина);
Значения = Запрос.Выполнить().Выгрузить();
Если ТипЗнч(Значения) <> Тип("ТаблицаЗначений") Или Значения.Количество() <> 3 Тогда
ВызватьИсключение "В собственном регистре должны быть только три подготовленных значения этой Книги";
КонецЕсли;
ПроверитьСвоюСтроку(Значения[0], "CLR", 0, 1, "Красный");
ПроверитьСвоюСтроку(Значения[1], "TAG", 1, 1, "Учебник");
ПроверитьСвоюСтроку(Значения[2], "TAG", 2, 2, "Бумага");
Сообщить("Связность всех двенадцати свойств описания подтверждена собственными метаданными и данными");
Сообщить("Книга: Цвет=Красный; Метки по порядку: Учебник, Бумага. Данные не записывались");
КонецПроцедуры
Процедура ПроверитьСвоёПоле(Поле, ИмяПоля)
Если ТипЗнч(Поле) <> Тип("Поле") Тогда
ВызватьИсключение "В описании требуется настроенное native-Поле " + ИмяПоля;
КонецЕсли;
Если Поле.Имя <> ИмяПоля Тогда
ВызватьИсключение "Описание ссылается не на собственное ожидаемое поле " + ИмяПоля;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоюСтроку(СтрокаЗначений, КодВида, КлючЧасти, Порядок, Значение)
Если ТипЗнч(СтрокаЗначений.КодВида) <> Тип("Строка") Или СтрокаЗначений.КодВида <> КодВида
Или ТипЗнч(СтрокаЗначений.КлючЧасти) <> Тип("Число") Или СтрокаЗначений.КлючЧасти <> КлючЧасти
Или ТипЗнч(СтрокаЗначений.Порядок) <> Тип("Число") Или СтрокаЗначений.Порядок <> Порядок
Или ТипЗнч(СтрокаЗначений.Значение) <> Тип("Строка") Или СтрокаЗначений.Значение <> Значение Тогда
ВызватьИсключение "Не совпали все поля и типы собственной строки значения характеристики";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 1 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 1 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыУчебныеХарактеристики85.Форма
Своя внешняя обработка УчебныеХарактеристики85 → управляемая Форма → Модуль
Полный отдельный модуль формы, вызывающий свой серверный общий модуль; не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеХарактеристики85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Метаданные.Справочники.УчебныеКниги85.Характеристики — настоящая readonly-коллекция ОписанияХарактеристик. Только после проверки количества1 Получить(0) даёт реальное ОписаниеХарактеристик. Индекс подтверждает принадлежность именно этой коллекции.
ВидыХарактеристик и ЗначенияХарактеристик сравниваются с конкретными собственными объектами метаданных плана и регистра. Это ссылки на метаданные, не значения записей, не строки имени и не пользовательские реквизиты формы.
ЗначениеОтбораВидов должно иметь тип Булево и равняться Истина. ПолеОтбораВидов указывает на собственное ДляКниг. Отбор типов проверяется отдельно от связи регистра с Книгой.
Все девять полей описания проверяются как настоящие объекты Поле с точными именами. ПолеКлюча=Ссылка связывает вид с планом; ПолеОбъекта=Книга и ПолеВида=Вид связывают собственную запись регистра с книгой и видом.
ПолеПутиКДанным указывает на подготовленное поле Путь. Его значения здесь намеренно пусты: проверяется метаданный маршрут, не автоматическое построение виртуального поля или привязки формы.
ПолеИспользованияМножественныхЗначений читает Множественный у вида. ПолеКлючаМножественныхЗначений указывает на КлючЧасти; собственный одиночный Цвет имеет ключ0, две Метки имеют разные ключи1/2. ПолеПорядкаМножественныхЗначений указывает на Порядок1/2.
После аудита метаданных получаем только собственные подготовленные ссылки по точным кодам, проверяем заполненность, имена и исходные признаки. Затем обычный параметризованный запрос читает три собственные строки и сверяет все их типы/значения.
Запрос явно читает регистр и упорядочивает по КодВида/Порядок. Он не выдаётся за проверку автоматически созданных виртуальных характеристик СКД. Связность описания и согласованность подготовленных данных — два отдельные результата.
Как проверить результат
Будущий результат: все двенадцать свойств описания имеют ожидаемые реальные значения/ссылки; Цвет — один Красный с ключом0, Метки — Учебник и Бумага с ключами1/2 и порядком1/2. Данные не записывались кодом.
Будущий отрицательный контроль метаданных: в своём описании характеристик выберите Порядок вместо КлючЧасти для поля ключа множественности. После обновления только своего стенда проверка должна остановиться на несовпадении ПолеКлючаМножественныхЗначений, до чтения значений. Верните исходное описание после опыта.
Будущий отрицательный контроль данных: вручную измените только собственное значение TAG/КлючЧасти2 с Бумага на Иное. Аудит метаданных останется корректным, но проверка полной третьей строки должна отвергнуть данные. Верните свой fixture после опыта.
runtimeVerifiedScenarios=0: конфигуратор, BSL, запрос, формы и записи1С здесь не запускались. Приведены полный код и будущая ручная подготовка только собственного учебного стенда.
Ожидаемый результат
Связность описания характеристик отделена от проверки собственных записей: проверены источники, все поля, отбор, одиночность и порядок двух множественных значений.
На что обратить внимание
У ОписаниеХарактеристик нет используемого здесь конструктора, а все его свойства readonly. Не присваивайте Описание.ПолеВида или Описание.ВидыХарактеристик из кода; настройка делается в своём Конфигураторе и перечитывается как метаданные.
Необязательные поля в других описаниях могут быть не настроены. Здесь они обязательны именно для подготовленного учебного описания; неподготовленный объект не подменяется строкой имени или пустым новым объектом.
Поле — отдельный native-тип, не ПолеФормы, не ПолеКомпоновкиДанных и не значение реквизита. Его Имя только читается. Поля видов и поля значений принадлежат разным источникам.
Значение по умолчанию ключа одиночной характеристики зависит от типа поля. Здесь ключ числовой, поэтому собственный одиночный Цвет использует0. Это не универсальное правило для ключа Строка/Ссылка/УникальныйИдентификатор.
Порядок задаётся отдельным подготовленным полем; совпадающие значения Порядок потребовали бы дополнительного согласованного порядка. В данном fixture порядки Меток различны.
Пустые значения Путь не подтверждают автоматическую привязку характеристик к пути данных. Не заявляется успешный динамический список, виртуальные поля запроса или интерфейс СКД: такой опыт требует отдельного исполнения.
Источник инспирации — структура штатных описаний в прочитанном XML УНФ; рабочий XML не редактировался и его бизнес-объекты в учебную схему не скопированы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.