ПостроительОтчета.Макет

Свойства · Template

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

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

ПостроительОтчета.Макет (ReportBuilder.Template)

ПостроительОтчета (ReportBuilder)

Макет (Template)

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

Использование:
Чтение и запись.
Описание:
Тип: ТабличныйДокумент.
Содержит макет, используемый для вывода отчета.
Доступность:

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

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

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

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

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

ПостроительОтчета: собственный полный макет и настоящая расшифровка группы

Обычная форма толстого клиента строит собственный отчёт из трёх literal строк, использует все области макета и по реальному cell callback выводит справа только выбранную собственную категорию. Это старый API построителя, не СКД.

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

Полный модуль собственной обычной формы обработки УчебныйМакетПостроителя85. ТолстыйКлиентОбычноеПриложение 8.5.1.1343; реальное событие собственного поля ТабличныйДокумент с native базовыми двумя параметрами плюс первый Элемент обычного расширения внутри формы. Только own literal query и макеты в памяти.

Подготовка

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

  2. Добавьте собственную обработку УчебныйМакетПостроителя85 и её Обычную форму Основная. Реквизиты формы: ОсновнойДокумент85 и ДетальныйДокумент85 типа ТабличныйДокумент, Состояние85 типа Строка неограниченной длины. Поставьте два ПолеТабличногоДокумента: ОсновнойОтчет85 с данными ОсновнойДокумент85 и ДетальныйОтчет85 с данными ДетальныйДокумент85. Разместите Состояние85 отдельным многострочным полем только для просмотра.

  3. Кнопку СформироватьОсновной85 свяжите с одноимённой процедурой. Событие формы ПриОткрытии — с ПриОткрытии(). У поля ОсновнойОтчет85 событие ОбработкаРасшифровки свяжите с ОсновнойОтчет85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка). Базовое событие поля имеет два параметра, а обычное расширение любого элемента внутри формы добавляет первым Элемент. Это итоговая ordinary сигнатура с тремя параметрами; код сверяет actual собственное поле, не вызывайте обработчик вручную.

  4. Весь код вставьте в модуль своей обычной формы, обновите только собственную конфигурацию и откройте свою обработку толстым клиентом в обычном приложении. На сервере, в тонком и web клиенте этот UI маршрут не запускается.

  5. Макет создаётся полностью в памяти самим модулем. Настоящие области: ЗаголовокОтчета, ШапкаТаблицы, Категория, Детали, ОбщиеИтоги, ПодвалТаблицы, ПодвалОтчета. Параметры детальных ячеек совпадают с полями собственного literal запроса. Для суммы количества группы используется ПараметрРасшифровки=Расшифровка, и построитель сам заполняет значение native cell.

  6. Свои строки: А85/Альфа85/1/100, А85/Гамма85/3/600, Б85/Бета85/5/1250. У текста построителя есть настоящий расширенный раздел {ГДЕ Д.Категория КАК Категория}; только это измерение доступно методу НастроитьРасшифровку. Не заменяйте запрос таблицами своей рабочей базы.

  7. Оформление Весна получается native ПолучитьМакетОформления и используется отдельным ТабличныйДокумент. Его применение идёт через ОформитьМакет после Выполнить, как в native примере. Цвета/точный вид темы проверьте вручную; исходники УТ подтверждают архитектуру параметров макета, но не доказывают исполнение этого урока на 8.5.1.1343.

#Если ТолстыйКлиентОбычноеПриложение Тогда

Перем СвойОсновнойПостроитель85;

Процедура ПриОткрытии()
    ПроверитьСвойПустойСтенд();
    СвойОсновнойПостроитель85 = Неопределено;
    ОсновнойДокумент85 = Новый ТабличныйДокумент;
    ДетальныйДокумент85 = Новый ТабличныйДокумент;
    ОсновнойДокумент85.ТолькоПросмотр = Истина;
    ДетальныйДокумент85.ТолькоПросмотр = Истина;
    Состояние85 = "Сначала СформироватьОсновной85. Затем двойной щелчок по количеству в строке группы А85 или Б85.";
