Проверить области собственной матрицы СКД и отменить отдельный черновик группировок

Учебные задачи

Настоящий контрольный отчёт на трёх своих строках и отдельный memory-черновик: реальные роли ресурсной ячейки и пересечения, ссылки областей, Add/Insert двух непустых групп и Clear без изменения базы.

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

Полный свой неглобальный серверный общий модуль УчебныйЧерновикСКД85. Вызов из реального серверного обработчика своей управляемой формы; только новый пустой lab-стенд, не рабочая база.

Подготовка

  1. Работайте только в новой пустой собственной файловой базе платформы 8.5.1.1343. Здесь 1С не запускалась; рабочие УТ/КА2/УНФ/БП не открывать.

  2. Путь базы C:\1c-labs\OwnMemorySkd85_96d2e47c-5188-4c8c-b6cc-c487279f589f\IB. Имя конфигурации УчебныйЧерновикСКД85; Версия 96d2e47c-5188-4c8c-b6cc-c487279f589f; основной режим Управляемое приложение, совместимость Не использовать. Не загружайте бизнес-конфигурацию или расширения.

  3. Конфигуратор → Общие → Общие модули → УчебныйЧерновикСКД85: Сервер Да; Глобальный, Вызов сервера, оба клиентских контекста, Внешнее соединение и Привилегированный Нет; Повторное использование возвращаемых значений Не использовать. Вставьте основной блок целиком, не внутрь другой процедуры.

  4. Общие → Общие формы → ЧерновикСКД85: управляемая форма без бизнес-реквизитов. Создайте команду формы ВыполнитьУрок, её одноимённый обработчик и кнопку. Отдельный блок модуля формы содержит клиентскую процедуру и серверную функцию без контекста.

  5. Общие → Общие команды → ОткрытьЧерновикСКД85: отдельный блок ОбработкаКоманды. Добавьте команду в собственную подсистему УчебнаяСКД85. Создайте собственную роль и lab-пользователя с правами запуска и доступа к учебным форме/команде. Обновите конфигурацию базы и вручную запустите собственную команду.

  6. Запрос содержит три свои константные строки без ИЗ: Север/Книга 3 и 750, Север/Ручка 1 и 50, Юг/Книга 2 и 500. Количество 6 проверяется по настоящему источнику; матрица показывает ресурс Сумма, четыре пересечения дают 1300.

  7. Поставьте серверную точку останова после НайтиРолевуюПару. Обе строки берутся из одного actual resource entry. Вторая должна совпасть с настоящим макросом противоположной оси того же черновика. Эта форма compiler tree не гарантирована без запуска: отсутствие пары означает неполную подготовку и STOP, не успех.

  8. Клиент получает только текст. Серверные макеты и коллекции не передаются клиенту. Нет файлов, печати, интернета, системных настроек, записи бизнес-объектов или копирования opaque объектов через XML.

  9. После структурных опытов черновик НЕ исполняется как отчёт. Контрольный макет и документ получены отдельным полным вызовом фабрики; очищается лишь тело группы черновика.

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

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

  1. Построить собственную схему, настройки и контрольный макет. В пятый параметр компоновщика передаётся Тип генератора, не экземпляр. Настоящий источник подтверждает 3 строки и 1300/6, настоящий документ — четыре пересечения матрицы.

  2. Вторым полным вызовом фабрики создать новую схему/настройки/компоновщик и отдельный черновик. Найти настоящие группы Магазин и Наименование по их заполненным полям.

  3. Снять Макет и МакетГруппировки из одного native resource entry настоящего макроса. Intersection должен совпасть с макросом другой оси; обе строки разрешаются в Макеты того же черновика. Случайное registry-имя не подходит.

  4. Добавить настоящий МакетТелаТаблицы через ресурсную коллекцию и заполнить доказанную пару строк. Добавить настоящую ссылку области через тело макета. Проверить типы, увеличение коллекции и разрешение ссылок.

  5. В собственном теле группы черновика показать Очистить, Добавить и Вставить(0, Тип(...)). Две настоящие группы получают полезные имена и по одному реальному полю из compiler descriptors. Порядок Наименование, затем Магазин.

  6. Сохранить читаемый паспорт, отменить только прототип групп посредством Очистить и снова проверить неизменённый контрольный документ и новый вывод контрольного макета. Частичный черновик процессору не передаётся.

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

  1. Успех требует actual native результата: источник 3 строки, сумма 1300, количество 6; четыре ячейки матрицы 750/50/500/пусто либо 0. Повторные контрольные проверки также проходят.

  2. Пара взята из одного настоящего entry, содержит разные непустые строки и реальную opposite-axis роль. Обе ссылки принадлежат тому же actual черновику. Если такой пары нет, это неполная подготовка, а не успешная демонстрация трёх ресурсных пунктов.

  3. Новый ресурс имеет native тип МакетТелаТаблицы..., коллекция увеличилась на 1; новая ссылка области имеет native тип МакетОбласти... и разрешается в реальное описание.

  4. Количество тела прототипа 0 → 1 → 2 → 0. Обе native группы имеют по одному заполненному descriptor; имя без настоящего поля не подходит.

  5. В собственной lab-копии проверьте отрицательные изменения: неверный путь/версия, случайное имя области, перепутанная пара, пустое поле, alias вместо второй фабрики. Нарушение инварианта должно остановить опыт; STOP не считать успехом.

  6. Проверки здесь статические. Реальный результат зависит от формы native compiler output. Сигнатуры и типы не доказывают успешного запуска в 1С.

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

Ожидается источник 3 строки и 1300/6, настоящая матрица 750/50/500/0, доказанная native пара областей, порядок двух заполненных групп и отмена только черновика. Если native пары нет, урок не завершён. Запуск в 1С не проверялся.

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

  1. Новый ГенераторМакетаКомпоновкиДанных запрещён. Передаётся Тип в пятый аргумент Выполнить.

  2. Тело, Группировка, МакетРесурсов и Макеты — readonly контейнеры. Меняют только дочерние коллекции их разрешёнными методами.

  3. Add/Insert принимают Тип, не готовый объект. Выбран ГруппировкаТаблицы..., присутствующий и во входном, и возвращаемом native контракте. Не используются спорные возвраты макросов или Move/Delete.

  4. Пара ресурс/пересечение всегда из одного actual entry. Нельзя подставлять одинаковые строки, random registry имена, имена другой компиляции или неизвестный входной объект.

  5. Header/Footer не обязаны дать требуемую пару в каждом релизе. Ветка неполной подготовки намеренная и не считается успешной runtime демонстрацией.

  6. Непустой descriptor — настоящее поле в коллекции Группировка с реальным типом группировки, не пустой getter-образец.

  7. Прототип ссылок и порядка не является готовым исполнимым отчётом. Скалярный паспорт описывает опыт; Очистить затрагивает только собственную память.

  8. Количество 6 проверено в источнике; в матрице выбран ресурс Сумма. Сумма четырёх native ячеек не выдаётся за проверку каждого автоматически оформленного общего итога.

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

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

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

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

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