НаборыДанныхСхемыКомпоновкиДанных.Удалить

Методы · Delete

Удаляет элемент из коллекции.

Синтаксис

Удалить(<Элемент>)
Полное описание, параметры и ограничения

НаборыДанныхСхемыКомпоновкиДанных.Удалить (DataCompositionSchemaDataSets.Delete)

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

Удалить (Delete)

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

Синтаксис:
Удалить(<Элемент>)
Параметры:

<Элемент> (обязательный)
Тип: НаборДанныхЗапросСхемыКомпоновкиДанных, НаборДанныхОбъектСхемыКомпоновкиДанных, НаборДанныхОбъединениеСхемыКомпоновкиДанных.
Удаляемый элемент.
Описание:

Удаляет элемент из коллекции.

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

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

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

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

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

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

Объединённый набор СКД: редактор двух запросов и полей с полным восстановлением

Создаём один настоящий набор-объединение, а внутри — собственные буквальные запросы A01/3 и B02/5. Редактируем порядок и состав частей, затем каталог полей первой части. Каждый шаг сверяет полную схему и независимую копию; финал заново восстанавливает обе части и все типизированные поля.

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

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

Подготовка

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

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

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

  4. Записи учебной базы не нужны: код сам объявляет один Local-источник СвоиОбъединения85, корневой Объединение85, два запроса и их поля Код Строка/Количество Число. У частей автозаполнение выключено; реальные имена/полные запросы/описания полей задаются явно.

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

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

Функция ИмяТипаСвоегоПоля(Имя)
    Если Имя = "Код" Тогда
        Возврат "Строка";
    ИначеЕсли Имя = "Количество" Тогда
        Возврат "Число";
    КонецЕсли;
    ВызватьИсключение "В своём объединении используются только Код и Количество";
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Набор-объединение получается через Схема.НаборыДанных.Добавить(Тип(...)), не через Новый и не подменяется запросом. У него Имя, Поля и Элементы. Элементы — собственный каталог составных частей, а не результаты выполнения запроса.

  2. Readonly у Поля и Элементы запрещает замену свойства целиком, но не операции над возвращёнными коллекциями. В справке поля объединения описаны как определения ограничений идентичности. Здесь задаём совместимые Код/Количество в модели и сверяем полные пути/типы; не обещаем поведение SQL ОБЪЕДИНИТЬ ВСЕ.

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

  4. В первой части удалить поле Количество как объект. Вставить новый объект поля в0, заполнить весь путь/тип; проверить Количество/Код и переставить его на1. Очистить собственные поля и проверить0, сохраняя обе части, их запросы и полный каталог полей объединения. Затем заново построить поля Код/Количество.

  5. Тринадцать контрольных состояний оригинала сверяют весь корень схемы, имя/тип источника, корневое объединение, его два поля, текущий состав частей, полные запросы/флаги/источник, реальные имена/пути/полные наборы типов полей, порядок и положительный/отрицательный поиск частей. Это не проверки одних размеров.

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

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

  8. Отсутствующие поля или пустой каталог частей — временно неполные состояния РЕДАКТОРА. Они не выдаются за готовую к выполнению схему. После восстановления финал содержит оба полных запроса с двумя согласованными полями в каждой части; движок СКД не запускается.

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

  1. Будущий итог модели: в корне один источник и Объединение85; Элементы содержат ПервыйНабор85/ВторойНабор85. Во всех трёх каталогах полей полный состав Код Строка/Количество Число; запросы строго равны своим исходным строкам, AutoFields=Ложь. Копия имеет тот же полный состав.

  2. Тексты своих запросов объявляют A01/3 и B02/5. Это исходные литералы, не полученные строки результата и не доказательство объединения, удаления дублей, суммирования или порядка вывода. Ни один запрос или компоновщик здесь не выполнялся.

  3. Будущий отрицательный контроль: после полного заполнения заменить только текст первого запроса на Количество=30, оставив прежние имена/число полей. Полная проверка должна отказать по тексту запроса. Другой контроль: тип поля Количество заменить на Строка — отказ по полному набору типов. Здесь контроля не было.

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

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

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

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

  1. Вставить получает ИНДЕКС, затем объект типа Тип. Не передавать готовый экземпляр, строку имени типа или перепутанные аргументы. Добавить набора при неподходящем типе может вернуть Неопределено; помощник проверяет реальный возвращённый тип до чтения свойств.

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

  3. Найти применяется к конкретному каталогу частей. Не предполагается недокументированный рекурсивный поиск по всем объединениям; поля проверяются по индексу и полным именам без выдуманного метода Найти.

  4. Перестановка описаний не доказывает сортировку строк будущего результата. Имена полей отображают псевдонимы собственных запросов; несовместимость типов/путей и временное отсутствие описаний не скрываются.

  5. Это не конструктор готового визуального отчёта и не пример запуска SQL UNION ALL. Выбор полей, ресурсы, группировки, настройки, компиляция и вывод — отдельные уроки и отдельная runtime-проверка.

  6. В КА2 отчёт АнализДоходовРасходов действительно имеет DataSetUnion:83 определения field и11 item, первые части Выручка/Себестоимость — DataSetQuery на ИсточникДанных1. Здесь повторяется структура собственного малого объединения, рабочий отчёт не вызывается и его выгрузка не изменяется.

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

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

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

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

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