КонецПроцедуры

Процедура СформироватьОсновной85(Кнопка)
    ПроверитьСвойПустойСтенд();
    НовыйПостроитель = СоздатьСвойПостроитель85();
    НовыйПостроитель.Выполнить();
    ПроверитьСвойЗапрос85(НовыйПостроитель, "");
    НовыйПостроитель.ОформитьМакет();
    НовыйДокумент = Новый ТабличныйДокумент;
    НовыйПостроитель.Вывести(НовыйДокумент);
    ПроверитьСвойВывод85(НовыйДокумент, "");
    НовыйДокумент.ТолькоПросмотр = Истина;
    СвойОсновнойПостроитель85 = НовыйПостроитель;
    ОсновнойДокумент85 = НовыйДокумент;
    Состояние85 = "Свой отчёт: 3 детальные строки; А85=4/700, Б85=5/1250, общий итог=9/1950. Щёлкните количество группы, не текст подвала.";
КонецПроцедуры

Функция СоздатьСвойПостроитель85()
    Построитель = Новый ПостроительОтчета;
    Построитель.Текст = "ВЫБРАТЬ Д.Категория, Д.Наименование, Д.Количество, Д.Сумма
|ИЗ (ВЫБРАТЬ ""А85"" КАК Категория, ""Альфа85"" КАК Наименование, 1 КАК Количество, 100 КАК Сумма
|    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""А85"", ""Гамма85"", 3, 600
|    ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Б85"", ""Бета85"", 5, 1250) КАК Д
|{ГДЕ Д.Категория КАК Категория}
|УПОРЯДОЧИТЬ ПО Категория, Наименование
|ИТОГИ СУММА(Количество), СУММА(Сумма) ПО ОБЩИЕ, Категория";
    Построитель.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    Построитель.ЗаполнитьНастройки();
    Построитель.ВыбранныеПоля.Очистить();
    Для Каждого ИмяПоля Из СтрРазделить("Категория,Наименование,Количество,Сумма", ",") Цикл
        Построитель.ВыбранныеПоля.Добавить(ИмяПоля, ИмяПоля);
    КонецЦикла;
    Построитель.ИзмеренияСтроки.Очистить();
    Измерение = Построитель.ИзмеренияСтроки.Добавить("Категория", "Категория", ТипИзмеренияПостроителяОтчета.Элементы);
    Построитель.ИзмеренияКолонки.Очистить();
    Построитель.АвтоДетальныеЗаписи = Ложь;
    Построитель.ВыводитьДетальныеЗаписи = Истина;
    Построитель.ВыводитьЗаголовокОтчета = Истина;
    Построитель.ВыводитьОбщиеИтоги = Истина;
    Построитель.ВыводитьШапкуТаблицы = Истина;
    Построитель.ВыводитьПодвалТаблицы = Истина;
    Построитель.ВыводитьПодвалОтчета = Истина;
    Построитель.ОтображатьСостояние = Ложь;
    Построитель.ОбрабатыватьПрерываниеПользователя = Ложь;
    Построитель.ЗаполнениеРасшифровки = ВидЗаполненияРасшифровкиПостроителяОтчета.Расшифровка;
    Построитель.Макет = СоздатьСвойМакет85();
    Построитель.МакетЗаголовкаОтчета = "ЗаголовокОтчета";
    Построитель.МакетШапкиТаблицы = "ШапкаТаблицы";
    Построитель.МакетДетальныхЗаписей = "Детали";
    Построитель.МакетОбщихИтогов = "ОбщиеИтоги";
    Построитель.МакетПодвалаТаблицы = "ПодвалТаблицы";
    Построитель.МакетПодвалаОтчета = "ПодвалОтчета";
    Измерение.Макет = "Категория";
    Построитель.МакетОформления = ПолучитьМакетОформления(СтандартноеОформление.Весна);
    Если ТипЗнч(Построитель.Макет) <> Тип("ТабличныйДокумент")
        Или ТипЗнч(Построитель.МакетОформления) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "Оба макета построителя должны быть настоящими табличными документами";
    КонецЕсли;
    Если Построитель.МакетЗаголовкаОтчета <> "ЗаголовокОтчета"
        Или Построитель.МакетШапкиТаблицы <> "ШапкаТаблицы"
        Или Построитель.МакетДетальныхЗаписей <> "Детали"
        Или Построитель.МакетОбщихИтогов <> "ОбщиеИтоги"
        Или Построитель.МакетПодвалаТаблицы <> "ПодвалТаблицы"
        Или Построитель.МакетПодвалаОтчета <> "ПодвалОтчета" Тогда
        ВызватьИсключение "Имена собственных областей не прочитались обратно";
    КонецЕсли;
    Возврат Построитель;
