Тип: ПрименениеРежимаОтображенияПриУстановкеРезультатаОтчета. Применение режима отображения при установке результата. Значение по умолчанию - Авто.
Полное описание, параметры и ограничения
Расширение формы клиентского приложения для отчета.ПрименениеРежимаОтображенияПриУстановкеРезультата (Client application form extension for reports.ViewModeApplicationOnSetResult)
Расширение формы клиентского приложения для отчета (Client application form extension for reports)
ПрименениеРежимаОтображенияПриУстановкеРезультата (ViewModeApplicationOnSetResult)
Доступен, начиная с версии 8.3.19.
Использование:
Только чтение.
Описание:
Тип: ПрименениеРежимаОтображенияПриУстановкеРезультатаОтчета.
Применение режима отображения при установке результата.
Значение по умолчанию - Авто.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.3.19.
Методическая информация
Практические примеры
Свой счет1000→500→1000: признаки изменения и реальные ссылки отчета
Настоящая управляемая форма своего отчета: сумма трех типизированных строк, отдельные основные и пользовательские настройки, полный readback native результата и явное согласие на локальное хранилище навигации.
Где и как запускать
Полный модуль основной управляемой формы своего отчета. Только новая FileCF8.5.1.1343 без совместимости, толстый управляемый клиентWindows/Такси; реальные server/clientдирективы показаны.
Подготовка
Только авторская инструкция: здесь не запускались1С, Конфигуратор, файловая ИБ, UI, сеть или запись хранилищ. На своем изолированном компьютере вручную создайте НОВУЮ пустую файловую ИБ C:\1C85_OwnInvoiceNavigation\6b304604-f172-40aa-9d45-b421833fe27d\Base. Если каталог/ИБ уже существовал, не использовать; для другого пути сначала согласованно изменить точный путь во всем собственном уроке. Это путь своей ИБ, не UUID информационной базы.
Платформа8.5.1.1343, Windows, толстый клиент, управляемое приложение. Имя новой конфигурации Уч85НавигацияСчета; РежимСовместимости=НеИспользовать, интерфейсТакси. Один пользователь УчебныйАдминистратор85 с одноименной собственной ролью и правами Администрирование (GetUsers), ИспользованиеТолстогоКлиента, Просмотр отчета, СохранениеДанныхПользователя. Других сеансов/пользователей/расширений/прикладных объектов нет; рабочие конфигурации не открывать и не изменять.
Создайте только отчет Уч85СчетНавигация, основной макет Схема85 типа СхемаКомпоновкиДанных, общий модуль Уч85СчетМаршрут (СерверДа, ВызовСервераНет, ГлобальныйНет, ПривилегированныйНет, клиентские флагиНет). Полный COMMON ниже — его модуль. У отчета одна форма Основная85, других форм/макетов/собственных хранилищ нет.
В конструкторе СКД: один источник СвойИсточник85, ТипИсточникаДанных=Local; один набор данных ОБЪЕКТ Строки85, ИмяОбъекта=Строки85, источникСвойИсточник85. Поля в таком порядке: Код85 (Строка длина1), Количество85/Цена85/Сумма85 (Число9,0, неотрицательное). Поле и ПутьКДанным каждого равны имени; нет выражений полей и вычисляемых полей/вложенных схем/связей/параметров. Один ресурс Сумма85, выражение Сумма(Сумма85); никаких запросов и внешних функций.
Настроенный вариант ровно один: ИмяСчет85, ПредставлениеСобственный счет85; он же вариант по умолчанию. Структура: единственная используемая группировка СвоиИтоги85 без полей группировки (общий итог). Выбранные поля: только используемый Сумма85; группы деталей не добавлять, числовые заголовки/дублирующие общие итоги не выводить. Вариант не редактируется программно в метаданных: основные настройки редактируются только внутри текущего экземпляра отчета.
В основных настройках варианта один НЕиспользуемый отбор Код85 Равно A. Весь разделОтбор включите в пользовательские настройки с идентификатором6b304604-f172-40aa-9d45-b421833fe27d-filter, представлениемСобственный фильтр A и обычным режимом отображения. Отбор содержит ровно одно условие; его начальноеИспользованиеЛожь, РежимОтображенияАвто, пользовательскийIDпустой. Другие пользовательские настройки не включать. При загрузке native компоновщик должен действительно создать свой ОтборКомпоновкиДанных в ПользовательскиеНастройки.Элементы; иначе урок останавливается, неизвестный объект не подставляется.
Создайте форму через настоящий Конструктор формы отчета: УправляемаяФормаОтчета, Использовать систему компоновки данныхДа, Назначить основнойДа. Главный реквизитОтчет — ОтчетОбъект.Уч85СчетНавигация; Результат — ТабличныйДокумент, отображается полем табличного документа. Собственные реквизиты: Этап85 Число3,0; ЗапрошенВывод85/НеизвестныйИсход85/РазрешаюНавигацию85/СсылкиСозданы85 Булево; СсылкаВарианта85/СсылкаНастроек85 Строка неограниченная. Кроме РазрешаюНавигацию85 все собственные реквизиты пользователю недоступны для ввода; ссылки показываются как обычный текст, не гиперссылки.
Назначьте реальные события формы ПриСозданииНаСервере→одноименная процедура2параметра, ПриКомпоновкеРезультата→одноименная процедура1параметр. Создайте команды ВыполнитьЭтап85 и СоздатьСсылки85, реальные кнопки вызывают их одноименные обработчики(Команда). Настройки/варианты разрешается выбирать штатным меню только ДО начала: выберите настоящий Счет85 с представлениемСобственный счет85. Не задавайте КлючТекущегоВарианта строкой имени; actualkey захватывается только из текущей настоящей формы. Во время маршрута настройки/вариант руками не менять; проверки полного XML обнаруживают отличия и останавливают процесс.
Полный FORM ниже вставьте в модульОсновная85, APPLICATION в модуль управляемого приложения. На этом этапе сохраните только свою новую конфигурацию вручную, обновите только ее БД и запустите толстое управляемое приложение. Запись/обновление учебной конфигурации — ваши ручные подготовительные действия, не действие опубликованного BSL и не проверенный здесь runtime.
Для ссылок отдельное ручное согласие: после собственного итога500 прочитайте предупреждение и установите РазрешаюНавигацию85. Это разрешение создать только собственные данные навигационной ссылки во встроенном хранилище новой учебной ИБ. Без флажка СоздатьСсылки85 возвращает управление без вызова обоихURLметодов; URL не открывать/не отправлять/не публиковать. После ошибки исход записи может быть неизвестен: не повторять и не обещать удаление/rollback созданного хранилищем.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Уч85СчетМаршрут.ПроверитьСреду85();
Если ЭтаФорма.ТипФормыОтчета <> ТипФормыОтчета.Основная Тогда
Отказ = Истина;
ВызватьИсключение "Нужна настоящая собственная основная управляемая форма отчета";
КонецЕсли;
Этап85 = 0;
ЗапрошенВывод85 = Ложь;
НеизвестныйИсход85 = Ложь;
РазрешаюНавигацию85 = Ложь;
СсылкиСозданы85 = Ложь;
СсылкаВарианта85 = "";
СсылкаНастроек85 = "";
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьЭтап85(Команда)
Если НеизвестныйИсход85 Тогда
ВызватьИсключение "После непроверенного исхода закрыть форму, не повторять операцию";
КонецЕсли;
Если Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2 Тогда
ВызватьИсключение "Маршрут уже завершен";
КонецЕсли;
НеизвестныйИсход85 = Истина;
Попытка
Политика85 = ЭтаФорма.ПрименениеРежимаОтображенияПриУстановкеРезультата;
Если Политика85 <> ПрименениеРежимаОтображенияПриУстановкеРезультатаОтчета.Авто
И Политика85 <> ПрименениеРежимаОтображенияПриУстановкеРезультатаОтчета.Применять
И Политика85 <> ПрименениеРежимаОтображенияПриУстановкеРезультатаОтчета.НеПрименять Тогда
ВызватьИсключение "Неизвестная readonly политика установки результата";
КонецЕсли;
Если Политика85 <> ПрименениеРежимаОтображенияПриУстановкеРезультатаОтчета.НеПрименять Тогда
ЭтаФорма.УстановитьРежимОтображенияРезультата(РежимОтображенияРезультатаОтчета.Обычный);
Если ЭтаФорма.ПолучитьРежимОтображенияРезультата() <> РежимОтображенияРезультатаОтчета.Обычный Тогда
ВызватьИсключение "Обычный режим формы не подтвердился";
КонецЕсли;
КонецЕсли;
ПодготовитьЭтап85();
ЭтаФорма.СкомпоноватьРезультат();
ПодтвердитьЭтап85();
НеизвестныйИсход85 = Ложь;
Исключение
НеизвестныйИсход85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура ПодготовитьЭтап85()
Если ЗапрошенВывод85 Тогда
ВызватьИсключение "Предыдущий вывод не подтвержден";
КонецЕсли;
Отчет85 = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
Уч85СчетМаршрут.ПроверитьОтчет85(Отчет85, Этап85 = 2);
Если ЭтаФорма.ПредставлениеТекущегоВарианта <> "Собственный счет85" Тогда
ВызватьИсключение "Сначала выбрать настоящий настроенный вариант Собственный счет85 штатным меню";
КонецЕсли;
Если Этап85 = 0 Тогда
Если ЭтаФорма.ВариантМодифицирован Или ЭтаФорма.ПользовательскиеНастройкиМодифицированы Тогда
ВызватьИсключение "Начинать только с немодифицированного собственного варианта";
КонецЕсли;
Иначе
Условие85 = Уч85СчетМаршрут.ПользовательскийОтбор85(Отчет85.КомпоновщикНастроек);
Группа85 = Отчет85.КомпоновщикНастроек.Настройки.Структура.Получить(0);
Условие85.Использование = Этап85 = 1;
Группа85.Имя = ?(Этап85 = 1, "СвоиИтогиА85", "СвоиИтоги85");
Уч85СчетМаршрут.ПроверитьОтчет85(Отчет85, Этап85 = 1);
ЭтаФорма.ЗначениеВРеквизитФормы(Отчет85, "Отчет");
ЭтаФорма.ВариантМодифицирован = Истина;
ЭтаФорма.ПользовательскиеНастройкиМодифицированы = Истина;
Если Не ЭтаФорма.ВариантМодифицирован Или Не ЭтаФорма.ПользовательскиеНастройкиМодифицированы Тогда
ВызватьИсключение "Оба самостоятельно поддерживаемых признака изменения должны читаться как Истина";
КонецЕсли;
КонецЕсли;
ЗапрошенВывод85 = Истина;
КонецПроцедуры
&НаСервере
Процедура ПриКомпоновкеРезультата(СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Не ЗапрошенВывод85 Или (Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2) Тогда
ВызватьИсключение "Вне собственного маршрута штатное формирование запрещено";
КонецЕсли;
Отчет85 = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
Результат = Уч85СчетМаршрут.Сформировать85(Отчет85, Этап85 = 1);
ЗапрошенВывод85 = Ложь;
КонецПроцедуры
&НаСервере
Процедура ПодтвердитьЭтап85()
Если ЗапрошенВывод85 Тогда
ВызватьИсключение "Настоящее событие ПриКомпоновкеРезультата не завершило собственный вывод";
КонецЕсли;
Отчет85 = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
Уч85СчетМаршрут.ПроверитьОтчет85(Отчет85, Этап85 = 1);
Уч85СчетМаршрут.ПроверитьВывод85(Результат, ?(Этап85 = 1, 500, 1000));
Если Этап85 = 2 Тогда
ЭтаФорма.ВариантМодифицирован = Ложь;
ЭтаФорма.ПользовательскиеНастройкиМодифицированы = Ложь;
Если ЭтаФорма.ВариантМодифицирован Или ЭтаФорма.ПользовательскиеНастройкиМодифицированы Тогда
ВызватьИсключение "После полного readback исходных настроек оба признака должны читаться как Ложь";
КонецЕсли;
КонецЕсли;
Этап85 = Этап85 + 1;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьСсылки85(Команда)
Если НеизвестныйИсход85 Или Этап85 <> 2 Или СсылкиСозданы85 Тогда
ВызватьИсключение "Ссылки разрешены один раз, только после проверенного собственного итога500";
КонецЕсли;
Если Не РазрешаюНавигацию85 Тогда
Возврат;
КонецЕсли;
НеизвестныйИсход85 = Истина;
Попытка
СоздатьСсылкиНаСервере85(РазрешаюНавигацию85);
НеизвестныйИсход85 = Ложь;
Исключение
НеизвестныйИсход85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура СоздатьСсылкиНаСервере85(Согласие85)
Если ТипЗнч(Согласие85) <> Тип("Булево") Или Не Согласие85 Или Этап85 <> 2 Или СсылкиСозданы85 Тогда
ВызватьИсключение "Нужно отдельное явное согласие на запись своих данных навигации";
КонецЕсли;
Отчет85 = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
Уч85СчетМаршрут.ПроверитьОтчет85(Отчет85, Истина);
Уч85СчетМаршрут.ПроверитьВывод85(Результат, 500);
Если ЭтаФорма.ПредставлениеТекущегоВарианта <> "Собственный счет85"
Или Не ЭтаФорма.ВариантМодифицирован Или Не ЭтаФорма.ПользовательскиеНастройкиМодифицированы Тогда
ВызватьИсключение "Не подтвержден собственный текущий вариант и измененные настройки";
КонецЕсли;
Ключ85 = ЭтаФорма.КлючТекущегоВарианта;
До85 = Уч85СчетМаршрут.XML85(Отчет85.КомпоновщикНастроек.ПолучитьНастройки());
СсылкаВарианта85 = ЭтаФорма.ПолучитьНавигационнуюСсылкуТекущегоВариантаОтчета();
СвоиДанные85 = Новый Структура("UUID85,Код85", "6b304604-f172-40aa-9d45-b421833fe27d", "A");
СсылкаНастроек85 = ЭтаФорма.ПолучитьНавигационнуюСсылкуТекущихНастроекОтчета("Собственный счет85: только A", СвоиДанные85);
Если ТипЗнч(СсылкаВарианта85) <> Тип("Строка") Или СсылкаВарианта85 = ""
Или ТипЗнч(СсылкаНастроек85) <> Тип("Строка") Или СсылкаНастроек85 = ""
Или ЭтаФорма.КлючТекущегоВарианта <> Ключ85 Тогда
ВызватьИсключение "Не подтвердились реальные строки ссылок и неизменность текущего native ключа";
КонецЕсли;
ПослеОтчет85 = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
Уч85СчетМаршрут.ПроверитьОтчет85(ПослеОтчет85, Истина);
Уч85СчетМаршрут.ПроверитьВывод85(Результат, 500);
Если Уч85СчетМаршрут.XML85(ПослеОтчет85.КомпоновщикНастроек.ПолучитьНастройки()) <> До85 Тогда
ВызватьИсключение "После создания ссылок собственные эффективные настройки изменились";
КонецЕсли;
СсылкиСозданы85 = Истина;
РазрешаюНавигацию85 = Ложь;
КонецПроцедурыПолный собственный серверный модуль: среда, три строки, XML и native СКД/readback
Общие → Общие модули → Уч85СчетМаршрут → Модуль
СерверДа, ВызовСервераНет, клиентские флагиНет, ГлобальныйНет, ПривилегированныйНет; вызовы только из serverметодов формы.
Процедура ПроверитьСреду85() Экспорт
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnInvoiceNavigation\6b304604-f172-40aa-9d45-b421833fe27d\Base"";" Тогда
ВызватьИсключение "Только новая собственная файловая учебная ИБ";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Не совпали платформа, собственная конфигурация или совместимость";
КонецЕсли;
Если Метаданные.Отчеты.Количество() <> 1 Или Метаданные.Отчеты.Найти("Уч85СчетНавигация") = Неопределено
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("Уч85СчетМаршрут") = Неопределено
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныйАдминистратор85") = Неопределено Тогда
ВызватьИсключение "Нужны только свои отчет, серверный общий модуль и роль";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.Константы.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0
Или Метаданные.ОбщиеФормы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0
Или Метаданные.ХранилищаНастроек.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "В учебной базе не должно быть прикладных данных и собственных хранилищ";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения на этом собственном стенде запрещены";
КонецЕсли;
Пользователь85 = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи85 = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Пользователь85 = Неопределено Или Пользователи85.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный собственный учебный пользователь";
КонецЕсли;
Если Пользователь85.Имя <> "УчебныйАдминистратор85"
Или Пользователи85[0].УникальныйИдентификатор <> Пользователь85.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпал реальный учебный пользователь";
КонецЕсли;
КонецПроцедуры
Функция СтрокиСчета85() Экспорт
Строки85 = Новый ТаблицаЗначений;
Строки85.Колонки.Добавить("Код85", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1)));
Числовой85 = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный));
Для Каждого Имя85 Из СтрРазделить("Количество85,Цена85,Сумма85", ",") Цикл
Строки85.Колонки.Добавить(Имя85, Числовой85);
КонецЦикла;
Для Индекс85 = 0 По 2 Цикл
Строка85 = Строки85.Добавить();
Строка85.Код85 = ?(Индекс85 = 0, "A", ?(Индекс85 = 1, "B", "C"));
Строка85.Количество85 = Индекс85 + 2;
Строка85.Цена85 = ?(Индекс85 = 0, 250, ?(Индекс85 = 1, 100, 50));
Строка85.Сумма85 = Строка85.Количество85 * Строка85.Цена85;
КонецЦикла;
Возврат Строки85;
КонецФункции
Функция XML85(Объект85) Экспорт
Писатель85 = Новый ЗаписьXML;
Писатель85.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Писатель85, Объект85);
Возврат Писатель85.Закрыть();
КонецФункции
Функция КопияНастроек85(Настройки85)
Читатель85 = Новый ЧтениеXML;
Читатель85.УстановитьСтроку(XML85(Настройки85));
Попытка
Копия85 = СериализаторXDTO.ПрочитатьXML(Читатель85, Тип("НастройкиКомпоновкиДанных"));
Исключение
Читатель85.Закрыть();
ВызватьИсключение;
КонецПопытки;
Читатель85.Закрыть();
Если ТипЗнч(Копия85) <> Тип("НастройкиКомпоновкиДанных") Или XML85(Копия85) <> XML85(Настройки85) Тогда
ВызватьИсключение "Не подтверждена полная копия собственных настроек";
КонецЕсли;
Возврат Копия85;
КонецФункции
Функция ПользовательскийОтбор85(Редактор85) Экспорт
НастройкиПользователя85 = Редактор85.ПользовательскиеНастройки;
Дополнительные85 = НастройкиПользователя85.ДополнительныеНастройки;
Если НастройкиПользователя85.Элементы.Количество() <> 1
Или НастройкиПользователя85.ДополнительныеСвойства.Количество() <> 0
Или ТипЗнч(Дополнительные85) <> Тип("ПользовательскиеНастройкиКомпоновкиДанных")
Или Дополнительные85.Элементы.Количество() <> 0 Или Дополнительные85.ДополнительныеСвойства.Количество() <> 0 Тогда
ВызватьИсключение "Нужен собственный конечный пользовательский раздел без дополнительных элементов и свойств";
КонецЕсли;
Пользовательский85 = НастройкиПользователя85.Элементы.Найти("6b304604-f172-40aa-9d45-b421833fe27d-filter");
Если ТипЗнч(Пользовательский85) <> Тип("ОтборКомпоновкиДанных")
Или НастройкиПользователя85.Элементы.Получить(0) <> Пользовательский85
Или Пользовательский85.ИдентификаторПользовательскойНастройки <> "6b304604-f172-40aa-9d45-b421833fe27d-filter"
Или Пользовательский85.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный
Или Пользовательский85.Элементы.Количество() <> 1 Тогда
ВызватьИсключение "Нет единственного настоящего собственного пользовательского отбора";
КонецЕсли;
Условие85 = Пользовательский85.Элементы.Получить(0);
Если ТипЗнч(Условие85) <> Тип("ЭлементОтбораКомпоновкиДанных")
Или ТипЗнч(Условие85.Использование) <> Тип("Булево")
Или Условие85.ИдентификаторПользовательскойНастройки <> ""
Или Условие85.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Авто
Или ТипЗнч(Условие85.ПравоеЗначение) <> Тип("Строка") Или Условие85.ПравоеЗначение <> "A"
Или Условие85.ВидСравнения <> ВидСравненияКомпоновкиДанных.Равно Тогда
ВызватьИсключение "Не совпали доступные native свойства своего пользовательского условия";
КонецЕсли;
Возврат Условие85;
КонецФункции
Процедура ПроверитьОтчет85(Отчет85, ТолькоА85) Экспорт
ПроверитьСреду85();
Если ТипЗнч(Отчет85) <> Тип("ОтчетОбъект.Уч85СчетНавигация") Или ТипЗнч(ТолькоА85) <> Тип("Булево") Тогда
ВызватьИсключение "Нужен свой настоящий объект отчета и булева стадия";
КонецЕсли;
Схема85 = Отчет85.ПолучитьМакет("Схема85");
Если ТипЗнч(Схема85) <> Тип("СхемаКомпоновкиДанных") Или XML85(Отчет85.СхемаКомпоновкиДанных) <> XML85(Схема85)
Или Схема85.ИсточникиДанных.Количество() <> 1 Или Схема85.НаборыДанных.Количество() <> 1
Или Схема85.ПоляИтога.Количество() <> 1 Или Схема85.Параметры.Количество() <> 0
Или Схема85.СвязиНаборовДанных.Количество() <> 0 Или Схема85.ВариантыНастроек.Количество() <> 1 Тогда
ВызватьИсключение "Не совпала полная собственная схема отчета";
КонецЕсли;
Источник85 = Схема85.ИсточникиДанных.Получить(0);
Набор85 = Схема85.НаборыДанных.Получить(0);
Если Источник85.Имя <> "СвойИсточник85" Или Источник85.ТипИсточникаДанных <> "Local"
Или ТипЗнч(Набор85) <> Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")
Или Набор85.Имя <> "Строки85" Или Набор85.ИмяОбъекта <> "Строки85"
Или Набор85.ИсточникДанных <> Источник85.Имя Или Набор85.Поля.Количество() <> 4 Тогда
ВызватьИсключение "Разрешен только свой объектный источник, без запросов к ИБ";
КонецЕсли;
Строки85 = СтрокиСчета85();
Для Индекс85 = 0 По 3 Цикл
Поле85 = Набор85.Поля.Получить(Индекс85);
Колонка85 = Строки85.Колонки.Получить(Индекс85);
Если Поле85.Поле <> Колонка85.Имя Или Поле85.ПутьКДанным <> Колонка85.Имя
Или Поле85.ТипЗначения <> Колонка85.ТипЗначения Тогда
ВызватьИсключение "Не совпала полная типизированная схема четырех полей";
КонецЕсли;
КонецЦикла;
Ресурс85 = Схема85.ПоляИтога.Получить(0);
Вариант85 = Схема85.ВариантыНастроек.Получить(0);
Если Ресурс85.ПутьКДанным <> "Сумма85" Или Ресурс85.Выражение <> "Сумма(Сумма85)"
Или Вариант85.Имя <> "Счет85" Или Вариант85.Представление <> "Собственный счет85" Тогда
ВызватьИсключение "Не совпали единственный ресурс и настоящий настроенный вариант";
КонецЕсли;
Эталон85 = Новый КомпоновщикНастроекКомпоновкиДанных;
Эталон85.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема85));
Эталон85.ЗагрузитьНастройки(КопияНастроек85(Вариант85.Настройки));
Если Эталон85.Настройки.Структура.Количество() <> 1 Тогда
ВызватьИсключение "Нужна ровно одна собственная группировка";
КонецЕсли;
Группа85 = Эталон85.Настройки.Структура.Получить(0);
Если ТипЗнч(Группа85) <> Тип("ГруппировкаКомпоновкиДанных")
Или Группа85.Имя <> "СвоиИтоги85" Или Группа85.ПоляГруппировки.Элементы.Количество() <> 0
Или Эталон85.Настройки.Выбор.Элементы.Количество() <> 1
Или Строка(Эталон85.Настройки.Выбор.Элементы.Получить(0).Поле) <> "Сумма85" Тогда
ВызватьИсключение "Нужна единственная общая итоговая группировка с единственным выбранным ресурсом";
КонецЕсли;
Группа85.Имя = ?(ТолькоА85, "СвоиИтогиА85", "СвоиИтоги85");
ЭталонУсловия85 = ПользовательскийОтбор85(Эталон85);
ЭталонУсловия85.Использование = ТолькоА85;
Редактор85 = Отчет85.КомпоновщикНастроек;
ФактУсловия85 = ПользовательскийОтбор85(Редактор85);
Если XML85(Редактор85.Настройки) <> XML85(Эталон85.Настройки)
Или ФактУсловия85.Использование <> ТолькоА85
Или XML85(Редактор85.ПолучитьНастройки()) <> XML85(Эталон85.ПолучитьНастройки()) Тогда
ВызватьИсключение "Изменились неизвестные основные, пользовательские или эффективные настройки";
КонецЕсли;
КонецПроцедуры
Функция Сформировать85(Отчет85, ТолькоА85) Экспорт
ПроверитьОтчет85(Отчет85, ТолькоА85);
Строки85 = СтрокиСчета85();
Ожидаемо85 = 0;
Для Каждого Строка85 Из Строки85 Цикл
Если Не ТолькоА85 Или Строка85.Код85 = "A" Тогда
Ожидаемо85 = Ожидаемо85 + Строка85.Количество85 * Строка85.Цена85;
КонецЕсли;
КонецЦикла;
Компоновщик85 = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет85 = Компоновщик85.Выполнить(Отчет85.СхемаКомпоновкиДанных, Отчет85.КомпоновщикНастроек.ПолучитьНастройки());
Процессор85 = Новый ПроцессорКомпоновкиДанных;
Процессор85.Инициализировать(Макет85, Новый Структура("Строки85", Строки85), , Ложь, Истина);
Вывод85 = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Документ85 = Вывод85.Вывести(Процессор85, Ложь);
ПроверитьВывод85(Документ85, Ожидаемо85);
ПроверитьОтчет85(Отчет85, ТолькоА85);
Если XML85(Строки85) <> XML85(СтрокиСчета85()) Тогда
ВызватьИсключение "Процессор изменил собственные исходные строки";
КонецЕсли;
Возврат Документ85;
КонецФункции
Процедура ПроверитьВывод85(Документ85, Ожидаемо85) Экспорт
Если ТипЗнч(Документ85) <> Тип("ТабличныйДокумент") Или (Ожидаемо85 <> 500 И Ожидаемо85 <> 1000)
Или Документ85.ВысотаТаблицы < 1 Или Документ85.ВысотаТаблицы > 30
Или Документ85.ШиринаТаблицы < 1 Или Документ85.ШиринаТаблицы > 10 Тогда
ВызватьИсключение "Не совпал тип или разумный размер фактического результата";
КонецЕсли;
Чисел85 = 0;
Для Ряд85 = 1 По Документ85.ВысотаТаблицы Цикл
Для Колонка85 = 1 По Документ85.ШиринаТаблицы Цикл
Ячейка85 = Документ85.Область(Ряд85, Колонка85);
Если Ячейка85.СодержитЗначение И ТипЗнч(Ячейка85.Значение) = Тип("Число") Тогда
Чисел85 = Чисел85 + 1;
Если Ячейка85.Значение <> Ожидаемо85 Тогда
ВызватьИсключение "Фактическое число отличается от независимой суммы исходных строк";
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Чисел85 <> 1 Тогда
ВызватьИсключение "Нужен ровно один числовой итог, не дублированные детали и итоги";
КонецЕсли;
КонецПроцедурыПолный модуль собственного управляемого приложения
Конфигурация → Открыть модуль управляемого приложения
Толстый управляемый клиент; ПриНачалеРаботыСистемы настоящее событие без параметров.
Процедура ПриНачалеРаботыСистемы()
ОткрытьФорму("Отчет.Уч85СчетНавигация.Форма.Основная85");
КонецПроцедурыРазбор по шагам
Выберите свой единственный настроенный вариант штатным меню. Первая кнопкаВыполнитьЭтап85 проверяет полные реальные настройки и через nativeСкомпоноватьРезультат вызывает настоящее серверное событие: итог1000.
Вторая кнопкаВыполнитьЭтап85 меняет имя собственной группировки основных настроек и Использование настоящего пользовательского условия. Оба самостоятельно поддерживаемых native признака изменения записываютсяTrue и тут же читаются; эффективные настройки дают толькоA500.
По желанию дайте отдельное ручное согласие и нажмитеСоздатьСсылки85. Первый nativeметод вызывается вообще без optionalпараметров; второй получает обязательное свое представление и только свой UUID/код. ПроверяемString, полный исходный результат и неизменность actualkey/эффективных настроек в том же запросе.
Третья кнопкаВыполнитьЭтап85 явно возвращает только собственные два изменения, сравнивает полный XML основных/эффективных настроек, доступные свойства собственного пользовательского фильтра и фактический1000. Только затем оба признакаFalse. Readonly политика выбирает применение обычного режима, но не заменяет проверку данных.
Как проверить результат
Из исходных A:2×250=500, B:3×100=300, C:4×50=200 вычисляется независимый1000. Native табличный документ должен содержать ровно один числовой итог1000, затем500 и вновь1000; отсутствие/дублирование/иная сумма останавливает урок.
Измените вручную одно поле схемы, состав отбора, пользовательский ID, вид сравнения, ресурс либо текущий вариант: собственный полный guard должен отказать, не очищая чужие настройки.
Без флажка согласия URLметоды не вызываются, стадия500/настройки/ссылки остаются прежними. После согласия получаются две реальные непустые строки; это не доказательство, что открытие ссылки восстановит такой же результат.
Если native вывод/запись ссылки завершились исключением или readback не совпал, НеизвестныйИсход85 остаетсяTrue на клиенте. Закройте форму и отдельно исследуйте свою учебную ИБ; нет автоматического повторения, слепого восстановления или гарантии атомарности.
Ожидаемый результат
Ожидаемый ручной результат при выполнении native контрактов:1000→500→1000, реальные строки навигации только после согласия, признакиTrue после своих изменений иFalse только после полного возврата. Выполнение1С здесь не проверялось.
На что обратить внимание
Ключ вариантаПроизвольный: имяСчет85 не является документированным форматом ключа. В этом уроке используется actualkey выбранного варианта и сравнение до/после одного вызова, без выдуманных UUIDключей и гарантий глобальной уникальности.
ВариантМодифицирован/ПользовательскиеНастройкиМодифицированы — RWБулево, не доказательство сохранения/автоматического обнаружения изменений. Мы сами поддерживаем их после действительного изменения соответствующих своих основных и пользовательских настроек.
ПрименениеРежимаОтображенияПриУстановкеРезультата только читается. Enumстраницы объявляютТолстыйКлиент: сравнения выполняются на клиенте нового толстого управляемого приложения. Авто без совместимости означаетПрименять; не объявляем универсальный thin/server/mobileпример.
Устаревшее свойствоРежимОтображенияРезультата не используется: только рекомендованные методыУстановить/Получить. Обычный режим и числовой результат проверяются раздельно; внешний вид/печать/компактность не доказаны статическими тестами.
VariantURL допускает0optionalargs или оба вместе; один без второго вызовет исключение. SettingsURL требует представление и может сохранять данные хранилища даже без внешнего параметра. Это НЕ pure-memory/no-write обещание.
Native ПриКомпоновкеРезультата формы имеет1Bool и исполняется на сервере; объектОтчет имеет другое событие. События вручную не вызываются. СтандартнаяОбработкаFalse до guards исключает параллельное стандартное формирование.
XML сравнивается только для собственных native сериализуемых объектов; неизвестный внешний XML не читается. Если nativeсериализация/полученныйтип/структура отличаются, fail-stop; типами или ожидаемым готовым документом их не подменять.
ПользовательскиеНастройки здесь НЕ сериализуютсяXML: native typepage обещаетСериализуется, но неXML/XDTO. Проверены конечные TOP/егоAdditionalSettings коллекции0, дополнительные свойства0, одинownfilter/ID/Mode/егоchildUse/Right/Comparison/Mode/ID. Это неgeneric снимок всех скрытых вложений. UserchildLeftValue/Parent/Presentation/Application недоступны по native и не читаются; полный применяемый смысл фильтра доказывает XML основных/эффективных НастройкиКомпоновкиДанных.
Здесь0runtime/БД/UI/сети/файловыхэффектов/печати/отправки/рабочихнастроек/резервныхкопий. Сохранение собственной CF и данные ссылок — отдельные будущие ручные действия пользователя, без гарантии восстановления/атомарности.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.