Настоящий контрольный отчёт на трёх своих строках и отдельный memory-черновик: реальные роли ресурсной ячейки и пересечения, ссылки областей, Add/Insert двух непустых групп и Clear без изменения базы.
Где и как запускать
Полный свой неглобальный серверный общий модуль УчебныйЧерновикСКД85. Вызов из реального серверного обработчика своей управляемой формы; только новый пустой lab-стенд, не рабочая база.
Подготовка
Работайте только в новой пустой собственной файловой базе платформы 8.5.1.1343. Здесь 1С не запускалась; рабочие УТ/КА2/УНФ/БП не открывать.
Путь базы C:\1c-labs\OwnMemorySkd85_96d2e47c-5188-4c8c-b6cc-c487279f589f\IB. Имя конфигурации УчебныйЧерновикСКД85; Версия 96d2e47c-5188-4c8c-b6cc-c487279f589f; основной режим Управляемое приложение, совместимость Не использовать. Не загружайте бизнес-конфигурацию или расширения.
Конфигуратор → Общие → Общие модули → УчебныйЧерновикСКД85: Сервер Да; Глобальный, Вызов сервера, оба клиентских контекста, Внешнее соединение и Привилегированный Нет; Повторное использование возвращаемых значений Не использовать. Вставьте основной блок целиком, не внутрь другой процедуры.
Общие → Общие формы → ЧерновикСКД85: управляемая форма без бизнес-реквизитов. Создайте команду формы ВыполнитьУрок, её одноимённый обработчик и кнопку. Отдельный блок модуля формы содержит клиентскую процедуру и серверную функцию без контекста.
Общие → Общие команды → ОткрытьЧерновикСКД85: отдельный блок ОбработкаКоманды. Добавьте команду в собственную подсистему УчебнаяСКД85. Создайте собственную роль и lab-пользователя с правами запуска и доступа к учебным форме/команде. Обновите конфигурацию базы и вручную запустите собственную команду.
Запрос содержит три свои константные строки без ИЗ: Север/Книга 3 и 750, Север/Ручка 1 и 50, Юг/Книга 2 и 500. Количество 6 проверяется по настоящему источнику; матрица показывает ресурс Сумма, четыре пересечения дают 1300.
Поставьте серверную точку останова после НайтиРолевуюПару. Обе строки берутся из одного actual resource entry. Вторая должна совпасть с настоящим макросом противоположной оси того же черновика. Эта форма compiler tree не гарантирована без запуска: отсутствие пары означает неполную подготовку и STOP, не успех.
Клиент получает только текст. Серверные макеты и коллекции не передаются клиенту. Нет файлов, печати, интернета, системных настроек, записи бизнес-объектов или копирования opaque объектов через XML.
После структурных опытов черновик НЕ исполняется как отчёт. Контрольный макет и документ получены отдельным полным вызовом фабрики; очищается лишь тело группы черновика.
Функция ВыполнитьУрок() Экспорт
ПроверитьСвойСтенд();
КонтрольныйМакет = СоздатьСвойМакет();
КонтрольныйДокумент = СформироватьДокумент(КонтрольныйМакет);
ПроверитьМатрицу(КонтрольныйДокумент);
Черновик = СоздатьСвойМакет();
ТаблицаЧерновика = НайтиТаблицу(Черновик);
ГруппаСтрок = НайтиГруппу(ТаблицаЧерновика.Строки, "Магазин");
ГруппаКолонок = НайтиГруппу(ТаблицаЧерновика.Колонки, "Наименование");
ПолеМагазина = СнятьПоле(ГруппаСтрок, "Магазин");
ПолеТовара = СнятьПоле(ГруппаКолонок, "Наименование");
Пара = НайтиРолевуюПару(Черновик, ГруппаСтрок, ГруппаКолонок);
До = Пара.Коллекция.Количество();
НовыйРесурс = Пара.Коллекция.Добавить();
Если ТипЗнч(НовыйРесурс) <> Тип("МакетТелаТаблицыМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Фабрика ресурса вернула неподходящий тип; урок не завершён";
КонецЕсли;
НовыйРесурс.Макет = Пара.Ресурс;
НовыйРесурс.МакетГруппировки = Пара.Пересечение;
Если Пара.Коллекция.Количество() <> До + 1
Или НовыйРесурс.Макет <> Пара.Ресурс
Или НовыйРесурс.МакетГруппировки <> Пара.Пересечение Тогда
ВызватьИсключение "Реальная ссылка ресурса не заполнилась";
КонецЕсли;
ПроверитьИмяОбласти(Черновик, НовыйРесурс.Макет);
ПроверитьИмяОбласти(Черновик, НовыйРесурс.МакетГруппировки);
СсылкаОбласти = Черновик.Тело.Добавить(Тип("МакетОбластиМакетаКомпоновкиДанных"));
Если ТипЗнч(СсылкаОбласти) <> Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Фабрика ссылки области вернула неподходящий тип";
КонецЕсли;
СсылкаОбласти.Макет = Пара.Ресурс;
ПроверитьИмяОбласти(Черновик, СсылкаОбласти.Макет);
ТелоЧерновика = ГруппаСтрок.Тело;
Если ТипЗнч(ТелоЧерновика) <> Тип("ТелоГруппировкиТаблицыМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Нужно настоящее тело собственной табличной группы";
КонецЕсли;
ТелоЧерновика.Очистить();
Если ТелоЧерновика.Количество() <> 0 Тогда ВызватьИсключение "Черновик не очищен"; КонецЕсли;
МагазиныЧерновика = ТелоЧерновика.Добавить(Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных"));
ЗаполнитьГруппу(МагазиныЧерновика, "ЧерновикМагазины", ПолеМагазина);
Если ТелоЧерновика.Количество() <> 1 Тогда ВызватьИсключение "Группа не добавлена"; КонецЕсли;
ТоварыЧерновика = ТелоЧерновика.Вставить(0, Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных"));
ЗаполнитьГруппу(ТоварыЧерновика, "ЧерновикТовары", ПолеТовара);
Если ТелоЧерновика.Количество() <> 2
Или ТелоЧерновика.Получить(0).Имя <> "ЧерновикТовары"
Или ТелоЧерновика.Получить(1).Имя <> "ЧерновикМагазины" Тогда
ВызватьИсключение "Не подтвердился порядок двух настоящих групп";
КонецЕсли;
СнятьПоле(ТоварыЧерновика, "Наименование");
СнятьПоле(МагазиныЧерновика, "Магазин");
Паспорт = "Источник: 3 строки, количество 6; контрольная матрица: 1300."
+ Символы.ПС + "Ресурсная ячейка: " + НовыйРесурс.Макет
+ Символы.ПС + "Пересечение с реальной группой другой оси: " + НовыйРесурс.МакетГруппировки
+ Символы.ПС + "Ссылка области: " + СсылкаОбласти.Макет
+ Символы.ПС + "Порядок черновика: Наименование, затем Магазин.";
ТелоЧерновика.Очистить();
Если ТелоЧерновика.Количество() <> 0 Тогда ВызватьИсключение "Отмена черновика не завершена"; КонецЕсли;
ПроверитьМатрицу(КонтрольныйДокумент);
ПроверитьМатрицу(СформироватьДокумент(КонтрольныйМакет));
Возврат Паспорт + Символы.ПС
+ "Отменён только memory-черновик групп. Контрольный отчёт не изменён."
+ Символы.ПС + "Черновик не объявляется готовым исполнимым отчётом.";
КонецФункции
Процедура ПроверитьСвойСтенд()
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnMemorySkd85_96d2e47c-5188-4c8c-b6cc-c487279f589f\IB"";" Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужна новая собственная файловая лаборатория 8.5.1.1343";
КонецЕсли;
Если РасширенияКонфигурации.Получить().Количество() <> 0
Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0
Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Тогда
ВызватьИсключение "Бизнес-объекты и сторонние обработчики не нужны";
КонецЕсли;
Модуль = Метаданные.ОбщиеМодули.Найти("УчебныйЧерновикСКД85");
Если Модуль = Неопределено Или Не Модуль.Сервер Или Модуль.Глобальный Или Модуль.ВызовСервера
Или Модуль.КлиентОбычноеПриложение Или Модуль.КлиентУправляемоеПриложение
Или Модуль.ВнешнееСоединение Или Модуль.Привилегированный
Или Модуль.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Нужен свой неглобальный непривилегированный серверный модуль";
КонецЕсли;
КонецПроцедуры
Функция СоздатьСвойМакет()
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "СвоиПродажи";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "СвоиТриСтроки";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ ""Север"" КАК Магазин, ""Книга"" КАК Наименование, 3 КАК Количество, 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Север"", ""Ручка"", 1, 50
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Юг"", ""Книга"", 2, 500";
Запрос = Новый Запрос;
Запрос.Текст = Набор.Запрос;
СтрокиИсточника = Запрос.Выполнить().Выгрузить();
Если СтрокиИсточника.Количество() <> 3
Или СтрокиИсточника.Итог("Сумма") <> 1300 Или СтрокиИсточника.Итог("Количество") <> 6 Тогда
ВызватьИсключение "Не подтвердились собственные 3 строки и итоги 1300/6";
КонецЕсли;
Для Каждого ИмяРесурса Из СтрРазделить("Сумма,Количество", ",") Цикл
Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = ИмяРесурса;
Ресурс.Выражение = "Сумма(" + ИмяРесурса + ")";
КонецЦикла;
Настройки = Схема.НастройкиПоУмолчанию;
НастройкаТаблицы = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
НастройкаТаблицы.Имя = "СвояМатрица";
НастройкаТаблицы.Использование = Истина;
Выбранное = НастройкаТаблицы.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных("Сумма");
Выбранное.Использование = Истина;
НастройкаСтрок = НастройкаТаблицы.Строки.Добавить();
НастройкаСтрок.Имя = "Магазины";
НастройкаСтрок.Использование = Истина;
НастройкаКолонок = НастройкаТаблицы.Колонки.Добавить();
НастройкаКолонок.Имя = "Товары";
НастройкаКолонок.Использование = Истина;
ПолеСтрок = НастройкаСтрок.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеСтрок.Поле = Новый ПолеКомпоновкиДанных("Магазин");
ПолеСтрок.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеСтрок.Использование = Истина;
ПолеКолонок = НастройкаКолонок.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеКолонок.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ПолеКолонок.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеКолонок.Использование = Истина;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанных"), Истина);
Если ТипЗнч(Макет) <> Тип("МакетКомпоновкиДанных") Тогда ВызватьИсключение "Нет собственного макета"; КонецЕсли;
Возврат Макет;
КонецФункции
Функция НайтиТаблицу(Макет)
Найденные = Новый Массив;
Для Каждого Часть Из Макет.Тело Цикл
Если ТипЗнч(Часть) = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда Найденные.Добавить(Часть); КонецЕсли;
КонецЦикла;
Если Найденные.Количество() <> 1 Тогда ВызватьИсключение "Нужна ровно одна собственная матрица"; КонецЕсли;
Возврат Найденные.Получить(0);
КонецФункции
Функция НайтиГруппу(ТелоОси, ИмяПоля)
Найденные = Новый Массив;
Для Каждого Часть Из ТелоОси Цикл
Если ТипЗнч(Часть) = Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных") Тогда
Для Каждого ЭлементПоля Из Часть.Группировка Цикл
Если ЭлементПоля.ИмяПоля = ИмяПоля Тогда Найденные.Добавить(Часть); КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если Найденные.Количество() <> 1 Тогда
ВызватьИсключение "Подготовка не завершена: структура настоящей оси не совпала с простым уроком";
КонецЕсли;
Возврат Найденные.Получить(0);
КонецФункции
Функция СнятьПоле(Группа, ИмяПоля)
Если ТипЗнч(Группа) <> Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных") Тогда ВызватьИсключение "Не табличная группа"; КонецЕсли;
Полей = 0;
Для Каждого ЭлементПоля Из Группа.Группировка Цикл
Если ТипЗнч(ЭлементПоля) <> Тип("ЭлементГруппировкиМакетаКомпоновкиДанных")
Или ЭлементПоля.ИмяПоля <> ИмяПоля Или ИмяПоля = ""
Или ТипЗнч(ЭлементПоля.Выражение) <> Тип("Строка")
Или ЭлементПоля.ТипГруппировки <> ТипГруппировкиКомпоновкиДанных.Элементы Тогда
ВызватьИсключение "Нужно реальное непустое поле собственной простой группировки";
КонецЕсли;
Полей = Полей + 1;
Снимок = Новый Структура("ИмяПоля,Выражение,ТипГруппировки",
ЭлементПоля.ИмяПоля, ЭлементПоля.Выражение, ЭлементПоля.ТипГруппировки);
КонецЦикла;
Если Полей <> 1 Тогда ВызватьИсключение "Нужно ровно одно настоящее поле группы"; КонецЕсли;
Возврат Снимок;
КонецФункции
Процедура ЗаполнитьГруппу(Группа, ИмяГруппы, Снимок)
Если ТипЗнч(Группа) <> Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Положительная фабрика Add/Insert вернула не табличную группу";
КонецЕсли;
Группа.Имя = ИмяГруппы;
ЭлементПоля = Группа.Группировка.Добавить();
ЭлементПоля.ИмяПоля = Снимок.ИмяПоля;
ЭлементПоля.Выражение = Снимок.Выражение;
ЭлементПоля.ТипГруппировки = Снимок.ТипГруппировки;
СнятьПоле(Группа, Снимок.ИмяПоля);
КонецПроцедуры
Процедура ПроверитьИмяОбласти(Макет, Имя)
Если ТипЗнч(Имя) <> Тип("Строка") Или Имя = "" Тогда ВызватьИсключение "Нужно реальное имя своей области"; КонецЕсли;
Описание = Макет.Макеты.Найти(Имя);
Если ТипЗнч(Описание) <> Тип("ОписаниеМакетаОбластиМакетаКомпоновкиДанных") Или Описание.Имя <> Имя Тогда
ВызватьИсключение "Ссылка не разрешается в том же собственном черновике";
КонецЕсли;
КонецПроцедуры
Функция НайтиРолевуюПару(Черновик, Строки, Колонки)
Источники = Новый Массив;
Источники.Добавить(Новый Структура("Группа,ДругаяОсь", Строки, Колонки));
Источники.Добавить(Новый Структура("Группа,ДругаяОсь", Колонки, Строки));
Для Каждого Ось Из Источники Цикл
Макросы = Новый Массив;
Макросы.Добавить(Ось.Группа.МакетШапки);
Макросы.Добавить(Ось.Группа.МакетПодвала);
ДругаяОсь = Новый Массив;
ДругаяОсь.Добавить(Ось.ДругаяОсь.МакетШапки);
ДругаяОсь.Добавить(Ось.ДругаяОсь.МакетПодвала);
Для Каждого Макрос Из Макросы Цикл
Если ТипЗнч(Макрос) <> Тип("МакетГруппировкиТаблицыМакетаКомпоновкиДанных") Тогда Продолжить; КонецЕсли;
Для Каждого ЗаписьРесурса Из Макрос.МакетРесурсов Цикл
Если ТипЗнч(ЗаписьРесурса) <> Тип("МакетТелаТаблицыМакетаКомпоновкиДанных") Тогда
ВызватьИсключение "Нативная коллекция ресурса имеет другой тип элемента";
КонецЕсли;
ИмяРесурса = ЗаписьРесурса.Макет;
ИмяПересечения = ЗаписьРесурса.МакетГруппировки;
Если ТипЗнч(ИмяРесурса) <> Тип("Строка") Или ТипЗнч(ИмяПересечения) <> Тип("Строка") Тогда
ВызватьИсключение "Ссылки native resource entry должны быть строками";
КонецЕсли;
Если ИмяРесурса = "" Или ИмяПересечения = "" Или ИмяРесурса = ИмяПересечения Тогда Продолжить; КонецЕсли;
Для Каждого ДругойМакрос Из ДругаяОсь Цикл
Если ТипЗнч(ДругойМакрос) = Тип("МакетГруппировкиТаблицыМакетаКомпоновкиДанных")
И ДругойМакрос.Макет = ИмяПересечения Тогда
ПроверитьИмяОбласти(Черновик, ИмяРесурса);
ПроверитьИмяОбласти(Черновик, ИмяПересечения);
Возврат Новый Структура("Коллекция,Ресурс,Пересечение",
Макрос.МакетРесурсов, ИмяРесурса, ИмяПересечения);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ВызватьИсключение "Подготовка не завершена: нет реальной пары resource cell / группы противоположной оси. Это НЕ успешный пример и НЕ повод подставлять случайные имена";
КонецФункции
Функция СформироватьДокумент(Макет)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Документ = Новый ТабличныйДокумент;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Вывод.УстановитьДокумент(Документ);
Вывод.Вывести(Процессор);
Возврат Документ;
КонецФункции
Функция КоординатаПодписи(Документ, Подпись, ПоСтроке)
Координата = 0;
Для НомерСтроки = 1 По Документ.ВысотаТаблицы Цикл
Для НомерКолонки = 1 По Документ.ШиринаТаблицы Цикл
Если СокрЛП(Документ.Область(НомерСтроки, НомерКолонки).Текст) = Подпись Тогда
Текущая = ?(ПоСтроке, НомерСтроки, НомерКолонки);
Если Координата <> 0 И Координата <> Текущая Тогда ВызватьИсключение "Неоднозначная подпись собственного отчёта"; КонецЕсли;
Координата = Текущая;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Координата = 0 Тогда ВызватьИсключение "В настоящем отчёте нет ожидаемой собственной подписи"; КонецЕсли;
Возврат Координата;
КонецФункции
Функция ЧислоВЯчейке(Ячейка, ДопуститьПустое = Ложь)
Если Ячейка.СодержитЗначение Тогда
Значение = Ячейка.Значение;
Если ТипЗнч(Значение) = Тип("Число") Тогда Возврат Значение; КонецЕсли;
КонецЕсли;
Текст = СтрЗаменить(СтрЗаменить(СокрЛП(Ячейка.Текст), Символ(160), ""), " ", "");
Если Текст = "" И ДопуститьПустое Тогда Возврат 0; КонецЕсли;
Если Текст = "" Тогда ВызватьИсключение "Нет настоящего числа в собственной ячейке"; КонецЕсли;
Для Позиция = 1 По СтрДлина(Текст) Цикл
Если СтрНайти("0123456789", Сред(Текст, Позиция, 1)) = 0 Тогда
ВызватьИсключение "Ожидается целочисленный учебный результат, а не произвольный текст";
КонецЕсли;
КонецЦикла;
Возврат Число(Текст);
КонецФункции
Процедура ПроверитьМатрицу(Документ)
Если ТипЗнч(Документ) <> Тип("ТабличныйДокумент")
Или Документ.ВысотаТаблицы < 1 Или Документ.ВысотаТаблицы > 200
Или Документ.ШиринаТаблицы < 1 Или Документ.ШиринаТаблицы > 100 Тогда
ВызватьИсключение "Нужен настоящий маленький собственный результат СКД";
КонецЕсли;
Север = КоординатаПодписи(Документ, "Север", Истина);
Юг = КоординатаПодписи(Документ, "Юг", Истина);
Книга = КоординатаПодписи(Документ, "Книга", Ложь);
Ручка = КоординатаПодписи(Документ, "Ручка", Ложь);
СеверКнига = ЧислоВЯчейке(Документ.Область(Север, Книга));
СеверРучка = ЧислоВЯчейке(Документ.Область(Север, Ручка));
ЮгКнига = ЧислоВЯчейке(Документ.Область(Юг, Книга));
ЮгРучка = ЧислоВЯчейке(Документ.Область(Юг, Ручка), Истина);
Если СеверКнига <> 750 Или СеверРучка <> 50 Или ЮгКнига <> 500 Или ЮгРучка <> 0
Или СеверКнига + СеверРучка + ЮгКнига + ЮгРучка <> 1300 Тогда
ВызватьИсключение "Настоящие пересечения собственной матрицы не подтвердили 750/50/500/0 и сумму 1300";
КонецЕсли;
КонецПроцедурыМодуль своей управляемой формы ЧерновикСКД85
Конфигуратор → Общие → Общие формы → ЧерновикСКД85 → Модуль. Вставьте весь блок на уровне модуля, не внутрь процедуры; обработчик команды формы ВыполнитьУрок должен быть связан с этой клиентской процедурой.
Своя управляемая форма: ВыполнитьУрок исполняется на клиенте, ВыполнитьНаСервере — на сервере без контекста. Вызов общего модуля только на сервере; клиенту возвращается текст.
&НаКлиенте
Процедура ВыполнитьУрок(Команда)
Сообщить(ВыполнитьНаСервере());
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
Возврат УчебныйЧерновикСКД85.ВыполнитьУрок();
КонецФункцииМодуль своей общей команды ОткрытьЧерновикСКД85
Конфигуратор → Общие → Общие команды → ОткрытьЧерновикСКД85 → Модуль команды. Вставьте блок целиком на уровне модуля. Разместите команду в собственной подсистеме УчебнаяСКД85.
Клиентский обработчик своей общей команды управляемого приложения. Открывает только собственную общую форму ЧерновикСКД85; не вызывайте серверный урок автоматически при старте приложения.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.ЧерновикСКД85");
КонецПроцедурыРазбор по шагам
Построить собственную схему, настройки и контрольный макет. В пятый параметр компоновщика передаётся Тип генератора, не экземпляр. Настоящий источник подтверждает 3 строки и 1300/6, настоящий документ — четыре пересечения матрицы.
Вторым полным вызовом фабрики создать новую схему/настройки/компоновщик и отдельный черновик. Найти настоящие группы Магазин и Наименование по их заполненным полям.
Снять Макет и МакетГруппировки из одного native resource entry настоящего макроса. Intersection должен совпасть с макросом другой оси; обе строки разрешаются в Макеты того же черновика. Случайное registry-имя не подходит.
Добавить настоящий МакетТелаТаблицы через ресурсную коллекцию и заполнить доказанную пару строк. Добавить настоящую ссылку области через тело макета. Проверить типы, увеличение коллекции и разрешение ссылок.
В собственном теле группы черновика показать Очистить, Добавить и Вставить(0, Тип(...)). Две настоящие группы получают полезные имена и по одному реальному полю из compiler descriptors. Порядок Наименование, затем Магазин.
Сохранить читаемый паспорт, отменить только прототип групп посредством Очистить и снова проверить неизменённый контрольный документ и новый вывод контрольного макета. Частичный черновик процессору не передаётся.
Как проверить результат
Успех требует actual native результата: источник 3 строки, сумма 1300, количество 6; четыре ячейки матрицы 750/50/500/пусто либо 0. Повторные контрольные проверки также проходят.
Пара взята из одного настоящего entry, содержит разные непустые строки и реальную opposite-axis роль. Обе ссылки принадлежат тому же actual черновику. Если такой пары нет, это неполная подготовка, а не успешная демонстрация трёх ресурсных пунктов.
Новый ресурс имеет native тип МакетТелаТаблицы..., коллекция увеличилась на 1; новая ссылка области имеет native тип МакетОбласти... и разрешается в реальное описание.
Количество тела прототипа 0 → 1 → 2 → 0. Обе native группы имеют по одному заполненному descriptor; имя без настоящего поля не подходит.
В собственной lab-копии проверьте отрицательные изменения: неверный путь/версия, случайное имя области, перепутанная пара, пустое поле, alias вместо второй фабрики. Нарушение инварианта должно остановить опыт; STOP не считать успехом.
Проверки здесь статические. Реальный результат зависит от формы native compiler output. Сигнатуры и типы не доказывают успешного запуска в 1С.
Ожидаемый результат
Ожидается источник 3 строки и 1300/6, настоящая матрица 750/50/500/0, доказанная native пара областей, порядок двух заполненных групп и отмена только черновика. Если native пары нет, урок не завершён. Запуск в 1С не проверялся.
На что обратить внимание
Новый ГенераторМакетаКомпоновкиДанных запрещён. Передаётся Тип в пятый аргумент Выполнить.
Тело, Группировка, МакетРесурсов и Макеты — readonly контейнеры. Меняют только дочерние коллекции их разрешёнными методами.
Add/Insert принимают Тип, не готовый объект. Выбран ГруппировкаТаблицы..., присутствующий и во входном, и возвращаемом native контракте. Не используются спорные возвраты макросов или Move/Delete.
Пара ресурс/пересечение всегда из одного actual entry. Нельзя подставлять одинаковые строки, random registry имена, имена другой компиляции или неизвестный входной объект.
Header/Footer не обязаны дать требуемую пару в каждом релизе. Ветка неполной подготовки намеренная и не считается успешной runtime демонстрацией.
Непустой descriptor — настоящее поле в коллекции Группировка с реальным типом группировки, не пустой getter-образец.
Прототип ссылок и порядка не является готовым исполнимым отчётом. Скалярный паспорт описывает опыт; Очистить затрагивает только собственную память.
Количество 6 проверено в источнике; в матрице выбран ресурс Сумма. Сумма четырёх native ячеек не выдаётся за проверку каждого автоматически оформленного общего итога.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.