КонецФункции

Функция СоздатьСвойМакет85()
    Макет = Новый ТабличныйДокумент;
    Макет.Область(1, 1, 8, 4).ШиринаКолонки = 22;
    Макет.Область(1, 1, 1, 4).Имя = "ЗаголовокОтчета";
    Макет.Область(1, 1).Текст = "Свой макет построителя85";
    Макет.Область(2, 1, 2, 4).Имя = "ШапкаТаблицы";
    Макет.Область(2, 1).Текст = "Категория";
    Макет.Область(2, 2).Текст = "Собственная строка";
    Макет.Область(2, 3).Текст = "Количество";
    Макет.Область(2, 4).Текст = "Сумма";
    Макет.Область(3, 1, 3, 4).Имя = "Категория";
    Макет.Область(3, 1).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    Макет.Область(3, 1).Параметр = "Категория";
    Макет.Область(3, 2).Текст = "Своя группа: открыть расшифровку количества";
    Макет.Область(3, 3).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    Макет.Область(3, 3).Параметр = "Количество";
    Макет.Область(3, 3).ПараметрРасшифровки = "Расшифровка";
    Макет.Область(3, 4).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    Макет.Область(3, 4).Параметр = "Сумма";
    Макет.Область(4, 1, 4, 4).Имя = "Детали";
    НомерКолонки = 1;
    Для Каждого ИмяПоля Из СтрРазделить("Категория,Наименование,Количество,Сумма", ",") Цикл
        Ячейка = Макет.Область(4, НомерКолонки);
        Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
        Ячейка.Параметр = ИмяПоля;
        НомерКолонки = НомерКолонки + 1;
    КонецЦикла;
    Макет.Область(5, 1, 5, 4).Имя = "ОбщиеИтоги";
    Макет.Область(5, 1).Текст = "Свой общий итог";
    Макет.Область(5, 3).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    Макет.Область(5, 3).Параметр = "Количество";
    Макет.Область(5, 4).Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
    Макет.Область(5, 4).Параметр = "Сумма";
    Макет.Область(6, 1, 6, 4).Имя = "ПодвалТаблицы";
    Макет.Область(6, 1).Текст = "Конец своей таблицы85";
    Макет.Область(7, 1, 7, 4).Имя = "ПодвалОтчета";
    Макет.Область(7, 1).Текст = "Своё учебное завершение85";
    Для Каждого ИмяОбласти Из СтрРазделить("ЗаголовокОтчета,ШапкаТаблицы,Категория,Детали,ОбщиеИтоги,ПодвалТаблицы,ПодвалОтчета", ",") Цикл
        Если ТипЗнч(Макет.ПолучитьОбласть(ИмяОбласти)) <> Тип("ТабличныйДокумент") Тогда
            ВызватьИсключение "Не создана настоящая собственная область " + ИмяОбласти;
        КонецЕсли;
    КонецЦикла;
    Возврат Макет;
КонецФункции

