НаборДанныхЗапросСхемыКомпоновкиДанных.Имя

Свойства · Name

Тип: Строка. Имя набора данных.

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

НаборДанныхЗапросСхемыКомпоновкиДанных.Имя (DataCompositionSchemaDataSetQuery.Name)

НаборДанныхЗапросСхемыКомпоновкиДанных (DataCompositionSchemaDataSetQuery)

Имя (Name)

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

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

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

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

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

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

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

Папки полей СКД и безопасный редактор логических источников

Два буквальных набора имеют свои папки Первый85/Второй85 и уникальные пути полей. Проверяем полярность запрета отбора, порядок источников, переназначение наборов до удаления источника и восстановление источников раньше наборов. Независимая копия сохраняет полный состав.

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

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

Подготовка

  1. НОВАЯ отдельная учебная база, не копия рабочей: точно8.5.1.1343, конфигурация УчебныеПапкиИсточники85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и заданий. Модули вручную пустые, кроме этого общего модуля.

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

  3. Будущая ручная подготовка вне опыта: завершить прежний свой сеанс, сохранить, Обновить конфигурацию базы данных (F7), открыть свежий свой клиент и обработку. Здесь ни F7, ни 1С не запускались.

  4. Записи базы и настоящие подключения не нужны. Основной85/Резерв85 — две логические записи Local в модели одной схемы, не две разные реальные базы. Запросы содержат только свои литералы A01/3 и B02/5; строк соединения и выполнения нет.

  5. Для обоих количеств3/5 задаётся Число(1,0,Неотрицательный) вторым аргументом ОписаниеТипов: один разряд ВСЕГО, ноль дробных, диапазон0–9. Проверяются разрядность, дробная часть и знак каждого числового описания. Это ограниченный собственный опыт, не диапазон количества рабочего отчёта.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Привилегированный режим в своём редакторе не нужен";
    КонецЕсли;
    Пусто = Новый Массив;
    Имена = СтрРазделить("Основной85,Резерв85", ",");
    ОбаОсновной = СтрРазделить("Основной85,Основной85", ",");
    ОбаРезерв = СтрРазделить("Резерв85,Резерв85", ",");
    Схема = Новый СхемаКомпоновкиДанных;
    Каталог = Схема.ИсточникиДанных;
    ПроверитьСвоюСхему(Схема, Пусто, Пусто, Ложь);
    Основной = Каталог.Добавить();
    ЗаполнитьСвойИсточник(Основной, "Основной85");
    ПроверитьСвоюСхему(Схема, СтрРазделить("Основной85", ","), Пусто, Ложь);
    ВосстановитьСвоиНаборы(Схема, ОбаОсновной);
    ПроверитьСвоюСхему(Схема, СтрРазделить("Основной85", ","), ОбаОсновной, Ложь);
    Резерв = Каталог.Вставить(0);
    ЗаполнитьСвойИсточник(Резерв, "Резерв85");
    ПроверитьСвоюСхему(Схема, СтрРазделить("Резерв85,Основной85", ","), ОбаОсновной, Ложь);
    Каталог.Сдвинуть(Резерв, 1);
    ПроверитьСвоюСхему(Схема, Имена, ОбаОсновной, Ложь);
    ПервыйНабор = Схема.НаборыДанных.Получить(0);
    ВторойНабор = Схема.НаборыДанных.Получить(1);
    ВторойНабор.ИсточникДанных = "Резерв85";
    ПроверитьСвоюСхему(Схема, Имена, Имена, Ложь);
    Копия = СоздатьСвоюПолнуюСхему();
    ПроверитьСвоюСхему(Копия, Имена, Имена, Ложь);
    ПерваяПапка = ПервыйНабор.Поля.Получить(0);
    УстановитьСвойЗапретОтбора(ПерваяПапка, Истина);
    ПроверитьСвоюСхему(Схема, Имена, Имена, Истина);
    ПроверитьСвоюСхему(Копия, Имена, Имена, Ложь);
    УстановитьСвойЗапретОтбора(ПерваяПапка, Ложь);
    ПроверитьСвоюСхему(Схема, Имена, Имена, Ложь);
    ПервыйНабор.ИсточникДанных = "Резерв85";
    ПроверитьСвоюСхему(Схема, Имена, ОбаРезерв, Ложь);
    УдалитьСвойНезависимыйИсточник(Схема, Основной);
    ПроверитьСвоюСхему(Схема, СтрРазделить("Резерв85", ","), ОбаРезерв, Ложь);
    ПроверитьСвоюСхему(Копия, Имена, Имена, Ложь);
    НовыйОсновной = Каталог.Вставить(0);
    ЗаполнитьСвойИсточник(НовыйОсновной, "Основной85");
    ПроверитьСвоюСхему(Схема, Имена, ОбаРезерв, Ложь);
    ПервыйНабор.ИсточникДанных = "Основной85";
    ПроверитьСвоюСхему(Схема, Имена, Имена, Ложь);
    Схема.НаборыДанных.Очистить();
    ПроверитьСвоюСхему(Схема, Имена, Пусто, Ложь);
    Каталог.Очистить();
    ПроверитьСвоюСхему(Схема, Пусто, Пусто, Ложь);
    ПроверитьСвоюСхему(Копия, Имена, Имена, Ложь);
    ВосстановитьСвоиИсточники(Схема);
    ПроверитьСвоюСхему(Схема, Имена, Пусто, Ложь);
    ВосстановитьСвоиНаборы(Схема, Имена);
    ПроверитьСвоюСхему(Схема, Имена, Имена, Ложь);
    ПроверитьСвоюСхему(Копия, Имена, Имена, Ложь);
    Сообщить("Свои папки и источники восстановлены без ссылок на отсутствующие источники");
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция СвойЗапросПапки(Имя)
    Если Имя = "Первый85" Тогда
        Возврат "ВЫБРАТЬ ""A01"" КАК Код, 3 КАК Количество";
    ИначеЕсли Имя = "Второй85" Тогда
        Возврат "ВЫБРАТЬ ""B02"" КАК Код, 5 КАК Количество";
    КонецЕсли;
    ВызватьИсключение "В собственной схеме только два известных буквальных запроса";
