Параметры оформления: реальные заголовки и идентификаторы у своего владельца

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

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

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

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

Подготовка

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

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

  3. Конфигуратор → Обработки → УчебныеМакетыВложений85 → Формы → Пульт: управляемая форма, команда Выполнить и кнопка с этой командой. Действие команды Выполнить. Полный модуль своей формы дан отдельно ниже; реквизиты не нужны.

  4. Сохранить и обновить собственную конфигурацию базы данных (F7). Запустить свежий свой клиент, Все функции → Обработки → УчебныеМакетыВложений85 → Выполнить. Здесь это будущие ручные шаги; 1С и F7 не запускались.

  5. Данные создаются только буквальным Local-запросом: Книга3×250=750, Ручка1×50=50. Четыре выбранных поля и одна группа деталей готовятся кодом; никакие справочники или документы не нужны.

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

  7. XML хранится только строками памяти. Копии создаются для независимого редакторского опыта и свежего вывода; файлов, архивов и резервных копий здесь нет.

  8. runtimeVerifiedScenarios=0. Выполнялись статические проверки установленной справки и итогового HTML. Будущий запуск должен пройти все встроенные проверки; реальный UI, печать, сеть и production здесь не запускались.

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

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

Процедура ЗаполнитьСвоиДанные(Схема)
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "УчебныйИсточник";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Набор.Имя = "УчебныеТовары";
    Набор.ИсточникДанных = Источник.Имя;
    Набор.АвтоЗаполнениеДоступныхПолей = Истина;
    Набор.Запрос = "ВЫБРАТЬ
    |    ""Книга"" КАК Наименование,
    |    3 КАК Количество,
    |    250 КАК Цена,
    |    750 КАК Сумма
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ ""Ручка"", 1, 50, 50";
КонецПроцедуры

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

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

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


Функция ПрочитатьСвоеЧисло(Ячейка)
    Если Ячейка.СодержитЗначение Тогда
        Значение = Ячейка.Значение;
        Если ТипЗнч(Значение) = Тип("Число") Тогда
            Возврат Значение;
        КонецЕсли;
        Возврат Неопределено;
    КонецЕсли;
    Текст = СтрЗаменить(СтрЗаменить(СокрЛП(Ячейка.Текст), Символ(160), ""), " ", "");
    Если Текст = "" Тогда
        Возврат Неопределено;
    КонецЕсли;
    ЕстьЦифра = Ложь;
    Для Позиция = 1 По СтрДлина(Текст) Цикл
        Знак = Сред(Текст, Позиция, 1);
        Если СтрНайти("0123456789", Знак) > 0 Тогда
            ЕстьЦифра = Истина;
        ИначеЕсли СтрНайти(",.-", Знак) = 0 Тогда
            Возврат Неопределено;
        КонецЕсли;
    КонецЦикла;
    Если Не ЕстьЦифра Тогда
        Возврат Неопределено;
    КонецЕсли;
    Возврат Число(Текст);
КонецФункции

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

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

УчебныеМакетыВложений85 → Обработки → УчебныеМакетыВложений85 → Формы → Пульт → Модуль

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

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

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

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

  1. Создать свою простую двухстрочную схему и группу деталей. Инициализировать редактор настоящим источником, затем загрузить исходные настройки. Общие и групповые параметры имеют разных владельцев.

  2. До изменения найти ПараметрКомпоновкиДанных("Заголовок") и "ВыводитьЗаголовок" в ДоступныеПараметры обоих владельцев. Отсутствие заканчивает свой опыт диагностикой; случайные новые параметры не добавляются в связанную коллекцию.

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

  4. У общих Элементы проверяются индекс и тот же реальный объект заголовка. У этих простых верхнеуровневых заголовков Родитель=Неопределено; readonly ЗначенияВложенныхПараметров является отдельной пустой коллекцией. Из пустоты нельзя делать вывод, что все параметры СКД плоские.

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

  6. Ни один ID не конструируется вручную. ОбщийID и ГрупповойID не сравниваются как числа/строки и не используются в другом редакторе. После загрузки полной XDTO-копии заново ищется новый объект и новый ID именно у его нового владельца.

  7. Первый и восстановленный реальные табличные документы должны содержать общий заголовок Учебные товары85 и неизменные строки Книга/Ручка. Групповой заголовок настроен и найден в модели, но его видимость у группы деталей не приписывается этому контролю.

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

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

  2. Проверка не предполагает фиксированные номера колонок: они находятся по фактическим заголовкам. Граница200×100 предназначена только для этого собственного небольшого отчета без ресурсов/итоговых строк. Дубли товара, посторонняя числовая строка, отсутствие числа или неверная ячейка завершают опыт исключением.

  3. Отрицательный контроль будущего отдельного опыта: изменить в собственном запросе только количество Книги3→30 при прежней сумме750. Числовая проверка должна отказать, несмотря на прежние два названия товаров.

  4. Исходная схема и полный исходный макет сохраняются; XML-сравнение проверяет собственное состояние в памяти, но не заменяет проверку строк результата.

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

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

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

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

  1. Настройки вложенного объекта, описание вложенной схемы и вложенный объект готового макета — три разных типа. Readonly КомпоновкаДанных не подменяется новой схемой; readonly каталоги параметров целиком не переназначаются.

  2. Изменение ID готового макета может нарушить его связи. Измененный черновик не исполняется; восстанавливается весь исходный макет, а не пара строк, оставляющая неизвестные зависимости.

  3. Идентификатор параметра принадлежит своему владельцу. Не переносить старый ID в восстановленный редактор и не превращать ИдентификаторКомпоновкиДанных в произвольную строку.

  4. Связанные коллекции значений параметров нельзя произвольно Добавить/Вставить/Удалить/Очистить. Используется штатное УстановитьЗначениеПараметра после проверки доступности. Ограниченные методы этим урокам не приписываются.

  5. Пустая коллекция ЗначенияВложенныхПараметров относится только к простому заголовку, а пустой список параметров готового вложения — только к конкретной простой компоновке. Общие вложенные/иерархические параметры требуют отдельного содержательного опыта.

  6. Заголовки настроены на своей схеме. Физическая раскладка сложных чужих макетов, повторяющиеся шапки, сводные таблицы и печатные области этим контрольным сканированием не поддерживаются.

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

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

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

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

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