Процедура ОсновнойОтчет85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Если Элемент <> ЭлементыФормы.ОсновнойОтчет85 Тогда
        ВызватьИсключение "Расшифровка пришла не от собственного actual поля основного отчёта";
    КонецЕсли;
    ПроверитьСвойПустойСтенд();
    Если СвойОсновнойПостроитель85 = Неопределено Тогда
        ВызватьИсключение "Сначала сформируйте свой основной отчёт";
    КонецЕсли;
    Если ТипЗнч(Расшифровка) <> Тип("Структура") Тогда
        Состояние85 = "Это не native структура групповой расшифровки: щёлкните количество строки группы А85 или Б85.";
        Возврат;
    КонецЕсли;
    Если Не Расшифровка.Свойство("Категория", Категория) Тогда
        Состояние85 = "В native расшифровке нет собственного измерения Категория; ничего не выполнялось.";
        Возврат;
    КонецЕсли;
    Если ТипЗнч(Категория) <> Тип("Строка") Или (Категория <> "А85" И Категория <> "Б85") Тогда
        ВызватьИсключение "Допустимы только две реальные категории собственного отчёта";
    КонецЕсли;
    ДокументДоВопроса = ДетальныйДокумент85;
    ТекстДоВопроса = СнимокСвоегоДокумента85(ДетальныйДокумент85);
    Ответ = Вопрос("Расшифровать свою категорию " + Категория + "?", РежимДиалогаВопрос.ДаНетОтмена, 30, КодВозвратаДиалога.Отмена);
    Если Ответ <> КодВозвратаДиалога.Да Тогда
        Если ДетальныйДокумент85 <> ДокументДоВопроса Или СнимокСвоегоДокумента85(ДетальныйДокумент85) <> ТекстДоВопроса Тогда
            ВызватьИсключение "Отказ или таймаут не должен изменять прежний детальный результат";
        КонецЕсли;
        Состояние85 = "Нет/Отмена/таймаут: собственный детальный документ остался прежним. Новый построитель не создавался.";
        Возврат;
    КонецЕсли;
    НовыйПостроитель = СоздатьСвойПостроитель85();
    Если НовыйПостроитель = СвойОсновнойПостроитель85 Тогда
        ВызватьИсключение "Детальная расшифровка должна иметь отдельный собственный построитель";
    КонецЕсли;
    СвойОсновнойПостроитель85.НастроитьРасшифровку(НовыйПостроитель, Расшифровка);
    НовыйПостроитель.Выполнить();
    ПроверитьСвойЗапрос85(НовыйПостроитель, Категория);
    НовыйПостроитель.ОформитьМакет();
    НовыйДокумент = Новый ТабличныйДокумент;
    НовыйПостроитель.Вывести(НовыйДокумент);
    ПроверитьСвойВывод85(НовыйДокумент, Категория);
    ПроверитьСвойЗапрос85(СвойОсновнойПостроитель85, "");
    НовыйДокумент.ТолькоПросмотр = Истина;
    ДетальныйДокумент85 = НовыйДокумент;
    Состояние85 = "Принята native расшифровка " + Категория + ". Справа только свои строки этой категории, слева исходные три строки сохранены.";
КонецПроцедуры

