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

Методы · Clear

Очищает коллекцию.

Синтаксис

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

НаборыДанныхСхемыКомпоновкиДанных.Очистить (DataCompositionSchemaDataSets.Clear)

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

Очистить (Clear)

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

Синтаксис:
Очистить()
Описание:

Очищает коллекцию.

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

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

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

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

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

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

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

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

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

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

Подготовка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создаём один настоящий набор-объединение, а внутри — собственные буквальные запросы 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С» и не аффилирован с ней.