ОформлениеКомпоновкиДанных.ДоступныеПараметры

Свойства · AvailableParameters

Тип: ДоступныеПараметрыКомпоновкиДанных. Содержит набор доступных параметров. Определяет состав оформления компоновки данных.

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

ОформлениеКомпоновкиДанных.ДоступныеПараметры (DataCompositionAppearance.AvailableParameters)

ОформлениеКомпоновкиДанных (DataCompositionAppearance)

ДоступныеПараметры (AvailableParameters)

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

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

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

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

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

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

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

Своя сводная таблица: варианты, владельцы параметров и проверенный вывод 1000 → 500 → 1000

С нуля строим типизированный источник, настоящую таблицу СКД и два собственных варианта. Проверяем доступность параметров до настройки, реальные ID→объект на своём владельце и отказ чужому; затем сверяем весь объём фактически выведенных ресурсов.

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

Полный общий модуль собственной новой файловой ИБ; ordinary thick branches, не отдельный фрагмент. Поддерживающие модули обычной формы и приложения приведены целиком.

Подготовка

  1. Этот урок готовит свои варианты сводной таблицы: товар по строкам, канал продаж по колонкам, два ресурса — количество и сумма. Это один полный процесс в памяти, не набор обёрток над неизвестным объектом.

  2. Вручную создайте НОВУЮ пустую файловую ИБ 8.5.1.1343 только по точному пути C:\1C85_OwnPivotLab\4a9861e6-9b2a-45b3-bcb8-859815e70b56\Base. Если каталог или регистрация уже существуют, остановитесь и не используйте их. UUID в имени каталога — метка учебного стенда, не UUID информационной базы. Здесь каталог, ИБ и VM фактически не создавались.

  3. В Конфигураторе назовите новую конфигурацию УчебнаяМатрицаВариантов85, режим совместимости НеИспользовать, основной режим запуска — обычное приложение. Никаких расширений, BSP, справочников, документов, регистров и других прикладных объектов. Один сеанс; никаких других пользователей или подключений к этой своей ИБ.

  4. Создайте только свою роль УчебныйАдминистратор85 с правом Администрирование, правами запуска обычного клиента и просмотра собственной общей формы; один реальный пользователь с тем же именем и этой ролью. Административные права нужны для native ПолучитьПользователей; роль с одним правом просмотра для проверки недостаточна. Подготовку прав выполняйте только в новой своей ИБ, не в рабочей конфигурации.

  5. Создайте общий модуль УчебныеВарианты85: Глобальный Нет, Клиент обычное приложение Да, Сервер Да, Внешнее соединение Нет, Привилегированный Нет, Вызов сервера Нет, Повторное использование возвращаемых значений НеИспользовать. Вставьте целиком CODE, не внутрь другой процедуры.

  6. В файловом толстом клиенте с обычным приложением символ ТолстыйКлиентОбычноеПриложение истинен в клиентской и серверной частях. Это не универсальная проверка «не сервер». Другие контексты без этого символа явно отказывают; отдельный exact File guard действует независимо.

  7. Создайте обычную общую форму МатрицаВариантов85, основного реквизита нет. Реквизиты Первый85/Второй85/Снова85 — ТабличныйДокумент, Статус85 — Строка неограниченной длины. Три поля табличного документа с такими же именами и Данные=одноимённый реквизит; каждое ТолькоПросмотр Истина. Статус85 показывать многострочным readonly полем.

  8. Единственная кнопка Сформировать85: Нажатие → Сформировать85(Кнопка). Обычная форма добавляет первым аргументом настоящий элемент управления по event104; сам Button.Click имеет ноль аргументов. ПриОткрытии → ПриОткрытии() без аргументов. Вставьте целиком FORM; эти события вручную не вызывайте.

  9. В модуль обычного приложения вставьте целиком APPLICATION, событие ПриНачалеРаботыСистемы() с нулём аргументов. В управляющую форму эти три модуля переносить нельзя. Других модулей и макетов в подготовке нет.

  10. После будущего ручного запуска нажмите настоящую кнопку один раз. CODE сам создаёт свой UUID пакета и полный источник: BOOK/RETAIL/1×250=250, BOOK/WHOLE/2×250=500, PAPER/RETAIL/1×250=250. Все шесть колонок типизированы; БД не читается запросом и ничего в ней не записывается.

  11. Схема и два варианта возникают через native factories: Новый СхемаКомпоновкиДанных → ВариантыНастроек.Добавить/Вставить → readonly Вариант.Настройки → Структура.Добавить(Тип(ТаблицаКомпоновкиДанных)) → Строки/Колонки.Добавить. Не создавайте внутренние коллекции и детей через несуществующие конструкторы.

  12. Каждый вариант отдельно загружается в собственный настоящий компоновщик, инициализированный ИсточникДоступныхНастроекКомпоновкиДанных(Схема). Доступные поля/параметры используются для проверки числового порога, строкового заголовка, enum итогов и допустимости правила оформления по Сумма85.

  13. Политика Строки задаёт native ID, подпись и обычный режим отображения. В этом уроке собственная форма использует их как явный gate/подпись результата. Это НЕ создание или открытие стандартного редактора пользовательских настроек и не обещание его интерфейса.

  14. Ожидаются три native документа: все продажи 1000 и количество4; порог300 — сумма500 и количество2; после удаления только своего вставленного варианта новый вывод основного опять1000/4. Проверяется не готовая арифметическая подстановка, а фактические ячейки ТабличногоДокумента, который вернул native процессор.

  15. В ручных негативных проверках временно изменяйте только этот собственный учебный исходник: чужой File путь, неизвестное имя параметра, подмена источника, другой UUID строки, повторно включённые итоги, пропущенный Move или чужой владелец должны приводить к отказу. Не выполняйте такие эксперименты в рабочей базе.