КонецФункции

Процедура ЗаполнитьСвойИсточник(Источник, Имя)
    Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен свой действительный источник";
    КонецЕсли;
    Если Имя <> "Основной85" И Имя <> "Резерв85" Тогда
        ВызватьИсключение "В опыте только свои основной и резервный логические источники";
    КонецЕсли;
    Источник.Имя = Имя;
    Источник.ТипИсточникаДанных = "Local";
КонецПроцедуры

Процедура УстановитьСвойЗапретОтбора(Папка, Запрет)
    Если ТипЗнч(Папка) <> Тип("ПапкаПолейНабораДанныхСхемыКомпоновкиДанных") Или ТипЗнч(Запрет) <> Тип("Булево") Тогда
        ВызватьИсключение "Нужны собственная папка и настоящий булев запрет";
    КонецЕсли;
    Ограничения = Папка.ОграничениеИспользования;
    Если ТипЗнч(Ограничения) <> Тип("ОграничениеИспользованияПоляСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Папка должна вернуть действительный объект ограничений";
    КонецЕсли;
    Ограничения.Поле = Ложь;
    Ограничения.Группировка = Ложь;
    Ограничения.Порядок = Ложь;
    Ограничения.Условие = Запрет;
КонецПроцедуры

Функция СвойТипКоличестваПапки()
    Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный));
КонецФункции

Процедура ПроверитьСвоюРазрядностьПапки(Описание)
    Квалификаторы = Описание.КвалификаторыЧисла;
    Если ТипЗнч(Квалификаторы) <> Тип("КвалификаторыЧисла") Или Квалификаторы.Разрядность <> 1
        Или Квалификаторы.РазрядностьДробнойЧасти <> 0
        Или Квалификаторы.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный Тогда
        ВызватьИсключение "Своё количество папки имеет один разряд, ноль дробных и неотрицательный знак";
    КонецЕсли;
КонецПроцедуры

