Свой счет1000→500→1000: признаки изменения и реальные ссылки отчета

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

Настоящая управляемая форма своего отчета: сумма трех типизированных строк, отдельные основные и пользовательские настройки, полный readback native результата и явное согласие на локальное хранилище навигации.

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

Полный модуль основной управляемой формы своего отчета. Только новая FileCF8.5.1.1343 без совместимости, толстый управляемый клиентWindows/Такси; реальные server/clientдирективы показаны.

Подготовка

  1. Только авторская инструкция: здесь не запускались1С, Конфигуратор, файловая ИБ, UI, сеть или запись хранилищ. На своем изолированном компьютере вручную создайте НОВУЮ пустую файловую ИБ C:\1C85_OwnInvoiceNavigation\6b304604-f172-40aa-9d45-b421833fe27d\Base. Если каталог/ИБ уже существовал, не использовать; для другого пути сначала согласованно изменить точный путь во всем собственном уроке. Это путь своей ИБ, не UUID информационной базы.

  2. Платформа8.5.1.1343, Windows, толстый клиент, управляемое приложение. Имя новой конфигурации Уч85НавигацияСчета; РежимСовместимости=НеИспользовать, интерфейсТакси. Один пользователь УчебныйАдминистратор85 с одноименной собственной ролью и правами Администрирование (GetUsers), ИспользованиеТолстогоКлиента, Просмотр отчета, СохранениеДанныхПользователя. Других сеансов/пользователей/расширений/прикладных объектов нет; рабочие конфигурации не открывать и не изменять.

  3. Создайте только отчет Уч85СчетНавигация, основной макет Схема85 типа СхемаКомпоновкиДанных, общий модуль Уч85СчетМаршрут (СерверДа, ВызовСервераНет, ГлобальныйНет, ПривилегированныйНет, клиентские флагиНет). Полный COMMON ниже — его модуль. У отчета одна форма Основная85, других форм/макетов/собственных хранилищ нет.

  4. В конструкторе СКД: один источник СвойИсточник85, ТипИсточникаДанных=Local; один набор данных ОБЪЕКТ Строки85, ИмяОбъекта=Строки85, источникСвойИсточник85. Поля в таком порядке: Код85 (Строка длина1), Количество85/Цена85/Сумма85 (Число9,0, неотрицательное). Поле и ПутьКДанным каждого равны имени; нет выражений полей и вычисляемых полей/вложенных схем/связей/параметров. Один ресурс Сумма85, выражение Сумма(Сумма85); никаких запросов и внешних функций.

  5. Настроенный вариант ровно один: ИмяСчет85, ПредставлениеСобственный счет85; он же вариант по умолчанию. Структура: единственная используемая группировка СвоиИтоги85 без полей группировки (общий итог). Выбранные поля: только используемый Сумма85; группы деталей не добавлять, числовые заголовки/дублирующие общие итоги не выводить. Вариант не редактируется программно в метаданных: основные настройки редактируются только внутри текущего экземпляра отчета.

  6. В основных настройках варианта один НЕиспользуемый отбор Код85 Равно A. Весь разделОтбор включите в пользовательские настройки с идентификатором6b304604-f172-40aa-9d45-b421833fe27d-filter, представлениемСобственный фильтр A и обычным режимом отображения. Отбор содержит ровно одно условие; его начальноеИспользованиеЛожь, РежимОтображенияАвто, пользовательскийIDпустой. Другие пользовательские настройки не включать. При загрузке native компоновщик должен действительно создать свой ОтборКомпоновкиДанных в ПользовательскиеНастройки.Элементы; иначе урок останавливается, неизвестный объект не подставляется.

  7. Создайте форму через настоящий Конструктор формы отчета: УправляемаяФормаОтчета, Использовать систему компоновки данныхДа, Назначить основнойДа. Главный реквизитОтчет — ОтчетОбъект.Уч85СчетНавигация; Результат — ТабличныйДокумент, отображается полем табличного документа. Собственные реквизиты: Этап85 Число3,0; ЗапрошенВывод85/НеизвестныйИсход85/РазрешаюНавигацию85/СсылкиСозданы85 Булево; СсылкаВарианта85/СсылкаНастроек85 Строка неограниченная. Кроме РазрешаюНавигацию85 все собственные реквизиты пользователю недоступны для ввода; ссылки показываются как обычный текст, не гиперссылки.

  8. Назначьте реальные события формы ПриСозданииНаСервере→одноименная процедура2параметра, ПриКомпоновкеРезультата→одноименная процедура1параметр. Создайте команды ВыполнитьЭтап85 и СоздатьСсылки85, реальные кнопки вызывают их одноименные обработчики(Команда). Настройки/варианты разрешается выбирать штатным меню только ДО начала: выберите настоящий Счет85 с представлениемСобственный счет85. Не задавайте КлючТекущегоВарианта строкой имени; actualkey захватывается только из текущей настоящей формы. Во время маршрута настройки/вариант руками не менять; проверки полного XML обнаруживают отличия и останавливают процесс.

  9. Полный FORM ниже вставьте в модульОсновная85, APPLICATION в модуль управляемого приложения. На этом этапе сохраните только свою новую конфигурацию вручную, обновите только ее БД и запустите толстое управляемое приложение. Запись/обновление учебной конфигурации — ваши ручные подготовительные действия, не действие опубликованного BSL и не проверенный здесь runtime.

  10. Для ссылок отдельное ручное согласие: после собственного итога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");