Процедура ПроверитьСвойЗапрос85(Построитель, Категория)
    Результат = Построитель.Результат;
    Если ТипЗнч(Результат) <> Тип("РезультатЗапроса") Тогда
        ВызватьИсключение "Нужен настоящий результат запроса построителя";
    КонецЕсли;
    Строки = Результат.Выгрузить(ОбходРезультатаЗапроса.Прямой);
    Если ТипЗнч(Строки) <> Тип("ТаблицаЗначений") Тогда
        ВызватьИсключение "Прямой native обход должен вернуть таблицу значений";
    КонецЕсли;
    Если Категория = "" Тогда
        ОжидаетсяСтрок = 3;
        ОжидаетсяКоличество = 9;
        ОжидаетсяСумма = 1950;
    ИначеЕсли Категория = "А85" Тогда
        ОжидаетсяСтрок = 2;
        ОжидаетсяКоличество = 4;
        ОжидаетсяСумма = 700;
    ИначеЕсли Категория = "Б85" Тогда
        ОжидаетсяСтрок = 1;
        ОжидаетсяКоличество = 5;
        ОжидаетсяСумма = 1250;
    Иначе
        ВызватьИсключение "Неизвестная категория собственного ожидания";
    КонецЕсли;
    Если Строки.Количество() <> ОжидаетсяСтрок Или Строки.Итог("Количество") <> ОжидаетсяКоличество
        Или Строки.Итог("Сумма") <> ОжидаетсяСумма Тогда
        ВызватьИсключение "Native запрос не совпал с собственным числовым ожиданием";
    КонецЕсли;
    Для Каждого СтрокаДанных Из Строки Цикл
        Если Категория <> "" И СтрокаДанных.Категория <> Категория Тогда
            ВызватьИсключение "Native отбор пропустил строку чужой категории";
        КонецЕсли;
        Если СтрокаДанных.Наименование = "Альфа85" Тогда
            Верно = СтрокаДанных.Категория = "А85" И СтрокаДанных.Количество = 1 И СтрокаДанных.Сумма = 100;
        ИначеЕсли СтрокаДанных.Наименование = "Гамма85" Тогда
            Верно = СтрокаДанных.Категория = "А85" И СтрокаДанных.Количество = 3 И СтрокаДанных.Сумма = 600;
        ИначеЕсли СтрокаДанных.Наименование = "Бета85" Тогда
            Верно = СтрокаДанных.Категория = "Б85" И СтрокаДанных.Количество = 5 И СтрокаДанных.Сумма = 1250;
        Иначе
            ВызватьИсключение "Запрос вернул неизвестную собственную строку";
        КонецЕсли;
        Если Не Верно Тогда
            ВызватьИсключение "Значения собственной строки не совпали";
        КонецЕсли;
    КонецЦикла;
    Если (Категория = "" Или Категория = "А85") И (Строки.Найти("Альфа85", "Наименование") = Неопределено
        Или Строки.Найти("Гамма85", "Наименование") = Неопределено) Тогда
        ВызватьИсключение "Потеряна собственная Альфа85 или Гамма85";
    КонецЕсли;
    Если (Категория = "" Или Категория = "Б85") И Строки.Найти("Бета85", "Наименование") = Неопределено Тогда
        ВызватьИсключение "Потеряна собственная Бета85";
    КонецЕсли;
КонецПроцедуры

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

Функция СнимокСвоегоДокумента85(Документ)
    Если Документ.ВысотаТаблицы > 100 Или Документ.ШиринаТаблицы > 20 Тогда
        ВызватьИсключение "Этот helper допускает только свой маленький учебный результат";
    КонецЕсли;
    Части = Новый Массив;
    Части.Добавить(Строка(Документ.ВысотаТаблицы));
    Части.Добавить(Строка(Документ.ШиринаТаблицы));
    Для НомерСтроки = 1 По Документ.ВысотаТаблицы Цикл
        Для НомерКолонки = 1 По Документ.ШиринаТаблицы Цикл
            Части.Добавить(Документ.Область(НомерСтроки, НомерКолонки).Текст);
        КонецЦикла;
    КонецЦикла;
    Возврат СтрСоединить(Части, Символы.ПС);
КонецФункции

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