Процедура ЗаполнитьСвойНабор(Схема, Набор, Имя, ИмяИсточника)
    Запрос = СвойЗапросПапки(Имя);
    Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")
        Или Схема.ИсточникиДанных.Найти(ИмяИсточника) = Неопределено Тогда
        ВызватьИсключение "Нужен свой набор и уже объявленный собственный источник";
    КонецЕсли;
    Набор.Имя = Имя;
    Набор.ИсточникДанных = ИмяИсточника;
    Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
    Набор.Запрос = Запрос;
    Папка = Набор.Поля.Добавить(Тип("ПапкаПолейНабораДанныхСхемыКомпоновкиДанных"));
    Если ТипЗнч(Папка) <> Тип("ПапкаПолейНабораДанныхСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужна настоящая собственная папка, не простое поле";
    КонецЕсли;
    Папка.ПутьКДанным = Имя;
    Папка.Заголовок = "Поля " + Имя;
    УстановитьСвойЗапретОтбора(Папка, Ложь);
    Имена = СтрРазделить("Код,Количество", ",");
    Для Индекс = 0 По 1 Цикл
        Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Нужно своё простое поле с явным типом";
        КонецЕсли;
        Поле.Поле = Имена[Индекс];
        Поле.ПутьКДанным = Имя + "." + Имена[Индекс];
        Если Индекс = 0 Тогда
            Поле.ТипЗначения = Новый ОписаниеТипов("Строка");
        Иначе
            Поле.ТипЗначения = СвойТипКоличестваПапки();
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ПроверитьСвоюСхему(Схема, ИменаИсточников, ИсточникиНаборов, ОтборПервойЗапрещен)
    Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных")
        Или Схема.ИсточникиДанных.Количество() <> ИменаИсточников.Количество()
        Или Схема.НаборыДанных.Количество() <> ИсточникиНаборов.Количество() Тогда
        ВызватьИсключение "Не совпал весь собственный состав источников и наборов";
    КонецЕсли;
    Для Индекс = 0 По ИменаИсточников.Количество() - 1 Цикл
        Источник = Схема.ИсточникиДанных.Получить(Индекс);
        Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных")
            Или Источник.Имя <> ИменаИсточников[Индекс] Или Источник.ТипИсточникаДанных <> "Local"
            Или Схема.ИсточникиДанных.Индекс(Источник) <> Индекс
            Или Схема.ИсточникиДанных[Индекс] <> Источник
            Или Схема.ИсточникиДанных.Найти(ИменаИсточников[Индекс]) <> Источник Тогда
            ВызватьИсключение "Не совпали полный порядок, имя, тип и поиск своих источников";
        КонецЕсли;
    КонецЦикла;
    Если Схема.ИсточникиДанных.Найти("НетТакогоИсточника85") <> Неопределено Тогда
        ВызватьИсключение "Отсутствующий собственный источник не должен находиться";
    КонецЕсли;
    Если ИсточникиНаборов.Количество() <> 0 И ИсточникиНаборов.Количество() <> 2 Тогда
        ВызватьИсключение "В редакторе допускается пустой состав либо обе собственные части";
    КонецЕсли;
    ИменаНаборов = СтрРазделить("Первый85,Второй85", ",");
    Для ИндексНабора = 0 По ИсточникиНаборов.Количество() - 1 Цикл
        Имя = ИменаНаборов[ИндексНабора];
        Набор = Схема.НаборыДанных.Получить(ИндексНабора);
        Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")
            Или Набор.Имя <> Имя Или Набор.ИсточникДанных <> ИсточникиНаборов[ИндексНабора]
            Или Схема.ИсточникиДанных.Найти(Набор.ИсточникДанных) = Неопределено
            Или Схема.НаборыДанных.Найти(Имя) <> Набор Или Набор.Запрос <> СвойЗапросПапки(Имя)
            Или Набор.АвтоЗаполнениеДоступныхПолей Или Набор.Поля.Количество() <> 3 Тогда
            ВызватьИсключение "Не совпали весь запрос, полный состав полей и действительная ссылка на источник";
        КонецЕсли;
        Папка = Набор.Поля.Получить(0);
        Если ТипЗнч(Папка) <> Тип("ПапкаПолейНабораДанныхСхемыКомпоновкиДанных")
            Или Папка.ПутьКДанным <> Имя Или Папка.Заголовок <> "Поля " + Имя Тогда
            ВызватьИсключение "Не совпали собственные полный путь и заголовок папки";
        КонецЕсли;
        ОжидаемыйЗапрет = Ложь;
        Если ИндексНабора = 0 Тогда
            ОжидаемыйЗапрет = ОтборПервойЗапрещен;
        КонецЕсли;
        Ограничения = Папка.ОграничениеИспользования;
        Если ТипЗнч(Ограничения) <> Тип("ОграничениеИспользованияПоляСхемыКомпоновкиДанных")
            Или ТипЗнч(Ограничения.Поле) <> Тип("Булево") Или Ограничения.Поле
            Или ТипЗнч(Ограничения.Группировка) <> Тип("Булево") Или Ограничения.Группировка
            Или ТипЗнч(Ограничения.Порядок) <> Тип("Булево") Или Ограничения.Порядок
            Или ТипЗнч(Ограничения.Условие) <> Тип("Булево") Или Ограничения.Условие <> ОжидаемыйЗапрет Тогда
            ВызватьИсключение "Не совпали все четыре булевых запрета собственной папки";
        КонецЕсли;
        Имена = СтрРазделить("Код,Количество", ",");
        Типы = СтрРазделить("Строка,Число", ",");
        Для Индекс = 0 По 1 Цикл
            Поле = Набор.Поля.Получить(Индекс + 1);
            Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
                Или Поле.Поле <> Имена[Индекс] Или Поле.ПутьКДанным <> Имя + "." + Имена[Индекс]
                Или ТипЗнч(Поле.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
                ВызватьИсключение "Не совпали собственные поля, префиксы и типы";
            КонецЕсли;
            ПолныеТипы = Поле.ТипЗначения.Типы();
            Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип(Типы[Индекс]) Тогда
                ВызватьИсключение "Не совпал полный единственный тип собственного поля";
            КонецЕсли;
            Если Индекс = 1 Тогда
                ПроверитьСвоюРазрядностьПапки(Поле.ТипЗначения);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Процедура ВосстановитьСвоиИсточники(Схема)
    Пусто = Новый Массив;
    ПроверитьСвоюСхему(Схема, Пусто, Пусто, Ложь);
    Основной = Схема.ИсточникиДанных.Добавить();
    ЗаполнитьСвойИсточник(Основной, "Основной85");
    Резерв = Схема.ИсточникиДанных.Добавить();
    ЗаполнитьСвойИсточник(Резерв, "Резерв85");
КонецПроцедуры

Процедура ВосстановитьСвоиНаборы(Схема, ИсточникиНаборов)
    Если Схема.НаборыДанных.Количество() <> 0 Или ИсточникиНаборов.Количество() <> 2 Тогда
        ВызватьИсключение "Восстановление только в свой пустой каталог наборов";
    КонецЕсли;
    Имена = СтрРазделить("Первый85,Второй85", ",");
    Для Индекс = 0 По 1 Цикл
        Если Схема.ИсточникиДанных.Найти(ИсточникиНаборов[Индекс]) = Неопределено Тогда
            ВызватьИсключение "Сначала восстановите собственные определения источников";
        КонецЕсли;
    КонецЦикла;
    Для Индекс = 0 По 1 Цикл
        Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
        ЗаполнитьСвойНабор(Схема, Набор, Имена[Индекс], ИсточникиНаборов[Индекс]);
    КонецЦикла;
КонецПроцедуры

Функция СоздатьСвоюПолнуюСхему()
    Схема = Новый СхемаКомпоновкиДанных;
    ВосстановитьСвоиИсточники(Схема);
    Имена = СтрРазделить("Основной85,Резерв85", ",");
    ВосстановитьСвоиНаборы(Схема, Имена);
    ПроверитьСвоюСхему(Схема, Имена, Имена, Ложь);
    Возврат Схема;
КонецФункции

Процедура УдалитьСвойНезависимыйИсточник(Схема, Источник)
    Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных") Или Схема.ИсточникиДанных.Индекс(Источник) < 0 Тогда
        ВызватьИсключение "Удаляется только действительный собственный источник этого каталога";
    КонецЕсли;
    Для Индекс = 0 По Схема.НаборыДанных.Количество() - 1 Цикл
        Набор = Схема.НаборыДанных.Получить(Индекс);
        Если Набор.ИсточникДанных = Источник.Имя Тогда
            ВызватьИсключение "Сначала переназначьте все собственные наборы на существующий источник";
        КонецЕсли;
    КонецЦикла;
    Схема.ИсточникиДанных.Удалить(Источник);
КонецПроцедуры
УчебныеПапкиИсточники85.Форма

Своя внешняя обработка УчебныеПапкиИсточники85 → управляемая Форма → Модуль

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

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

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

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

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

  2. Оба набора используют псевдонимы Код/Количество в Поле; разные ПутьКДанным предотвращают конфликт несвязанных наборов. В каждом каталоге ровно три элемента: папка, строковый Код, числовое Количество. Проверяются полный тип, путь, заголовок, порядок и полный запрос.

  3. У настоящего объекта ОграничениеИспользования явно задать все четыре Булево. Поле/Группировка/Порядок=Ложь, Условие сначала Ложь, затем Истина и обратно. Истина означает ЗАПРЕТ, а не разрешение. Условие — точное имя ограничения отбора, не выдуманное Отбор.

  4. Шестнадцать состояний оригинала сверяют весь каталог источников с именами/Local/индексами/числовым []/Найти, всю привязку каждого набора к существующему источнику, полные запросы и все поля/папки/четыре запрета. Изменение одного запрета сверяется отдельно, без изменения размеров каталогов.

  5. Добавить основной источник, объявить оба набора на нём. Вставить резервный в0, полностью проверить обратный порядок, затем Сдвинуть(Резерв,1). У источников Вставить получает только индекс, а не Тип; по имени используем Найти, не недокументированный строковый [].

  6. Переназначить второй набор на существующий резерв; после проверки и создания независимой копии переназначить первый. Теперь оба ссылаются на Резерв85. Помощник удаления сканирует ВСЕ свои наборы и запрещает удалять источник, на имя которого кто-либо ещё ссылается. Только после этого Удалить(Основной) как объект.

  7. Вставить новый основной в0, полностью заполнить, вернуть первый набор на него. Перед очисткой всех источников сначала очистить свой каталог наборов и подтвердить0; затем очистить источники. Восстановить две записи источников раньше двух наборов. Проверка существования обеих привязок выполняется до добавления наборов.

  8. Копия заново создаёт свои источники, оба запроса, папки, простые поля и ограничения. Пять сверок копии показывают сохранность после запрета отбора, удаления основного и очистки обоих каталогов оригинала. Старые ссылки после удаления/очистки не используются.

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

  1. Будущий итог модели: источники Основной85/Резерв85 в этом порядке; Первый85 ссылается на Основной85, Второй85 на Резерв85. Папки и четыре уникальных префиксных пути восстановлены, все четыре запрета каждой папки=Ложь, полные запросы/типы полей прежние. Копия имеет тот же состав.

  2. Ложь в ограничении не предоставляет права и не делает поле доступным вопреки самому набору. Реальная доступность дочерних полей в UI, наследование запретов, сортировка/отбор результата, подключение или переключение реальной базы этим опытом не доказаны.

  3. Будущий отрицательный контроль: вызвать УдалитьСвойНезависимыйИсточник(Схема,Основной) до переназначения первого набора на резерв. Проверка должна отказать ДО удаления по живой ссылке имени. Другой контроль: путь поля второго набора заменить на Первый85.Код — полный контроль префикса должен отказать. Здесь контроля не было.

  4. runtimeVerifiedScenarios=0. Только статическая сверка установленной справки и итогового HTML. Нет исполнения1С, рабочих данных, чтения/записи записей, запросов, сети/подключений, компоновки или печати.

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

Содержательный редактор папок и зависимых логических источников: точные ограничения, переназначение ссылок до удаления и восстановление в безопасном порядке.

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

  1. Истина в каждом ограничении — недоступность соответствующего применения. Не путать запреты с RLS, ролями, функциональными опциями или гарантией видимости.

  2. Папка должна вернуть объект ОграничениеИспользованияПоляСхемыКомпоновкиДанных; код проверяет тип до изменения. Применение запрета к UI не запускалось. Нельзя выдумывать свойства папки Имя/Поля или ограничения Отбор.

  3. Вставить источника — абсолютный индекс; Сдвинуть — объект и относительное смещение; Индекс/Удалить — текущий объект. После удаления основной создаётся заново, после очистки заново создаются все определения.

  4. Числовой [] коллекции источников документирован, строковый индекс не предполагается. Имя источника хранится строкой в наборе и всегда должно находиться через Найти до удаления/восстановления зависимостей.

  5. Пустые каталоги — этап собственного редактора. Не утверждается готовность отчёта к выполнению в промежуточном состоянии. К настройкам выбора/группировки папки здесь не добавляются, отчёт не запускается.

  6. Квалификаторы числового описания заданы явно и сверяются после пересоздания наборов. Для других величин и дробных количеств нужно отдельно выбирать диапазон; данный учебный диапазон0–9 не является производственным правилом.

  7. В КА2 ВедомостьПоДенежнымСредствам есть папка АналитикаДСВПути и поля с её префиксом; ФинансоваяОтчетностьСервер создаёт папку через Добавить(Тип(...)) и заполняет путь/заголовок. Здесь используется собственная маленькая модель, не вызов рабочего отчёта.

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

Макет поля СКД: реальное поле, существующая именованная область и восстановление ссылок

Создаём собственный набор с тремя явно описанными полями и четыре реальные постоянные области. Привязываем поля к именам макетов, переставляем элементы, переключаем количество на альтернативную область, удаляем и восстанавливаем привязки. На каждом этапе проверяется вся основа, ссылки и полное содержимое областей, без выполнения отчёта.

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

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

Подготовка

  1. Нужна НОВАЯ отдельная учебная база, не копия рабочей: точно8.5.1.1343, имя конфигурации УчебныеМакетыПолей85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий. Модули вручную пустые, кроме данного общего модуля; реальные записи не нужны.

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

  3. Будущая ручная подготовка только вне опыта: завершить прежний собственный сеанс, сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), затем свежий собственный клиент и своя обработка. Здесь F7, BSL, компоновщик, запросы, вывод и печать не запускались.

  4. Источник СвоиДанные85 типа Local и набор УчебныеОстатки85 созданы только в своей схеме. Запрос буквально объявляет A01/3/Учебный; он не исполняется. АвтоЗаполнениеДоступныхПолей=Ложь: КодТовара Строка, Количество Число, Склад Строка объявлены вручную, с совпадающими Поле/ПутьКДанным.

  5. Количество в буквальном запросе равно3. Его собственное описание — Число(1,0), неотрицательное: один общий разряд, ноль дробных, допустимые целые0–9. Это предел учебного исходного поля, не диапазон количества рабочего отчёта и не описание типа агрегата Сумма(Количество).

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Привилегированный режим не нужен";
    КонецЕсли;
    Пусто = Новый Массив;
    ВсеИмена = СтрРазделить("КодТовара|Количество|Склад", "|");
    Схема = СоздатьСвоюОсновуМакетовПолей();
    Привязки = Схема.МакетыПолей;
    ПроверитьСвоиПривязкиПолей(Схема, Пусто, Пусто);
    Код = Привязки.Добавить();
    ЗаполнитьСвоюПривязкуПоля(Схема, Код, "КодТовара", "КодТовара");
    ПроверитьСвоиПривязкиПолей(Схема, СтрРазделить("КодТовара", ","), СтрРазделить("КодТовара", ","));
    Количество = Привязки.Добавить();
    ЗаполнитьСвоюПривязкуПоля(Схема, Количество, "Количество", "Количество");
    ПроверитьСвоиПривязкиПолей(Схема, СтрРазделить("КодТовара,Количество", ","), СтрРазделить("КодТовара,Количество", ","));
    Если Привязки.Найти("КодТовара") <> Код Или Привязки.Найти("Количество") <> Количество
        Или Привязки.Найти("Склад") <> Неопределено Тогда
        ВызватьИсключение "Две одноимённые собственные привязки находятся; склад ещё не привязан";
    КонецЕсли;
    Склад = Привязки.Вставить(1);
    ЗаполнитьСвоюПривязкуПоля(Схема, Склад, "Склад", "Склад");
    ПроверитьСвоиПривязкиПолей(Схема, СтрРазделить("КодТовара,Склад,Количество", ","), СтрРазделить("КодТовара,Склад,Количество", ","));
    Привязки.Сдвинуть(Склад, 1);
    ПроверитьСвоиПривязкиПолей(Схема, ВсеИмена, ВсеИмена);
    Количество.Макет = "КоличествоВыделено85";
    ПроверитьСвоиПривязкиПолей(Схема, ВсеИмена, СтрРазделить("КодТовара,КоличествоВыделено85,Склад", ","));
    Количество.Макет = "Количество";
    ПроверитьСвоиПривязкиПолей(Схема, ВсеИмена, ВсеИмена);
    Копия = СоздатьСвоюОсновуМакетовПолей();
    ВосстановитьСвоиПривязкиПолей(Копия);
    Привязки.Удалить(Количество);
    ПроверитьСвоиПривязкиПолей(Схема, СтрРазделить("КодТовара,Склад", ","), СтрРазделить("КодТовара,Склад", ","));
    ПроверитьСвоиПривязкиПолей(Копия, ВсеИмена, ВсеИмена);
    НовоеКоличество = Привязки.Вставить(1);
    ЗаполнитьСвоюПривязкуПоля(Схема, НовоеКоличество, "Количество", "Количество");
    ПроверитьСвоиПривязкиПолей(Схема, ВсеИмена, ВсеИмена);
    Привязки.Очистить();
    ПроверитьСвоиПривязкиПолей(Схема, Пусто, Пусто);
    ПроверитьСвоиПривязкиПолей(Копия, ВсеИмена, ВсеИмена);
    ВосстановитьСвоиПривязкиПолей(Схема);
    ПроверитьСвоиПривязкиПолей(Схема, ВсеИмена, ВсеИмена);
    ПроверитьСвоиПривязкиПолей(Копия, ВсеИмена, ВсеИмена);
    Сообщить("Три поля и четыре реальные области сохранены; привязки КодТовара, Количество, Склад восстановлены");
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьУчебнуюОбласть(ТекстОбласти)
    Область = Новый МакетОбластиКомпоновкиДанных;
    СтрокаОбласти = Область.Добавить(Тип("СтрокаТаблицыОбластиКомпоновкиДанных"));
    Ячейка = СтрокаОбласти.Ячейки.Добавить();
    Поле = Ячейка.Элементы.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
    Поле.Значение = ТекстОбласти;
    Возврат Область;
КонецФункции

Процедура ЗаполнитьСвойИменованныйМакет(Описание, Имя, Текст)
    Если ТипЗнч(Описание) <> Тип("ОписаниеМакетаСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужно настоящее описание макета именно собственной схемы";
    КонецЕсли;
    Описание.Имя = Имя;
    Описание.Макет = СоздатьУчебнуюОбласть(Текст);
КонецПроцедуры

Процедура ПроверитьСвоюПолнуюОбласть(Описание, Текст)
    Если ТипЗнч(Описание.Макет) <> Тип("МакетОбластиКомпоновкиДанных")
        Или ТипЗнч(Описание.Параметры) <> Тип("ПараметрыОбластиКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужна собственная область СКД, не табличный документ или имя файла";
    КонецЕсли;
    Если Описание.Параметры.Количество() <> 0 Или Описание.Макет.Количество() <> 1 Тогда
        ВызватьИсключение "Собственная постоянная область имеет одну строку и не имеет параметров";
    КонецЕсли;
    СтрокаОбласти = Описание.Макет.Получить(0);
    Если ТипЗнч(СтрокаОбласти) <> Тип("СтрокаТаблицыОбластиКомпоновкиДанных")
        Или ТипЗнч(СтрокаОбласти.Ячейки) <> Тип("ЯчейкиТаблицыОбластиКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужна реальная собственная строка с коллекцией ячеек";
    КонецЕсли;
    Если СтрокаОбласти.Ячейки.Количество() <> 1 Тогда
        ВызватьИсключение "В собственной строке ровно одна ячейка";
    КонецЕсли;
    Ячейка = СтрокаОбласти.Ячейки.Получить(0);
    Если ТипЗнч(Ячейка) <> Тип("ЯчейкаТаблицыОбластиКомпоновкиДанных")
        Или ТипЗнч(Ячейка.Элементы) <> Тип("ЭлементыМакетаОбластиКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужна реальная ячейка с коллекцией элементов области";
    КонецЕсли;
    Если Ячейка.Элементы.Количество() <> 1 Тогда
        ВызватьИсключение "В собственной ячейке ровно одно постоянное поле";
    КонецЕсли;
    Поле = Ячейка.Элементы.Получить(0);
    Если ТипЗнч(Поле) <> Тип("ПолеОбластиКомпоновкиДанных")
        Или ТипЗнч(Поле.Значение) <> Тип("Строка") Или Поле.Значение <> Текст Тогда
        ВызватьИсключение "Не совпало полное текстовое содержимое собственной области";
    КонецЕсли;
КонецПроцедуры

Функция СвойТипКоличестваМакета()
    Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный));
КонецФункции

Процедура ПроверитьСвоюРазрядностьМакета(Описание)
    Квалификаторы = Описание.КвалификаторыЧисла;
    Если ТипЗнч(Квалификаторы) <> Тип("КвалификаторыЧисла") Или Квалификаторы.Разрядность <> 1
        Или Квалификаторы.РазрядностьДробнойЧасти <> 0
        Или Квалификаторы.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный Тогда
        ВызватьИсключение "Своё количество макета имеет один разряд, ноль дробных и неотрицательный знак";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьСвоюОсновуМакетовПолей()
    Схема = Новый СхемаКомпоновкиДанных;
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "СвоиДанные85";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен собственный набор запроса";
    КонецЕсли;
    Набор.Имя = "УчебныеОстатки85";
    Набор.ИсточникДанных = "СвоиДанные85";
    Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
    Набор.Запрос = "ВЫБРАТЬ ""A01"" КАК КодТовара, 3 КАК Количество, ""Учебный"" КАК Склад";
    Имена = СтрРазделить("КодТовара|Количество|Склад", "|");
    Для Индекс = 0 По 2 Цикл
        Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Нужно простое собственное описание поля, не папка";
        КонецЕсли;
        Поле.Поле = Имена[Индекс];
        Поле.ПутьКДанным = Имена[Индекс];
        Если Индекс = 1 Тогда
            Поле.ТипЗначения = СвойТипКоличестваМакета();
        Иначе
            Поле.ТипЗначения = Новый ОписаниеТипов("Строка");
        КонецЕсли;
    КонецЦикла;
    ИменаМакетов = СтрРазделить("КодТовара|Количество|Склад|КоличествоВыделено85", "|");
    Тексты = СтрРазделить("Код: A01|Количество: 3|Склад: Учебный|Количество: 3 (выделено)", "|");
    Для Индекс = 0 По 3 Цикл
        Описание = Схема.Макеты.Добавить();
        ЗаполнитьСвойИменованныйМакет(Описание, ИменаМакетов[Индекс], Тексты[Индекс]);
    КонецЦикла;
    ПроверитьСвоюОсновуМакетовПолей(Схема);
    Возврат Схема;
КонецФункции

Процедура ПроверитьСвоюОсновуМакетовПолей(Схема)
    Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Или Схема.ИсточникиДанных.Количество() <> 1
        Или Схема.НаборыДанных.Количество() <> 1 Или Схема.Макеты.Количество() <> 4 Тогда
        ВызватьИсключение "Нужны только собственные источник, набор и четыре согласованные области";
    КонецЕсли;
    Источник = Схема.ИсточникиДанных.Получить(0);
    Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных")
        Или Источник.Имя <> "СвоиДанные85" Или Источник.ТипИсточникаДанных <> "Local" Тогда
        ВызватьИсключение "Не совпал собственный источник";
    КонецЕсли;
    Набор = Схема.НаборыДанных.Получить(0);
    Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен собственный набор запроса";
    КонецЕсли;
    Если Набор.Имя <> "УчебныеОстатки85" Или Набор.ИсточникДанных <> "СвоиДанные85"
        Или Набор.АвтоЗаполнениеДоступныхПолей Или Набор.Запрос <> "ВЫБРАТЬ ""A01"" КАК КодТовара, 3 КАК Количество, ""Учебный"" КАК Склад"
        Или Набор.Поля.Количество() <> 3 Тогда
        ВызватьИсключение "Не совпали полный собственный запрос и ручное описание полей";
    КонецЕсли;
    Имена = СтрРазделить("КодТовара|Количество|Склад", "|");
    Типы = СтрРазделить("Строка,Число,Строка", ",");
    Для Индекс = 0 По 2 Цикл
        Поле = Набор.Поля.Получить(Индекс);
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
            Или Поле.Поле <> Имена[Индекс] Или Поле.ПутьКДанным <> Имена[Индекс]
            Или ТипЗнч(Поле.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
            ВызватьИсключение "Не совпали полный путь, имя и описание собственного поля";
        КонецЕсли;
        ПолныеТипы = Поле.ТипЗначения.Типы();
        Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип(Типы[Индекс]) Тогда
            ВызватьИсключение "Не совпал полный набор типов собственного поля";
        КонецЕсли;
        Если Индекс = 1 Тогда
            ПроверитьСвоюРазрядностьМакета(Поле.ТипЗначения);
        КонецЕсли;
    КонецЦикла;
    ИменаМакетов = СтрРазделить("КодТовара|Количество|Склад|КоличествоВыделено85", "|");
    Тексты = СтрРазделить("Код: A01|Количество: 3|Склад: Учебный|Количество: 3 (выделено)", "|");
    Для Индекс = 0 По 3 Цикл
        Описание = Схема.Макеты.Получить(Индекс);
        Если ТипЗнч(Описание) <> Тип("ОписаниеМакетаСхемыКомпоновкиДанных")
            Или Описание.Имя <> ИменаМакетов[Индекс] Или Схема.Макеты.Найти(ИменаМакетов[Индекс]) <> Описание Тогда
            ВызватьИсключение "Не совпали имена и порядок существующих собственных макетов";
        КонецЕсли;
        ПроверитьСвоюПолнуюОбласть(Описание, Тексты[Индекс]);
    КонецЦикла;
КонецПроцедуры

Процедура ЗаполнитьСвоюПривязкуПоля(Схема, Привязка, ИмяПоля, ИмяМакета)
    ПроверитьСвоюОсновуМакетовПолей(Схема);
    Если ТипЗнч(Привязка) <> Тип("МакетПоляСхемыКомпоновкиДанных")
        Или Схема.МакетыПолей.Индекс(Привязка) < 0 Тогда
        ВызватьИсключение "Нужна текущая собственная привязка этой схемы";
    КонецЕсли;
    Если ИмяПоля <> "КодТовара" И ИмяПоля <> "Количество" И ИмяПоля <> "Склад" Тогда
        ВызватьИсключение "Привязывается только одно из трёх объявленных собственных полей";
    КонецЕсли;
    Если ТипЗнч(Схема.Макеты.Найти(ИмяМакета)) <> Тип("ОписаниеМакетаСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Ссылка должна указывать на существующий собственный макет";
    КонецЕсли;
    Привязка.Поле = ИмяПоля;
    Привязка.Макет = ИмяМакета;
КонецПроцедуры

Процедура ПроверитьСвоиПривязкиПолей(Схема, ИменаПолей, ИменаМакетов)
    ПроверитьСвоюОсновуМакетовПолей(Схема);
    Привязки = Схема.МакетыПолей;
    Если ТипЗнч(Привязки) <> Тип("МакетыПолейСхемыКомпоновкиДанных")
        Или ИменаПолей.Количество() <> ИменаМакетов.Количество() Или Привязки.Количество() <> ИменаПолей.Количество() Тогда
        ВызватьИсключение "Не совпал полный собственный состав привязок";
    КонецЕсли;
    Для Индекс = 0 По ИменаПолей.Количество() - 1 Цикл
        Привязка = Привязки.Получить(Индекс);
        Если ТипЗнч(Привязка) <> Тип("МакетПоляСхемыКомпоновкиДанных")
            Или ТипЗнч(Привязка.Поле) <> Тип("Строка") Или ТипЗнч(Привязка.Макет) <> Тип("Строка")
            Или Привязка.Поле <> ИменаПолей[Индекс] Или Привязка.Макет <> ИменаМакетов[Индекс]
            Или Привязки.Индекс(Привязка) <> Индекс Или Привязки[Индекс] <> Привязка Тогда
            ВызватьИсключение "Не совпали строки ссылок, типы и порядок всех собственных привязок";
        КонецЕсли;
        Если ТипЗнч(Схема.Макеты.Найти(Привязка.Макет)) <> Тип("ОписаниеМакетаСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Каждая ссылка должна вести к существующему собственному макету";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ВосстановитьСвоиПривязкиПолей(Схема)
    Пусто = Новый Массив;
    ПроверитьСвоиПривязкиПолей(Схема, Пусто, Пусто);
    Имена = СтрРазделить("КодТовара|Количество|Склад", "|");
    Для Каждого Имя Из Имена Цикл
        Привязка = Схема.МакетыПолей.Добавить();
        ЗаполнитьСвоюПривязкуПоля(Схема, Привязка, Имя, Имя);
    КонецЦикла;
    ПроверитьСвоиПривязкиПолей(Схема, Имена, Имена);
КонецПроцедуры
УчебныеМакетыПолей85.Форма

Своя внешняя обработка УчебныеМакетыПолей85 → управляемая Форма → Модуль

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

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

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

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

  1. Построить собственную основу: один источник, один набор, точный текст собственного запроса, три поля нужных полных типов и четыре именованных макета. В каждом макете проверить тип области, одну строку/ячейку/поле, постоянный полный текст и отсутствие параметров. Не предполагать автоматическое появление полей без их объявления.

  2. Схема.МакетыПолей readonly, но её собственная коллекция изменяется методами. Добавить возвращает МакетПоляСхемыКомпоновкиДанных. Его writable Поле и Макет — строки: имя объявленного поля и имя существующего описания в Схема.Макеты, не объекты областей.

  3. Добавить КодТовара и Количество. Для демонстрации Найти использовать их одинаковые имена поля и основного макета; Склад пока не имеет привязки. Справка говорит о поиске по имени, не уточняя свойство-ключ. Здесь не утверждается отдельная недокументированная семантика поиска после смены ссылки.

  4. Вставить привязку склада по индексу1; проверить КодТовара/Склад/Количество. Сдвинуть принимает объект Склад и относительное+1, после чего порядок КодТовара/Количество/Склад. Каждый элемент проверен через Получить,[],Индекс, обе строковые ссылки и наличие настоящего макета.

  5. Не меняя Поле="Количество", задать Макет="КоличествоВыделено85". Эта четвёртая область реально создана и содержит «Количество: 3 (выделено)». Проверить все ссылки и содержание, затем вернуть Макет="Количество". Текст запроса и три поля не меняются.

  6. Независимую схему, источник, поля, области и привязки создать заново из собственных строк/типов. Удалить текущий объект Количество, не индекс1; после удаления его не использовать. Копия сохраняет исходные ссылки. Восстановить новым Вставить(1), затем очистить только привязки оригинала и подтвердить их0 при сохранённых полях/областях.

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

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

  1. Будущий результат модели: поля КодТовара/Количество/Склад с типами Строка/Число/Строка, четыре области сохранены. После восстановления три привязки ссылаются на одноимённые основные макеты в порядке0/1/2. Временное переключение количества затронуло только строковое имя макета, не поле или источник.

  2. Будущий отрицательный контроль: сразу после Количество.Макет = "КоличествоВыделено85" заменить это имя на "НетТакогоУчебногоМакета85", сохранив ожидаемое имя альтернативной области. Проверка должна отказать по полному значению ссылки при том же размере3. Вернуть код, сохранить/F7 вне опыта и открыть новый свой сеанс. Здесь контроль не выполнялся.

  3. runtimeVerifiedScenarios=0. Query/Local — только объявления в собственной модели; нет выполнения запроса, формирования отчёта, записи, сети, печати и обращения к рабочим конфигурациям.

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

Урок показывает различие между строковой ссылкой Макет у привязки и объектной областью Макет у описания, с реальными собственными полями и полным восстановлением.

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

  1. Макет у МакетПоляСхемыКомпоновкиДанных — Строка; у ОписаниеМакетаСхемыКомпоновкиДанных — МакетОбластиКомпоновкиДанных. Не присваивайте область строковой ссылке или неизвестное имя несуществующего макета.

  2. ПутьКДанным определяет имя поля в выражениях/настройках. В этом простом собственном наборе он намеренно равен Поле, поэтому разночтений нет. Состав полей объявлен вручную и каждый раз проверяется, не берётся из неизвестной конфигурации.

  3. Вставить — абсолютный индекс, Сдвинуть — объект и относительное смещение, Удалить — объект. Оператор[] этой коллекции документирован по индексу, не по имени. После удаления/очистки старые привязки не используются.

  4. Для Найти в этом опыте основные имя поля и имя макета совпадают. Не заявляется проверенный в1С ключ поиска для разных имён: переключённая ссылка проверяется через текущую привязку, индекс и фактические свойства. Это ограничение явно отделено от полного контроля существования макета.

  5. Оригинал и копия не разделяют изменяемые области, поля или привязки. Очистка МакетыПолей не очищает Макеты или НаборыДанных; их полный состав и тексты проверяются заново.

  6. Здесь не компилируется макет отчёта и не доказывается внешний вид. Чтобы получать данные и выводить отчёт, нужен отдельный согласованный цикл настроек/компиляции/процессора; настоящий запуск не входит в этот опыт.

  7. Число в ОписаниеТипов задаётся вместе со вторым аргументом КвалификаторыЧисла(1,0,Неотрицательный), а не одним именем типа. Полная проверка сначала сверяет единственный тип Число, затем тип квалификаторов, общую разрядность1, дробную0 и знак. Строковые КодТовара/Склад остаются строками без числовых квалификаторов. Не расширяйте данные за0–9 без согласованного изменения описания и его эталона; запрос и агрегат здесь не исполняются.

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

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

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

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

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