СвязьНаборовДанныхСхемыКомпоновкиДанных.НаборДанныхПриемник

Свойства · DestinationDataSet

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

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

СвязьНаборовДанныхСхемыКомпоновкиДанных.НаборДанныхПриемник (DataCompositionSchemaDataSetLink.DestinationDataSet)

СвязьНаборовДанныхСхемыКомпоновкиДанных (DataCompositionSchemaDataSetLink)

НаборДанныхПриемник (DestinationDataSet)

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

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

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

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

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

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

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

Параметр связи СКД: объявление строковых кодов и согласованные режимы = / В

Создаём свой источник A01/3 и приёмник с буквальными строками A01/500, B01/700 внутри настоящего вложенного запроса. Объявляем КодыСвязи85 в схеме, связываем его с полем источника, переключаем полное условие запроса и Булево разрешения списка вместе, проверяем восстановление и независимую копию без исполнения.

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

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

Подготовка

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

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

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

  4. Источник и приёмник объявлены самим кодом: четыре уникальных пути, в каждом наборе Строка/Число. Приёмник использует вложенный запрос как таблицу-источник, объединяющую две собственные буквальные строки; рабочих таблиц и неизвестных параметров нет.

  5. Числовые поля имеют разные явные учебные контракты: КоличествоИсточника — целое 0–9, ЦенаПриемника — целое 0–999. Собственные буквальные значения3,500,700 укладываются в них. КвалификаторыЧисла передаются вторым аргументом ОписаниеТипов; это не утверждение, что рабочие цены всегда целые или ограничены999.

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

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

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

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

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

Функция СвойЗапросПриемника(СписокРазрешен)
    Если СписокРазрешен Тогда
        Возврат "ВЫБРАТЬ Данные.Код КАК КодПриемника, Данные.Цена КАК ЦенаПриемника ИЗ (ВЫБРАТЬ ""A01"" КАК Код, 500 КАК Цена ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""B01"" КАК Код, 700 КАК Цена) КАК Данные ГДЕ Данные.Код В (&КодыСвязи85)";
    КонецЕсли;
    Возврат "ВЫБРАТЬ Данные.Код КАК КодПриемника, Данные.Цена КАК ЦенаПриемника ИЗ (ВЫБРАТЬ ""A01"" КАК Код, 500 КАК Цена ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""B01"" КАК Код, 700 КАК Цена) КАК Данные ГДЕ Данные.Код = &КодыСвязи85";
