Обычная форма толстого клиента строит собственный отчёт из трёх literal строк, использует все области макета и по реальному cell callback выводит справа только выбранную собственную категорию. Это старый API построителя, не СКД.
Где и как запускать
Полный модуль собственной обычной формы обработки УчебныйМакетПостроителя85. ТолстыйКлиентОбычноеПриложение 8.5.1.1343; реальное событие собственного поля ТабличныйДокумент с native базовыми двумя параметрами плюс первый Элемент обычного расширения внутри формы. Только own literal query и макеты в памяти.
Подготовка
Вручную создайте отдельную новую пустую базу платформы 8.5.1.1343. Имя конфигурации=УчебныйМакетПостроителя85, основной режим запуска=Обычное приложение. Включите использование модальности для своего обычного клиента. Нет объектов бизнеса, расширений, рабочих данных и внешних источников.
Добавьте собственную обработку УчебныйМакетПостроителя85 и её Обычную форму Основная. Реквизиты формы: ОсновнойДокумент85 и ДетальныйДокумент85 типа ТабличныйДокумент, Состояние85 типа Строка неограниченной длины. Поставьте два ПолеТабличногоДокумента: ОсновнойОтчет85 с данными ОсновнойДокумент85 и ДетальныйОтчет85 с данными ДетальныйДокумент85. Разместите Состояние85 отдельным многострочным полем только для просмотра.
Кнопку СформироватьОсновной85 свяжите с одноимённой процедурой. Событие формы ПриОткрытии — с ПриОткрытии(). У поля ОсновнойОтчет85 событие ОбработкаРасшифровки свяжите с ОсновнойОтчет85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка). Базовое событие поля имеет два параметра, а обычное расширение любого элемента внутри формы добавляет первым Элемент. Это итоговая ordinary сигнатура с тремя параметрами; код сверяет actual собственное поле, не вызывайте обработчик вручную.
Весь код вставьте в модуль своей обычной формы, обновите только собственную конфигурацию и откройте свою обработку толстым клиентом в обычном приложении. На сервере, в тонком и web клиенте этот UI маршрут не запускается.
Макет создаётся полностью в памяти самим модулем. Настоящие области: ЗаголовокОтчета, ШапкаТаблицы, Категория, Детали, ОбщиеИтоги, ПодвалТаблицы, ПодвалОтчета. Параметры детальных ячеек совпадают с полями собственного literal запроса. Для суммы количества группы используется ПараметрРасшифровки=Расшифровка, и построитель сам заполняет значение native cell.
Свои строки: А85/Альфа85/1/100, А85/Гамма85/3/600, Б85/Бета85/5/1250. У текста построителя есть настоящий расширенный раздел {ГДЕ Д.Категория КАК Категория}; только это измерение доступно методу НастроитьРасшифровку. Не заменяйте запрос таблицами своей рабочей базы.
Оформление Весна получается 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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
#КонецЕслиРазбор по шагам
СформироватьОсновной85 создаёт новый собственный ПостроительОтчета. ЗаполнитьНастройки разбирает собственный текст, затем выбор и измерения устанавливаются явно. Все шесть форматных секций включены, детальные записи выводятся независимо от авто-решения.
Макет — полный собственный табличный документ. Каждое секционное свойство содержит настоящее имя уже созданной области, разрешённое native контрактом Строка/ТабличныйДокумент. Группировка Категория имеет собственный макет. Перед выполнением читаем назначения обратно, а не считаем одно присваивание достаточным доказательством.
Выполнить реально исполняет literal запрос. Прямой native Выгрузить возвращает три детальные строки; проверяются каждое имя/число/сумма и общий итог 9/1950. ОформитьМакет применяет native оформление, затем Вывести формирует настоящий документ. FindText в результате контролирует заголовок, оба подвала и реальные имена всех строк.
Слева найдите строку группы А85 и дважды щёлкните её значение Количество=4. Подлинный native ОбработкаРасшифровки получает Структура из сформированной ячейки; код не создаёт вместо неё Новый Структура. Только существующее собственное измерение Категория со значением А85/Б85 разрешает дальнейший маршрут.
Подтвердите Да в настоящем Вопрос с Да/Нет/Отмена. При Нет, Отмена или таймауте 30 секунд проверяются identity и текстовый снимок предыдущего детального документа; ни новый построитель, ни новый вывод ещё не создаются. СтандартнаяОбработка отключена, чтобы система не выполняла вторую самостоятельную расшифровку.
После Да создаётся отдельный новый собственный построитель с тем же literal запросом и своим макетом. Исходный.НастроитьРасшифровку(Новый, Расшифровка) передаёт именно реальное значение callback. Другие поля структуры не превращаются в отбор: native метод ограничен измерениями раздела ГДЕ. Результат проверки должен дать для А85 только Альфа85/Гамма85 с итогом 4/700.
Документ детализации сначала полностью строится и проверяется в локальном кандидате. Только после числового readback и проверки его настоящих ячеек новый документ присваивается ДетальныйДокумент85. Повторная проверка исходного построителя должна по-прежнему видеть все три строки. Двойной щелчок по группе Б85 и Да заменяет правый результат на одну собственную Бета85, итог 5/1250.
Как проверить результат
Слева видны заголовок Свой макет построителя85, шапка, две группы, три имени деталей, общий итог 9/1950, Конец своей таблицы85 и Своё учебное завершение85. Код проверяет появление текстов и состав результатов; конкретное оформление Весна требует визуальной проверки в своём клиенте.
А85 + Да: справа ровно Альфа85 и Гамма85, никаких Бета85; количество 4, сумма 700. Б85 + Да: справа только Бета85, количество 5, сумма 1250. Левый отчёт не должен потерять группу А85 или Б85.
После успешной детализации А85 нажмите расшифровку Б85 и Отмена, затем повторите Нет, затем дождитесь таймаута. Правый документ с Альфа85/Гамма85 должен сохраняться; состояние прямо сообщает нормальный отказ, не ошибку и не успешную перестройку.
Щелчок по тексту заголовка/подвала без native расшифровки не должен вызывать обработчик. Щелчок по ячейке с неподходящим native значением завершает свой обработчик без выполнения нового отчёта. Нельзя считать такой щелчок успешной расшифровкой.
Для собственного негативного опыта в отдельной копии учебного текста удалите только строку {ГДЕ ...}. Native метод больше не обязан применять Категория; readback детализации должен отклонить полный результат, прежний правый документ останется принят. Не меняйте рабочую конфигурацию и не подставляйте фиктивную структуру вместо cell callback.
Ожидаемый результат
Ожидаемый при ручном запуске результат: собственные секции макета реально участвуют в выводе; native структура расшифровки переключает второй отчёт между 2 и 1 детальными строками без изменения исходного отчёта и без записи данных.
На что обратить внимание
ПостроительОтчета и старый ТабличныйДокумент оформление — не СКД. Не подменяйте Структура расшифровки построителя на идентификатор элемента ДанныеРасшифровкиКомпоновкиДанных.
НастроитьРасшифровку фильтрует только разрешённые измерения секции ГДЕ целевого построителя. Наличие ключа в native структуре само по себе не гарантирует отбор: поэтому результат проверяется до принятия.
ПараметрРасшифровки не равен свойству Расшифровка готовой ячейки. В макете задаётся имя параметра, а actual значение создаёт построитель при выводе. Код не вызывает callback напрямую и не назначает вручную его входную структуру.
Снимок документа проверяет размеры и тексты ячеек, не является полной сериализацией оформления. Статические тесты не доказывают визуальный фон, шрифты, клиентские темы и настоящий UI callback.
При повторном выводе построитель учитывает внутренний флаг: новый построитель и Выполнить обеспечивают реальный новый вывод. Не присваивайте readonly Результат и не заполняйте результат вручную ожидаемыми строками.
Никаких файлов, публикаций, запуска 1С, принтеров, сети или записи базы агент не выполнял. Это код и статическая проверка; ручной запуск и визуальный протокол нужны в указанной собственной учебной базе.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.