#Если ТолстыйКлиентОбычноеПриложение Тогда
Процедура ПроверитьСвойСтенд85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnPivotLab\4a9861e6-9b2a-45b3-bcb8-859815e70b56\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
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
        ВызватьИсключение "Собственный пустой стенд без расширений";
    КонецЕсли;
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Если Пользователь = Неопределено Или Пользователи.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен единственный собственный учебный пользователь";
    КонецЕсли;
    Если Пользователь.Имя <> "УчебныйАдминистратор85"
        Или Пользователи[0].УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор Тогда
        ВызватьИсключение "Не совпал собственный реальный пользователь";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьПродажи85(UUIDПакета)
    Продажи = Новый ТаблицаЗначений;
    Продажи.Колонки.Добавить("UUID85", Новый ОписаниеТипов("УникальныйИдентификатор"));
    СтроковыйТип = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(12));
    Продажи.Колонки.Добавить("Товар85", СтроковыйТип);
    Продажи.Колонки.Добавить("Канал85", СтроковыйТип);
    ЧисловойТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный));
    Для Каждого Имя Из СтрРазделить("Количество85,Цена85,Сумма85", ",") Цикл
        Продажи.Колонки.Добавить(Имя, ЧисловойТип);
    КонецЦикла;
    Для Индекс = 0 По 2 Цикл
        Запись = Продажи.Добавить();
        Запись.UUID85 = UUIDПакета;
        Запись.Товар85 = ?(Индекс = 2, "PAPER", "BOOK");
        Запись.Канал85 = ?(Индекс = 1, "WHOLE", "RETAIL");
        Запись.Количество85 = ?(Индекс = 1, 2, 1);
        Запись.Цена85 = 250;
        Запись.Сумма85 = Запись.Количество85 * Запись.Цена85;
    КонецЦикла;
    Возврат Продажи;
КонецФункции

