Тип: ДоступныеПараметрыКомпоновкиДанных. Содержит набор доступных параметров. Определяет состав оформления компоновки данных.
Полное описание, параметры и ограничения
ОформлениеКомпоновкиДанных.ДоступныеПараметры (DataCompositionAppearance.AvailableParameters)
ОформлениеКомпоновкиДанных (DataCompositionAppearance)
ДоступныеПараметры (AvailableParameters)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: ДоступныеПараметрыКомпоновкиДанных.
Содержит набор доступных параметров. Определяет состав оформления компоновки данных.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Своя сводная таблица: варианты, владельцы параметров и проверенный вывод 1000 → 500 → 1000
С нуля строим типизированный источник, настоящую таблицу СКД и два собственных варианта. Проверяем доступность параметров до настройки, реальные ID→объект на своём владельце и отказ чужому; затем сверяем весь объём фактически выведенных ресурсов.
Где и как запускать
Полный общий модуль собственной новой файловой ИБ; ordinary thick branches, не отдельный фрагмент. Поддерживающие модули обычной формы и приложения приведены целиком.
Подготовка
Этот урок готовит свои варианты сводной таблицы: товар по строкам, канал продаж по колонкам, два ресурса — количество и сумма. Это один полный процесс в памяти, не набор обёрток над неизвестным объектом.
Вручную создайте НОВУЮ пустую файловую ИБ 8.5.1.1343 только по точному пути C:\1C85_OwnPivotLab\4a9861e6-9b2a-45b3-bcb8-859815e70b56\Base. Если каталог или регистрация уже существуют, остановитесь и не используйте их. UUID в имени каталога — метка учебного стенда, не UUID информационной базы. Здесь каталог, ИБ и VM фактически не создавались.
В Конфигураторе назовите новую конфигурацию УчебнаяМатрицаВариантов85, режим совместимости НеИспользовать, основной режим запуска — обычное приложение. Никаких расширений, BSP, справочников, документов, регистров и других прикладных объектов. Один сеанс; никаких других пользователей или подключений к этой своей ИБ.
Создайте только свою роль УчебныйАдминистратор85 с правом Администрирование, правами запуска обычного клиента и просмотра собственной общей формы; один реальный пользователь с тем же именем и этой ролью. Административные права нужны для native ПолучитьПользователей; роль с одним правом просмотра для проверки недостаточна. Подготовку прав выполняйте только в новой своей ИБ, не в рабочей конфигурации.
Создайте общий модуль УчебныеВарианты85: Глобальный Нет, Клиент обычное приложение Да, Сервер Да, Внешнее соединение Нет, Привилегированный Нет, Вызов сервера Нет, Повторное использование возвращаемых значений НеИспользовать. Вставьте целиком CODE, не внутрь другой процедуры.
В файловом толстом клиенте с обычным приложением символ ТолстыйКлиентОбычноеПриложение истинен в клиентской и серверной частях. Это не универсальная проверка «не сервер». Другие контексты без этого символа явно отказывают; отдельный exact File guard действует независимо.
Создайте обычную общую форму МатрицаВариантов85, основного реквизита нет. Реквизиты Первый85/Второй85/Снова85 — ТабличныйДокумент, Статус85 — Строка неограниченной длины. Три поля табличного документа с такими же именами и Данные=одноимённый реквизит; каждое ТолькоПросмотр Истина. Статус85 показывать многострочным readonly полем.
Единственная кнопка Сформировать85: Нажатие → Сформировать85(Кнопка). Обычная форма добавляет первым аргументом настоящий элемент управления по event104; сам Button.Click имеет ноль аргументов. ПриОткрытии → ПриОткрытии() без аргументов. Вставьте целиком FORM; эти события вручную не вызывайте.
В модуль обычного приложения вставьте целиком APPLICATION, событие ПриНачалеРаботыСистемы() с нулём аргументов. В управляющую форму эти три модуля переносить нельзя. Других модулей и макетов в подготовке нет.
После будущего ручного запуска нажмите настоящую кнопку один раз. CODE сам создаёт свой UUID пакета и полный источник: BOOK/RETAIL/1×250=250, BOOK/WHOLE/2×250=500, PAPER/RETAIL/1×250=250. Все шесть колонок типизированы; БД не читается запросом и ничего в ней не записывается.
Схема и два варианта возникают через native factories: Новый СхемаКомпоновкиДанных → ВариантыНастроек.Добавить/Вставить → readonly Вариант.Настройки → Структура.Добавить(Тип(ТаблицаКомпоновкиДанных)) → Строки/Колонки.Добавить. Не создавайте внутренние коллекции и детей через несуществующие конструкторы.
Каждый вариант отдельно загружается в собственный настоящий компоновщик, инициализированный ИсточникДоступныхНастроекКомпоновкиДанных(Схема). Доступные поля/параметры используются для проверки числового порога, строкового заголовка, enum итогов и допустимости правила оформления по Сумма85.
Политика Строки задаёт native ID, подпись и обычный режим отображения. В этом уроке собственная форма использует их как явный gate/подпись результата. Это НЕ создание или открытие стандартного редактора пользовательских настроек и не обещание его интерфейса.
Ожидаются три native документа: все продажи 1000 и количество4; порог300 — сумма500 и количество2; после удаления только своего вставленного варианта новый вывод основного опять1000/4. Проверяется не готовая арифметическая подстановка, а фактические ячейки ТабличногоДокумента, который вернул native процессор.
В ручных негативных проверках временно изменяйте только этот собственный учебный исходник: чужой 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");
#Иначе
ВызватьИсключение "Учебный сценарий запускается только в обычном толстом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Проверить exact собственную новую файловую ИБ, версию, схему и пользователя.
Создать три строки и два ресурса, затем основной вариант и второй native Insert(0).
Фактически передвинуть количество перед суммой, задать явные итоги Нет, заголовок и собственное оформление.
Инициализировать каждый компоновщик настоящей схемой, загрузить реальные настройки и проверить доступные типы, владельцев и ID.
Native генератор/процессор выводит1000, затем500. Прочитать фактические ячейки; не писать в документ ожидаемые суммы.
После полного whitelist коллекции удалить только свой вставленный вариант, заново связать основной и нативно вывести1000.
Полностью сверить источник после вывода, передать три действительных документа своей форме через настоящий handler.
Как проверить результат
Проверьте1000/4 →500/2 →1000/4 и полный набор числовых ячеек250/500, а не одну итоговую строку.
Каждый собственный ID разрешается ровно в тот же actual child. Native GetID чужого реального объекта даёт Неопределено; собственный протокол отказывает чужому owner-tagged дескриптору до native разрешения ID.
Insert сохраняет основной object на индексе1, Delete возвращает именно его на индекс0; выбранное количество действительно на индексе0.
В source после каждого этапа все3×6 исходных scalar значений неизменны. Cancel/Close ничего не пишет и не удаляет.
При неоднозначном native layout/дополнительных итогах проверка отказывает; она не маскирует их готовым ожидаемым документом.
Ожидаемый результат
Ожидаемый будущий ручной результат — три native сводных документа1000→500→1000, неизменный свой источник и один сохранённый основной memory вариант. Здесь только авторство и статические тесты: actual1С/compile/DB/UI/network/runtime0.
На что обратить внимание
Не путайте readonly контейнеры с изменяемыми детьми: Настройки, Структура, ПараметрыДанных, ДоступныеПараметры, ДоступныеПоляПараметров и Элементы не заменяются.
Opaque ID не обещан глобально уникальным: одинаковые деревья могут иметь совпадающие ID. По чужому ID не делаем вывод о владельце. Свой memory дескриптор хранит actual owner reference, actual child и native ID; чужому владельцу явно отказываем ДО GetObjectByID. Этот протокол не предназначен для передачи/сериализации вне процесса. После нового LoadSettings получаем свежие native объекты и ID.
Оформление применяется к своей таблице, доступные поля только проверяются, чужие объекты не добавляются.
Числовая проверка различает настоящий numeric value и текст ячейки; Значение читается только при СодержитЗначение. Формат чисел явно без групп и дробной части.
Проверяется множество и сумма фактических resource cells, не абсолютные координаты pivot layout и не все свойства оформления. No runtime proof: 1С может обнаружить дополнительное ограничение, тогда остановитесь.
Свои memory изменения и присваивания трёх UI реквизитов не обещаны атомарными. При ошибке присваивания форма fail-stop; слепого отката/повтора нет.
Резервные копии, запись системных/пользовательских настроек, файлы, сеть, фоновые задания, print/export и изменения существующих конфигураций не используются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.