ДанныеРасшифровкиКомпоновкиДанных.По умолчанию

Конструкторы

Синтаксис и применение ДанныеРасшифровкиКомпоновкиДанных.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.

Синтаксис

Новый ДанныеРасшифровкиКомпоновкиДанных
Полное описание, параметры и ограничения

ДанныеРасшифровкиКомпоновкиДанных.По умолчанию

ДанныеРасшифровкиКомпоновкиДанных (DataCompositionDetailsData)

По умолчанию

Синтаксис:
Новый ДанныеРасшифровкиКомпоновкиДанных
Методическая информация

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

Настоящая расшифровка СКД: фильтр, детализация, группировка, порядок и собственная карточка

Полный собственный thick-managed маршрут получает реальные ID из табличного вывода native процессора, применяет возвращённые настройки и проверяет реальные числовые ячейки. Без выдуманных ID и без структуры расшифровки старого ПостроительОтчета.

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

Полный модуль управляемой формы своей обработки УчебнаяРасшифровкаСКД85. Только ТолстыйКлиентУправляемоеПриложение 8.5.1.1343; все native схемы, источники и данные client-side, реальный managed raw event и отдельная Асинх команда.

Подготовка

  1. Вручную создайте отдельную новую пустую файловую базу платформы 8.5.1.1343. Имя конфигурации=УчебнаяРасшифровкаСКД85, основное приложение=Управляемое, совместимость без старого ограничения 8.3.9 и ниже, модальность собственного desktop клиента разрешена. Этот урок запускается ТОЛЬКО толстым управляемым клиентом: серверные native типы схемы/данных непосредственно доступны там, но не в тонком клиенте.

  2. Создайте ровно один собственный неиерархический справочник МоиКарточки85: Код Строка длина 8, контроль уникальности кода включён, автоматическая нумерация отключена, Наименование Строка длина 40. Без дополнительных реквизитов, табличных частей, владельцев, подписок, обменов, фоновых заданий, рабочих метаданных и расширений.

  3. До включения запрета записи вручную в собственной новой базе создайте две реальные карточки: Код У85А, Наименование Моя карточка А85; Код У85Б, Наименование Моя карточка Б85. Больше записей и пометок удаления нет. Это ручная учебная подготовка, агент не создавал базу, карточки и не выполнял запись 1С.

  4. Затем вставьте supporting-модуль ПередЗаписью/ПередУдалением в МоиКарточки85 → Модуль объекта и обновите только свой стенд. Создайте у справочника управляемую основную форму элемента ФормаЭлемента, назначьте её основной формой элемента и вставьте supporting-модуль ПриОткрытии. Теперь объектная запись/удаление запрещены, а native открытие собственной ссылки покажет только просмотр. Не подключайте этот код к рабочему справочнику.

  5. Создайте свою обработку УчебнаяРасшифровкаСКД85 с управляемой Основной формой. Реквизиты: Документ85 ТабличныйДокумент, Состояние85 Строка неограниченной длины. Поле табличного документа Отчет85 связано с Документ85; Состояние85 покажите отдельным полем только просмотра. Код целиком вставьте в модуль формы. ПриОткрытии назначьте процедуре ПриОткрытии(Отказ). Событие Отчет85.ОбработкаРасшифровки свяжите с Отчет85ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры): Element формы плюс три native параметра, не обычная двухаргументная сигнатура.

  6. Создайте десять команд формы и кнопки: ВосстановитьСвойОтчет85, ОтфильтроватьСвоюКатегорию85, РасшифроватьСвоюГруппу85, СгруппироватьСвоиКарточки85, УпорядочитьСвоиСтроки85, ОткрытьСвоюКарточку85, ПрименитьСвойЗаголовок85, ВыбратьСвоёДействие85, ВыбратьСвоёДействиеАсинх85, ВыполнитьСвоёМеню85. Свяжите действия с одноимёнными процедурами; async кнопка должна вызывать настоящую Асинх процедуру с Ждать, не имитированное оповещение.

  7. При открытии код только читает две уже подготовленные собственные записи и берёт настоящие ссылки. Схема/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.

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ЭтотОбъект.ТолькоПросмотр = Истина;
КонецПроцедуры

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

  1. Native компоновщик макета и процессор получают один настоящий ДанныеРасшифровкиКомпоновкиДанных и наполняют его при выводе. Никакие Элементы.Добавить, вручную назначенные Расшифровка или новые произвольные ID не используются. В начальном документе три детали; actual текст числовых ячеек даёт 9/1950.

  2. Двойной щелчок по собственной ячейке сохраняет реальный ID из native события. Модуль проверяет принадлежность текущему собственному Данные.Элементы[ID]; операция кнопкой работает именно с этим ID. Конструктор получает самостоятельную XML копию действительных своих данных, ID обязан пройти roundtrip без подмены. После любой принятой перестройки старый ID сбрасывается: прежде чем нажать следующую кнопку, снова щёлкните новую actual ячейку.

  3. Для ОтфильтроватьСвоюКатегорию85 выберите ячейку категории А85, затем кнопку. Настройки реально возвращает Обработка.Отфильтровать(ID, ПолеКомпоновкиДанных Категория); их независимая XML копия реально компонуется. Readback требует Альфа85/Гамма85 и 4/700, без Бета85. Восстановите начальный отчёт и повторите Б85: только Бета85 и 5/1250.

  4. Перед каждым независимым опытом ВосстановитьСвойОтчет85. Для РасшифроватьСвоюГруппу85 выберите ресурс количества строки группы А85: ресурс позволяет native действие детализации; метод получает поле Наименование. Для СгруппироватьСвоиКарточки85 выберите детальную ячейку и добавьте группировку по своему полю Карточка. XML полученного варианта должен отличаться от принятого: no-op не объявляется успешной перестройкой. Если native группировка показывает только агрегаты, readback проверяет ресурсы по настоящим названиям обеих собственных карточек, не требует выдуманных детальных строк.

  5. Для УпорядочитьСвоиСтроки85 двойным щелчком выберите настоящий заголовок Наименование85. Native ОсновноеДействие должно быть Упорядочить; затем метод перестраивает настройки по Наименованию. Проверьте направление/порядок в документе и после повторного вызова. Нельзя использовать ID произвольной ресурсной ячейки и объявлять его заголовком.

  6. Для ОткрытьСвоюКарточку85 выберите actual ячейку Карточка своей детальной строки. Значение извлекается из настоящего элемента/его actual родительских элементов и сверяется с одной из двух own ссылок. ОткрытьЗначение(ID, Поле Карточка) не получает произвольный объект или пользовательский путь. Результат открытия native метода не возвращается, поэтому фактическую открытую собственную форму и только просмотр проверяет пользователь.

  7. ПрименитьСвойЗаголовок85 создаёт инициализированный собственным источником delta: ноль пользовательских полей, ноль группировок, только native параметр Заголовок. ПрименитьНастройки возвращает полные native настройки, которые реально компонуются. В документе должен появиться Мой заголовок расшифровки85; имена/числа исходных строк сохраняются.

  8. ВыбратьСвоёДействие85 передаёт два обязательных out-параметра и разрешает только native Отфильтровать/Сгруппировать плюс собственный пункт отказа. Выберите Фильтр→Категория либо Группировать→Карточка. Полученный native delta применяется через ПрименитьНастройки(ID, delta), не подменяется вручную собранным результатом. Нет действия, Escape или Не менять свой отчёт85 не создают новый документ; XML принятых настроек/данных и identity документа/ID/ревизии сверяются с состоянием до меню.

  9. ВыбратьСвоёДействиеАсинх85 ожидает настоящее обещание. Объект результата читается через readonly ВыбранноеДействие и ПараметрВыбранногоДействия; ничего в них не присваивается. Захвачены actual ID и ревизия; до завершения меню перестройка и новый выбор блокируются. После ожидания проверяются ревизия/ID, затем ровно тот же реальный путь применения delta. Исключение ожидания освобождает флаг, но не изменяет принятый отчёт.

  10. ВыполнитьСвоёМеню85 — другой native маршрут: метод сам выполняет выбранное действие и возвращает полные либо пользовательские настройки или Неопределено. Наш own fixture не содержит user IDs; ожидается полный объект. Неопределено означает отсутствие изменений настроек, не доказательство отмены. При полном объекте он реально перекомпонуется; при другом типе не притворяемся, что это полный вариант.

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

  1. Каждый независимый опыт начинайте с ВосстановитьСвойОтчет85 и свежего actual щелчка. В начале видны Альфа85/Гамма85/Бета85, Количество85=1/3/5 и Сумма85=100/600/1250. Readback считывает эти реальные числовые ячейки по native найденным заголовкам, не только значения исходного запроса.

  2. А85 фильтр: две детали с 4/700, Бета85 отсутствует; Б85 фильтр: одна Бета85 с 5/1250. При несоответствии кандидата ни документ, ни принятые данные, ни ревизия, ни ID не должны заменяться.

  3. Группировка по Карточка сохраняет собственный ресурс 9/1950. Если детали скрыты native настройками, видны агрегаты Моя карточка А85=4/700 и Моя карточка Б85=5/1250. Если документ оставляет детали, проверяются их настоящие имена/числа. Разное оформление не является доказательством неправильной native группировки.

  4. После Сгруппировать, Расшифровать и Упорядочить откройте отладчик и сравните СвоиНастройки85.Структура/Порядок до и после; это реально возвращённые настройки, а не самостоятельно имитированная перестановка исходных строк. Направление и точную вложенность подтвердите ручным протоколом, не предполагайте их по одному названию метода.

  5. Проверьте синхронное меню и async меню отдельно: выбрать фильтр, выбрать группировку, Escape, затем свой Не менять свой отчёт85. При отказе Документ85, СвоиНастройки85, СвоиДанные85, СвойID85 и Ревизия85 не меняются. Для native Выполнить отсутствие возвращённых настроек фиксируется как отсутствие изменения, не обязательно Cancel.

  6. ОткрытьЗначение должно показать именно Моя карточка А85 или Моя карточка Б85 в подготовленной readonly форме. Попытка записать уже подготовленную карточку отдельно в своей новой базе отклоняется supporting объектным модулем. Агент эту попытку не выполнял.

  7. Если выбран неподходящий заголовок/ячейка, используйте новый настоящий щелчок; не подставляйте ID=0, UUID, Структура от построителя или вручную созданный элемент данных. Если внешний вид native макета сдвинул числовые колонки, readback прекращает принятие: исправьте собственную схему/подготовку и заново проверьте, а не удаляйте контроль.

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