КонецПроцедуры

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

  1. Выберите свой единственный настроенный вариант штатным меню. Первая кнопкаВыполнитьЭтап85 проверяет полные реальные настройки и через nativeСкомпоноватьРезультат вызывает настоящее серверное событие: итог1000.

  2. Вторая кнопкаВыполнитьЭтап85 меняет имя собственной группировки основных настроек и Использование настоящего пользовательского условия. Оба самостоятельно поддерживаемых native признака изменения записываютсяTrue и тут же читаются; эффективные настройки дают толькоA500.

  3. По желанию дайте отдельное ручное согласие и нажмитеСоздатьСсылки85. Первый nativeметод вызывается вообще без optionalпараметров; второй получает обязательное свое представление и только свой UUID/код. ПроверяемString, полный исходный результат и неизменность actualkey/эффективных настроек в том же запросе.

  4. Третья кнопкаВыполнитьЭтап85 явно возвращает только собственные два изменения, сравнивает полный XML основных/эффективных настроек, доступные свойства собственного пользовательского фильтра и фактический1000. Только затем оба признакаFalse. Readonly политика выбирает применение обычного режима, но не заменяет проверку данных.

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

  1. Из исходных A:2×250=500, B:3×100=300, C:4×50=200 вычисляется независимый1000. Native табличный документ должен содержать ровно один числовой итог1000, затем500 и вновь1000; отсутствие/дублирование/иная сумма останавливает урок.

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

  3. Без флажка согласия URLметоды не вызываются, стадия500/настройки/ссылки остаются прежними. После согласия получаются две реальные непустые строки; это не доказательство, что открытие ссылки восстановит такой же результат.

  4. Если native вывод/запись ссылки завершились исключением или readback не совпал, НеизвестныйИсход85 остаетсяTrue на клиенте. Закройте форму и отдельно исследуйте свою учебную ИБ; нет автоматического повторения, слепого восстановления или гарантии атомарности.

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

Ожидаемый ручной результат при выполнении native контрактов:1000→500→1000, реальные строки навигации только после согласия, признакиTrue после своих изменений иFalse только после полного возврата. Выполнение1С здесь не проверялось.

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

  1. Ключ вариантаПроизвольный: имяСчет85 не является документированным форматом ключа. В этом уроке используется actualkey выбранного варианта и сравнение до/после одного вызова, без выдуманных UUIDключей и гарантий глобальной уникальности.

  2. ВариантМодифицирован/ПользовательскиеНастройкиМодифицированы — RWБулево, не доказательство сохранения/автоматического обнаружения изменений. Мы сами поддерживаем их после действительного изменения соответствующих своих основных и пользовательских настроек.

  3. ПрименениеРежимаОтображенияПриУстановкеРезультата только читается. Enumстраницы объявляютТолстыйКлиент: сравнения выполняются на клиенте нового толстого управляемого приложения. Авто без совместимости означаетПрименять; не объявляем универсальный thin/server/mobileпример.

  4. Устаревшее свойствоРежимОтображенияРезультата не используется: только рекомендованные методыУстановить/Получить. Обычный режим и числовой результат проверяются раздельно; внешний вид/печать/компактность не доказаны статическими тестами.

  5. VariantURL допускает0optionalargs или оба вместе; один без второго вызовет исключение. SettingsURL требует представление и может сохранять данные хранилища даже без внешнего параметра. Это НЕ pure-memory/no-write обещание.

  6. Native ПриКомпоновкеРезультата формы имеет1Bool и исполняется на сервере; объектОтчет имеет другое событие. События вручную не вызываются. СтандартнаяОбработкаFalse до guards исключает параллельное стандартное формирование.

  7. XML сравнивается только для собственных native сериализуемых объектов; неизвестный внешний XML не читается. Если nativeсериализация/полученныйтип/структура отличаются, fail-stop; типами или ожидаемым готовым документом их не подменять.

  8. ПользовательскиеНастройки здесь НЕ сериализуютсяXML: native typepage обещаетСериализуется, но неXML/XDTO. Проверены конечные TOP/егоAdditionalSettings коллекции0, дополнительные свойства0, одинownfilter/ID/Mode/егоchildUse/Right/Comparison/Mode/ID. Это неgeneric снимок всех скрытых вложений. UserchildLeftValue/Parent/Presentation/Application недоступны по native и не читаются; полный применяемый смысл фильтра доказывает XML основных/эффективных НастройкиКомпоновкиДанных.

  9. Здесь0runtime/БД/UI/сети/файловыхэффектов/печати/отправки/рабочихнастроек/резервныхкопий. Сохранение собственной CF и данные ссылок — отдельные будущие ручные действия пользователя, без гарантии восстановления/атомарности.

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

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

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

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

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