Процедура ПроверитьПродажи85(Продажи, UUIDПакета)
    Если ТипЗнч(UUIDПакета) <> Тип("УникальныйИдентификатор") Или ТипЗнч(Продажи) <> Тип("ТаблицаЗначений") Тогда
        ВызватьИсключение "Не совпал собственный тип входных данных";
    КонецЕсли;
    Если Продажи.Количество() <> 3 Или Продажи.Колонки.Количество() <> 6 Тогда
        ВызватьИсключение "Нужны все три собственные строки и все шесть колонок";
    КонецЕсли;
    ЭталонСхемы = СоздатьПродажи85(UUIDПакета);
    Для Индекс = 0 По 5 Цикл
        Колонка = Продажи.Колонки.Получить(Индекс);
        Описание = ЭталонСхемы.Колонки.Получить(Индекс);
        Если Колонка.Имя <> Описание.Имя Или Колонка.ТипЗначения <> Описание.ТипЗначения Тогда
            ВызватьИсключение "Не совпала полная типизированная схема собственного источника";
        КонецЕсли;
    КонецЦикла;
    Для Индекс = 0 По 2 Цикл
        Факт = Продажи.Получить(Индекс);
        Если Факт.UUID85 <> UUIDПакета Или Факт.Товар85 <> ?(Индекс = 2, "PAPER", "BOOK")
            Или Факт.Канал85 <> ?(Индекс = 1, "WHOLE", "RETAIL")
            Или Факт.Количество85 <> ?(Индекс = 1, 2, 1) Или Факт.Цена85 <> 250
            Или Факт.Сумма85 <> ?(Индекс = 1, 500, 250) Или Факт.Количество85 * Факт.Цена85 <> Факт.Сумма85 Тогда
            ВызватьИсключение "Не совпали все собственные ключи, количество, цена или сумма";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Процедура ЗаполнитьВариант85(Вариант, Порог)
    Если ТипЗнч(Вариант) <> Тип("ВариантНастроекКомпоновкиДанных") Или (Порог <> 250 И Порог <> 300) Тогда
        ВызватьИсключение "Нужен только свой реальный вариант с порогом 250 или 300";
    КонецЕсли;
    Настройки = Вариант.Настройки;
    Если Настройки.ПараметрыДанных.ДоступныеПараметры <> Неопределено Тогда
        ВызватьИсключение "Новый вариант должен быть ещё не связан с доступными параметрами; Add и смена Параметр в связанной коллекции запрещены";
    КонецЕсли;
    Если Настройки.Структура.Количество() <> 0 Или Настройки.ПараметрыДанных.Элементы.Количество() <> 0
        Или Настройки.Отбор.Элементы.Количество() <> 0 Тогда
        ВызватьИсключение "Существующие неизвестные настройки не очищаем";
    КонецЕсли;
    ПараметрПорога = Настройки.ПараметрыДанных.Элементы.Добавить();
    ПараметрПорога.Параметр = Новый ПараметрКомпоновкиДанных("Порог85");
    ПараметрПорога.Значение = Порог;
    ПараметрПорога.Использование = Истина;
    Отбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор.Использование = Истина;
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма85");
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    Отбор.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПараметрыДанных.Порог85");
    Таблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
    Таблица.Имя = "СобственнаяМатрица85";
    Таблица.Использование = Истина;
    Строки = Таблица.Строки.Добавить();
    Колонки = Таблица.Колонки.Добавить();
    Для Индекс = 0 По 1 Цикл
        Группа = ?(Индекс = 0, Строки, Колонки);
        Группа.Имя = ?(Индекс = 0, "Товары85", "Каналы85");
        Группа.Использование = Истина;
        ПолеГруппы = Группа.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
        ПолеГруппы.Поле = Новый ПолеКомпоновкиДанных(?(Индекс = 0, "Товар85", "Канал85"));
        ПолеГруппы.Использование = Истина;
        ПолеГруппы.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
        Группа.ПараметрыВывода.УстановитьЗначениеПараметра("РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
        Группа.ПараметрыВывода.УстановитьЗначениеПараметра("РасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
    КонецЦикла;
    Для Каждого Имя Из СтрРазделить("Сумма85,Количество85", ",") Цикл
        Выбранное = Таблица.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        Выбранное.Поле = Новый ПолеКомпоновкиДанных(Имя);
        Выбранное.Использование = Истина;
    КонецЦикла;
    ПолеКоличество = Таблица.Выбор.Элементы.Получить(1);
    Таблица.Выбор.Элементы.Сдвинуть(ПолеКоличество, -1);
    Если Таблица.Выбор.Элементы.Количество() <> 2 Или Таблица.Выбор.Элементы.Получить(0) <> ПолеКоличество
        Или Строка(Таблица.Выбор.Элементы.Получить(0).Поле) <> "Количество85"
        Или Строка(Таблица.Выбор.Элементы.Получить(1).Поле) <> "Сумма85" Тогда
        ВызватьИсключение "Сдвинуть должен реально поставить количество перед суммой";
    КонецЕсли;
    ПараметрыТаблицы = Таблица.ПараметрыВывода;
    ПараметрыТаблицы.УстановитьЗначениеПараметра("Заголовок", "Собственная матрица продаж");
    ПараметрыТаблицы.УстановитьЗначениеПараметра("ВыводЗаголовка", ТипВыводаТекстаКомпоновкиДанных.Выводить);
    Для Каждого Имя Из СтрРазделить("РасположениеИтогов,ГоризонтальноеРасположениеОбщихИтогов,ВертикальноеРасположениеОбщихИтогов", ",") Цикл
        ПараметрыТаблицы.УстановитьЗначениеПараметра(Имя, РасположениеИтоговКомпоновкиДанных.Нет);
    КонецЦикла;
    Таблица.Строки.ИдентификаторПользовательскойНастройки = "4a9861e6-9b2a-45b3-bcb8-859815e70b56-rows";
    Таблица.Строки.ПредставлениеПользовательскойНастройки = "Товары собственной матрицы";
    Таблица.Строки.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
    Правило = Таблица.УсловноеОформление.Элементы.Добавить();
    Правило.Использование = Истина;
    Правило.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(242, 248, 255));
КонецПроцедуры

Функция РазрешитьСвойПараметр85(Владелец, Дескриптор)
    Если ТипЗнч(Дескриптор) <> Тип("Структура") Тогда
        ВызватьИсключение "Нужен собственный memory дескриптор параметра";
    КонецЕсли;
    Если Дескриптор.Количество() <> 3 Или Не Дескриптор.Свойство("Владелец", ВладелецДескриптора)
        Или Не Дескриптор.Свойство("Объект", ДочернийОбъектДескриптора) Или Не Дескриптор.Свойство("ID", NativeID) Тогда
        ВызватьИсключение "Не совпал полный собственный дескриптор";
    КонецЕсли;
    Если ВладелецДескриптора <> Владелец Тогда
        Возврат Неопределено;
    КонецЕсли;
    Если ТипЗнч(Владелец) <> Тип("ЗначенияПараметровДанныхКомпоновкиДанных")
        И ТипЗнч(Владелец) <> Тип("ЗначенияПараметровВыводаТаблицыКомпоновкиДанных")
        И ТипЗнч(Владелец) <> Тип("ЗначенияПараметровВыводаГруппировкиТаблицыКомпоновкиДанных") Тогда
        ВызватьИсключение "Неизвестный native владелец дескриптора";
    КонецЕсли;
    Если NativeID = Неопределено Или ТипЗнч(NativeID) <> Тип("ИдентификаторКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен настоящий ID, полученный native методом своего владельца";
    КонецЕсли;
    ФактическийОбъект = Владелец.ПолучитьОбъектПоИдентификатору(NativeID);
    Если ФактическийОбъект = Неопределено Или ФактическийОбъект <> ДочернийОбъектДескриптора Тогда
        ВызватьИсключение "Настоящий ID не разрешился ровно в исходного ребёнка собственного владельца";
    КонецЕсли;
    Возврат ФактическийОбъект;
КонецФункции

Функция СвязатьВариант85(Схема, Вариант, Порог)
    Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
    Компоновщик.Инициализировать(ИсточникНастроек);
    Компоновщик.ЗагрузитьНастройки(Вариант.Настройки);
    Настройки = Компоновщик.Настройки;
    Если Настройки.Структура.Количество() <> 1 Или Настройки.Отбор.Элементы.Количество() <> 1 Тогда
        ВызватьИсключение "Нужна единственная своя native таблица с единственным отбором";
    КонецЕсли;
    Таблица = Настройки.Структура.Получить(0);
    Если ТипЗнч(Таблица) <> Тип("ТаблицаКомпоновкиДанных") Или Не Таблица.Использование
        Или Таблица.Имя <> "СобственнаяМатрица85" Или Таблица.Строки.Количество() <> 1
        Или Таблица.Колонки.Количество() <> 1 Или Таблица.Выбор.Элементы.Количество() <> 2 Тогда
        ВызватьИсключение "Не совпало полное собственное дерево таблицы";
    КонецЕсли;
    Строки = Таблица.Строки.Получить(0);
    Колонки = Таблица.Колонки.Получить(0);
    Если Строки.Родитель <> Таблица Или Колонки.Родитель <> Таблица
        Или Строки.ПоляГруппировки.Элементы.Количество() <> 1 Или Колонки.ПоляГруппировки.Элементы.Количество() <> 1
        Или Строка(Строки.ПоляГруппировки.Элементы.Получить(0).Поле) <> "Товар85"
        Или Строка(Колонки.ПоляГруппировки.Элементы.Получить(0).Поле) <> "Канал85" Тогда
        ВызватьИсключение "Не совпали настоящие владельцы и полные пути обеих групп";
    КонецЕсли;
    ПараметрыДанных = Настройки.ПараметрыДанных;
    ПоляПараметров = ПараметрыДанных.ДоступныеПоляПараметров;
    Если ТипЗнч(ПоляПараметров) <> Тип("ДоступныеПоляКомпоновкиДанных") Тогда
        ВызватьИсключение "Компоновщик не связал собственные доступные поля параметров";
    КонецЕсли;
    ДоступныйПорог = ПоляПараметров.НайтиПоле(Новый ПолеКомпоновкиДанных("ПараметрыДанных.Порог85"));
    Если ТипЗнч(ДоступныйПорог) <> Тип("ДоступноеПолеКомпоновкиДанных")
        Или Не ДоступныйПорог.ТипЗначения.СодержитТип(Тип("Число")) Тогда
        ВызватьИсключение "Отбор нельзя связать с неизвестным или нечисловым доступным порогом";
    КонецЕсли;
    ЗначениеПорога = ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Порог85"));
    Если ЗначениеПорога = Неопределено Или ЗначениеПорога.Значение <> Порог Или Не ЗначениеПорога.Использование Тогда
        ВызватьИсключение "Не совпало реально загруженное значение порога";
    КонецЕсли;
    IDПорога = ПараметрыДанных.ПолучитьИдентификаторПоОбъекту(ЗначениеПорога);
    Если IDПорога = Неопределено Или ПараметрыДанных.ПолучитьОбъектПоИдентификатору(IDПорога) <> ЗначениеПорога Тогда
        ВызватьИсключение "Нарушен реальный roundtrip собственного параметра данных";
    КонецЕсли;
    ПараметрыТаблицы = Таблица.ПараметрыВывода;
    ДоступныйЗаголовок = ПараметрыТаблицы.ДоступныеПараметры.НайтиПараметр(Новый ПараметрКомпоновкиДанных("Заголовок"));
    Если ДоступныйЗаголовок = Неопределено Или Не ДоступныйЗаголовок.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
        ВызватьИсключение "Нативная таблица не поддерживает собственный строковый заголовок";
    КонецЕсли;
    Заголовок = ПараметрыТаблицы.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Заголовок"));
    Если Заголовок = Неопределено Или Заголовок.Значение <> "Собственная матрица продаж" Или Не Заголовок.Использование
        Или ПараметрыТаблицы.Элементы.Индекс(Заголовок) < 0 Тогда
        ВызватьИсключение "Заголовок должен быть настоящим используемым ребёнком своей коллекции";
    КонецЕсли;
    IDЗаголовка = ПараметрыТаблицы.ПолучитьИдентификаторПоОбъекту(Заголовок);
    Если IDЗаголовка = Неопределено Или ПараметрыТаблицы.ПолучитьОбъектПоИдентификатору(IDЗаголовка) <> Заголовок Тогда
        ВызватьИсключение "Нарушен реальный roundtrip параметра вывода таблицы";
    КонецЕсли;
    Для Индекс = 0 По 1 Цикл
        Группа = ?(Индекс = 0, Строки, Колонки);
        ПараметрыГруппы = Группа.ПараметрыВывода;
        ДоступноеРасположение = ПараметрыГруппы.ДоступныеПараметры.НайтиПараметр(Новый ПараметрКомпоновкиДанных("РасположениеИтогов"));
        Если ДоступноеРасположение = Неопределено Или Не ДоступноеРасположение.ТипЗначения.СодержитТип(Тип("РасположениеИтоговКомпоновкиДанных")) Тогда
            ВызватьИсключение "Группа не поддерживает собственную явную политику итогов";
        КонецЕсли;
        Расположение = ПараметрыГруппы.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("РасположениеИтогов"));
        Если Расположение = Неопределено Или Не Расположение.Использование Или Расположение.Значение <> РасположениеИтоговКомпоновкиДанных.Нет Тогда
            ВызватьИсключение "Скрытые или повторно выведенные итоги испортят независимую проверку ячеек";
        КонецЕсли;
        IDРасположения = ПараметрыГруппы.ПолучитьИдентификаторПоОбъекту(Расположение);
        Если IDРасположения = Неопределено Или ПараметрыГруппы.ПолучитьОбъектПоИдентификатору(IDРасположения) <> Расположение Тогда
            ВызватьИсключение "Нарушен реальный roundtrip параметра своей группы";
        КонецЕсли;
    КонецЦикла;
    Оформление = Таблица.УсловноеОформление.Элементы.Получить(0).Оформление;
    Если Оформление.ДоступныеПараметры.НайтиПараметр(Новый ПараметрКомпоновкиДанных("ЦветФона")) = Неопределено Тогда
        ВызватьИсключение "Не поддерживается выбранное оформление собственного отчёта";
    КонецЕсли;
    ЦветФона = Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"));
    Если ЦветФона = Неопределено Или Не ЦветФона.Использование
        Или ЦветФона.Значение <> Новый Цвет(242, 248, 255) Тогда
        ВызватьИсключение "Не подтверждено реальное значение собственного оформления";
    КонецЕсли;
    ПоляОформления = Оформление.ДоступныеПоляПараметров;
    Если ТипЗнч(ПоляОформления) <> Тип("ДоступныеПоляКомпоновкиДанных") Тогда
        ВызватьИсключение "Нет настоящих доступных полей для редактирования оформления";
    КонецЕсли;
    ДоступноеПолеСуммы = ПоляОформления.НайтиПоле(Новый ПолеКомпоновкиДанных("Сумма85"));
    Если ТипЗнч(ДоступноеПолеСуммы) <> Тип("ДоступноеПолеКомпоновкиДанных")
        Или Не ДоступноеПолеСуммы.ТипЗначения.СодержитТип(Тип("Число")) Тогда
        ВызватьИсключение "Правило оформления нельзя привязать к неизвестному или нечисловому полю суммы";
    КонецЕсли;
    Условие = Таблица.УсловноеОформление.Элементы.Получить(0).Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма85");
    Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    Условие.ПравоеЗначение = 500;
    Условие.Использование = Истина;
    Если Таблица.Строки.ИдентификаторПользовательскойНастройки <> "4a9861e6-9b2a-45b3-bcb8-859815e70b56-rows"
        Или Таблица.Строки.ПредставлениеПользовательскойНастройки <> "Товары собственной матрицы"
        Или Таблица.Строки.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда
        ВызватьИсключение "Не совпала собственная политика настройки строк";
    КонецЕсли;
    РасположениеСтрок = Строки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("РасположениеИтогов"));
    Если РасположениеСтрок = Неопределено Тогда
        ВызватьИсключение "В контекст передаём именно своего действительного ребёнка параметров строк";
    КонецЕсли;
    ДескрипторДанных = Новый Структура("Владелец,Объект,ID", ПараметрыДанных, ЗначениеПорога, IDПорога);
    ДескрипторТаблицы = Новый Структура("Владелец,Объект,ID", ПараметрыТаблицы, Заголовок, IDЗаголовка);
    ДескрипторГруппы = Новый Структура("Владелец,Объект,ID", Строки.ПараметрыВывода, РасположениеСтрок,
        Строки.ПараметрыВывода.ПолучитьИдентификаторПоОбъекту(РасположениеСтрок));
    Если РазрешитьСвойПараметр85(ПараметрыДанных, ДескрипторДанных) <> ЗначениеПорога
        Или РазрешитьСвойПараметр85(ПараметрыТаблицы, ДескрипторТаблицы) <> Заголовок
        Или РазрешитьСвойПараметр85(Строки.ПараметрыВывода, ДескрипторГруппы) <> РасположениеСтрок Тогда
        ВызватьИсключение "Не подтверждены собственные owner-tagged дескрипторы для реального вывода";
    КонецЕсли;
    Возврат Новый Структура("Компоновщик,Настройки,Таблица,Порог,Заголовок,Расположение,Строки,Колонки,ДескрипторДанных,ДескрипторТаблицы,ДескрипторГруппы",
        Компоновщик, Настройки, Таблица, ЗначениеПорога, Заголовок, РасположениеСтрок, Строки, Колонки, ДескрипторДанных, ДескрипторТаблицы, ДескрипторГруппы);