Все девять native действий входят в реальный own workflow: живые данные/ID, полные возвращённые настройки, настоящая перекомпоновка, own reference navigation и честное отсутствие изменения при отказе.

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

  1. Непримитивное ОткрытьЗначение требует настоящей ссылки: две карточки заранее создаются пользователем только в отдельном стенде. Ссылки исходной рабочей базы и произвольные navigation paths запрещены.

  2. Native методы могут вернуть ПользовательскиеНастройкиКомпоновкиДанных, если использованы user IDs. В этом уроке user IDs не создаются. Не передавайте пользовательские настройки компоновщику как полный вариант: текущий код честно отклоняет такой неожиданный тип.

  3. ВыбратьДействие возвращает delta через out-параметры; ВыбратьДействиеАсинх возвращает readonly результат выбора; Выполнить возвращает уже изменённые настройки или Неопределено. Эти три контракта не взаимозаменяемы.

  4. ПрименитьНастройки ограничивает структуру delta максимум двумя ненестированными группировками, одна может называться ТекущаяГруппировка. Пользовательские поля должны отсутствовать либо совпадать. Программный delta заголовка урока вообще не содержит группировок/user полей.

  5. Данные и источник передаются конструктору как настоящие native объекты. Это другой ctor, не ранее покрытые строковые адреса временного хранилища. Только thick managed контекст делает этот целый client-side маршрут допустимым.

  6. Числовой readback зависит от собственных native заголовков и шаблона колонок; ошибки чтения — стоп до принятия, не автоматическое доказательство дефекта API. Вычисление ресурсов и точный клиентский вид, сортировка и открытие формы в 1С агентом не запускались.

  7. Никакие реальные базы, серверы, GUI, каталоги файлов, сеть или записи карточек агент не менял. Выполнены только авторство и статические проверки; ручная подготовка и runtime-проверка выполняются отдельно в указанной своей базе.

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

