Каталог источников макета: добавить, вставить, сдвинуть, удалить и восстановить

Учебные задачи

Редактируем только независимый черновой каталог своих местных источников. Сверяем реальные элементы, поиск и порядок, затем восстанавливаем полный макет и оба настоящих результата 4/800.

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

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

Подготовка

  1. НОВАЯ отдельная пустая база 8.5.1.1343: корневое Имя=УчебныеМестныеИсточники85, совместимость НеИспользовать, управляемое приложение. Не рабочая КА2/УНФ/УТ/БП и не ее копия. Без бизнес-метаданных, расширений, подписок, заданий и внешних действий. Здесь база и опыт не запускались: runtimeVerifiedScenarios=0.

  2. Создайте общий модуль УчебныеМестныеИсточники85: Сервер=Да, Клиент=Нет, Вызов сервера=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной код ОДНОГО урока. Не объединяйте уроки с повторяющимися именами процедур.

  3. Создайте обработку УчебныйКаталогИсточников85 → управляемая форма Пульт → команда Выполнить с действием Выполнить и кнопкой. Отдельный полный модуль формы ниже. F7, затем обновите только собственный новый стенд перед будущим отдельно разрешенным опытом.

  4. Схема строится полным кодом, макет конфигурации не нужен. Собственный запрос содержит только Книга/3/250/750 и Ручка/1/50/50. В настройках выбираются четыре поля и только детальные записи без таблиц/диаграмм; генератор поддерживает настоящий вывод в ТаблицаЗначений.

  5. Серверная точка останова после ПроверитьСвойМестныйИсточник: сравните Набор.ИсточникДанных и фактическое Имя элемента Макет.ИсточникиДанных. Для своей текущей базы ТипИсточникаДанных=Local, СтрокаСоединения пустая. Серверы, базы, учетные данные, файловые пути и подключения к чужим источникам не задаются.

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

  7. Будущий просмотр результата — внутри ПроверитьСвойПолныйВывод. Реальный процессор должен вернуть две строки и четыре колонки с точными ячейками, количеством 4 и суммой 800. Здесь статические проверки не заменяют запуск компоновщика, процессора и XDTO в 1С.

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

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

Процедура ПроверитьСвойПолныйВывод(Макет, ВнешниеДанные)
    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(Макет, ВнешниеДанные);
    Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    Приемник = Новый ТаблицаЗначений;
    Вывод.ОтображатьПроцентВывода = Ложь;
    Вывод.УстановитьОбъект(Приемник);
    Результат = Вывод.Вывести(Процессор, Ложь);
    Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Или Результат.Количество() <> 2
        Или Результат.Колонки.Количество() <> 4 Тогда
        ВызватьИсключение "Настоящий вывод должен дать две строки и четыре колонки";
    КонецЕсли;
    Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
        Если Результат.Колонки.Найти(ИмяПоля) = Неопределено Тогда
            ВызватьИсключение "Потеряна ожидаемая колонка реального вывода " + ИмяПоля;
        КонецЕсли;
    КонецЦикла;
    Книга = Результат.Найти("Книга", "Наименование");
    Ручка = Результат.Найти("Ручка", "Наименование");
    Если Книга = Неопределено Или Ручка = Неопределено Тогда
        ВызватьИсключение "Не найдены обе реальные исходные строки результата";
    КонецЕсли;
    Если Книга.Количество <> 3 Или Книга.Цена <> 250 Или Книга.Сумма <> 750
        Или Ручка.Количество <> 1 Или Ручка.Цена <> 50 Или Ручка.Сумма <> 50
        Или Результат.Итог("Количество") <> 4 Или Результат.Итог("Сумма") <> 800 Тогда
        ВызватьИсключение "Потеряны или изменены реальные ячейки собственного полного вывода";
    КонецЕсли;
    Сообщить("Настоящий вывод проверен: Книга 3 × 250 = 750, Ручка 1 × 50 = 50; количество 4, сумма 800.");
КонецПроцедуры

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

Функция СвойМакетВСтроку(Макет)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Макет);
    Возврат Запись.Закрыть();
КонецФункции

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

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