КонецФункции

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

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

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

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

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

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

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

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

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

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

  1. Полностью объявить свой параметр Схема.Параметры.Добавить(): имя КодыСвязи85, ОписаниеТипов("Строка"), строковое значение по умолчанию пустое, использование Авто. В КА2 АнализСчета настоящий параметр связи Ссылки также объявлен в схеме, тип соответствует полю источника.

  2. Не устанавливать Всегда механически: по справке этот режим всегда использует значение настройки. В своём опыте проверяется Авто и передача кода через Параметр связи; пустой default не выдаётся за полученное значение источника.

  3. Параметр свойства связи — имя без амперсанда: КодыСвязи85. В запросе используется &КодыСвязи85. Значение определяется ВыражениеИсточник="КодИсточника"; ВыражениеПриемник="КодПриемника" указывает реальный ключ приёмника. ЦенаПриемника нужна в выборе; источник кода также выбран.

  4. Скалярная версия запроса содержит Данные.Код = &КодыСвязи85 и РазрешенСписокПараметров=Ложь. Списочная версия содержит Данные.Код В (&КодыСвязи85) и флаг Истина. СвойЗапросПриемника возвращает полный точный запрос режима, а УстановитьСвойРежимСвязи меняет запрос и флаг согласованно.

  5. Условие находится во внешнем запросе с настоящим ИЗ (вложенный запрос) КАК Данные, не в выдуманном ГДЕ без источника. Вложенные источники документированы установленной справкой; поля Данные.Код/Цена объявлены внутренним списком выборки.

  6. Восемь контрольных состояний оригинала проверяют полный источник, оба текста запросов, все поля/типы/порядок, весь параметр, его положительный/отрицательный поиск, выбор, обе стороны связи, имя параметра, реальный Булево и каталог. Флаг списка не считается доказанным только по названию свойства.

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

  8. Списочный режим разрешает обработку списка, но код не присваивает Массив строковому ТипЗначения параметра и не запускает движок. Конкретная упаковка значений компоновщиком и данные результата остаются будущей runtime-проверкой.

  9. СвойТипПоляПараметра различает все четыре настоящих имени поля: коды Строка, количество Число(1,0,Неотрицательный), цена Число(3,0,Неотрицательный). Проверка каждого числового поля сверяет все три квалификатора, а не только наличие Число в Типы(). Строковый параметр КодыСвязи85, запросы и переключение = / В остаются прежними.

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

  1. Будущий итог проверки модели: единственный строковый КодыСвязи85 с пустым default/Авто; два исходных набора и полный скалярный запрос; одна связь Источник85→Приемник85, КодИсточника→КодПриемника, Параметр=КодыСвязи85, флаг списка Ложь. Копия сохраняет то же исходное состояние.

  2. Буквальные строки задают A01/500 и B01/700. По математической логике = для A01 выбирает первый код, а В для списка A01/B01 допускает оба кода, но здесь список источников не формировался и запрос не выполнялся: это объяснение режимов, не полученные строки или обещание производительности.

  3. Будущий отрицательный контроль: после согласованного перехода в режим В вручную заменить только Связь.РазрешенСписокПараметров на Ложь, не меняя эталон Истина и полный запрос. Проверка должна отказать. Альтернативно заменить имя параметра связи на НетТакогоПараметра85 при прежних запросах. Вернуть код, сохранить/F7 вне опыта и открыть новый свой сеанс; здесь контроль не выполнялся.

  4. runtimeVerifiedScenarios=0. Сохранность прежних материалов и native-контракты проверяются статически. Нет выполнения 1С, запросов, записи, сети, реального компоновщика, печати или изменения конфигураций пользователя.

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

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

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

  1. Параметр связи хранит имя параметра, не его значение и не текст &КодыСвязи85. Амперсанд нужен в языке запроса; строка свойства задаётся без него. Полный текст запроса не сводится к поиску подстроки В.

  2. Список допустим при использовании параметра в операции В. Не включайте Истина при сохранённом сравнении = и не подменяйте ОписаниеТипов строкового элемента типом Массив без документированного основания.

  3. Авто и Всегда имеют разный смысл. Этот урок не утверждает, что default пустой станет A01 сам по себе: это работа будущего компоновщика при использовании связи, здесь ни её исполнение, ни фактическая передача не проверялись.

  4. Буквальный вложенный запрос позволяет изучать контракты без чужих таблиц. Наличие параметрической связи не обещает выполненный SQL, количество обращений или готовый визуальный отчёт.

  5. Копия содержит новые собственные объекты. После Удалить и Очистить старые ссылки связи не используются; объявление параметра и оба набора сохраняются. XML получает только собственное ПолеКомпоновкиДанных и пишет строку в памяти.

  6. Методы жизненного цикла каталога параметров и параметры функциональных опций не привязываются как бессмысленные заглушки: им нужны отдельные содержательные задачи.

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

Объектный набор СКД: собственное дерево, self-link и начальное выражение

Создаём свою типизированную таблицу A/B/C, структуру внешних данных, объектный набор и настоящую связь Дерево85 с самим собой. Отличаем пустую строку данных от выражения пустой строки в кавычках, меняем начало на A, проверяем все значения/пути/типы и независимое восстановление без компоновки отчёта.

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

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

Подготовка

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

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

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

  4. Таблица создаётся самим кодом в памяти: КодЭлемента/КодРодителя Строка, ЗначениеУзла Число. Полные строки: A/пустой родитель/10, B/A/20, C/A/30. Уникальные коды, единственный корень и конечные дети исключают цикл в этом собственном эталоне.

  5. ЗначениеУзла намеренно ограничено целыми неотрицательными числами 0–99: значения10/20/30 укладываются в два разряда. Числовой квалификатор явно передан вторым аргументом ОписаниеТипов и одинаков для колонки таблицы и описания поля схемы. Этот учебный диапазон не является правилом рабочих данных.

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

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

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

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

