ХарактеристикаКомпоновкиДанныхСхемыЗапроса.ЗначенияХарактеристикЗапрос

Свойства · CharacteristicValuesQuery

Тип: Строка. Запрос, из которого будут получены значения характеристик.

Полное описание, параметры и ограничения

ХарактеристикаКомпоновкиДанныхСхемыЗапроса.ЗначенияХарактеристикЗапрос (QuerySchemaDataCompositionCharacteristic.CharacteristicValuesQuery)

ХарактеристикаКомпоновкиДанныхСхемыЗапроса (QuerySchemaDataCompositionCharacteristic)

ЗначенияХарактеристикЗапрос (CharacteristicValuesQuery)

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

Использование:
Только чтение.
Описание:
Тип: Строка.
Запрос, из которого будут получены значения характеристик.
Доступность:

Сервер, толстый клиент, внешнее соединение.

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

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

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

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

Характеристики товаров СКД: свой ПВХ, регистр, таблицы и запросы с полным восстановлением

Описываем для собственных товаров виды числовых свойств и место хранения значений. Переключаем источники с таблиц на запросы с другими именами полей, возвращаем таблицы, удаляем и восстанавливаем описание. Семь самостоятельных разборов проверяют все11 readonly-свойств и неизменные колонки товаров.

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

Полный серверный общий модуль УчебныеЗадачи нового собственного стенда УчебныеХарактеристики85; только метаданные и модель в памяти, запуск в1С не проверен.