УчебныеМестныеИсточники85 → Обработки → УчебныйКаталогИсточников85 → Формы → Пульт → Модуль

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

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

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

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

  1. Первый Источник в коде создания схемы — описание источника схемы. После компиляции берем другой настоящий тип ИсточникДанныхМакетаКомпоновкиДанных. Источник не тождественен набору данных: источник определяет доступ к данным, а запросный набор хранит свой запрос и имя этого источника.

  2. Из одного настоящего запроса макета берем фактический Набор.ИсточникДанных. Каталог.Найти по этому имени должен вернуть тот же элемент, что Получить(0). Имя генератора не угадывается и не предполагается равным УчебныйИсточник исходной схемы.

  3. Local и пустая строка соединения означают текущую информационную базу по установленной справке. Защита до создания схемы требует только свой новый пустой стенд. Пустая строка здесь не ошибка подключения и не команда выбрать произвольную базу.

  4. Отсутствующее НетТакогоИсточника85 дает Неопределено. Nullable-результат проверяется до чтения его свойств. Макет.ИсточникиДанных — readonly-ссылка на каталог; ее нельзя заменять новым объектом или присваивать ей массив источников.

  5. ПроверитьСвойПолныйВывод получает настоящий результат Вывод.Вывести. Проверяются два наименования, каждая ячейка количества/цены/суммы, точные четыре колонки, размер 2 и оба итога 4/800. Эталонная таблица вместо фактического результата не создается.

  6. Первый добавляется в конец, Второй вставляется в начало каталога собственной XDTO-копии. Имена ПервыйМестный85/ВторойМестный85 обозначают только свои временные местные определения: тип Local и пустое соединение задаются явно.

  7. Проверяется порядок Второй/Скопированный/Первый, Индекс(Первый)=2 и поиск обоих временных имен. Сдвинуть(Первый,-2) дает Первый/Второй/Скопированный; Удалить(Второй) оставляет Первый/Скопированный; Очистить убирает только источники копии.

  8. Исходный Макет обязан сохранить тот же МестныйИсточник. Восстановленный создается заново из собственной исходной XML-строки; сверяются фактическое имя, тип и соединение, заново разрешается имя источника из его настоящего запроса. Оба полных макета повторно выводятся и проверяются по всем ячейкам.

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

  1. Будущий исходный результат: Книга 3 × 250 = 750; Ручка 1 × 50 = 50; ровно две строки, четыре колонки, количество 4, сумма 800. Настоящий набор запроса разрешает свое имя источника в настоящем каталоге.

  2. Отдельный отрицательный ручной опыт в своем разрешенном стенде: перед ПроверитьСвойМестныйИсточник заменить Набор.ИсточникДанных на НетТакогоИсточника85. Проверка должна отказать до инициализации процессора; нельзя подставлять первый источник вместо неудачного поиска. Здесь контроль не выполнялся.

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

  4. Размеры чернового каталога: 1 → 3 → 3 → 2 → 0. Индексы, настоящие элементы и поиск имен проверяются на каждом изменении. Исходный каталог остается с одним тем же настоящим элементом; после полного восстановления снова один Local с пустым соединением.

  5. Три полных вывода — исходный до изменений, восстановленный и исходный после очистки копии — каждый должен дать Книга/Ручка, количество 4, сумму 800. Неполный Черновик в процессор не передается.

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

Ожидается реальный местный источник, разрешающий имя из настоящего запроса, и полный вывод Книга/Ручка: количество 4, сумма 800. Здесь в 1С не запускалось.

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

  1. runtimeVerifiedScenarios=0. Это полный код будущего собственного опыта, статически сверенный с native-справкой; реальная компиляция, вывод и XDTO не запускались.

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

  3. У элемента макета все три свойства строки и доступны для записи. ТипИсточникаДанных="Local" — буквальное native-значение строки, не Тип("Local") и не выдуманное перечисление. Для текущей базы СтрокаСоединения=""; других вариантов этот урок не обещает.

  4. Добавить() и Вставить(Индекс) каталога источников макета не принимают Тип. Индекс, Сдвинуть и Удалить работают с настоящим элементом именно своего каталога. После удаления/очистки старые ссылки элементов не используются.

  5. Очистка каталога источников копии оставляет ссылки запросов и тела макета неполными. Это редакторское состояние, не готовый отчет. Восстановление полного макета из исходной собственной строки обязательно перед повторным выводом.

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

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

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

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

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