Функция СоздатьСвойСтендДерева()
    Данные = Новый ТаблицаЗначений;
    Имена = СтрРазделить("КодЭлемента,КодРодителя,ЗначениеУзла", ",");
    Типы = СтрРазделить("Строка,Строка,Число", ",");
    Для Индекс = 0 По 2 Цикл
        Данные.Колонки.Добавить(Имена[Индекс], СвойТипПоляДерева(Типы[Индекс]));
    КонецЦикла;
    СтрокаДанных = Данные.Добавить();
    СтрокаДанных.КодЭлемента = "A";
    СтрокаДанных.КодРодителя = "";
    СтрокаДанных.ЗначениеУзла = 10;
    СтрокаДанных = Данные.Добавить();
    СтрокаДанных.КодЭлемента = "B";
    СтрокаДанных.КодРодителя = "A";
    СтрокаДанных.ЗначениеУзла = 20;
    СтрокаДанных = Данные.Добавить();
    СтрокаДанных.КодЭлемента = "C";
    СтрокаДанных.КодРодителя = "A";
    СтрокаДанных.ЗначениеУзла = 30;
    ВнешниеДанные = Новый Структура;
    ВнешниеДанные.Вставить("Дерево85", Данные);
    Схема = Новый СхемаКомпоновкиДанных;
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "ДанныеДерева85";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    Если ТипЗнч(Набор) <> Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен собственный объектный набор, не набор запроса";
    КонецЕсли;
    Набор.Имя = "Дерево85";
    Набор.ИмяОбъекта = "Дерево85";
    Набор.ИсточникДанных = "ДанныеДерева85";
    Для Индекс = 0 По 2 Цикл
        Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Нужно свое явно объявленное поле, не папка";
        КонецЕсли;
        Поле.Поле = Имена[Индекс];
        Поле.ПутьКДанным = Имена[Индекс];
        Поле.ТипЗначения = СвойТипПоляДерева(Типы[Индекс]);
    КонецЦикла;
    Стенд = Новый Структура;
    Стенд.Вставить("Схема", Схема);
    Стенд.Вставить("ВнешниеДанные", ВнешниеДанные);
    ПроверитьСвоюОсновуДерева(Стенд);
    Возврат Стенд;
КонецФункции

