Инициализирует обработку расшифровки данными расшифровки и источником доступных настроек.
Синтаксис
Новый ОбработкаРасшифровкиКомпоновкиДанных(<ДанныеРасшифровки>, <ИсточникДоступныхНастроек>)Полное описание, параметры и ограничения
ОбработкаРасшифровкиКомпоновкиДанных.На основании данных расшифровки и источника доступных настроек
ОбработкаРасшифровкиКомпоновкиДанных (DataCompositionDetailsProcess)
На основании данных расшифровки и источника доступных настроек
Доступен, начиная с версии 8.1.
Синтаксис:
Новый ОбработкаРасшифровкиКомпоновкиДанных(<ДанныеРасшифровки>, <ИсточникДоступныхНастроек>)
Параметры:
<ДанныеРасшифровки> (обязательный)
Тип: ДанныеРасшифровкиКомпоновкиДанных.
Предоставляет исходные данные для обработки.
<ИсточникДоступныхНастроек> (обязательный)
Тип: ИсточникДоступныхНастроекКомпоновкиДанных.
Предоставляет источник доступных настроек.
Описание:
Инициализирует обработку расшифровки данными расшифровки и источником доступных настроек.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Настоящая расшифровка СКД: фильтр, детализация, группировка, порядок и собственная карточка
Полный собственный thick-managed маршрут получает реальные ID из табличного вывода native процессора, применяет возвращённые настройки и проверяет реальные числовые ячейки. Без выдуманных ID и без структуры расшифровки старого ПостроительОтчета.
Где и как запускать
Полный модуль управляемой формы своей обработки УчебнаяРасшифровкаСКД85. Только ТолстыйКлиентУправляемоеПриложение 8.5.1.1343; все native схемы, источники и данные client-side, реальный managed raw event и отдельная Асинх команда.
Подготовка
Вручную создайте отдельную новую пустую файловую базу платформы 8.5.1.1343. Имя конфигурации=УчебнаяРасшифровкаСКД85, основное приложение=Управляемое, совместимость без старого ограничения 8.3.9 и ниже, модальность собственного desktop клиента разрешена. Этот урок запускается ТОЛЬКО толстым управляемым клиентом: серверные native типы схемы/данных непосредственно доступны там, но не в тонком клиенте.
Создайте ровно один собственный неиерархический справочник МоиКарточки85: Код Строка длина 8, контроль уникальности кода включён, автоматическая нумерация отключена, Наименование Строка длина 40. Без дополнительных реквизитов, табличных частей, владельцев, подписок, обменов, фоновых заданий, рабочих метаданных и расширений.
До включения запрета записи вручную в собственной новой базе создайте две реальные карточки: Код У85А, Наименование Моя карточка А85; Код У85Б, Наименование Моя карточка Б85. Больше записей и пометок удаления нет. Это ручная учебная подготовка, агент не создавал базу, карточки и не выполнял запись 1С.
Затем вставьте supporting-модуль ПередЗаписью/ПередУдалением в МоиКарточки85 → Модуль объекта и обновите только свой стенд. Создайте у справочника управляемую основную форму элемента ФормаЭлемента, назначьте её основной формой элемента и вставьте supporting-модуль ПриОткрытии. Теперь объектная запись/удаление запрещены, а native открытие собственной ссылки покажет только просмотр. Не подключайте этот код к рабочему справочнику.
Создайте свою обработку УчебнаяРасшифровкаСКД85 с управляемой Основной формой. Реквизиты: Документ85 ТабличныйДокумент, Состояние85 Строка неограниченной длины. Поле табличного документа Отчет85 связано с Документ85; Состояние85 покажите отдельным полем только просмотра. Код целиком вставьте в модуль формы. ПриОткрытии назначьте процедуре ПриОткрытии(Отказ). Событие Отчет85.ОбработкаРасшифровки свяжите с Отчет85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры): Element формы плюс три native параметра, не обычная двухаргументная сигнатура.
Создайте десять команд формы и кнопки: ВосстановитьСвойОтчет85, ОтфильтроватьСвоюКатегорию85, РасшифроватьСвоюГруппу85, СгруппироватьСвоиКарточки85, УпорядочитьСвоиСтроки85, ОткрытьСвоюКарточку85, ПрименитьСвойЗаголовок85, ВыбратьСвоёДействие85, ВыбратьСвоёДействиеАсинх85, ВыполнитьСвоёМеню85. Свяжите действия с одноимёнными процедурами; async кнопка должна вызывать настоящую Асинх процедуру с Ждать, не имитированное оповещение.
При открытии код только читает две уже подготовленные собственные записи и берёт настоящие ссылки. Схема/query полностью свои: Альфа85=1/100 и Гамма85=3/600 категории А85, Бета85=5/1250 категории Б85; карточки передаются параметрами схемы. Это не запрос бизнес-остатков и не загрузка чужого сохранённого варианта.
#Если ТолстыйКлиентУправляемоеПриложение Тогда
&НаКлиенте
Перем СвояСхема85, СвойИсточник85, СвоиДанные85, СвоиНастройки85, СвойID85, СвояКарточкаА85, СвояКарточкаБ85, Ревизия85, МенюОжидается85;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПроверитьСвойПустойСтенд();
Проверка = Новый Запрос("ВЫБРАТЬ Ссылка, Код, Наименование, ПометкаУдаления ИЗ Справочник.МоиКарточки85");
Карточки = Проверка.Выполнить().Выгрузить();
Если Карточки.Количество() <> 2 Тогда
ВызватьИсключение "Нужны ровно две заранее вручную подготовленные собственные карточки";
КонецЕсли;
А = Карточки.Найти("У85А", "Код");
Б = Карточки.Найти("У85Б", "Код");
Если А = Неопределено Или Б = Неопределено Тогда
ВызватьИсключение "Не найдены оба точных собственных кода У85А/У85Б";
КонецЕсли;
Если А.Наименование <> "Моя карточка А85" Или Б.Наименование <> "Моя карточка Б85"
Или А.ПометкаУдаления Или Б.ПометкаУдаления Тогда
ВызватьИсключение "Подготовленные собственные карточки не совпали с учебным fixture";
КонецЕсли;
СвояКарточкаА85 = А.Ссылка;
СвояКарточкаБ85 = Б.Ссылка;
Если Не ЗначениеЗаполнено(СвояКарточкаА85) Или Не ЗначениеЗаполнено(СвояКарточкаБ85)
Или СвояКарточкаА85 = СвояКарточкаБ85 Тогда
ВызватьИсключение "Нужны две разные настоящие собственные ссылки, не пустые или выдуманные UUID";
КонецЕсли;
СвояСхема85 = СоздатьСвоюСхему85();
СвойИсточник85 = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СвояСхема85);
Ревизия85 = 0;
МенюОжидается85 = Ложь;
ВосстановитьСвойОтчет85(Неопределено);
КонецПроцедуры
&НаКлиенте
Функция СоздатьСвоюСхему85()
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "СвойLocal85";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "СвоиТриСтроки85";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
Набор.Запрос = "ВЫБРАТЬ ""А85"" КАК Категория, &КарточкаА85 КАК Карточка, ""Альфа85"" КАК Наименование, 1 КАК Количество, 100 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""А85"", &КарточкаА85, ""Гамма85"", 3, 600
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Б85"", &КарточкаБ85, ""Бета85"", 5, 1250";
Для Каждого ИмяПоля Из СтрРазделить("Категория,Карточка,Наименование,Количество,Сумма", ",") Цикл
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле.Поле = ИмяПоля;
Поле.ПутьКДанным = ИмяПоля;
Поле.Заголовок = ИмяПоля + "85";
Если ИмяПоля = "Карточка" Тогда
Поле.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.МоиКарточки85");
ИначеЕсли ИмяПоля = "Количество" Или ИмяПоля = "Сумма" Тогда
Поле.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0));
Поле.Оформление.УстановитьЗначениеПараметра("Формат", "ЧГ=0;ЧДЦ=0");
Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = ИмяПоля;
Ресурс.Выражение = "Сумма(" + ИмяПоля + ")";
Иначе
Поле.ТипЗначения = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(32));
КонецЕсли;
Выбранное = Схема.НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Для Каждого ИмяПараметра Из СтрРазделить("КарточкаА85,КарточкаБ85", ",") Цикл
Параметр = Схема.Параметры.Добавить();
Параметр.Имя = ИмяПараметра;
Параметр.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.МоиКарточки85");
Параметр.Значение = ?(ИмяПараметра = "КарточкаА85", СвояКарточкаА85, СвояКарточкаБ85);
КонецЦикла;
Группа = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группа.Имя = "СвоиКатегории85";
Группа.Использование = Истина;
ПолеГруппы = Группа.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппы.Поле = Новый ПолеКомпоновкиДанных("Категория");
ПолеГруппы.Использование = Истина;
Детали = Группа.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
Возврат Схема;
КонецФункции
&НаКлиенте
Процедура ВосстановитьСвойОтчет85(Команда)
ПроверитьГотовностьСвоейФормы85();
Редактор = Новый КомпоновщикНастроекКомпоновкиДанных;
Редактор.Инициализировать(СвойИсточник85);
Редактор.ЗагрузитьНастройки(СвояСхема85.НастройкиПоУмолчанию);
Настройки = Редактор.ПолучитьНастройки();
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КарточкаА85", СвояКарточкаА85);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КарточкаБ85", СвояКарточкаБ85);
ПринятьСвойРезультат85(Настройки, "Все", "Начальный собственный отчёт");
КонецПроцедуры
&НаКлиенте
Процедура Отчет85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
СтандартнаяОбработка = Ложь;
ПроверитьСвойПустойСтенд();
Если Элемент <> Элементы.Отчет85 Или МенюОжидается85 Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
Состояние85 = "В этой ячейке нет настоящего ID СКД; выбор не заменён.";
Возврат;
КонецЕсли;
ЭлементДанных = СвоиДанные85.Элементы[Расшифровка];
Если ЭлементДанных.Идентификатор <> Расшифровка Тогда
ВызватьИсключение "ID не относится к текущему собственному отчёту";
КонецЕсли;
СвойID85 = Расшифровка;
Состояние85 = "Сохранён настоящий native ID своей ячейки. Теперь выберите одно действие кнопкой; после перестройки снова щёлкните настоящую ячейку.";
КонецПроцедуры
&НаКлиенте
Функция СоздатьСвоюОбработку85()
ПроверитьГотовностьСвоейФормы85();
Если СвойID85 = Неопределено Тогда
ВызватьИсключение "Сначала двойным щелчком выберите actual ячейку своего отчёта";
КонецЕсли;
ЭлементДанных = СвоиДанные85.Элементы[СвойID85];
Если ЭлементДанных.Идентификатор <> СвойID85 Тогда
ВызватьИсключение "Старый или посторонний ID не подходит текущим данным";
КонецЕсли;
КопияДанных = ПрочитатьСвойXML85(ЗаписатьСвойXML85(СвоиДанные85), Тип("ДанныеРасшифровкиКомпоновкиДанных"));
Если КопияДанных.Элементы[СвойID85].Идентификатор <> СвойID85 Тогда
ВызватьИсключение "Native ID не прошёл XML roundtrip своих данных";
КонецЕсли;
Возврат Новый ОбработкаРасшифровкиКомпоновкиДанных(КопияДанных, СвойИсточник85);
КонецФункции
&НаКлиенте
Процедура ОтфильтроватьСвоюКатегорию85(Команда)
Обработка = СоздатьСвоюОбработку85();
Категория = ПолучитьСвоёПоле85("Категория");
Если Категория <> "А85" И Категория <> "Б85" Тогда
ВызватьИсключение "Выберите actual ячейку с собственной категорией, не заголовок";
КонецЕсли;
Настройки = Обработка.Отфильтровать(СвойID85, Новый ПолеКомпоновкиДанных("Категория"));
ПринятьСвойРезультат85(Настройки, Категория, "Native Отфильтровать категорию");
КонецПроцедуры
&НаКлиенте
Процедура РасшифроватьСвоюГруппу85(Команда)
Обработка = СоздатьСвоюОбработку85();
Если ПолучитьСвоёПоле85("Категория") = Неопределено Тогда
ВызватьИсключение "Выберите ресурс количества своей группы категории, не заголовок";
КонецЕсли;
Настройки = Обработка.Расшифровать(СвойID85, Новый ПолеКомпоновкиДанных("Наименование"));
ПроверитьРеальноеИзменениеНастроек85(Настройки);
ПринятьСвойРезультат85(Настройки, "Подмножество", "Native Расшифровать по Наименованию");
КонецПроцедуры
&НаКлиенте
Процедура СгруппироватьСвоиКарточки85(Команда)
Обработка = СоздатьСвоюОбработку85();
Настройки = Обработка.Сгруппировать(СвойID85, Новый ПолеКомпоновкиДанных("Карточка"));
ПроверитьРеальноеИзменениеНастроек85(Настройки);
ПринятьСвойРезультат85(Настройки, "Группы", "Native Сгруппировать по своим карточкам");
КонецПроцедуры
&НаКлиенте
Процедура УпорядочитьСвоиСтроки85(Команда)
Обработка = СоздатьСвоюОбработку85();
ЭлементДанных = СвоиДанные85.Элементы[СвойID85];
Если ТипЗнч(ЭлементДанных) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
ВызватьИсключение "Для сортировки выберите actual заголовок Наименование85";
КонецЕсли;
Если ЭлементДанных.ОсновноеДействие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить Тогда
ВызватьИсключение "Native контекст не предлагает упорядочивание: выберите заголовок поля";
КонецЕсли;
Настройки = Обработка.Упорядочить(СвойID85, Новый ПолеКомпоновкиДанных("Наименование"));
ПроверитьРеальноеИзменениеНастроек85(Настройки);
ПринятьСвойРезультат85(Настройки, "Все", "Native Упорядочить по Наименованию");
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьСвоюКарточку85(Команда)
Обработка = СоздатьСвоюОбработку85();
Карточка = ПолучитьСвоёПоле85("Карточка");
Если Карточка <> СвояКарточкаА85 И Карточка <> СвояКарточкаБ85 Тогда
ВызватьИсключение "Открыть можно только одну из двух actual собственных карточек";
КонецЕсли;
Обработка.ОткрытьЗначение(СвойID85, Новый ПолеКомпоновкиДанных("Карточка"));
Состояние85 = "Native ОткрытьЗначение вызван для проверенной собственной ссылки. Форму и запрет записи проверьте вручную; метод не возвращает доказательство открытия.";
КонецПроцедуры
&НаКлиенте
Процедура ПрименитьСвойЗаголовок85(Команда)
Обработка = СоздатьСвоюОбработку85();
РедакторИзменений = Новый КомпоновщикНастроекКомпоновкиДанных;
РедакторИзменений.Инициализировать(СвойИсточник85);
РедакторИзменений.ЗагрузитьНастройки(Новый НастройкиКомпоновкиДанных);
Изменения = РедакторИзменений.Настройки;
Если Изменения.ПользовательскиеПоля.Элементы.Количество() <> 0 Или Изменения.Структура.Количество() <> 0 Тогда
ВызватьИсключение "Для своего delta разрешены ноль группировок и ноль пользовательских полей";
КонецЕсли;
Изменения.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", "Мой заголовок расшифровки85");
Настройки = Обработка.ПрименитьНастройки(СвойID85, Изменения);
ПринятьСвойРезультат85(Настройки, "Заголовок", "Native ПрименитьНастройки: только свой заголовок");
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьРеальноеИзменениеНастроек85(Настройки)
Если ТипЗнч(Настройки) <> Тип("НастройкиКомпоновкиДанных") Тогда
ВызватьИсключение "Native действие должно вернуть полный вариант своего урока";
КонецЕсли;
Если ЗаписатьСвойXML85(Настройки) = ЗаписатьСвойXML85(СвоиНастройки85) Тогда
ВызватьИсключение "Native действие не изменило вариант; вернитесь к исходному отчёту и выберите правильный actual контекст";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СвоиДоступныеДействия85()
Действия = Новый Массив;
Действия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать);
Действия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Сгруппировать);
Возврат Действия;
КонецФункции
&НаКлиенте
Процедура ВыбратьСвоёДействие85(Команда)
Обработка = СоздатьСвоюОбработку85();
ДоМеню = ПолучитьСвойСнимок85();
Действие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет;
Параметр = Неопределено;
Отказ = Новый СписокЗначений;
Отказ.Добавить("МойОтказ85", "Не менять свой отчёт85");
Обработка.ВыбратьДействие(СвойID85, Действие, Параметр, СвоиДоступныеДействия85(), Отказ, Ложь, Элементы.Отчет85);
ПрименитьСвойВыбор85(Обработка, СвойID85, Действие, Параметр);
Если Ревизия85 = ДоМеню.Ревизия Тогда
ПроверитьСвойСнимок85(ДоМеню);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Асинх Процедура ВыбратьСвоёДействиеАсинх85(Команда)
Обработка = СоздатьСвоюОбработку85();
ДоМеню = ПолучитьСвойСнимок85();
ЗахваченныйID = СвойID85;
ЗахваченнаяРевизия = Ревизия85;
МенюОжидается85 = Истина;
Отказ = Новый СписокЗначений;
Отказ.Добавить("МойОтказ85", "Не менять свой отчёт85");
Попытка
Выбор = Ждать Обработка.ВыбратьДействиеАсинх(ЗахваченныйID, СвоиДоступныеДействия85(), Отказ, Ложь, Элементы.Отчет85);
Исключение
МенюОжидается85 = Ложь;
ВызватьИсключение;
КонецПопытки;
МенюОжидается85 = Ложь;
Если Ревизия85 <> ЗахваченнаяРевизия Или СвойID85 <> ЗахваченныйID Тогда
ВызватьИсключение "Старое async меню нельзя применять к перестроенному или другому своему отчёту";
КонецЕсли;
Если ТипЗнч(Выбор) <> Тип("РезультатВыбораДействияРасшифровкиКомпоновкиДанных") Тогда
ВызватьИсключение "Обещание должно вернуть настоящий native объект результата выбора";
КонецЕсли;
ПрименитьСвойВыбор85(Обработка, ЗахваченныйID, Выбор.ВыбранноеДействие, Выбор.ПараметрВыбранногоДействия);
Если Ревизия85 = ДоМеню.Ревизия Тогда
ПроверитьСвойСнимок85(ДоМеню);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьСвоёМеню85(Команда)
Обработка = СоздатьСвоюОбработку85();
ДоМеню = ПолучитьСвойСнимок85();
Действие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет;
Отказ = Новый СписокЗначений;
Отказ.Добавить("МойОтказ85", "Не менять свой отчёт85");
Настройки = Обработка.Выполнить(СвойID85, Действие, СвоиДоступныеДействия85(), Отказ);
Если Настройки = Неопределено Тогда
ПроверитьСвойСнимок85(ДоМеню);
Состояние85 = "Native Выполнить не вернул изменённых настроек. Прежний отчёт сохранён; это не доказательство выбранного действия.";
Возврат;
КонецЕсли;
Если Действие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать
И Действие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Сгруппировать Тогда
ВызватьИсключение "Получены настройки, но actual выполненное действие не входит в два разрешённых";
КонецЕсли;
ПринятьСвойРезультат85(Настройки, "Подмножество", "Native Выполнить: полученные настройки реально перекомпонованы");
КонецПроцедуры
&НаКлиенте
Процедура ПрименитьСвойВыбор85(Обработка, Идентификатор, Действие, Параметр)
Если Действие = Неопределено Или Действие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет Или Действие = "МойОтказ85" Тогда
Состояние85 = "Native меню: действия нет либо выбран свой отказ. Настройки, ID и документ не изменены.";
Возврат;
КонецЕсли;
Если Действие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать
И Действие <> ДействиеОбработкиРасшифровкиКомпоновкиДанных.Сгруппировать Тогда
ВызватьИсключение "Native меню вернуло действие вне двух разрешённых собственных действий";
КонецЕсли;
Если ТипЗнч(Параметр) <> Тип("НастройкиКомпоновкиДанных") Тогда
ВызватьИсключение "Для разрешённого native действия нужен настоящий delta объект настроек";
КонецЕсли;
Настройки = Обработка.ПрименитьНастройки(Идентификатор, Параметр);
Режим = ?(Действие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Сгруппировать, "Группы", "Подмножество");
ПринятьСвойРезультат85(Настройки, Режим, "Native выбранное действие применено к своему actual ID");
КонецПроцедуры
&НаКлиенте
Функция ПолучитьСвоёПоле85(ИмяПоля)
Стек = Новый Массив;
Стек.Добавить(СвоиДанные85.Элементы[СвойID85]);
Посещенные = Новый Массив;
Пока Стек.Количество() > 0 Цикл
ЭлементДанных = Стек[Стек.Количество() - 1];
Стек.Удалить(Стек.Количество() - 1);
Если Посещенные.Найти(ЭлементДанных.Идентификатор) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Посещенные.Добавить(ЭлементДанных.Идентификатор);
Если Посещенные.Количество() > СвоиДанные85.Элементы.Количество() Тогда
ВызватьИсключение "Native граф родительских элементов должен принадлежать своему конечному набору";
КонецЕсли;
Если ТипЗнч(ЭлементДанных) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Для Каждого Поле Из ЭлементДанных.ПолучитьПоля() Цикл
Если Поле.Поле = ИмяПоля Тогда
Возврат Поле.Значение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для Каждого Родитель Из ЭлементДанных.ПолучитьРодителей() Цикл
Если ТипЗнч(Родитель) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля")
И ТипЗнч(Родитель) <> Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
ВызватьИсключение "Нужен actual native родительский элемент, не выдуманный индекс";
КонецЕсли;
Если СвоиДанные85.Элементы[Родитель.Идентификатор] <> Родитель Тогда
ВызватьИсключение "Родитель не принадлежит своим данным расшифровки";
КонецЕсли;
Стек.Добавить(Родитель);
КонецЦикла;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаКлиенте
Процедура ПринятьСвойРезультат85(Настройки, Режим, Описание)
ПроверитьГотовностьСвоейФормы85();
Если ТипЗнч(Настройки) <> Тип("НастройкиКомпоновкиДанных") Тогда
ВызватьИсключение "В своём уроке без user IDs нужен полный native объект настроек, не пользовательские настройки";
КонецЕсли;
Копия = ПрочитатьСвойXML85(ЗаписатьСвойXML85(Настройки), Тип("НастройкиКомпоновкиДанных"));
Если Копия.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КарточкаА85")).Значение <> СвояКарточкаА85
Или Копия.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КарточкаБ85")).Значение <> СвояКарточкаБ85 Тогда
ВызватьИсключение "Native действия не должны подменять две собственные ссылки-параметра";
КонецЕсли;
Данные = Новый ДанныеРасшифровкиКомпоновкиДанных;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(СвояСхема85, Копия, Данные);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет, , Данные, Ложь);
Документ = Новый ТабличныйДокумент;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьДокумент(Документ);
Вывод.Вывести(Процессор, Ложь);
Если Данные.Элементы.Количество() = 0 Или Документ.ВысотаТаблицы = 0 Тогда
ВызватьИсключение "ID и документ должен реально создать native процессор, не ручной fixture";
КонецЕсли;
Сводка = ПроверитьСвоиЯчейки85(Документ, Режим);
Если Режим = "Заголовок" И Документ.НайтиТекст("Мой заголовок расшифровки85") = Неопределено Тогда
ВызватьИсключение "Native delta заголовка не появился в настоящем выводе";
КонецЕсли;
Документ.ТолькоПросмотр = Истина;
СвоиНастройки85 = Копия;
СвоиДанные85 = Данные;
Документ85 = Документ;
Ревизия85 = Ревизия85 + 1;
СвойID85 = Неопределено;
Состояние85 = Описание + ". Readback actual ячеек: " + Сводка + ". Старый ID сброшен; снова щёлкните actual ячейку.";
КонецПроцедуры
&НаКлиенте
Функция ПроверитьСвоиЯчейки85(Документ, Режим)
КоличествоЗаголовок = Документ.НайтиТекст("Количество85");
СуммаЗаголовок = Документ.НайтиТекст("Сумма85");
Если КоличествоЗаголовок = Неопределено Или СуммаЗаголовок = Неопределено Тогда
ВызватьИсключение "Нужны настоящие заголовки собственных числовых колонок";
КонецЕсли;
ЧислоСтрок = 0;
ИтогКоличество = 0;
ИтогСумма = 0;
Для Каждого Имя Из СтрРазделить("Альфа85,Гамма85,Бета85", ",") Цикл
Найденная = Документ.НайтиТекст(Имя);
Если Найденная = Неопределено Тогда
Продолжить;
КонецЕсли;
Количество = ПрочитатьЧислоСвоейЯчейки85(Документ, Найденная.Верх, КоличествоЗаголовок.Лево);
Сумма = ПрочитатьЧислоСвоейЯчейки85(Документ, Найденная.Верх, СуммаЗаголовок.Лево);
ОжидаетсяКоличество = ?(Имя = "Альфа85", 1, ?(Имя = "Гамма85", 3, 5));
ОжидаетсяСумма = ?(Имя = "Альфа85", 100, ?(Имя = "Гамма85", 600, 1250));
Если Количество <> ОжидаетсяКоличество Или Сумма <> ОжидаетсяСумма Тогда
ВызватьИсключение "Реальные собственные числовые ячейки не совпали: " + Имя;
КонецЕсли;
ЧислоСтрок = ЧислоСтрок + 1;
ИтогКоличество = ИтогКоличество + Количество;
ИтогСумма = ИтогСумма + Сумма;
КонецЦикла;
Если Режим = "Все" Или Режим = "Заголовок" Тогда
Если ЧислоСтрок <> 3 Или ИтогКоличество <> 9 Или ИтогСумма <> 1950 Тогда
ВызватьИсключение "Должны сохраниться все три собственные строки с итогом 9/1950";
КонецЕсли;
ИначеЕсли Режим = "А85" Тогда
Если ЧислоСтрок <> 2 Или ИтогКоличество <> 4 Или ИтогСумма <> 700 Или Документ.НайтиТекст("Бета85") <> Неопределено Тогда
ВызватьИсключение "Native фильтр А85 должен оставить Альфа85 и Гамма85 с 4/700";
КонецЕсли;
ИначеЕсли Режим = "Б85" Тогда
Если ЧислоСтрок <> 1 Или ИтогКоличество <> 5 Или ИтогСумма <> 1250 Или Документ.НайтиТекст("Альфа85") <> Неопределено Тогда
ВызватьИсключение "Native фильтр Б85 должен оставить только Бета85 с 5/1250";
КонецЕсли;
ИначеЕсли Режим = "Группы" Тогда
Если ЧислоСтрок = 0 Тогда
Для Каждого Код Из СтрРазделить("А85,Б85", ",") Цикл
Группа = Документ.НайтиТекст("Моя карточка " + Код);
Если Группа = Неопределено Тогда
ВызватьИсключение "Группировка без деталей должна реально показать обе собственные карточки";
КонецЕсли;
Количество = ПрочитатьЧислоСвоейЯчейки85(Документ, Группа.Верх, КоличествоЗаголовок.Лево);
Сумма = ПрочитатьЧислоСвоейЯчейки85(Документ, Группа.Верх, СуммаЗаголовок.Лево);
Если Количество <> ?(Код = "А85", 4, 5) Или Сумма <> ?(Код = "А85", 700, 1250) Тогда
ВызватьИсключение "Собственный native групповой ресурс не совпал";
КонецЕсли;
ИтогКоличество = ИтогКоличество + Количество;
ИтогСумма = ИтогСумма + Сумма;
КонецЦикла;
КонецЕсли;
Если ИтогКоличество <> 9 Или ИтогСумма <> 1950 Тогда
ВызватьИсключение "Собственная группировка должна сохранить общий ресурс 9/1950";
КонецЕсли;
ИначеЕсли Режим = "Подмножество" Тогда
Если ЧислоСтрок = 0 Тогда
ВызватьИсключение "Выбранная native детализация/фильтр должна вывести хотя бы одну собственную строку";
КонецЕсли;
Иначе
ВызватьИсключение "Неизвестный собственный режим readback";
КонецЕсли;
Возврат "своих видимых имён=" + Строка(ЧислоСтрок) + ", количество=" + Строка(ИтогКоличество) + ", сумма=" + Строка(ИтогСумма);
КонецФункции
&НаКлиенте
Функция ПрочитатьЧислоСвоейЯчейки85(Документ, Строка, Колонка)
Текст = Документ.Область(Строка, Колонка).Текст;
Текст = СтрЗаменить(СтрЗаменить(Текст, Символ(160), ""), " ", "");
Возврат Число(Текст);
КонецФункции
&НаКлиенте
Функция ПолучитьСвойСнимок85()
Возврат Новый Структура("НастройкиXML,ДанныеXML,Документ,Идентификатор,Ревизия", ЗаписатьСвойXML85(СвоиНастройки85), ЗаписатьСвойXML85(СвоиДанные85), Документ85, СвойID85, Ревизия85);
КонецФункции
&НаКлиенте
Процедура ПроверитьСвойСнимок85(Снимок)
Если ЗаписатьСвойXML85(СвоиНастройки85) <> Снимок.НастройкиXML Или ЗаписатьСвойXML85(СвоиДанные85) <> Снимок.ДанныеXML
Или Документ85 <> Снимок.Документ Или СвойID85 <> Снимок.Идентификатор Или Ревизия85 <> Снимок.Ревизия Тогда
ВызватьИсключение "Нет действия или собственный отказ не должен изменять принятый отчёт/данные/ID";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьГотовностьСвоейФормы85()
ПроверитьСвойПустойСтенд();
Если МенюОжидается85 Тогда
ВызватьИсключение "Своё async меню ещё ожидается; повторное действие/перестройка запрещены";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ЗаписатьСвойXML85(Настройки)
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, Настройки, НазначениеТипаXML.Явное);
Возврат Запись.Закрыть();
КонецФункции
&НаКлиенте
Функция ПрочитатьСвойXML85(Текст, ОжидаемыйТип)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(Текст);
Копия = СериализаторXDTO.ПрочитатьXML(Чтение, ОжидаемыйТип);
Чтение.Закрыть();
Возврат Копия;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.Справочники.Найти("МоиКарточки85") = Неопределено Тогда
ВызватьИсключение "Разрешён ровно собственный справочник МоиКарточки85";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
#КонецЕслиЗапретЗаписиПодготовленныхКарточек85
Своя CF УчебнаяРасшифровкаСКД85 → Справочники → МоиКарточки85 → Модуль объекта, после ручной подготовки ровно двух карточек
Native ПередЗаписью собственного справочника; не рабочий объект.
Процедура ПередЗаписью(Отказ)
Отказ = Истина;
ВызватьИсключение "Две собственные учебные карточки уже подготовлены; любая последующая запись запрещена";
КонецПроцедуры
Процедура ПередУдалением(Отказ)
Отказ = Истина;
ВызватьИсключение "Удаление двух подготовленных собственных учебных карточек запрещено";
КонецПроцедурыТолькоПросмотрСвоейКарточки85
Своя CF УчебнаяРасшифровкаСКД85 → Справочники → МоиКарточки85 → Формы → основная ФормаЭлемента → Модуль, событие ПриОткрытии
Управляемая форма только собственной карточки; native OpenValue открывает её по actual ref.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтотОбъект.ТолькоПросмотр = Истина;
КонецПроцедурыРазбор по шагам
Native компоновщик макета и процессор получают один настоящий ДанныеРасшифровкиКомпоновкиДанных и наполняют его при выводе. Никакие Элементы.Добавить, вручную назначенные Расшифровка или новые произвольные ID не используются. В начальном документе три детали; actual текст числовых ячеек даёт 9/1950.
Двойной щелчок по собственной ячейке сохраняет реальный ID из native события. Модуль проверяет принадлежность текущему собственному Данные.Элементы[ID]; операция кнопкой работает именно с этим ID. Конструктор получает самостоятельную XML копию действительных своих данных, ID обязан пройти roundtrip без подмены. После любой принятой перестройки старый ID сбрасывается: прежде чем нажать следующую кнопку, снова щёлкните новую actual ячейку.
Для ОтфильтроватьСвоюКатегорию85 выберите ячейку категории А85, затем кнопку. Настройки реально возвращает Обработка.Отфильтровать(ID, ПолеКомпоновкиДанных Категория); их независимая XML копия реально компонуется. Readback требует Альфа85/Гамма85 и 4/700, без Бета85. Восстановите начальный отчёт и повторите Б85: только Бета85 и 5/1250.
Перед каждым независимым опытом ВосстановитьСвойОтчет85. Для РасшифроватьСвоюГруппу85 выберите ресурс количества строки группы А85: ресурс позволяет native действие детализации; метод получает поле Наименование. Для СгруппироватьСвоиКарточки85 выберите детальную ячейку и добавьте группировку по своему полю Карточка. XML полученного варианта должен отличаться от принятого: no-op не объявляется успешной перестройкой. Если native группировка показывает только агрегаты, readback проверяет ресурсы по настоящим названиям обеих собственных карточек, не требует выдуманных детальных строк.
Для УпорядочитьСвоиСтроки85 двойным щелчком выберите настоящий заголовок Наименование85. Native ОсновноеДействие должно быть Упорядочить; затем метод перестраивает настройки по Наименованию. Проверьте направление/порядок в документе и после повторного вызова. Нельзя использовать ID произвольной ресурсной ячейки и объявлять его заголовком.
Для ОткрытьСвоюКарточку85 выберите actual ячейку Карточка своей детальной строки. Значение извлекается из настоящего элемента/его actual родительских элементов и сверяется с одной из двух own ссылок. ОткрытьЗначение(ID, Поле Карточка) не получает произвольный объект или пользовательский путь. Результат открытия native метода не возвращается, поэтому фактическую открытую собственную форму и только просмотр проверяет пользователь.
ПрименитьСвойЗаголовок85 создаёт инициализированный собственным источником delta: ноль пользовательских полей, ноль группировок, только native параметр Заголовок. ПрименитьНастройки возвращает полные native настройки, которые реально компонуются. В документе должен появиться Мой заголовок расшифровки85; имена/числа исходных строк сохраняются.
ВыбратьСвоёДействие85 передаёт два обязательных out-параметра и разрешает только native Отфильтровать/Сгруппировать плюс собственный пункт отказа. Выберите Фильтр→Категория либо Группировать→Карточка. Полученный native delta применяется через ПрименитьНастройки(ID, delta), не подменяется вручную собранным результатом. Нет действия, Escape или Не менять свой отчёт85 не создают новый документ; XML принятых настроек/данных и identity документа/ID/ревизии сверяются с состоянием до меню.
ВыбратьСвоёДействиеАсинх85 ожидает настоящее обещание. Объект результата читается через readonly ВыбранноеДействие и ПараметрВыбранногоДействия; ничего в них не присваивается. Захвачены actual ID и ревизия; до завершения меню перестройка и новый выбор блокируются. После ожидания проверяются ревизия/ID, затем ровно тот же реальный путь применения delta. Исключение ожидания освобождает флаг, но не изменяет принятый отчёт.
ВыполнитьСвоёМеню85 — другой native маршрут: метод сам выполняет выбранное действие и возвращает полные либо пользовательские настройки или Неопределено. Наш own fixture не содержит user IDs; ожидается полный объект. Неопределено означает отсутствие изменений настроек, не доказательство отмены. При полном объекте он реально перекомпонуется; при другом типе не притворяемся, что это полный вариант.
Как проверить результат
Каждый независимый опыт начинайте с ВосстановитьСвойОтчет85 и свежего actual щелчка. В начале видны Альфа85/Гамма85/Бета85, Количество85=1/3/5 и Сумма85=100/600/1250. Readback считывает эти реальные числовые ячейки по native найденным заголовкам, не только значения исходного запроса.
А85 фильтр: две детали с 4/700, Бета85 отсутствует; Б85 фильтр: одна Бета85 с 5/1250. При несоответствии кандидата ни документ, ни принятые данные, ни ревизия, ни ID не должны заменяться.
Группировка по Карточка сохраняет собственный ресурс 9/1950. Если детали скрыты native настройками, видны агрегаты Моя карточка А85=4/700 и Моя карточка Б85=5/1250. Если документ оставляет детали, проверяются их настоящие имена/числа. Разное оформление не является доказательством неправильной native группировки.
После Сгруппировать, Расшифровать и Упорядочить откройте отладчик и сравните СвоиНастройки85.Структура/Порядок до и после; это реально возвращённые настройки, а не самостоятельно имитированная перестановка исходных строк. Направление и точную вложенность подтвердите ручным протоколом, не предполагайте их по одному названию метода.
Проверьте синхронное меню и async меню отдельно: выбрать фильтр, выбрать группировку, Escape, затем свой Не менять свой отчёт85. При отказе Документ85, СвоиНастройки85, СвоиДанные85, СвойID85 и Ревизия85 не меняются. Для native Выполнить отсутствие возвращённых настроек фиксируется как отсутствие изменения, не обязательно Cancel.
ОткрытьЗначение должно показать именно Моя карточка А85 или Моя карточка Б85 в подготовленной readonly форме. Попытка записать уже подготовленную карточку отдельно в своей новой базе отклоняется supporting объектным модулем. Агент эту попытку не выполнял.
Если выбран неподходящий заголовок/ячейка, используйте новый настоящий щелчок; не подставляйте ID=0, UUID, Структура от построителя или вручную созданный элемент данных. Если внешний вид native макета сдвинул числовые колонки, readback прекращает принятие: исправьте собственную схему/подготовку и заново проверьте, а не удаляйте контроль.
Ожидаемый результат
Все девять native действий входят в реальный own workflow: живые данные/ID, полные возвращённые настройки, настоящая перекомпоновка, own reference navigation и честное отсутствие изменения при отказе.
На что обратить внимание
Непримитивное ОткрытьЗначение требует настоящей ссылки: две карточки заранее создаются пользователем только в отдельном стенде. Ссылки исходной рабочей базы и произвольные navigation paths запрещены.
Native методы могут вернуть ПользовательскиеНастройкиКомпоновкиДанных, если использованы user IDs. В этом уроке user IDs не создаются. Не передавайте пользовательские настройки компоновщику как полный вариант: текущий код честно отклоняет такой неожиданный тип.
ВыбратьДействие возвращает delta через out-параметры; ВыбратьДействиеАсинх возвращает readonly результат выбора; Выполнить возвращает уже изменённые настройки или Неопределено. Эти три контракта не взаимозаменяемы.
ПрименитьНастройки ограничивает структуру delta максимум двумя ненестированными группировками, одна может называться ТекущаяГруппировка. Пользовательские поля должны отсутствовать либо совпадать. Программный delta заголовка урока вообще не содержит группировок/user полей.
Данные и источник передаются конструктору как настоящие native объекты. Это другой ctor, не ранее покрытые строковые адреса временного хранилища. Только thick managed контекст делает этот целый client-side маршрут допустимым.
Числовой readback зависит от собственных native заголовков и шаблона колонок; ошибки чтения — стоп до принятия, не автоматическое доказательство дефекта API. Вычисление ресурсов и точный клиентский вид, сортировка и открытие формы в 1С агентом не запускались.
Никакие реальные базы, серверы, GUI, каталоги файлов, сеть или записи карточек агент не менял. Выполнены только авторство и статические проверки; ручная подготовка и runtime-проверка выполняются отдельно в указанной своей базе.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.