КонецФункции

Процедура ПроверитьЧужиеВладельцы85(Первый, Второй)
    Если Первый.Настройки = Второй.Настройки Или Первый.Порог = Второй.Порог Или Первый.Заголовок = Второй.Заголовок Тогда
        ВызватьИсключение "Два действительных владельца должны иметь разные реальные дочерние объекты";
    КонецЕсли;
    ДанныеПервого = Первый.Настройки.ПараметрыДанных;
    ДанныеВторого = Второй.Настройки.ПараметрыДанных;
    ТаблицаПервого = Первый.Таблица.ПараметрыВывода;
    ТаблицаВторого = Второй.Таблица.ПараметрыВывода;
    ГруппаПервого = Первый.Строки.ПараметрыВывода;
    ГруппаВторого = Второй.Строки.ПараметрыВывода;
    Если ДанныеПервого.ПолучитьИдентификаторПоОбъекту(Второй.Порог) <> Неопределено
        Или ТаблицаПервого.ПолучитьИдентификаторПоОбъекту(Второй.Заголовок) <> Неопределено
        Или ГруппаПервого.ПолучитьИдентификаторПоОбъекту(Второй.Расположение) <> Неопределено Тогда
        ВызватьИсключение "Чужой настоящий объект нельзя считать ребёнком своего владельца";
    КонецЕсли;
    Если РазрешитьСвойПараметр85(ДанныеВторого, Второй.ДескрипторДанных) <> Второй.Порог
        Или РазрешитьСвойПараметр85(ТаблицаВторого, Второй.ДескрипторТаблицы) <> Второй.Заголовок
        Или РазрешитьСвойПараметр85(ГруппаВторого, Второй.ДескрипторГруппы) <> Второй.Расположение Тогда
        ВызватьИсключение "Перед negative проверкой дескрипторы второго владельца должны быть реально разрешимы на своём owner";
    КонецЕсли;
    Если РазрешитьСвойПараметр85(ДанныеПервого, Второй.ДескрипторДанных) <> Неопределено
        Или РазрешитьСвойПараметр85(ТаблицаПервого, Второй.ДескрипторТаблицы) <> Неопределено
        Или РазрешитьСвойПараметр85(ГруппаПервого, Второй.ДескрипторГруппы) <> Неопределено Тогда
        ВызватьИсключение "Собственный протокол обязан отказать чужому owner до native разрешения ID";
    КонецЕсли;
