Тип: Строка. Запрос, из которого будут получены значения характеристик.
Полное описание, параметры и ограничения
ХарактеристикаКомпоновкиДанныхСхемыЗапроса.ЗначенияХарактеристикЗапрос (QuerySchemaDataCompositionCharacteristic.CharacteristicValuesQuery)
ХарактеристикаКомпоновкиДанныхСхемыЗапроса (QuerySchemaDataCompositionCharacteristic)
ЗначенияХарактеристикЗапрос (CharacteristicValuesQuery)
Доступен, начиная с версии 8.3.14.
Использование:
Только чтение.
Описание:
Тип: Строка.
Запрос, из которого будут получены значения характеристик.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.14.
Методическая информация
Практические примеры
Характеристики товаров СКД: свой ПВХ, регистр, таблицы и запросы с полным восстановлением
Описываем для собственных товаров виды числовых свойств и место хранения значений. Переключаем источники с таблиц на запросы с другими именами полей, возвращаем таблицы, удаляем и восстанавливаем описание. Семь самостоятельных разборов проверяют все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С связывают его со СПИСКОМ видов характеристик. Здесь оно явно берётся из ПВХ/запроса видов. Пустая строка не используется как способ угадать числовой тип.
Схема описывает, откуда СКД сможет получать свойства, но не является выполненным отчётом и не хранит автоматически цену у товара. Здесь нет Запрос.Выполнить, записей, транзакций, сети, печати или рабочих баз. Обычные колонки и дочерние объекты копии принадлежат своим родительским схемам.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.