Подготовка

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

  2. Справочники → УчебныеТовары85: неиерархический, код Строка3, наименование40, без владельцев, реквизитов и табличных частей. Автонумерация выключена. Модули объекта/менеджера пусты; элементы не создавайте.

  3. Планы видов характеристик → УчебныеВиды85: неиерархический, код Строка3, наименование40. В свойстве Тип разрешите только Число12,2; дополнительные значения характеристик не назначайте. Без реквизитов, табличных частей и предопределённых видов; модули пусты. Это допустимые ТИПЫ значений, не тип ссылки на вид свойства.

  4. Регистры сведений → УчебныеЗначения85: независимый, непериодический. Измерение Товар: СправочникСсылка.УчебныеТовары85; измерение Вид: ПланВидовХарактеристикСсылка.УчебныеВиды85; ресурс Значение: Число12,2. Реквизитов и обработчиков нет. Записи не создавайте: данный урок редактирует модель запроса, а не значения характеристик.

  5. Общие → Общие модули → УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной код. Создайте свою внешнюю обработку УчебныеХарактеристикиЗапроса85, управляемую Форму и команду/кнопку Выполнить с действием Выполнить, без реквизитов. Полный отдельный модуль формы дан ниже.

  6. Вне опыта завершите прежний свой сеанс без транзакции, сохраните свою конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (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 → управляемая Форма → Модуль

Полный отдельный модуль своей управляемой формы; модель схемы работает на сервере, здесь не запускался.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственное описание характеристик, изменение источников и полный повторный разбор проверены");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеЗадачи.ВыполнитьПример();
КонецПроцедуры

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

  1. Проверить точную платформу, отсутствие расширений/чужой транзакции и всю собственную модель. Регистр связывает конкретный товар с конкретным видом свойства; числовой ресурс согласован с допустимыми значениями ПВХ.

  2. Разобрать два своих обычных запроса источников без выполнения. Виды дают Ключ/Имя/ТипЗначения; значения дают Объект/Характеристика/ЗначениеХарактеристики. Проверить каждую колонку, порядок, полное выражение и точный набор типов. Получить канонические тексты от СхемаЗапроса, не угадывая отступы.

  3. Разобрать основную схему товаров в режиме СКД. Обычные колонки Товар и Наименование сохраняются на всех этапах. Коллекция Характеристики принадлежит ЗапросВыбораСхемыЗапроса; исходно она пуста.

  4. Добавить описание для ОписаниеТипов собственного СправочникСсылка.УчебныеТовары85. Режим таблиц: виды — свой ПВХ, ключ Ссылка, имя Наименование, тип ТипЗначения; значения — свой регистр, объект Товар, вид Вид, значение Значение. Параметры текстов запросов пусты, поскольку имена таблиц заданы.

  5. Проверить все11 readonly-свойств: Тип — описание ровно одного типа ссылки товара; остальные десять — строки с точными именами/пустыми текстами. Проверить Количество1, Получить(0), [], Индекс0 и совпадение возвращённого Добавить с текущим элементом. Сформировать текст и полностью проверить новую самостоятельную схему.

  6. Изменить принимает индекс0 и ещё11 аргументов, возвращает текущее описание. Переключить обе таблицы на пустые имена и передать собственные канонические запросы; одновременно изменить имена полей на их псевдонимы Ключ/Имя и Объект/Характеристика/ЗначениеХарактеристики. Полученный элемент проверить заново, старое описание после Изменить не использовать.

  7. В режиме запросов сверить все свойства, каждую ссылочную связь и полный канонический текст обоих источников. Отдельно сохранить Копия с этим описанием. Вернуть оригинал к таблицам через Изменить и повторно проверить все свойства и новый полный разбор.

  8. Удалить принимает числовой индекс0, не объект. Проверить пустую коллекцию при сохранённых колонках товаров; восстановить новым Добавить и ещё раз проверить режим таблиц. Очистить только оригинал. Финально оригинал пуст, Копия продолжает хранить оба источника-запроса и все имена. Семь контрольных разборов плюс независимая сохраняемая копия.

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

  1. Будущий результат: исходная схема после очистки имеет0 характеристик и2 обычные колонки. Копия имеет1 описание для собственного типа ссылки товара, таблицы-источники пусты, два запроса полностью соответствуют своим ПВХ/регистру. Имена Ключ, Имя, ТипЗначения, Объект, Характеристика, ЗначениеХарактеристики сохранены.

  2. В режиме таблиц проверяются полные имена собственного ПВХ и регистра, поля Ссылка/Наименование/ТипЗначения и Товар/Вид/Значение, пустые тексты запросов. В режиме запросов проверяются не только непустые строки, но точные источники, выражения, типы и полный канонический текст. Ни элементы товаров/ПВХ, ни строки регистра не создаются.

  3. Будущий отрицательный контроль вне опыта: в ожидании ПолеВида заменить Характеристика на Вид только для режима запросов. После сохранения/F7 до свежего собственного сеанса полная проверка должна отказать, хотя число характеристик1. Вернуть код и до нового сеанса снова сохранить/F7. Здесь контроль не исполнялся.

  4. runtimeVerifiedScenarios=0. Static/native-проверки не являются выполнением в1С, отображением настроек СКД или получением настоящих значений товаров. Состояния описаны как будущие ручные проверки в собственной пустой базе.

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

Описаны обе стороны хранения характеристик и реальный жизненный цикл собственного описания СКД; все свойства проверяются после изменения и самостоятельного восстановления, без неизвестных входных объектов.

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

  1. Все свойства ХарактеристикаКомпоновкиДанныхСхемыЗапроса readonly. Для изменения используется Изменить коллекции, а не присваивание ПолеКлюча, Тип или другого свойства. После Изменить берём возвращённый/текущий элемент, после удаления старый элемент не читается.

  2. Тип описания характеристики — тип ОБЪЕКТА, которому принадлежат свойства: ссылка своего товара. ТипЗначения в источнике видов — допустимый тип ЗНАЧЕНИЯ конкретного свойства. Ссылка вида свойства — третий отдельный тип. Их нельзя взаимозаменять.

  3. Непустое имя таблицы имеет приоритет: соответствующий текст запроса игнорируется. Чтобы использовать запрос, имя таблицы нужно очистить и дать корректный текст; в уроке выполняется именно это. Присутствие сразу двух непустых параметров не заявляется совместным источником.

  4. В native-описании аргумента ПолеТипаЗначения встречается указание на источник значений, но отдельное свойство и официальный пример 1С связывают его со СПИСКОМ видов характеристик. Здесь оно явно берётся из ПВХ/запроса видов. Пустая строка не используется как способ угадать числовой тип.

  5. Схема описывает, откуда СКД сможет получать свойства, но не является выполненным отчётом и не хранит автоматически цену у товара. Здесь нет Запрос.Выполнить, записей, транзакций, сети, печати или рабочих баз. Обычные колонки и дочерние объекты копии принадлежат своим родительским схемам.

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

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

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

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

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