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

Методы · Insert

Добавляет элемент в заданную позицию.

Синтаксис

Вставить(<Индекс>)
Полное описание, параметры и ограничения

СвязиНаборовДанныхСхемыКомпоновкиДанных.Вставить (DataCompositionSchemaDataSetLinks.Insert)

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

Вставить (Insert)

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

Синтаксис:
Вставить(<Индекс>)
Параметры:

<Индекс> (обязательный)
Тип: Число.
Расположение элемента в коллекции.
Возвращаемое значение:
Тип: СвязьНаборовДанныхСхемыКомпоновкиДанных.

Описание:

Добавляет элемент в заданную позицию.

Доступность:

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

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

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

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

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

Связи наборов СКД: продажи, цены, два ключа, включение и условие

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

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

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

Подготовка

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

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

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

  4. Код сам создаёт Local-источник и две декларации буквальных запросов. Продажа: A01/Учебный/3; цена: A01/Учебный/500. Все шесть путей уникальны; типы каждого набора Строка/Строка/Число объявляются вручную. Нет ссылок на рабочие регистры или неизвестных внешних объектов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4. Первая связь сопоставляет КодПродажи с КодЦены; вторая СкладПродажи со СкладЦены. В КА2 интеграция торговых площадок действительно создаёт две связи между одинаковыми сторонами для разных ключей. Этот урок создаёт свои ключи и не вызывает рабочую интеграцию.

  5. Обязательная=Истина означает добавление связи в макет при задействованных полях приёмника. Ложь означает добавление только при задействованных полях исходного набора, используемых в выражении источника. Это правило включения СКД, не переключатель ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL. В своём выборе нужна Цена; склад продажи задействован группой.

  6. УсловиеСвязи — строковое выражение, проверяемое перед выполнением связи. Для кода задано КоличествоПродажи > 0; для склада пустая строка означает выполнять всегда. Независимо изменить флаг кода на Ложь и вернуть Истина; затем изменить условие на >3 и вернуть >0. Полные проверки отличают каждый переход без подсчёта неисполненных строк.

  7. Двенадцать контрольных состояний оригинала проверяют всю основу, обе стороны и выражения каждого ключа, реальный Булево, полное условие, порядок, Индекс и обращение[индекс]. Вставить(0) — абсолютная позиция; Сдвинуть(ПоСкладу,1) — объект и относительное смещение.

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

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

  1. Будущий итог проверки модели: Продажи85/Цены85 и все шесть путей неизменны. Каталог содержит сначала КодПродажи→КодЦены, Обязательная=Истина, условие КоличествоПродажи > 0, затем СкладПродажи→СкладЦены, Обязательная=Ложь, пустое условие. Оба описания указывают на существующие наборы.

  2. В исходных декларациях код/склад совпадают, количество3, цена500. Это входные литералы, а не полученные строки соединения. Для числа3 сравнение >0 математически истинно, >3 ложно, но условие компоновщиком здесь не вычислялось и визуальный результат не заявляется.

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

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

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

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

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

  1. Имена наборов и выражения полей — разные строки. Нельзя передать объект набора вместо его имени, связать неизвестное поле или считать одинаковый размер каталогов доказательством правильности связей.

  2. Найти есть у коллекции НаборыДанных, но не у коллекции СвязиНаборовДанных. Для связей используется документированный Индекс, Получить и обращение по числовой позиции. Поиск набора учитывает возможное Неопределено до обращения к свойствам.

  3. Обязательная не обещает SQL-тип соединения. УсловиеСвязи не заменяет выражения ключей. Изменение свойства проверено как модель, а не как исполненное соединение или визуально полученные данные.

  4. Параметр и РазрешенСписокПараметров требуют настоящего параметра запроса приёмника; НачальноеВыражение требует настоящей связи набора с самим собой. Здесь они не читаются как пустые заглушки и не привязываются ради покрытия: им нужны отдельные содержательные уроки.

  5. Свойства обычной группы не переносятся на пользовательские настройки. XML-сериализация получает только свое ПолеКомпоновкиДанных, пишет строку в памяти и закрывает писатель в обоих исходах.

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

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

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

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

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

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