Процедура ПроверитьСвоюОсновуДерева(Стенд)
    Если ТипЗнч(Стенд) <> Тип("Структура") Или Стенд.Количество() <> 2 Тогда
        ВызватьИсключение "Нужен собственный стенд со схемой и внешней структурой";
    КонецЕсли;
    Схема = Неопределено;
    ВнешниеДанные = Неопределено;
    Если Не Стенд.Свойство("Схема", Схема) Или Не Стенд.Свойство("ВнешниеДанные", ВнешниеДанные) Тогда
        ВызватьИсключение "Не совпали оба собственных ключа стенда";
    КонецЕсли;
    Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Или Схема.ИсточникиДанных.Количество() <> 1
        Или Схема.НаборыДанных.Количество() <> 1 Тогда
        ВызватьИсключение "Нужны единственные собственные источник и набор";
    КонецЕсли;
    Если ТипЗнч(ВнешниеДанные) <> Тип("Структура") Или ВнешниеДанные.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен единственный собственный внешний набор в структуре";
    КонецЕсли;
    Данные = Неопределено;
    Если Не ВнешниеДанные.Свойство("Дерево85", Данные) Тогда
        ВызватьИсключение "Не найден собственный объект данных Дерево85";
    КонецЕсли;
    Если ТипЗнч(Данные) <> Тип("ТаблицаЗначений") Или Данные.Количество() <> 3 Или Данные.Колонки.Количество() <> 3 Тогда
        ВызватьИсключение "Нужна собственная таблица из трех строк и трех колонок";
    КонецЕсли;
    Имена = СтрРазделить("КодЭлемента,КодРодителя,ЗначениеУзла", ",");
    Типы = СтрРазделить("Строка,Строка,Число", ",");
    Для Индекс = 0 По 2 Цикл
        Колонка = Данные.Колонки.Получить(Индекс);
        Если ТипЗнч(Колонка) <> Тип("КолонкаТаблицыЗначений") Или Колонка.Имя <> Имена[Индекс]
            Или ТипЗнч(Колонка.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
            ВызватьИсключение "Не совпали имена, порядок и описания типов собственных колонок";
        КонецЕсли;
        ПолныеТипы = Колонка.ТипЗначения.Типы();
        Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип(Типы[Индекс]) Тогда
            ВызватьИсключение "Не совпал полный тип собственной колонки";
        КонецЕсли;
        Если Типы[Индекс] = "Число" Тогда
            ПроверитьСвоиКвалификаторыДерева(Колонка.ТипЗначения);
        КонецЕсли;
    КонецЦикла;
    Коды = СтрРазделить("A,B,C", ",");
    Родители = Новый Массив;
    Родители.Добавить("");
    Родители.Добавить("A");
    Родители.Добавить("A");
    Значения = Новый Массив;
    Значения.Добавить(10);
    Значения.Добавить(20);
    Значения.Добавить(30);
    Для Индекс = 0 По 2 Цикл
        СтрокаДанных = Данные.Получить(Индекс);
        Если ТипЗнч(СтрокаДанных) <> Тип("СтрокаТаблицыЗначений")
            Или ТипЗнч(СтрокаДанных.КодЭлемента) <> Тип("Строка") Или СтрокаДанных.КодЭлемента <> Коды[Индекс]
            Или ТипЗнч(СтрокаДанных.КодРодителя) <> Тип("Строка") Или СтрокаДанных.КодРодителя <> Родители[Индекс]
            Или ТипЗнч(СтрокаДанных.ЗначениеУзла) <> Тип("Число") Или СтрокаДанных.ЗначениеУзла <> Значения[Индекс] Тогда
            ВызватьИсключение "Не совпали все собственные коды, родители, значения и их типы";
        КонецЕсли;
    КонецЦикла;
    Источник = Схема.ИсточникиДанных.Получить(0);
    Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных")
        Или Источник.Имя <> "ДанныеДерева85" Или Источник.ТипИсточникаДанных <> "Local" Тогда
        ВызватьИсключение "Не совпал собственный источник";
    КонецЕсли;
    Набор = Схема.НаборыДанных.Получить(0);
    Если ТипЗнч(Набор) <> Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен собственный объектный набор";
    КонецЕсли;
    Если Набор.Имя <> "Дерево85" Или Набор.ИмяОбъекта <> "Дерево85" Или Набор.ИсточникДанных <> "ДанныеДерева85"
        Или Схема.НаборыДанных.Найти("Дерево85") <> Набор
        Или ТипЗнч(Набор.Поля) <> Тип("ПоляНабораДанныхСхемыКомпоновкиДанных") Или Набор.Поля.Количество() <> 3 Тогда
        ВызватьИсключение "Не совпали имя, внешний объект, источник и собственные поля";
    КонецЕсли;
    Для Индекс = 0 По 2 Цикл
        Поле = Набор.Поля.Получить(Индекс);
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
            Или Поле.Поле <> Имена[Индекс] Или Поле.ПутьКДанным <> Имена[Индекс]
            Или ТипЗнч(Поле.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
            ВызватьИсключение "Не совпали полные собственные пути, порядок и типы полей набора";
        КонецЕсли;
        ПолныеТипы = Поле.ТипЗначения.Типы();
        Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип(Типы[Индекс]) Тогда
            ВызватьИсключение "Не совпал полный набор типов собственного поля";
        КонецЕсли;
        Если Типы[Индекс] = "Число" Тогда
            ПроверитьСвоиКвалификаторыДерева(Поле.ТипЗначения);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

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

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

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

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

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

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

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

  2. В этом опыте Имя и ИмяОбъекта намеренно одинаковы: Дерево85, и такой же ключ помещён в структуру внешних данных. Значение ключа — реально созданная таблица. Источник называется ДанныеДерева85, Local. Каждый контроль проверяет все связи имён и всю таблицу, не только существование ключа.

  3. В УНФ ПраваРолей настоящая схема содержит объектный набор Иерархия, внешний объект Иерархия и self-link КодЭлемента→КодРодителя с начальным выражением "". Модуль отчёта передаёт свою таблицу через ВнешниеНаборыДанных.Вставить("Иерархия", ...). Этот урок использует только свои A/B/C и не читает права пользователей.

  4. Связь.НаборДанныхИсточник и НаборДанныхПриемник равны Дерево85. Источник значения — КодЭлемента; поле приёмника — КодРодителя. Так задаётся связь набора с самим собой, для которой документировано НачальноеВыражение.

  5. НачальноеВыражение хранит ТЕКСТ выражения. Для пустого строкового значения нужен текст из двух кавычек: в BSL-литерале кавычки удвоены. Пустой КодРодителя в таблице — само значение данных, а начальное выражение "" — выражение, которое должно дать это значение. Их нельзя заменить друг другом.

  6. Восемь контрольных состояний оригинала проверяют каждую ячейку и её тип, имена/типы колонок, внешнюю структуру, весь набор/поля, обе стороны связи и полную строку выражения. Изменить начало с выражения "" на выражение "A", подтвердить только это изменение, затем вернуть исходное начало.

  7. Независимую копию построить заново: новая таблица, строки, структура, источник, набор, поля и связь. Удалить текущую Связь как объект, не индекс; старую ссылку не применять. Подтвердить0 связей при сохранённой основе и копии, создать новую, очистить каталог оригинала и снова восстановить новую связь.

  8. Структура внешних данных подготовлена по документированному контракту второго аргумента ПроцессорКомпоновкиДанных.Инициализировать, но вызов здесь отсутствует: готового макета нет и исполнения не разрешено. Поэтому этот метод не привязывается к уроку ради счётчика.

  9. СвойТипПоляДерева создаёт отдельно строковый и числовой типы. ПроверитьСвоиКвалификаторыДерева сверяет Разрядность=2, РазрядностьДробнойЧасти=0, ДопустимыйЗнак=Неотрицательный и у колонки, и у поля СКД во всех прежних состояниях. Старые значения, связи, выражения и независимая копия не меняются; readonly ТипЗначения колонки не присваивается.

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

  1. Будущий итог проверки модели: ровно три прежние строки A/B/C с родителями и значениями10/20/30; один объектный набор Дерево85 и соответствующий внешний ключ; одна связь Дерево85→Дерево85, КодЭлемента→КодРодителя, начальный текст "". Копия хранит исходное начало при изменении и очистке оригинала.

  2. Для будущего разрешённого обхода по этим определениям пустое начальное значение соответствует корню A с пустым родителем; значение A соответствует детям B/C. Здесь процессор не запускался: это ожидаемая логика своей конечной модели, а не полученная иерархия, порядок вывода или рассчитанный итог60.

  3. Будущий отрицательный контроль: после построения стенда заменить Стенд.ВнешниеДанные.Дерево85[1].КодРодителя = "B", не меняя эталон. Проверка должна отказать при прежних размерах и именах, потому что появилась неверная собственная родительская ячейка. Вернуть код, сохранить/F7 вне опыта и открыть свежий собственный сеанс. Здесь контроль не выполнялся.

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

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

Полный опыт на собственных данных: объявление объектного набора, реальный внешний объект, осмысленное начало self-link и независимое восстановление.

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

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

  2. Строка-выражение "A" не равна строке имени поля A. Кавычки выражения должны остаться внутри значения свойства; BSL удваивает их в литерале. Полная строка проверяется без обрезки, форматирования и угадывания.

  3. Имя объекта данных не заменяет саму таблицу. Поля схемы и колонки таблицы проверяются независимо по всем именам и полным наборам типов. ТипЗначения колонки readonly: допустимые типы передаются при Добавить, не присваиваются после.

  4. В этом опыте имя набора, имя объекта и внешний ключ одинаковы намеренно; пример не доказывает правила сопоставления при разных именах. Фактический обход, настройки выбора/группировки и визуальный вывод требуют отдельного разрешённого опыта с макетом.

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

  6. Копия создаётся из собственных примитивов заново. После Удалить и Очистить старые ссылки связи не используются; файл, рабочая база и чужие объекты не затрагиваются.

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

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

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

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

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