КонецПроцедуры

Функция ВывестиМатрицу85(Схема, Контекст, Продажи)
    РазрешённыйПорог = РазрешитьСвойПараметр85(Контекст.Настройки.ПараметрыДанных, Контекст.ДескрипторДанных);
    Если РазрешённыйПорог = Неопределено Или РазрешённыйПорог <> Контекст.Порог Тогда
        ВызватьИсключение "Перед выводом нужно разрешить свой actual порог через своего владельца";
    КонецЕсли;
    Если РазрешённыйПорог.Значение <> 250 И РазрешённыйПорог.Значение <> 300 Тогда
        ВызватьИсключение "Неизвестный порог перед native компоновкой";
    КонецЕсли;
    МакетКомпоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = МакетКомпоновщик.Выполнить(Схема, Контекст.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанных"), Истина);
    Если ТипЗнч(Макет) <> Тип("МакетКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен настоящий скомпонованный native макет";
    КонецЕсли;
    Процессор = Новый ПроцессорКомпоновкиДанных;
    ВнешниеДанные = Новый Структура("СвоиПродажи85", Продажи);
    Если Не ВнешниеДанные.Свойство("СвоиПродажи85", ФактИсточника) Или ФактИсточника <> Продажи Тогда
        ВызватьИсключение "Не подменяйте источник готовым ожидаемым результатом";
    КонецЕсли;
    Процессор.Инициализировать(Макет, ВнешниеДанные, , Ложь, Истина);
    Документ = Новый ТабличныйДокумент;
    Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    Вывод.УстановитьДокумент(Документ);
    ВозвращённыйДокумент = Вывод.Вывести(Процессор, Ложь);
    Если ВозвращённыйДокумент <> Документ Или Документ.ВысотаТаблицы = 0 Или Документ.ШиринаТаблицы = 0 Тогда
        ВызватьИсключение "Нужно прочитать именно native возвращённый документ";
    КонецЕсли;
    Возврат Документ;
КонецФункции

Функция ПроверитьМатрицу85(Документ, Порог)
    Если ТипЗнч(Документ) <> Тип("ТабличныйДокумент") Или (Порог <> 250 И Порог <> 300) Тогда
        ВызватьИсключение "Нужно проверить весь собственный native табличный результат";
    КонецЕсли;
    Если Документ.ВысотаТаблицы > 50 Или Документ.ШиринаТаблицы > 30 Тогда
        ВызватьИсключение "Неожиданно большой результат для трёх собственных строк";
    КонецЕсли;
    Количества = Новый Массив;
    Суммы = Новый Массив;
    ЗаголовокНайден = Ложь;
    ПорядокЗаголовковПодтверждён = Ложь;
    ЦветПодтверждён = Ложь;
    Для СтрокаДокумента = 1 По Документ.ВысотаТаблицы Цикл
        ПервыйЗаголовокКоличества = Неопределено;
        ПервыйЗаголовокСуммы = Неопределено;
        Для КолонкаДокумента = 1 По Документ.ШиринаТаблицы Цикл
            Ячейка = Документ.Область(СтрокаДокумента, КолонкаДокумента);
            Если ТипЗнч(Ячейка) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
                ВызватьИсключение "Нужна действительная отдельная ячейка";
            КонецЕсли;
            Текст = СокрЛП(Строка(Ячейка.Текст));
            Если Текст = "Собственная матрица продаж" Тогда
                ЗаголовокНайден = Истина;
            КонецЕсли;
            Если Текст = "Количество85" И ПервыйЗаголовокКоличества = Неопределено Тогда
                ПервыйЗаголовокКоличества = КолонкаДокумента;
            КонецЕсли;
            Если Текст = "Сумма85" И ПервыйЗаголовокСуммы = Неопределено Тогда
                ПервыйЗаголовокСуммы = КолонкаДокумента;
            КонецЕсли;
            Числовое = Неопределено;
            Если Ячейка.СодержитЗначение Тогда
                Значение = Ячейка.Значение;
                Если ТипЗнч(Значение) = Тип("Число") Тогда
                    Числовое = Значение;
                КонецЕсли;
            ИначеЕсли Текст <> "" Тогда
                Попытка
                    Числовое = Число(Текст);
                Исключение
                    Числовое = Неопределено;
                КонецПопытки;
            КонецЕсли;
            Если Числовое <> Неопределено Тогда
                Если Числовое = 1 Или Числовое = 2 Тогда
                    Количества.Добавить(Числовое);
                ИначеЕсли Числовое = 250 Или Числовое = 500 Тогда
                    Суммы.Добавить(Числовое);
                    Если Числовое = 500 Тогда
                        Если Ячейка.ЦветФона <> Новый Цвет(242, 248, 255) Тогда
                            ВызватьИсключение "Собственное условное оформление не подтверждено на фактической ячейке500";
                        КонецЕсли;
                        ЦветПодтверждён = Истина;
                    КонецЕсли;
                ИначеЕсли Числовое <> 0 Тогда
                    ВызватьИсключение "В native результате есть неожиданные числа или дубли итогов";
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        Если ПервыйЗаголовокКоличества <> Неопределено И ПервыйЗаголовокСуммы <> Неопределено Тогда
            Если ПервыйЗаголовокКоличества >= ПервыйЗаголовокСуммы Тогда
                ВызватьИсключение "Фактический вывод не подтвердил порядок количества перед суммой";
            КонецЕсли;
            ПорядокЗаголовковПодтверждён = Истина;
        КонецЕсли;
    КонецЦикла;
    Если Не ЗаголовокНайден Или Не ПорядокЗаголовковПодтверждён Или Не ЦветПодтверждён
        Или Суммы.Количество() <> ?(Порог = 250, 3, 1)
        Или Количества.Количество() <> Суммы.Количество() Тогда
        ВызватьИсключение "Не совпал полный объём фактических ячеек ресурсов";
    КонецЕсли;
    СуммаРезультата = 0;
    КоличествоРезультата = 0;
    Число250 = 0;
    Число500 = 0;
    Число1 = 0;
    Число2 = 0;
    Для Каждого Сумма Из Суммы Цикл
        СуммаРезультата = СуммаРезультата + Сумма;
        Число250 = Число250 + ?(Сумма = 250, 1, 0);
        Число500 = Число500 + ?(Сумма = 500, 1, 0);
    КонецЦикла;
    Для Каждого Количество Из Количества Цикл
        КоличествоРезультата = КоличествоРезультата + Количество;
        Число1 = Число1 + ?(Количество = 1, 1, 0);
        Число2 = Число2 + ?(Количество = 2, 1, 0);
    КонецЦикла;
    Если СуммаРезультата <> ?(Порог = 250, 1000, 500) Или КоличествоРезультата <> ?(Порог = 250, 4, 2)
        Или Число250 <> ?(Порог = 250, 2, 0) Или Число500 <> 1 Или Число1 <> ?(Порог = 250, 2, 0) Или Число2 <> 1 Тогда
        ВызватьИсключение "Фактически выведенные native числа не прошли независимый числовой контроль";
    КонецЕсли;
    Возврат СуммаРезультата;
КонецФункции

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

Функция СформироватьУчебныйПакет85() Экспорт
    ПроверитьСвойСтенд85();
    UUIDПакета = Новый УникальныйИдентификатор;
    Продажи = СоздатьПродажи85(UUIDПакета);
    ПроверитьПродажи85(Продажи, UUIDПакета);
    Схема = СоздатьСхему85(Продажи);
    Варианты = Схема.ВариантыНастроек;
    Если Варианты.Количество() <> 0 Тогда
        ВызватьИсключение "Новая собственная memory схема без существующих вариантов";
    КонецЕсли;
    Основной = Варианты.Добавить();
    Основной.Имя = "Все85";
    Основной.Представление = "Все три собственные продажи";
    ЗаполнитьВариант85(Основной, 250);
    Вставленный = Варианты.Вставить(0);
    Вставленный.Имя = "Крупная85";
    Вставленный.Представление = "Собственная продажа от трёхсот";
    ЗаполнитьВариант85(Вставленный, 300);
    Если Варианты.Количество() <> 2 Или Варианты.Получить(0) <> Вставленный Или Варианты.Получить(1) <> Основной Тогда
        ВызватьИсключение "Вставить должен сохранить реальный основной вариант и изменить только позицию";
    КонецЕсли;
    Первый = СвязатьВариант85(Схема, Основной, 250);
    Второй = СвязатьВариант85(Схема, Вставленный, 300);
    ПроверитьЧужиеВладельцы85(Первый, Второй);
    Документ1000 = ВывестиМатрицу85(Схема, Первый, Продажи);
    Если ПроверитьМатрицу85(Документ1000, 250) <> 1000 Тогда
        ВызватьИсключение "Не подтверждён первый native результат";
    КонецЕсли;
    ПроверитьПродажи85(Продажи, UUIDПакета);
    Документ500 = ВывестиМатрицу85(Схема, Второй, Продажи);
    Если ПроверитьМатрицу85(Документ500, 300) <> 500 Тогда
        ВызватьИсключение "Не подтверждён второй native результат";
    КонецЕсли;
    Если Варианты.Количество() <> 2 Или Варианты.Получить(0) <> Вставленный Или Варианты.Получить(1) <> Основной
        Или Основной.Имя <> "Все85" Или Вставленный.Имя <> "Крупная85" Тогда
        ВызватьИсключение "Перед удалением нужна полная собственная коллекция двух вариантов";
    КонецЕсли;
    Варианты.Удалить(Вставленный);
    Если Варианты.Количество() <> 1 Или Варианты.Получить(0) <> Основной Или Основной.Имя <> "Все85" Тогда
        ВызватьИсключение "Удалить должен убрать только свой вставленный вариант";
    КонецЕсли;
    Восстановленный = СвязатьВариант85(Схема, Основной, 250);
    ДокументСнова1000 = ВывестиМатрицу85(Схема, Восстановленный, Продажи);
    Если ПроверитьМатрицу85(ДокументСнова1000, 250) <> 1000 Тогда
        ВызватьИсключение "Возвращение к основному варианту не подтверждено native выводом";
    КонецЕсли;
    СверитьВозвратКОсновному85(Документ1000, ДокументСнова1000);
    ПроверитьПродажи85(Продажи, UUIDПакета);
    ПолитикаСтрок = Восстановленный.Таблица.Строки;
    РазрешёнСобственныйПросмотр = ПолитикаСтрок.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
    Если Не РазрешёнСобственныйПросмотр Тогда
        ВызватьИсключение "Собственная форма принимает только явно согласованную обычную политику";
    КонецЕсли;
    Возврат Новый Структура("Первый,Второй,Снова,Подпись,Разрешён", Документ1000, Документ500, ДокументСнова1000,
        ПолитикаСтрок.ПредставлениеПользовательскойНастройки + ": " + ПолитикаСтрок.ИдентификаторПользовательскойНастройки, РазрешёнСобственныйПросмотр);
КонецФункции
#Иначе
Функция СформироватьУчебныйПакет85() Экспорт
    ВызватьИсключение "Только собственная файловая ИБ и толстый клиент с обычным приложением";
КонецФункции
Процедура ПроверитьСвойСтенд85() Экспорт
    ВызватьИсключение "В этом контексте учебный сценарий не поддерживается";
КонецПроцедуры
#КонецЕсли
Полный модуль собственной обычной общей формы

Общие → Общие формы → МатрицаВариантов85 → Модуль

Толстый клиент, обычная форма. Настоящий Нажатие с первым Элемент по event104; события напрямую не вызываются.

Перем Остановка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 Тогда
            ВызватьИсключение "После присваивания поля не показывают действительные native документы";
        КонецЕсли;
        Статус85 = Кандидат.Подпись + ". Выведено 1000 → 500 → 1000; источник сохранён полностью.";
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры
Полный модуль обычного приложения

Корень конфигурации → Модуль обычного приложения

Настоящее ПриНачалеРаботыСистемы()0; только ordinary thick branch.

Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
    УчебныеВарианты85.ПроверитьСвойСтенд85();
    ОткрытьФорму("ОбщаяФорма.МатрицаВариантов85");
#Иначе
    ВызватьИсключение "Учебный сценарий запускается только в обычном толстом клиенте";
#КонецЕсли
КонецПроцедуры

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

  1. Проверить exact собственную новую файловую ИБ, версию, схему и пользователя.

  2. Создать три строки и два ресурса, затем основной вариант и второй native Insert(0).

  3. Фактически передвинуть количество перед суммой, задать явные итоги Нет, заголовок и собственное оформление.

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

  5. Native генератор/процессор выводит1000, затем500. Прочитать фактические ячейки; не писать в документ ожидаемые суммы.

  6. После полного whitelist коллекции удалить только свой вставленный вариант, заново связать основной и нативно вывести1000.

  7. Полностью сверить источник после вывода, передать три действительных документа своей форме через настоящий handler.

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

  1. Проверьте1000/4 →500/2 →1000/4 и полный набор числовых ячеек250/500, а не одну итоговую строку.

  2. Каждый собственный ID разрешается ровно в тот же actual child. Native GetID чужого реального объекта даёт Неопределено; собственный протокол отказывает чужому owner-tagged дескриптору до native разрешения ID.

  3. Insert сохраняет основной object на индексе1, Delete возвращает именно его на индекс0; выбранное количество действительно на индексе0.

  4. В source после каждого этапа все3×6 исходных scalar значений неизменны. Cancel/Close ничего не пишет и не удаляет.

  5. При неоднозначном native layout/дополнительных итогах проверка отказывает; она не маскирует их готовым ожидаемым документом.

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

Ожидаемый будущий ручной результат — три native сводных документа1000→500→1000, неизменный свой источник и один сохранённый основной memory вариант. Здесь только авторство и статические тесты: actual1С/compile/DB/UI/network/runtime0.

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

  1. Не путайте readonly контейнеры с изменяемыми детьми: Настройки, Структура, ПараметрыДанных, ДоступныеПараметры, ДоступныеПоляПараметров и Элементы не заменяются.

  2. Opaque ID не обещан глобально уникальным: одинаковые деревья могут иметь совпадающие ID. По чужому ID не делаем вывод о владельце. Свой memory дескриптор хранит actual owner reference, actual child и native ID; чужому владельцу явно отказываем ДО GetObjectByID. Этот протокол не предназначен для передачи/сериализации вне процесса. После нового LoadSettings получаем свежие native объекты и ID.

  3. Оформление применяется к своей таблице, доступные поля только проверяются, чужие объекты не добавляются.

  4. Числовая проверка различает настоящий numeric value и текст ячейки; Значение читается только при СодержитЗначение. Формат чисел явно без групп и дробной части.

  5. Проверяется множество и сумма фактических resource cells, не абсолютные координаты pivot layout и не все свойства оформления. No runtime proof: 1С может обнаружить дополнительное ограничение, тогда остановитесь.

  6. Свои memory изменения и присваивания трёх UI реквизитов не обещаны атомарными. При ошибке присваивания форма fail-stop; слепого отката/повтора нет.

  7. Резервные копии, запись системных/пользовательских настроек, файлы, сеть, фоновые задания, print/export и изменения существующих конфигураций не используются.

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

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

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

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

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