Добавляет элемент в заданную позицию.
Синтаксис
Вставить(<Индекс>)Полное описание, параметры и ограничения
СвязиНаборовДанныхСхемыКомпоновкиДанных.Вставить (DataCompositionSchemaDataSetLinks.Insert)
СвязиНаборовДанныхСхемыКомпоновкиДанных (DataCompositionSchemaDataSetLinks)
Вставить (Insert)
Доступен, начиная с версии 8.1.
Синтаксис:
Вставить(<Индекс>)
Параметры:
<Индекс> (обязательный)
Тип: Число.
Расположение элемента в коллекции.
Возвращаемое значение:
Тип: СвязьНаборовДанныхСхемыКомпоновкиДанных.
Описание:
Добавляет элемент в заданную позицию.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Связи наборов СКД: продажи, цены, два ключа, включение и условие
Создаём два собственных набора Продажи85/Цены85 с отдельными полными путями кода, склада и числовых данных. Настраиваем две связи по коду и складу, отдельно меняем признак включения и условие, проверяем точные определения и независимо восстанавливаем каталог без исполнения отчёта.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеСвязи85; в1С не запускался.
Подготовка
НОВАЯ отдельная учебная база, не копия рабочей: точно8.5.1.1343, конфигурация УчебныеСвязи85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий. Модули вручную пустые, кроме данного общего модуля.
Конфигуратор → Общие → Общие модули → УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить весь основной модуль. Создать свою внешнюю обработку УчебныеСвязи85 → управляемая Форма: команда/кнопка Выполнить с действием Выполнить. Отдельный полный модуль формы дан ниже; реквизиты не нужны.
Будущая ручная подготовка вне опыта: завершить прежний свой сеанс, сохранить, Конфигурация → Обновить конфигурацию базы данных (F7), открыть свежий собственный клиент и свою обработку. Здесь F7, BSL, запросы, компоновка и отчёт не запускались.
Код сам создаёт 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 → управляемая Форма → Модуль
Полный отдельный модуль своей формы с серверным вызовом; здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Два набора, ключи связей, признаки включения, условия и восстановление проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Построить два настоящих собственных набора с именами Продажи85 и Цены85. Проверять полные тексты запросов, источники, порядок и три явно заданных поля каждого. Найти по имени может вернуть разные типы наборов или Неопределено: код подтверждает реальный тип набора запроса и отрицательный поиск.
Создать обычную включённую группу ПоСкладуПродажи85 по СкладПродажи и выбор КоличествоПродажи/Цена. В группе и выборе полные пути объектов ПолеКомпоновкиДанных сверяются через собственный XML в памяти. Количество, цена и группировка принадлежат своим объявленным наборам.
Схема.СвязиНаборовДанных readonly, но собственная коллекция редактируется методами. Добавить без аргументов возвращает СвязьНаборовДанныхСхемыКомпоновкиДанных. НаборДанныхИсточник/Приемник — строки имён существующих наборов, а ВыражениеИсточник/Приемник — строки выражений над их полями, не сами объекты наборов.
Первая связь сопоставляет КодПродажи с КодЦены; вторая СкладПродажи со СкладЦены. В КА2 интеграция торговых площадок действительно создаёт две связи между одинаковыми сторонами для разных ключей. Этот урок создаёт свои ключи и не вызывает рабочую интеграцию.
Обязательная=Истина означает добавление связи в макет при задействованных полях приёмника. Ложь означает добавление только при задействованных полях исходного набора, используемых в выражении источника. Это правило включения СКД, не переключатель ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL. В своём выборе нужна Цена; склад продажи задействован группой.
УсловиеСвязи — строковое выражение, проверяемое перед выполнением связи. Для кода задано КоличествоПродажи > 0; для склада пустая строка означает выполнять всегда. Независимо изменить флаг кода на Ложь и вернуть Истина; затем изменить условие на >3 и вернуть >0. Полные проверки отличают каждый переход без подсчёта неисполненных строк.
Двенадцать контрольных состояний оригинала проверяют всю основу, обе стороны и выражения каждого ключа, реальный Булево, полное условие, порядок, Индекс и обращение[индекс]. Вставить(0) — абсолютная позиция; Сдвинуть(ПоСкладу,1) — объект и относительное смещение.
Заново создать независимую собственную схему с обоими наборами, полями, группой, выбором и связями. Удалить текущую ПоКоду как объект, не индекс; старую ссылку не применять. Вставить новую связь, очистить только каталог оригинала при сохранённой основе и копии, затем восстановить обе связи новыми описаниями.
Как проверить результат
Будущий итог проверки модели: Продажи85/Цены85 и все шесть путей неизменны. Каталог содержит сначала КодПродажи→КодЦены, Обязательная=Истина, условие КоличествоПродажи > 0, затем СкладПродажи→СкладЦены, Обязательная=Ложь, пустое условие. Оба описания указывают на существующие наборы.
В исходных декларациях код/склад совпадают, количество3, цена500. Это входные литералы, а не полученные строки соединения. Для числа3 сравнение >0 математически истинно, >3 ложно, но условие компоновщиком здесь не вычислялось и визуальный результат не заявляется.
Будущий отрицательный контроль: после создания связи склада присвоить ПоСкладу.НаборДанныхПриемник = "НетТакогоНабора85", не меняя эталон. Проверка должна отказать при прежнем количестве связей и правильных ключах. Вернуть исходный код, сохранить/F7 вне опыта и открыть новый собственный сеанс. Здесь контроль не выполнялся.
runtimeVerifiedScenarios=0. Только статическая сверка типов, сигнатур, контекстов, источников и HTML-поиска. Нет выполнения 1С, записей, реальных запросов, сети, компоновщика, печати или изменений конфигураций пользователя.
Ожидаемый результат
Содержательный опыт связывания своих объявленных наборов: реальные поля обеих сторон, осмысленные флаги/условия и полное независимое восстановление.
На что обратить внимание
Имена наборов и выражения полей — разные строки. Нельзя передать объект набора вместо его имени, связать неизвестное поле или считать одинаковый размер каталогов доказательством правильности связей.
Найти есть у коллекции НаборыДанных, но не у коллекции СвязиНаборовДанных. Для связей используется документированный Индекс, Получить и обращение по числовой позиции. Поиск набора учитывает возможное Неопределено до обращения к свойствам.
Обязательная не обещает SQL-тип соединения. УсловиеСвязи не заменяет выражения ключей. Изменение свойства проверено как модель, а не как исполненное соединение или визуально полученные данные.
Параметр и РазрешенСписокПараметров требуют настоящего параметра запроса приёмника; НачальноеВыражение требует настоящей связи набора с самим собой. Здесь они не читаются как пустые заглушки и не привязываются ради покрытия: им нужны отдельные содержательные уроки.
Свойства обычной группы не переносятся на пользовательские настройки. XML-сериализация получает только свое ПолеКомпоновкиДанных, пишет строку в памяти и закрывает писатель в обоих исходах.
Удалить принимает связь, Вставить — индекс, Сдвинуть — связь/смещение. Удалённые и очищенные ссылки не используются; наборы и связи копии создаются заново, дочерние объекты между схемами не передаются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.