Получает значения параметров вывода группировки диаграммы компоновки данных, соответствующие переданному идентификатору.
Синтаксис
ПолучитьОбъектПоИдентификатору(<Идентификатор>)Полное описание, параметры и ограничения
ЗначенияПараметровВыводаГруппировкиДиаграммыКомпоновкиДанных.ПолучитьОбъектПоИдентификатору (DataCompositionChartGroupOutputParameterValues.GetObjectByID)
ЗначенияПараметровВыводаГруппировкиДиаграммыКомпоновкиДанных (DataCompositionChartGroupOutputParameterValues)
ПолучитьОбъектПоИдентификатору (GetObjectByID)
Доступен, начиная с версии 8.2.
Синтаксис:
ПолучитьОбъектПоИдентификатору(<Идентификатор>)
Параметры:
<Идентификатор> (необязательный)
Тип: ИдентификаторКомпоновкиДанных.
Идентификатор объекта.
Возвращаемое значение:
Тип: ЗначениеПараметраКомпоновкиДанных, Неопределено.
Неопределено - объект, для которого был передан идентификатор, не найден или если он не является частью данного объекта.
Описание:
Получает значения параметров вывода группировки диаграммы компоновки данных, соответствующие переданному идентификатору.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Заголовок и лимит диаграммы: owner-local identity и проверенное восстановление
Настроить свой memory-профиль диаграммы2→1→2 и вернуть его только после реального readback; native ID не заменяет принадлежность owner.
Где и как запускать
Полный собственный серверный общий модуль .1343; GLOBAL только для СчетГруппа85. Собственная управляемая форма вызывает конвейер из серверной части. Все native параметры/расшифровка остаются на сервере.
Подготовка
Задача: собственная корзина из трёх товаров. BOOK: 2×250=500; PAPER: 5×50=250; TEA: 3×100=300. Количество10, сумма1050. СКД объединяет товары в категории Офис750/Чай300. Надбавка20% должна дать настоящие900/360 и общий итог1260, затем новый запуск без надбавки возвращает1050.
Вручную создайте НОВУЮ пустую файловую ИБ только по пути C:\1C85_OwnSKDInvoice\27ab6906-e418-43d5-9e74-5aedb8f7449f\IB. Если такой каталог/регистрация уже существуют, остановитесь. UUID в пути — метка собственного стенда, не UUID базы. Здесь создание каталога/CF/пользователя и запуск1С не выполнялись.
Конфигуратор: имя конфигурации СвойСчетСКД85; РежимСовместимости=НеИспользовать; ОсновнойРежимЗапуска=УправляемоеПриложение. Запуск вручную только толстым управляемым клиентом1cv8.exe платформы8.5.1.1343. Тонкий/web-клиент этот урок не поддерживает: APP читает server/thick-only свойства метаданных. Создайте только три общих модуля, одну управляемую общую форму и одну свою роль. Не переносите прикладные объекты, расширения или данные из рабочих конфигураций.
Создайте роль Счет85Администратор с правами Администрирование, АктивныеПользователи и запуска/просмотра собственной формы. Создайте ровно одного настоящего пользователя Счет85Ученик с этой ролью. После обновления своей ИБ закройте Конфигуратор и все другие соединения. Guard сравнит actualUUID этого пользователя и настоящее соединение; placeholder UUID не требуется.
Общие модули СчетГруппа85/СчетДиаграмма85/СчетКонвейер85: СерверДа; оба КлиентНет; ВнешнееСоединениеНет; ВызовСервераНет; ПривилегированныйНет. Только СчетГруппа85 имеет ГлобальныйДа; два других ГлобальныйНет. Только для двух неглобальных задайте ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать: у GLOBAL это свойство настройки недоступно и код его не читает. Вставьте каждый полный модуль из карточки. GLOBAL-функция вызывается самим выражением ресурса СКД; это не RPC с nativeGroupData.
Общая управляемая форма СчетСКД85 без основного реквизита: До85/После85/Вернули85 — ТабличныйДокумент; Статус85 — неограниченная Строка; Остановка85/Завершено85 — Булево, начальноЛожь. Три поля табличного документа связаны с одноимёнными реквизитами и только для просмотра; Статус85 — многострочное readonly-поле. Команда Сформировать85 с Действие=Сформировать85; одна кнопка с Команда=Сформировать85. Вставьте полный FORM_CODE.
В модуль управляемого приложения своей конфигурации вставьте полный APPLICATION_CODE. Настоящее событие ПриНачалеРаботыСистемы()0 открывает только собственную форму. Его не вызывают вручную. После будущего ручного обновления запустите собственный управляемый клиент и один раз нажмите кнопку. Это инструкция будущего прогона, не уже состоявшийся запуск.
ПрочитатьИсточник85 выполняет только собственный литеральный запрос без ИЗ таблиц базы. Каждая из3×5 ячеек проверяется независимо, включая qty×price=amount; native итоги10/1050. Та же строка запроса помещена в native querydataset своей схемы, типы полей взяты из реальных колонок результата.
Ресурс Сумма85 вычисляется глобальной функцией СчетСНадбавкой85(ГрупповаяОбработка(...),ПараметрыДанных.Надбавка85). Это ресурс собственной схемы, не пользовательское поле. ГрупповаяОбработка выдаёт значения ГРУППИРОВОК: две category-строки750/300, а не три товарные строки. CurrentItem — настоящая строка этой таблицы либо Неопределено для общего итога.
У СКД-groupData нет документированного конструктора. Readonly свойства Данные/ТекущийЭлемент/ВременныеДанныеОбработки не назначаются. Во вложенную настоящую структуру временных данных помещается только свой уникально названный снимок. Ранее существовавшее несовместимое состояние приводит к отказу, не Clear или подмене объекта.
Параметр Надбавка85 добавляется только в новую несвязанную коллекцию до LoadSettings; после связывания прочитывается его реальное значение. Макет получает тот же собственный объект расшифровки, который затем передаётся процессору. Четвёртый аргумент Инициализировать=Истина разрешает собственные GLOBAL-функции. Это не разрешение внешней сети и не разрешение пользовательских выражений.
Свой отдельный профиль диаграммы получает настоящие Chart/ChartGroup через native Add(Type)/Add(). После LoadSettings перечитываются actual владельцы и значения Заголовок/КоличествоЗаписей. Их descriptor содержит настоящий owner+child+nativeID. Чужойowner отклоняется ДО lookup; opaqueID не считается глобально уникальным UUID. Лимит2→1→2 и заголовок изменяются только в своём memory-профиле.
Расшифровку наполняет только настоящий native output; вручную её элементы не добавляются. Индекс+[] проверяют принадлежность. Родители проходят проверку фактического типа: собственный item или nativeDetailsID; неизвестные виды/циклы запрещены. GroupDetails.Группировка содержит СТРОКОВЫЙ ИДЕНТИФИКАТОР группировки, который сверяется с настоящим compiledGroup.Идентификатор. Это не compiledGroup.Имя, не UUID элемента расшифровки и не текст Офис/Чай.
Читатель native табличного документа ищет фактические заголовки и проверяет две категории, числовые ресурсы и ровно один общий итог. При ином renderer/layout/пустомGroupProcessing/nativeNULL код остановится с ошибкой; успешный результат не подставляется. Runtime-проверки настоящих форм/графа/общего итога предстоят вручную.
Одна ошибка на server или client границе делает экземпляр формы sticky-stop. Повтор после частичного изменения и слепой rollback не разрешены. Восстановление профиля диаграммы выполняется только после полного readback именно собственного ожидаемого промежуточного состояния; это не обещание атомарности.
Здесь выполняются авторство и статические native/scoped тесты. Реальные1С/CF/DB/UI/сеть/печать/файлы/хранилища/backup0. Параметры диаграммы подтверждают значения настроек, не пиксели/отбор прав/успешность отрисовки; источник и табличный результат проверяются раздельно.
Функция СвойПараметр85(Владелец, Имя)
Значение = Владелец.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Имя));
Если ТипЗнч(Значение) <> Тип("ЗначениеПараметраКомпоновкиДанных")
Или Строка(Значение.Параметр) <> Имя Или Не Значение.Использование Тогда
ВызватьИсключение "Не найдено настоящее включённое значение собственного параметра";
КонецЕсли;
Возврат Значение;
КонецФункции
Процедура ПроверитьОписание85(Владелец, Описание)
Если ТипЗнч(Описание) <> Тип("ФиксированнаяСтруктура") Или Описание.Владелец <> Владелец Тогда
ВызватьИсключение "Чужой owner отклонён до native поиска по непрозрачному идентификатору";
КонецЕсли;
Если ТипЗнч(Владелец) <> Тип("ЗначенияПараметровВыводаДиаграммыКомпоновкиДанных")
И ТипЗнч(Владелец) <> Тип("ЗначенияПараметровВыводаГруппировкиДиаграммыКомпоновкиДанных") Тогда
ВызватьИсключение "Неизвестный владелец параметров вывода";
КонецЕсли;
Если ТипЗнч(Описание.Дочерний) <> Тип("ЗначениеПараметраКомпоновкиДанных")
Или ТипЗнч(Описание.ID) <> Тип("ИдентификаторКомпоновкиДанных") Тогда
ВызватьИсключение "Нет настоящего дочернего значения или native ID";
КонецЕсли;
Если Владелец.ПолучитьИдентификаторПоОбъекту(Описание.Дочерний) <> Описание.ID
Или Владелец.ПолучитьОбъектПоИдентификатору(Описание.ID) <> Описание.Дочерний Тогда
ВызватьИсключение "Не сохранилась реальная identity собственного параметра";
КонецЕсли;
КонецПроцедуры
Функция Описание85(Владелец, Дочерний)
ID = Владелец.ПолучитьИдентификаторПоОбъекту(Дочерний);
Если ТипЗнч(ID) <> Тип("ИдентификаторКомпоновкиДанных") Тогда
ВызватьИсключение "Native ID своего значения отсутствует";
КонецЕсли;
Описание = Новый ФиксированнаяСтруктура(Новый Структура("Владелец,Дочерний,ID", Владелец, Дочерний, ID));
ПроверитьОписание85(Владелец, Описание);
Возврат Описание;
КонецФункции
Функция ПроверитьПараметры85(Схема) Экспорт
СчетКонвейер85.ПроверитьСтенд85();
Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Тогда
ВызватьИсключение "Нужна созданная своим конвейером схема";
КонецЕсли;
Настройки = Новый НастройкиКомпоновкиДанных;
Диаграмма = Настройки.Структура.Добавить(Тип("ДиаграммаКомпоновкиДанных"));
Если ТипЗнч(Диаграмма) <> Тип("ДиаграммаКомпоновкиДанных") Тогда
ВызватьИсключение "Фабрика структуры не вернула настоящую диаграмму";
КонецЕсли;
Диаграмма.Имя = "СвояДиаграмма85";
Диаграмма.Использование = Истина;
Точка = Диаграмма.Точки.Добавить();
Если ТипЗнч(Точка) <> Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда
ВызватьИсключение "Фабрика точек не вернула настоящую группировку";
КонецЕсли;
Точка.Имя = "СвояТочка85";
Точка.Использование = Истина;
ПолеТочки = Точка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеТочки.Поле = Новый ПолеКомпоновкиДанных("Категория85");
ПолеТочки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеТочки.Использование = Истина;
Выбор = Диаграмма.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбор.Поле = Новый ПолеКомпоновкиДанных("Сумма85");
Выбор.Использование = Истина;
Диаграмма.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", "Корзина1050");
Точка.ПараметрыВывода.УстановитьЗначениеПараметра("КоличествоЗаписей", 2);
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
Компоновщик.ЗагрузитьНастройки(Настройки);
Свои = Компоновщик.Настройки;
Если Свои.Структура.Количество() <> 1 Тогда
ВызватьИсключение "Изменился полный собственный профиль диаграммы";
КонецЕсли;
СвояДиаграмма = Свои.Структура.Получить(0);
Если ТипЗнч(СвояДиаграмма) <> Тип("ДиаграммаКомпоновкиДанных")
Или СвояДиаграмма.Имя <> "СвояДиаграмма85" Или СвояДиаграмма.Точки.Количество() <> 1 Тогда
ВызватьИсключение "Связанная диаграмма не совпала с собственной подготовкой";
КонецЕсли;
СвояТочка = СвояДиаграмма.Точки.Получить(0);
Если ТипЗнч(СвояТочка) <> Тип("ГруппировкаДиаграммыКомпоновкиДанных")
Или СвояТочка.Имя <> "СвояТочка85" Или СвояТочка.Родитель <> СвояДиаграмма Тогда
ВызватьИсключение "Не совпал настоящий дочерний owner точки";
КонецЕсли;
ПараметрыДиаграммы = СвояДиаграмма.ПараметрыВывода;
ПараметрыТочки = СвояТочка.ПараметрыВывода;
Если ТипЗнч(ПараметрыДиаграммы) <> Тип("ЗначенияПараметровВыводаДиаграммыКомпоновкиДанных")
Или ТипЗнч(ПараметрыТочки) <> Тип("ЗначенияПараметровВыводаГруппировкиДиаграммыКомпоновкиДанных")
Или ПараметрыДиаграммы.ДоступныеПараметры = Неопределено
Или ПараметрыТочки.ДоступныеПараметры = Неопределено Тогда
ВызватьИсключение "Не связались настоящие доступные параметры собственной диаграммы и точки";
КонецЕсли;
Заголовок = СвойПараметр85(ПараметрыДиаграммы, "Заголовок");
Записи = СвойПараметр85(ПараметрыТочки, "КоличествоЗаписей");
Если Заголовок.Значение <> "Корзина1050" Или Записи.Значение <> 2 Тогда
ВызватьИсключение "Нет полного собственного исходного состояния до изменения профиля";
КонецЕсли;
Элементы = ПараметрыДиаграммы.Элементы;
Найдено = 0;
Для Каждого Дочерний Из Элементы Цикл
Если Дочерний = Заголовок Тогда
Найдено = Найдено + 1;
КонецЕсли;
КонецЦикла;
Если Найдено <> 1 Тогда
ВызватьИсключение "Заголовок не входит ровно один раз в настоящую коллекцию своего владельца";
КонецЕсли;
ОписаниеЗаголовка = Описание85(ПараметрыДиаграммы, Заголовок);
ОписаниеЗаписей = Описание85(ПараметрыТочки, Записи);
ПараметрыДиаграммы.УстановитьЗначениеПараметра("Заголовок", "Предпросмотр1260");
ПараметрыТочки.УстановитьЗначениеПараметра("КоличествоЗаписей", 1);
ПроверитьОписание85(ПараметрыДиаграммы, ОписаниеЗаголовка);
ПроверитьОписание85(ПараметрыТочки, ОписаниеЗаписей);
Если СвойПараметр85(ПараметрыДиаграммы, "Заголовок") <> Заголовок
Или СвойПараметр85(ПараметрыТочки, "КоличествоЗаписей") <> Записи
Или Заголовок.Значение <> "Предпросмотр1260" Или Записи.Значение <> 1 Тогда
ВызватьИсключение "Частичный или чужой профиль не восстанавливаем автоматически";
КонецЕсли;
ПараметрыДиаграммы.УстановитьЗначениеПараметра("Заголовок", "Корзина1050");
ПараметрыТочки.УстановитьЗначениеПараметра("КоличествоЗаписей", 2);
ПроверитьОписание85(ПараметрыДиаграммы, ОписаниеЗаголовка);
ПроверитьОписание85(ПараметрыТочки, ОписаниеЗаписей);
Если Заголовок.Значение <> "Корзина1050" Или Записи.Значение <> 2 Тогда
ВызватьИсключение "Не прочитан полный восстановленный собственный профиль";
КонецЕсли;
Возврат "Native профиль: заголовок и лимит2→1→2, owner/child/ID сохранены";
КонецФункцииСчетГруппа85 — полный глобальный серверный модуль
Общие → Общие модули → СчетГруппа85
Собственный серверный общий модуль .1343.
Функция СчетСНадбавкой85(ГрупповыеДанные, Надбавка) Экспорт
СчетКонвейер85.ПроверитьСтенд85();
Если ТипЗнч(ГрупповыеДанные) <> Тип("ДанныеГрупповойОбработкиКомпоновкиДанных")
Или ТипЗнч(Надбавка) <> Тип("Число") Или (Надбавка <> 0 И Надбавка <> 20) Тогда
ВызватьИсключение "Ожидается настоящий результат ГрупповаяОбработка и своя надбавка 0 или 20";
КонецЕсли;
Данные = ГрупповыеДанные.Данные;
Временные = ГрупповыеДанные.ВременныеДанныеОбработки;
Текущая = ГрупповыеДанные.ТекущийЭлемент;
Если ТипЗнч(Данные) <> Тип("ТаблицаЗначений") Или ТипЗнч(Временные) <> Тип("Структура")
Или Данные.Количество() <> 2 Или Данные.Колонки.Количество() <> 2
Или Данные.Колонки.Получить(0).Имя <> "Категория85"
Или Данные.Колонки.Получить(1).Имя <> "Сумма85" Тогда
ВызватьИсключение "Настоящая групповая таблица должна содержать две свои категории и два выражения";
КонецЕсли;
Категории = Новый Соответствие;
Всего = 0;
Для Каждого СтрокаГруппы Из Данные Цикл
Если ТипЗнч(СтрокаГруппы.Категория85) <> Тип("Строка") Или ТипЗнч(СтрокаГруппы.Сумма85) <> Тип("Число")
Или Категории.Получить(СтрокаГруппы.Категория85) <> Неопределено Тогда
ВызватьИсключение "Неизвестные типы или повторная категория групповой обработки";
КонецЕсли;
Если (СтрокаГруппы.Категория85 = "Офис" И СтрокаГруппы.Сумма85 = 750)
Или (СтрокаГруппы.Категория85 = "Чай" И СтрокаГруппы.Сумма85 = 300) Тогда
Категории.Вставить(СтрокаГруппы.Категория85, СтрокаГруппы.Сумма85);
Всего = Всего + СтрокаГруппы.Сумма85;
Иначе
ВызватьИсключение "Групповые значения не совпали с собственными BOOK/PAPER/TEA";
КонецЕсли;
КонецЦикла;
Если Категории.Количество() <> 2 Или Всего <> 1050 Тогда
ВызватьИсключение "Не получен полный собственный итог двух категорий";
КонецЕсли;
Если Временные.Свойство("OwnSKDInvoice27ab6906_Snapshot", Снимок) Тогда
Если ТипЗнч(Снимок) <> Тип("ФиксированнаяСтруктура") Или Снимок.Данные <> Данные
Или Снимок.Надбавка <> Надбавка Или Снимок.Офис <> Категории.Получить("Офис")
Или Снимок.Чай <> Категории.Получить("Чай") Или Снимок.Итог <> Всего Тогда
ВызватьИсключение "Чужое или изменённое временное состояние своей функции";
КонецЕсли;
Иначе
Снимок = Новый ФиксированнаяСтруктура(Новый Структура("Данные,Надбавка,Офис,Чай,Итог",
Данные, Надбавка, Категории.Получить("Офис"), Категории.Получить("Чай"), Всего));
Временные.Вставить("OwnSKDInvoice27ab6906_Snapshot", Снимок);
КонецЕсли;
Если Текущая = Неопределено Тогда
Возврат Всего * (100 + Надбавка) / 100;
КонецЕсли;
Если ТипЗнч(Текущая) <> Тип("СтрокаТаблицыЗначений") Или Данные.Индекс(Текущая) < 0
Или Категории.Получить(Текущая.Категория85) <> Текущая.Сумма85 Тогда
ВызватьИсключение "ТекущийЭлемент не является проверенной строкой настоящей групповой таблицы";
КонецЕсли;
Возврат Текущая.Сумма85 * (100 + Надбавка) / 100;
КонецФункцииСчетКонвейер85 — полный серверный конвейер и граф
Общие → Общие модули → СчетКонвейер85
Собственный серверный общий модуль .1343.
Процедура ПроверитьСтенд85() Экспорт
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnSKDInvoice\27ab6906-e418-43d5-9e74-5aedb8f7449f\IB"";" Тогда
ВызватьИсключение "Только новая собственная файловая учебная ИБ по точному пути";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Иная версия или собственная конфигурация";
КонецЕсли;
Если Метаданные.ОбщиеМодули.Количество() <> 3 Или Метаданные.ОбщиеФормы.Количество() <> 1
Или Метаданные.ОбщиеФормы.Найти("СчетСКД85") = Неопределено Тогда
ВызватьИсключение "Нужны только свои три общих модуля и одна общая форма";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("СчетГруппа85,СчетДиаграмма85,СчетКонвейер85", ",") Цикл
Модуль = Метаданные.ОбщиеМодули.Найти(Имя);
Если Модуль = Неопределено Тогда
ВызватьИсключение "Нет собственного полного общего модуля";
КонецЕсли;
Если Не Модуль.Сервер Или Модуль.Глобальный <> (Имя = "СчетГруппа85")
Или Модуль.КлиентУправляемоеПриложение Или Модуль.КлиентОбычноеПриложение
Или Модуль.ВнешнееСоединение Или Модуль.ВызовСервера Или Модуль.Привилегированный Тогда
ВызватьИсключение "Не совпали настоящие flags/server/global/без кэша";
КонецЕсли;
Если Не Модуль.Глобальный Тогда
Если Модуль.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Повторное использование доступно только своему неглобальному модулю; здесь оно выключено";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Прикладных данных и внешних источников в своём стенде не должно быть";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один настоящий собственный пользователь";
КонецЕсли;
Если Текущий.Имя <> "Счет85Ученик" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпал UUID реального пользователя ИБ";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Закройте Конфигуратор и остальные соединения своего стенда";
КонецЕсли;
Соединение = Соединения[0];
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Соединение.Пользователь = Неопределено Тогда
ВызватьИсключение "Не совпало настоящее собственное соединение";
КонецЕсли;
Если Соединение.Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Сеанс принадлежит другому пользователю";
КонецЕсли;
КонецПроцедуры
Функция ТекстИсточника85()
Возврат "ВЫБРАТЬ ""Офис"" КАК Категория85, ""BOOK"" КАК Код85, 2 КАК Количество85, 250 КАК Цена85, 500 КАК Сумма85
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Офис"", ""PAPER"", 5, 50, 250
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Чай"", ""TEA"", 3, 100, 300";
КонецФункции
Функция ПрочитатьИсточник85()
Запрос = Новый Запрос;
Запрос.Текст = ТекстИсточника85();
Источник = Запрос.Выполнить().Выгрузить();
Если ТипЗнч(Источник) <> Тип("ТаблицаЗначений") Или Источник.Количество() <> 3
Или Источник.Колонки.Количество() <> 5 Тогда
ВызватьИсключение "Литеральный native запрос не вернул три свои полные строки";
КонецЕсли;
Коды = Новый Соответствие;
Для Каждого Строка Из Источник Цикл
Если Коды.Получить(Строка.Код85) <> Неопределено Или Строка.Сумма85 <> Строка.Количество85 * Строка.Цена85 Тогда
ВызватьИсключение "Повтор товара или несогласованные исходные числовые ячейки";
КонецЕсли;
Если (Строка.Код85 = "BOOK" И Строка.Категория85 = "Офис" И Строка.Количество85 = 2 И Строка.Цена85 = 250 И Строка.Сумма85 = 500)
Или (Строка.Код85 = "PAPER" И Строка.Категория85 = "Офис" И Строка.Количество85 = 5 И Строка.Цена85 = 50 И Строка.Сумма85 = 250)
Или (Строка.Код85 = "TEA" И Строка.Категория85 = "Чай" И Строка.Количество85 = 3 И Строка.Цена85 = 100 И Строка.Сумма85 = 300) Тогда
Коды.Вставить(Строка.Код85, Истина);
Иначе
ВызватьИсключение "Изменена хотя бы одна собственная исходная ячейка";
КонецЕсли;
КонецЦикла;
Если Источник.Итог("Количество85") <> 10 Или Источник.Итог("Сумма85") <> 1050 Тогда
ВызватьИсключение "Не получен независимый native источник10/1050";
КонецЕсли;
Возврат Источник;
КонецФункции
Функция СоздатьСхему85(Источник)
Схема = Новый СхемаКомпоновкиДанных;
Локальный = Схема.ИсточникиДанных.Добавить();
Локальный.Имя = "СвойLocal85";
Локальный.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
ВызватьИсключение "Набор создан не нативной фабрикой своей схемы";
КонецЕсли;
Набор.Имя = "СвояКорзина85";
Набор.ИсточникДанных = Локальный.Имя;
Набор.Запрос = ТекстИсточника85();
Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
Для Каждого Колонка Из Источник.Колонки Цикл
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле.Поле = Колонка.Имя;
Поле.ПутьКДанным = Колонка.Имя;
Поле.Заголовок = Колонка.Имя;
Поле.ТипЗначения = Колонка.ТипЗначения;
Если Колонка.Имя = "Сумма85" Тогда
Поле.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=0;ЧГ=0;ЧН=0");
КонецЕсли;
КонецЦикла;
Параметр = Схема.Параметры.Добавить();
Параметр.Имя = "Надбавка85";
Параметр.ТипЗначения = Новый ОписаниеТипов("Число");
Параметр.Значение = 0;
Параметр.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;
Параметр.ВключатьВДоступныеПоля = Истина;
Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = "Сумма85";
Ресурс.Выражение = "СчетСНадбавкой85(ГрупповаяОбработка(""Категория85 КАК Категория85, Сумма(Сумма85) КАК Сумма85"", , ""СвоиКатегории85""), ПараметрыДанных.Надбавка85)";
Возврат Схема;
КонецФункции
Функция НастройкиСчета85(Схема, Надбавка)
Настройки = Новый НастройкиКомпоновкиДанных;
Если Настройки.ПараметрыДанных.ДоступныеПараметры <> Неопределено Тогда
ВызватьИсключение "Нельзя менять Parameter в связанной коллекции";
КонецЕсли;
Значение = Настройки.ПараметрыДанных.Элементы.Добавить();
Значение.Параметр = Новый ПараметрКомпоновкиДанных("Надбавка85");
Значение.Значение = Надбавка;
Значение.Использование = Истина;
Группа = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группа.Имя = "СвоиКатегории85";
Группа.Использование = Истина;
ПолеГруппы = Группа.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппы.Поле = Новый ПолеКомпоновкиДанных("Категория85");
ПолеГруппы.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеГруппы.Использование = Истина;
Для Каждого Имя Из СтрРазделить("Категория85,Сумма85", ",") Цикл
Выбор = Группа.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбор.Поле = Новый ПолеКомпоновкиДанных(Имя);
Выбор.Использование = Истина;
КонецЦикла;
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("РасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Конец);
Группа.ПараметрыВывода.УстановитьЗначениеПараметра("РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
Компоновщик.ЗагрузитьНастройки(Настройки);
Свои = Компоновщик.Настройки;
ФактическаяНадбавка = Свои.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Надбавка85"));
Если ФактическаяНадбавка = Неопределено Или Не ФактическаяНадбавка.Использование
Или ФактическаяНадбавка.Значение <> Надбавка Или Свои.Структура.Количество() <> 1 Тогда
ВызватьИсключение "Схема не связала собственные настоящие настройки";
КонецЕсли;
СвояГруппа = Свои.Структура.Получить(0);
Если ТипЗнч(СвояГруппа) <> Тип("ГруппировкаКомпоновкиДанных") Или СвояГруппа.Имя <> "СвоиКатегории85"
Или Не СвояГруппа.Использование Или СвояГруппа.ПоляГруппировки.Элементы.Количество() <> 1
Или СвояГруппа.Выбор.Элементы.Количество() <> 2 Тогда
ВызватьИсключение "Связанные настройки потеряли собственную группу и полный выбор";
КонецЕсли;
СвоеПоле = СвояГруппа.ПоляГруппировки.Элементы.Получить(0);
Если Строка(СвоеПоле.Поле) <> "Категория85" Или Не СвоеПоле.Использование
Или СвоеПоле.ТипГруппировки <> ТипГруппировкиКомпоновкиДанных.Элементы Тогда
ВызватьИсключение "Связанная группа не использует настоящую свою категорию";
КонецЕсли;
Возврат Свои;
КонецФункции
Процедура ПрочитатьИдентификаторыМакета85(Тело, Идентификаторы)
Для Каждого Часть Из Тело Цикл
Если ТипЗнч(Часть) <> Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Неизвестная часть собственного группового макета";
КонецЕсли;
Если ТипЗнч(Часть.Идентификатор) <> Тип("Строка") Тогда
ВызватьИсключение "Настоящий compiled идентификатор группировки не является строкой";
КонецЕсли;
Идентификаторы.Вставить(Часть.Идентификатор, Истина);
ПрочитатьИдентификаторыМакета85(Часть.Тело, Идентификаторы);
КонецЦикла;
КонецПроцедуры
Функция СвойУзел85(Элементы, Узел)
Если ТипЗнч(Узел) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка")
И ТипЗнч(Узел) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
ВызватьИсключение "Неизвестный тип реально созданного элемента расшифровки";
КонецЕсли;
Индекс = Элементы.Индекс(Узел);
Если Индекс < 0 Или Индекс >= Элементы.Количество() Тогда
ВызватьИсключение "Элемент принадлежит другому экземпляру расшифровки";
КонецЕсли;
Если Элементы[Индекс] <> Узел Тогда
ВызватьИсключение "Не подтверждено совпадение actual collection/index/item";
КонецЕсли;
Возврат Индекс;
КонецФункции
Процедура ПроверитьГраф85(Элементы, Узел, Состояния, Идентификаторы)
Индекс = СвойУзел85(Элементы, Узел);
Если Состояния.Получить(Индекс) = 1 Тогда
ВызватьИсключение "Обнаружен цикл родителей собственной расшифровки";
ИначеЕсли Состояния.Получить(Индекс) = 2 Тогда
Возврат;
КонецЕсли;
Состояния.Вставить(Индекс, 1);
Если ТипЗнч(Узел) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
ГрупповойУзел = Узел;
Если ТипЗнч(ГрупповойУзел.Группировка) <> Тип("Строка")
Или Идентификаторы.Получить(ГрупповойУзел.Группировка) <> Истина
Или ТипЗнч(ГрупповойУзел.Идентификатор) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
ВызватьИсключение "Группировка не принадлежит фактическому собственному макету";
КонецЕсли;
Если Элементы[ГрупповойУзел.Идентификатор] <> ГрупповойУзел Тогда
ВызватьИсключение "Native ID группировки не разрешился в тот же свой узел";
КонецЕсли;
Родители = ГрупповойУзел.ПолучитьРодителей();
Иначе
ПолевойУзел = Узел;
Родители = ПолевойУзел.ПолучитьРодителей();
КонецЕсли;
Если ТипЗнч(Родители) <> Тип("Массив") Или Родители.Количество() > Элементы.Количество() Тогда
ВызватьИсключение "Native родители имеют неизвестный тип или необоснованное число";
КонецЕсли;
Для Каждого Родитель Из Родители Цикл
Если ТипЗнч(Родитель) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
НастоящийРодитель = Элементы[Родитель];
ИначеЕсли ТипЗнч(Родитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка")
Или ТипЗнч(Родитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
НастоящийРодитель = Родитель;
Иначе
ВызватьИсключение "Документация не определяет типы содержимого массива; неизвестный родитель отклонён";
КонецЕсли;
ПроверитьГраф85(Элементы, НастоящийРодитель, Состояния, Идентификаторы);
КонецЦикла;
Состояния.Вставить(Индекс, 2);
КонецПроцедуры
Функция ПрочитатьРасшифровку85(Расшифровка, Макет)
Если ТипЗнч(Расшифровка) <> Тип("ДанныеРасшифровкиКомпоновкиДанных") Тогда
ВызватьИсключение "Нет собственного настоящего экземпляра расшифровки";
КонецЕсли;
Элементы = Расшифровка.Элементы;
Если ТипЗнч(Элементы) <> Тип("ЭлементыРасшифровкиКомпоновкиДанных")
Или Элементы.Количество() = 0 Или Элементы.Количество() > 100 Тогда
ВызватьИсключение "Процессор не наполнил ограниченную собственную расшифровку";
КонецЕсли;
Идентификаторы = Новый Соответствие;
ПрочитатьИдентификаторыМакета85(Макет.Тело, Идентификаторы);
Состояния = Новый Соответствие;
Категории = Новый Соответствие;
Групп = 0;
Полей = 0;
Для Каждого Узел Из Элементы Цикл
ПроверитьГраф85(Элементы, Узел, Состояния, Идентификаторы);
Если ТипЗнч(Узел) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
Групп = Групп + 1;
Иначе
Полей = Полей + 1;
ПолевойУзел = Узел;
ЗначенияПолей = ПолевойУзел.ПолучитьПоля();
Если ТипЗнч(ЗначенияПолей) <> Тип("ЗначенияПолейРасшифровкиКомпоновкиДанных") Тогда
ВызватьИсключение "Нет настоящих значений полей расшифровки";
КонецЕсли;
Категория = ЗначенияПолей.Найти("Категория85");
Если Категория <> Неопределено Тогда
Если ТипЗнч(Категория) <> Тип("ЗначениеПоляРасшифровкиКомпоновкиДанных") Или Категория.Поле <> "Категория85" Тогда
ВызватьИсключение "Не совпало реальное поле категории";
КонецЕсли;
Если Категория.Значение = "Офис" Или Категория.Значение = "Чай" Тогда
Категории.Вставить(Категория.Значение, Истина);
ИначеЕсли ТипЗнч(Категория.Значение) <> Тип("Null") Тогда
ВызватьИсключение "Чужая категория в собственном native графе";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Групп = 0 Или Полей = 0 Или Категории.Количество() <> 2
Или Состояния.Количество() <> Элементы.Количество() Тогда
ВызватьИсключение "Не прочитан полный native граф и обе собственные категории";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура(Новый Структура("Узлов,Групп,Полей", Элементы.Количество(), Групп, Полей));
КонецФункции
Функция ПрочитатьРезультат85(Документ, Надбавка)
Если ТипЗнч(Документ) <> Тип("ТабличныйДокумент") Или Документ.ВысотаТаблицы = 0
Или Документ.ВысотаТаблицы > 40 Или Документ.ШиринаТаблицы > 12 Тогда
ВызватьИсключение "Неожиданный native табличный результат";
КонецЕсли;
КолКатегории = 0;
КолСуммы = 0;
Для Стр = 1 По Документ.ВысотаТаблицы Цикл
Для Кол = 1 По Документ.ШиринаТаблицы Цикл
Текст = СокрЛП(Документ.Область(Стр, Кол).Текст);
Если Текст = "Категория85" Тогда
Если КолКатегории <> 0 Тогда
ВызватьИсключение "Повторный заголовок категории";
КонецЕсли;
КолКатегории = Кол;
ИначеЕсли Текст = "Сумма85" Тогда
Если КолСуммы <> 0 Тогда
ВызватьИсключение "Повторный заголовок суммы";
КонецЕсли;
КолСуммы = Кол;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если КолКатегории = 0 Или КолСуммы <= КолКатегории Тогда
ВызватьИсключение "Не найдены реальные собственные заголовки; координаты не угадываем";
КонецЕсли;
Категории = Новый Соответствие;
Всего = 0;
ОбщихИтогов = 0;
Для Стр = 1 По Документ.ВысотаТаблицы Цикл
Для Кол = 1 По Документ.ШиринаТаблицы Цикл
Если Кол <> КолКатегории И Кол <> КолСуммы Тогда
ДругаяЯчейка = Документ.Область(Стр, Кол);
Если СокрЛП(ДругаяЯчейка.Текст) <> "" Тогда
ВызватьИсключение "Неожиданные данные вне двух собственных native колонок";
КонецЕсли;
Если ДругаяЯчейка.СодержитЗначение Тогда
Если ДругаяЯчейка.Значение <> Неопределено И ТипЗнч(ДругаяЯчейка.Значение) <> Тип("Null") Тогда
ВызватьИсключение "Скрытое native значение вне полного собственного вывода";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Категория = СокрЛП(Документ.Область(Стр, КолКатегории).Текст);
Ячейка = Документ.Область(Стр, КолСуммы);
Если СокрЛП(Ячейка.Текст) = "" Или СокрЛП(Ячейка.Текст) = "Сумма85" Тогда
Продолжить;
КонецЕсли;
Если Ячейка.СодержитЗначение Тогда
Сумма = Ячейка.Значение;
Иначе
Сумма = Число(Ячейка.Текст);
КонецЕсли;
Если ТипЗнч(Сумма) <> Тип("Число") Тогда
ВызватьИсключение "Native ресурс не является числом";
КонецЕсли;
Если Категория = "Офис" Или Категория = "Чай" Тогда
Если Категории.Получить(Категория) <> Неопределено
Или Сумма <> ?(Категория = "Офис", 750, 300) * (100 + Надбавка) / 100 Тогда
ВызватьИсключение "Лишняя категория или неверный actual ресурс с надбавкой";
КонецЕсли;
Категории.Вставить(Категория, Сумма);
Всего = Всего + Сумма;
Иначе
Если Сумма <> 1050 * (100 + Надбавка) / 100 Тогда
ВызватьИсключение "Посторонняя numeric строка вместо собственного общего итога";
КонецЕсли;
ОбщихИтогов = ОбщихИтогов + 1;
КонецЕсли;
КонецЦикла;
Если Категории.Количество() <> 2 Или ОбщихИтогов <> 1 Или Всего <> 1050 * (100 + Надбавка) / 100 Тогда
ВызватьИсключение "Не прочитаны две native категории и ровно один настоящий общий итог";
КонецЕсли;
Возврат Всего;
КонецФункции
Функция Сформировать85() Экспорт
ПроверитьСтенд85();
Источник = ПрочитатьИсточник85();
Схема = СоздатьСхему85(Источник);
Профиль = СчетДиаграмма85.ПроверитьПараметры85(Схема);
Протокол = "Source: BOOK500/PAPER250/TEA300, qty10, total1050";
Для Шаг = 0 По 2 Цикл
Надбавка = ?(Шаг = 1, 20, 0);
Настройки = НастройкиСчета85(Схема, Надбавка);
Расшифровка = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки, Расшифровка);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет, , Расшифровка, Истина);
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Документ = Новый ТабличныйДокумент;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьДокумент(Документ);
Результат = Вывод.Вывести(Процессор, Ложь);
Если Результат <> Документ Тогда
ВызватьИсключение "Native вывод не вернул собственный документ-приёмник";
КонецЕсли;
ФактическийИтог = ПрочитатьРезультат85(Результат, Надбавка);
Граф = ПрочитатьРасшифровку85(Расшифровка, Макет);
После = ПрочитатьИсточник85();
Если После.Итог("Количество85") <> Источник.Итог("Количество85")
Или После.Итог("Сумма85") <> Источник.Итог("Сумма85") Тогда
ВызватьИсключение "Источник изменился после native вывода";
КонецЕсли;
Протокол = Протокол + Символы.ПС + "Надбавка=" + Формат(Надбавка, "ЧГ=0;ЧДЦ=0;ЧН=0")
+ "; nativeTotal=" + Формат(ФактическийИтог, "ЧГ=0;ЧДЦ=0;ЧН=0")
+ "; actualDetails=" + Формат(Граф.Узлов, "ЧГ=0;ЧДЦ=0;ЧН=0");
Если Шаг = 0 Тогда
До = Результат;
ИначеЕсли Шаг = 1 Тогда
СНадбавкой = Результат;
Иначе
Восстановлено = Результат;
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура(Новый Структура("До,СНадбавкой,Восстановлено,Протокол",
До, СНадбавкой, Восстановлено, Протокол + Символы.ПС + Профиль));
КонецФункцииПолный модуль собственной управляемой формы
Общие → Общие формы → СчетСКД85 → Модуль
Собственная управляемая форма: Windows толстый managed client и server.
&НаКлиенте
Процедура Сформировать85(Команда)
Если Остановка85 Или Завершено85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Этот экземпляр завершён или остановлен; повторный запуск запрещён";
КонецЕсли;
Попытка
СформироватьНаСервере85();
Исключение
Остановка85 = Истина;
Статус85 = "Остановлено: " + ОписаниеОшибки();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере85()
Если Остановка85 Или Завершено85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Нельзя продолжить частично выполненный собственный процесс";
КонецЕсли;
Попытка
СчетКонвейер85.ПроверитьСтенд85();
Результат = СчетКонвейер85.Сформировать85();
До85 = Результат.До;
После85 = Результат.СНадбавкой;
Вернули85 = Результат.Восстановлено;
Статус85 = Результат.Протокол;
Завершено85 = Истина;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПолный модуль своего управляемого приложения
Своя конфигурация → Модуль управляемого приложения
Windows толстый managed client .1343, native OnStart0; thin/web ветка отказа.
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Процедура ПриНачалеРаботыСистемы()
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnSKDInvoice\27ab6906-e418-43d5-9e74-5aedb8f7449f\IB"";" Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Модуль приложения предназначен только своему exact FileCF";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.СчетСКД85");
КонецПроцедуры
#Иначе
Процедура ПриНачалеРаботыСистемы()
ВызватьИсключение "Этот собственный урок запускается только толстым управляемым клиентом1cv8.exe";
КонецПроцедуры
#КонецЕслиРазбор по шагам
Полный конвейер создаёт свою схему и вызывает экспорт этого серверного модуля локально на сервере.
Native Structure.Add(Type) и Points.Add() создают реальные Chart/ChartGroup; LoadSettings связывает настоящие доступные параметры.
Получите actual Заголовок и КоличествоЗаписей, membership в Элементы и owner/child/nativeID.
Измените свой заголовок/лимит, перечитайте именно те же значения и identity; чужойowner откажется доlookup.
Верните только подтверждённый собственный промежуточный профиль; после частичного отказа не запускайте повтор.
Как проверить результат
Будущий ручной результат: BOOK500/PAPER250/TEA300, qty10; nativeОфис750→900→750 и Чай300→360→300; nativeобщийитог1050→1260→1050.
Профиль диаграммы: Заголовок Корзина1050→Предпросмотр1260→Корзина1050, nativeКоличествоЗаписей2→1→2; realowner/child/ID остаются теми же.
ActualDetails содержит и групповые, и полевые узлы, обе категории; все узлы принадлежат тому же экземпляру, родительский граф конечен.
Измените только в своём учебном исходнике товар/категорию/сумму/путь/надбавку/owner descriptor: ожидается отказ, не исправление чужого состояния.
Неизвестный native layout/NULL/тип родителей/пустая расшифровка — честный fail-stop. Статический PASS не доказывает успешный1С-runtime.
Ожидаемый результат
Ожидаемый будущий результат: собственный native счёт1050→1260→1050, guarded параметры диаграммы и прочитанный реальный граф расшифровки. RuntimeVerified=False; фактических1С/БД/UI/network/print/backup операций0.
На что обратить внимание
У groupData/Chart/ChartGroup/DetailsItem нет выдуманных конструкторов. Реальные фабрики и typedproperties перечислены в подготовке.
GroupData.Data — значения группировок, не detailRows. Native CurrentItem может быть Undefined; это не ошибка само по себе.
Родительский массив не имеет документированного типа элементов: actual nativeID/item различаются проверкой, неизвестные значения не подставляются.
Получить2894 с конфликтующим zero-argument syntax и ОсновноеДействие8969 без declaredtype исключены полностью.
GetID/GetObject описывают локальный owner; foreignID не обязан быть глобально уникальным или возвращатьUndefined у другого владельца.
Параметры диаграммы — настройки, не доказательство пикселей/доставки UI. Здесь она отдельно не выводится; числовые доказательства дают собственный native табличный вывод.
Readback/restore только своего полного knownstate, не атомарность и не retry. Group/Details/parameter objects не передаются черезRPC.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.