Полный native счёт и граф собственной расшифровки

Один свой объект расшифровки проходит compiler/processor/output; читаются реальные числовые ячейки и настоящий конечный граф родителей.

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

Полный собственный серверный общий модуль .1343; GLOBAL только для СчетГруппа85. Собственная управляемая форма вызывает конвейер из серверной части. Все native параметры/расшифровка остаются на сервере.

Подготовка

  1. Задача: собственная корзина из трёх товаров. BOOK: 2×250=500; PAPER: 5×50=250; TEA: 3×100=300. Количество10, сумма1050. СКД объединяет товары в категории Офис750/Чай300. Надбавка20% должна дать настоящие900/360 и общий итог1260, затем новый запуск без надбавки возвращает1050.

  2. Вручную создайте НОВУЮ пустую файловую ИБ только по пути C:\1C85_OwnSKDInvoice\27ab6906-e418-43d5-9e74-5aedb8f7449f\IB. Если такой каталог/регистрация уже существуют, остановитесь. UUID в пути — метка собственного стенда, не UUID базы. Здесь создание каталога/CF/пользователя и запуск1С не выполнялись.

  3. Конфигуратор: имя конфигурации СвойСчетСКД85; РежимСовместимости=НеИспользовать; ОсновнойРежимЗапуска=УправляемоеПриложение. Запуск вручную только толстым управляемым клиентом1cv8.exe платформы8.5.1.1343. Тонкий/web-клиент этот урок не поддерживает: APP читает server/thick-only свойства метаданных. Создайте только три общих модуля, одну управляемую общую форму и одну свою роль. Не переносите прикладные объекты, расширения или данные из рабочих конфигураций.

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

  5. Общие модули СчетГруппа85/СчетДиаграмма85/СчетКонвейер85: СерверДа; оба КлиентНет; ВнешнееСоединениеНет; ВызовСервераНет; ПривилегированныйНет. Только СчетГруппа85 имеет ГлобальныйДа; два других ГлобальныйНет. Только для двух неглобальных задайте ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать: у GLOBAL это свойство настройки недоступно и код его не читает. Вставьте каждый полный модуль из карточки. GLOBAL-функция вызывается самим выражением ресурса СКД; это не RPC с nativeGroupData.

  6. Общая управляемая форма СчетСКД85 без основного реквизита: До85/После85/Вернули85 — ТабличныйДокумент; Статус85 — неограниченная Строка; Остановка85/Завершено85 — Булево, начальноЛожь. Три поля табличного документа связаны с одноимёнными реквизитами и только для просмотра; Статус85 — многострочное readonly-поле. Команда Сформировать85 с Действие=Сформировать85; одна кнопка с Команда=Сформировать85. Вставьте полный FORM_CODE.

  7. В модуль управляемого приложения своей конфигурации вставьте полный APPLICATION_CODE. Настоящее событие ПриНачалеРаботыСистемы()0 открывает только собственную форму. Его не вызывают вручную. После будущего ручного обновления запустите собственный управляемый клиент и один раз нажмите кнопку. Это инструкция будущего прогона, не уже состоявшийся запуск.

  8. ПрочитатьИсточник85 выполняет только собственный литеральный запрос без ИЗ таблиц базы. Каждая из3×5 ячеек проверяется независимо, включая qty×price=amount; native итоги10/1050. Та же строка запроса помещена в native querydataset своей схемы, типы полей взяты из реальных колонок результата.

  9. Ресурс Сумма85 вычисляется глобальной функцией СчетСНадбавкой85(ГрупповаяОбработка(...),ПараметрыДанных.Надбавка85). Это ресурс собственной схемы, не пользовательское поле. ГрупповаяОбработка выдаёт значения ГРУППИРОВОК: две category-строки750/300, а не три товарные строки. CurrentItem — настоящая строка этой таблицы либо Неопределено для общего итога.

  10. У СКД-groupData нет документированного конструктора. Readonly свойства Данные/ТекущийЭлемент/ВременныеДанныеОбработки не назначаются. Во вложенную настоящую структуру временных данных помещается только свой уникально названный снимок. Ранее существовавшее несовместимое состояние приводит к отказу, не Clear или подмене объекта.

  11. Параметр Надбавка85 добавляется только в новую несвязанную коллекцию до LoadSettings; после связывания прочитывается его реальное значение. Макет получает тот же собственный объект расшифровки, который затем передаётся процессору. Четвёртый аргумент Инициализировать=Истина разрешает собственные GLOBAL-функции. Это не разрешение внешней сети и не разрешение пользовательских выражений.

  12. Свой отдельный профиль диаграммы получает настоящие Chart/ChartGroup через native Add(Type)/Add(). После LoadSettings перечитываются actual владельцы и значения Заголовок/КоличествоЗаписей. Их descriptor содержит настоящий owner+child+nativeID. Чужойowner отклоняется ДО lookup; opaqueID не считается глобально уникальным UUID. Лимит2→1→2 и заголовок изменяются только в своём memory-профиле.

  13. Расшифровку наполняет только настоящий native output; вручную её элементы не добавляются. Индекс+[] проверяют принадлежность. Родители проходят проверку фактического типа: собственный item или nativeDetailsID; неизвестные виды/циклы запрещены. GroupDetails.Группировка содержит СТРОКОВЫЙ ИДЕНТИФИКАТОР группировки, который сверяется с настоящим compiledGroup.Идентификатор. Это не compiledGroup.Имя, не UUID элемента расшифровки и не текст Офис/Чай.

  14. Читатель native табличного документа ищет фактические заголовки и проверяет две категории, числовые ресурсы и ровно один общий итог. При ином renderer/layout/пустомGroupProcessing/nativeNULL код остановится с ошибкой; успешный результат не подставляется. Runtime-проверки настоящих форм/графа/общего итога предстоят вручную.

  15. Одна ошибка на server или client границе делает экземпляр формы sticky-stop. Повтор после частичного изменения и слепой rollback не разрешены. Восстановление профиля диаграммы выполняется только после полного readback именно собственного ожидаемого промежуточного состояния; это не обещание атомарности.

  16. Здесь выполняются авторство и статические native/scoped тесты. Реальные1С/CF/DB/UI/сеть/печать/файлы/хранилища/backup0. Параметры диаграммы подтверждают значения настроек, не пиксели/отбор прав/успешность отрисовки; источник и табличный результат проверяются раздельно.