#КонецЕсли

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

  1. СформироватьОсновной85 создаёт новый собственный ПостроительОтчета. ЗаполнитьНастройки разбирает собственный текст, затем выбор и измерения устанавливаются явно. Все шесть форматных секций включены, детальные записи выводятся независимо от авто-решения.

  2. Макет — полный собственный табличный документ. Каждое секционное свойство содержит настоящее имя уже созданной области, разрешённое native контрактом Строка/ТабличныйДокумент. Группировка Категория имеет собственный макет. Перед выполнением читаем назначения обратно, а не считаем одно присваивание достаточным доказательством.

  3. Выполнить реально исполняет literal запрос. Прямой native Выгрузить возвращает три детальные строки; проверяются каждое имя/число/сумма и общий итог 9/1950. ОформитьМакет применяет native оформление, затем Вывести формирует настоящий документ. FindText в результате контролирует заголовок, оба подвала и реальные имена всех строк.

  4. Слева найдите строку группы А85 и дважды щёлкните её значение Количество=4. Подлинный native ОбработкаРасшифровки получает Структура из сформированной ячейки; код не создаёт вместо неё Новый Структура. Только существующее собственное измерение Категория со значением А85/Б85 разрешает дальнейший маршрут.

  5. Подтвердите Да в настоящем Вопрос с Да/Нет/Отмена. При Нет, Отмена или таймауте 30 секунд проверяются identity и текстовый снимок предыдущего детального документа; ни новый построитель, ни новый вывод ещё не создаются. СтандартнаяОбработка отключена, чтобы система не выполняла вторую самостоятельную расшифровку.

  6. После Да создаётся отдельный новый собственный построитель с тем же literal запросом и своим макетом. Исходный.НастроитьРасшифровку(Новый, Расшифровка) передаёт именно реальное значение callback. Другие поля структуры не превращаются в отбор: native метод ограничен измерениями раздела ГДЕ. Результат проверки должен дать для А85 только Альфа85/Гамма85 с итогом 4/700.

  7. Документ детализации сначала полностью строится и проверяется в локальном кандидате. Только после числового readback и проверки его настоящих ячеек новый документ присваивается ДетальныйДокумент85. Повторная проверка исходного построителя должна по-прежнему видеть все три строки. Двойной щелчок по группе Б85 и Да заменяет правый результат на одну собственную Бета85, итог 5/1250.

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

  1. Слева видны заголовок Свой макет построителя85, шапка, две группы, три имени деталей, общий итог 9/1950, Конец своей таблицы85 и Своё учебное завершение85. Код проверяет появление текстов и состав результатов; конкретное оформление Весна требует визуальной проверки в своём клиенте.

  2. А85 + Да: справа ровно Альфа85 и Гамма85, никаких Бета85; количество 4, сумма 700. Б85 + Да: справа только Бета85, количество 5, сумма 1250. Левый отчёт не должен потерять группу А85 или Б85.

  3. После успешной детализации А85 нажмите расшифровку Б85 и Отмена, затем повторите Нет, затем дождитесь таймаута. Правый документ с Альфа85/Гамма85 должен сохраняться; состояние прямо сообщает нормальный отказ, не ошибку и не успешную перестройку.

  4. Щелчок по тексту заголовка/подвала без native расшифровки не должен вызывать обработчик. Щелчок по ячейке с неподходящим native значением завершает свой обработчик без выполнения нового отчёта. Нельзя считать такой щелчок успешной расшифровкой.

  5. Для собственного негативного опыта в отдельной копии учебного текста удалите только строку {ГДЕ ...}. Native метод больше не обязан применять Категория; readback детализации должен отклонить полный результат, прежний правый документ останется принят. Не меняйте рабочую конфигурацию и не подставляйте фиктивную структуру вместо cell callback.

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

Ожидаемый при ручном запуске результат: собственные секции макета реально участвуют в выводе; native структура расшифровки переключает второй отчёт между 2 и 1 детальными строками без изменения исходного отчёта и без записи данных.

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

  1. ПостроительОтчета и старый ТабличныйДокумент оформление — не СКД. Не подменяйте Структура расшифровки построителя на идентификатор элемента ДанныеРасшифровкиКомпоновкиДанных.

  2. НастроитьРасшифровку фильтрует только разрешённые измерения секции ГДЕ целевого построителя. Наличие ключа в native структуре само по себе не гарантирует отбор: поэтому результат проверяется до принятия.

  3. ПараметрРасшифровки не равен свойству Расшифровка готовой ячейки. В макете задаётся имя параметра, а actual значение создаёт построитель при выводе. Код не вызывает callback напрямую и не назначает вручную его входную структуру.

  4. Снимок документа проверяет размеры и тексты ячеек, не является полной сериализацией оформления. Статические тесты не доказывают визуальный фон, шрифты, клиентские темы и настоящий UI callback.

  5. При повторном выводе построитель учитывает внутренний флаг: новый построитель и Выполнить обеспечивают реальный новый вывод. Не присваивайте readonly Результат и не заполняйте результат вручную ожидаемыми строками.

  6. Никаких файлов, публикаций, запуска 1С, принтеров, сети или записи базы агент не выполнял. Это код и статическая проверка; ручной запуск и визуальный протокол нужны в указанной собственной учебной базе.

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

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

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

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

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