Процедура ПроверитьСтенд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 — полный глобальный серверный модуль

Общие → Общие модули → СчетГруппа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(Владелец, Имя)
    Значение = Владелец.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Имя));
    Если ТипЗнч(Значение) <> Тип("ЗначениеПараметраКомпоновкиДанных")
        Или Строка(Значение.Параметр) <> Имя Или Не Значение.Использование Тогда
        ВызватьИсключение "Не найдено настоящее включённое значение собственного параметра";
    КонецЕсли;
    Возврат Значение;
КонецФункции

Процедура ПроверитьОписание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 → Модуль

Собственная управляемая форма: 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";
КонецПроцедуры
#КонецЕсли

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

  1. Подготовьте все полные модули и собственную общую форму; числовые исходники видны в литеральном запросе.

  2. Передайте тот же actual Details экземпляр в compiler и processor, а AllowExternalFunctions — именно четвёртым аргументом.

  3. Прочитайте настоящий TabDoc, две категории и общий итог; запрещена подстановка заранее готовой таблицы результатов.

  4. ForEach/Index/[] проверяют реальные узлы; строковый groupingID сверяется с actual compiledGroup.Идентификатор, а nativeDetailsID разрешается в того же собственного владельца.

  5. Parents проверяются по фактическим типам и конечному графу; неизвестный тип/чужойitem/cycle даёт отказ.

  6. Сравните native1050→1260→1050 с полной неизменной source3×5; это разные проверки.

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

  1. Будущий ручной результат: BOOK500/PAPER250/TEA300, qty10; nativeОфис750→900→750 и Чай300→360→300; nativeобщийитог1050→1260→1050.

  2. Профиль диаграммы: Заголовок Корзина1050→Предпросмотр1260→Корзина1050, nativeКоличествоЗаписей2→1→2; realowner/child/ID остаются теми же.

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

  4. Измените только в своём учебном исходнике товар/категорию/сумму/путь/надбавку/owner descriptor: ожидается отказ, не исправление чужого состояния.

  5. Неизвестный native layout/NULL/тип родителей/пустая расшифровка — честный fail-stop. Статический PASS не доказывает успешный1С-runtime.

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

Ожидаемый будущий результат: собственный native счёт1050→1260→1050, guarded параметры диаграммы и прочитанный реальный граф расшифровки. RuntimeVerified=False; фактических1С/БД/UI/network/print/backup операций0.

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

  1. У groupData/Chart/ChartGroup/DetailsItem нет выдуманных конструкторов. Реальные фабрики и typedproperties перечислены в подготовке.

  2. GroupData.Data — значения группировок, не detailRows. Native CurrentItem может быть Undefined; это не ошибка само по себе.

  3. Родительский массив не имеет документированного типа элементов: actual nativeID/item различаются проверкой, неизвестные значения не подставляются.

  4. Получить2894 с конфликтующим zero-argument syntax и ОсновноеДействие8969 без declaredtype исключены полностью.

  5. GetID/GetObject описывают локальный owner; foreignID не обязан быть глобально уникальным или возвращатьUndefined у другого владельца.

  6. Параметры диаграммы — настройки, не доказательство пикселей/доставки UI. Здесь она отдельно не выводится; числовые доказательства дают собственный native табличный вывод.

  7. Readback/restore только своего полного knownstate, не атомарность и не retry. Group/Details/parameter objects не передаются черезRPC.

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

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

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

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

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