Область оформления: свои элементы, порядок и цвет настоящих строк отчёта

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

Берем полный Основной макет и создаем собственную независимую копию через XML-строку. В ее реальной области ДетальныеЗаписи проверяем очистку, добавление, вставку, индексы, получение, сдвиг и удаление. В итоговой области оставляем один элемент уровня0; настоящий отчет должен сохранить числа и получить фон14/178/222 в шести ячейках, затем вернуть исходные цвета.

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

Полный серверный общий модуль нового собственного стенда УчебныеЭлементыОформления85; отдельный модуль формы запуска ниже.

Подготовка

  1. Создать НОВУЮ отдельную пустую учебную базу ровно8.5.1.1343: конфигурация УчебныеЭлементыОформления85, совместимость Не использовать. Без бизнес-объектов, заданий, подписок и расширений; не рабочую базу и не ее копию.

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

  3. Конфигуратор → Обработки → УчебныеЭлементыОформления85 → Формы → Пульт: управляемая форма, команда Выполнить, действие Выполнить и кнопка с этой командой. Отдельный полный модуль запуска приведен ниже; реквизиты не нужны.

  4. Сохранить и обновить свою базу данных (F7), открыть обработку в новом своем клиенте. Здесь F7 и1С не выполнялись: это будущая ручная проверка.

  5. Собственный Local-запрос содержит только Книга3/250/750 и Ручка1/50/50; выбранные поля Наименование, Количество, Цена, Сумма и одна группа деталей. Нет ресурсов, итоговых строк, собственного условного оформления или иных таблиц.

  6. Макет Основной только читается. Каждая изменяемая копия создается из полного XML в памяти; библиотечный объект, общие макеты и пользовательские настройки не изменяются.

  7. Поставить точки останова после получения Область и перед компоновкой измененного макета. Нужна реальная область ДетальныеЗаписи; при отсутствии код остановится, а не создаст неизвестный объект через несуществующий конструктор.

  8. runtimeVerifiedScenarios=0. Числовые/цветовые проверки подготовлены в коде, но в1С здесь не выполнялись. Нет файлов, архивов, резервных копий, сети, печати или изменения production.

Функция ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Схема = Новый СхемаКомпоновкиДанных;
    ЗаполнитьСвоиДанные(Схема);
    ЗаполнитьСвоиНачальныеНастройки(Схема.НастройкиПоУмолчанию);
    ТекстСхемы = СвойОбъектРасшифровкиВСтроку(Схема);
    ИсходныйМакет = БиблиотекаМакетовОформленияКомпоновкиДанных.Основной;
    ТекстИсходного = СвойОбъектРасшифровкиВСтроку(ИсходныйМакет);
    СвойМакет = СвойОбъектРасшифровкиИзСтроки(ТекстИсходного, Тип("МакетОформленияКомпоновкиДанных"));
    ТекстСвоегоДо = СвойОбъектРасшифровкиВСтроку(СвойМакет);
    ДокументДо = ПолучитьСвойОтчетСОформлением(Схема, СвойМакет);
    ФоныДо = ПолучитьСвоиФоныЧисел(ДокументДо, Ложь);
    Область = ПолучитьСвоюОбластьДеталей(СвойМакет);
    Область.Очистить();
    Если Область.Количество() <> 0 Тогда
        ВызватьИсключение "Очистилась только область деталей собственной копии, не вся библиотека";
    КонецЕсли;
    Основной = Область.Добавить();
    НастроитьСвойЭлементОбласти(Основной, Новый Цвет(14, 178, 222));
    Временный = Область.Вставить(0);
    НастроитьСвойЭлементОбласти(Временный, Новый Цвет(88, 98, 108));
    Если Область.Количество() <> 2 Или Область.Индекс(Временный) <> 0
        Или Область.Индекс(Основной) <> 1 Или Область.Получить(0) <> Временный Тогда
        ВызватьИсключение "В своей области должны быть два настоящих элемента в проверенном порядке";
    КонецЕсли;
    Область.Сдвинуть(Основной, -1);
    Если Область.Индекс(Основной) <> 0 Или Область.Индекс(Временный) <> 1
        Или Область.Получить(0) <> Основной Или Область.Получить(1) <> Временный Тогда
        ВызватьИсключение "Сдвиг на минус1 должен поменять реальные позиции элементов";
    КонецЕсли;
    Область.Удалить(Временный);
    Если Область.Количество() <> 1 Или Область.Индекс(Основной) <> 0
        Или Область.Получить(0) <> Основной Или Основной.Уровень <> 0 Тогда
        ВызватьИсключение "Перед компоновкой в области деталей оставляем только один свой элемент уровня0";
    КонецЕсли;
    ДокументПослеИзменения = ПолучитьСвойОтчетСОформлением(Схема, СвойМакет);
    ФоныПослеИзменения = ПолучитьСвоиФоныЧисел(ДокументПослеИзменения, Истина);
    Если ФоныПослеИзменения.Количество() <> 6 Тогда
        ВызватьИсключение "Подсветка должна подтвердиться в шести настоящих числовых ячейках двух товаров";
    КонецЕсли;
    ВосстановленныйМакет = СвойОбъектРасшифровкиИзСтроки(ТекстСвоегоДо, Тип("МакетОформленияКомпоновкиДанных"));
    Если СвойОбъектРасшифровкиВСтроку(ВосстановленныйМакет) <> ТекстСвоегоДо Тогда
        ВызватьИсключение "Восстанавливается весь свой макет со всеми областями, не один параметр цвета";
    КонецЕсли;
    ДокументВосстановления = ПолучитьСвойОтчетСОформлением(Схема, ВосстановленныйМакет);
    ФоныВосстановления = ПолучитьСвоиФоныЧисел(ДокументВосстановления, Ложь);
    Для Каждого ЗаписьФона Из ФоныДо Цикл
        Если ФоныВосстановления.Получить(ЗаписьФона.Ключ) <> ЗаписьФона.Значение Тогда
            ВызватьИсключение "Восстановление полного макета должно вернуть исходный реальный RGB каждой числовой ячейки";
        КонецЕсли;
    КонецЦикла;
    Если СвойОбъектРасшифровкиВСтроку(ИсходныйМакет) <> ТекстИсходного
        Или СвойОбъектРасшифровкиВСтроку(Схема) <> ТекстСхемы Тогда
        ВызватьИсключение "Своя правка не должна менять исходный библиотечный макет или схему";
    КонецЕсли;
    Возврат "Свой макет: вставка→сдвиг→удаление; шесть RGB14/178/222; исходные цвета восстановлены; количество4 и сумма800 во всех трех отчетах";
КонецФункции

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Процедура ЗаполнитьСвоиДанные(Схема)
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "УчебныйИсточник";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Набор.Имя = "УчебныеТовары";
    Набор.ИсточникДанных = Источник.Имя;
    Набор.АвтоЗаполнениеДоступныхПолей = Истина;
    Набор.Запрос = "ВЫБРАТЬ
    |    ""Книга"" КАК Наименование,
    |    3 КАК Количество,
    |    250 КАК Цена,
    |    750 КАК Сумма
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ ""Ручка"", 1, 50, 50";
КонецПроцедуры

Процедура ЗаполнитьСвоиНачальныеНастройки(Настройки)
    Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
        Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
        Выбранное.Использование = Истина;
    КонецЦикла;
    Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Детали.Использование = Истина;
    АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоВыбор.Использование = Истина;
КонецПроцедуры

Функция ПолучитьСвоюОбластьДеталей(Макет)
    Если ТипЗнч(Макет) <> Тип("МакетОформленияКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен полный собственный макет оформления";
    КонецЕсли;
    ПараметрОбласти = Макет.Найти("ДетальныеЗаписи");
    Если ПараметрОбласти = Неопределено Тогда
        ВызватьИсключение "В фактической копии Основного макета не найдена предопределенная область ДетальныеЗаписи";
    КонецЕсли;
    Если ТипЗнч(ПараметрОбласти.Значение) <> Тип("ОбластьМакетаОформленияКомпоновкиДанных") Тогда
        ВызватьИсключение "Значение настоящего параметра области должно быть коллекцией ее элементов";
    КонецЕсли;
    Возврат ПараметрОбласти.Значение;
КонецФункции

Процедура НастроитьСвойЭлементОбласти(Элемент, ЦветФона)
    Если ТипЗнч(Элемент) <> Тип("ЭлементОбластиМакетаОформленияКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен настоящий элемент своей области, полученный Добавить или Вставить";
    КонецЕсли;
    Элемент.Уровень = 0;
    Оформление = Элемент.Оформление;
    Ключ = Новый ПараметрКомпоновкиДанных("ЦветФона");
    Если Оформление.ДоступныеПараметры.НайтиПараметр(Ключ) = Неопределено Тогда
        ВызватьИсключение "В реальном оформлении своей области должен быть доступен ЦветФона";
    КонецЕсли;
    Оформление.УстановитьЗначениеПараметра(Ключ, ЦветФона);
    ЗначениеФона = Оформление.НайтиЗначениеПараметра(Ключ);
    Если ЗначениеФона = Неопределено Тогда
        ВызватьИсключение "Настоящий установленный фон не найден в модели оформления";
    КонецЕсли;
    Если Не ЗначениеФона.Использование Или ЗначениеФона.Значение <> ЦветФона Или Элемент.Уровень <> 0 Тогда
        ВызватьИсключение "Уровень0 и включенный собственный цвет должны реально сохраниться";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьСвойОтчетСОформлением(Схема, Оформление)
    Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = Компоновщик.Выполнить(Схема, Схема.НастройкиПоУмолчанию, , Оформление, Тип("ГенераторМакетаКомпоновкиДанных"));
    Возврат ПолучитьСвойПроверенныйДокумент(Макет, "");
КонецФункции

Функция ПолучитьСвоиФоныЧисел(Документ, ПроверятьНовыйЦвет)
    Колонки = Новый Соответствие;
    Для НомерСтроки = 1 По Документ.ВысотаТаблицы Цикл
        Для НомерКолонки = 1 По Документ.ШиринаТаблицы Цикл
            Текст = СокрЛП(Документ.Область(НомерСтроки, НомерКолонки).Текст);
            Если Текст = "Наименование" Или Текст = "Количество" Или Текст = "Цена" Или Текст = "Сумма" Тогда
                Колонки.Вставить(Текст, НомерКолонки);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    Если Колонки.Количество() <> 4 Тогда
        ВызватьИсключение "Цвет проверяется только по фактически найденным четырем колонкам своей таблицы";
    КонецЕсли;
    Фоны = Новый Соответствие;
    Для НомерСтроки = 1 По Документ.ВысотаТаблицы Цикл
        Товар = СокрЛП(Документ.Область(НомерСтроки, Колонки.Получить("Наименование")).Текст);
        Если Товар = "Книга" Или Товар = "Ручка" Тогда
            Для Каждого ИмяПоля Из СтрРазделить("Количество,Цена,Сумма", ",") Цикл
                Ячейка = Документ.Область(НомерСтроки, Колонки.Получить(ИмяПоля));
                Если ПрочитатьСвоеЧисло(Ячейка) = Неопределено Тогда
                    ВызватьИсключение "Цвет без настоящего числа не считается результатом опыта";
                КонецЕсли;
                Фон = Ячейка.ЦветФона.ПолучитьАбсолютный();
                Если ПроверятьНовыйЦвет И (Фон.Красный <> 14 Или Фон.Зеленый <> 178 Или Фон.Синий <> 222) Тогда
                    ВызватьИсключение "Реальный фон каждой числовой ячейки должен быть14/178/222";
                КонецЕсли;
                Ключ = Товар + ":" + ИмяПоля;
                Если Фоны.Получить(Ключ) <> Неопределено Тогда
                    ВызватьИсключение "Числовая ячейка собственного товара должна учитываться один раз";
                КонецЕсли;
                Фоны.Вставить(Ключ, Строка(Фон.Красный) + "/" + Строка(Фон.Зеленый) + "/" + Строка(Фон.Синий));
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Если Фоны.Количество() <> 6 Тогда
        ВызватьИсключение "Нужно проверить шесть реальных ячеек количества, цены и суммы Книги и Ручки";
    КонецЕсли;
    Возврат Фоны;
КонецФункции

Функция ПолучитьСвойПроверенныйДокумент(Макет, Заголовок)
    Копия = СвойОбъектРасшифровкиИзСтроки(СвойОбъектРасшифровкиВСтроку(Макет), Тип("МакетКомпоновкиДанных"));
    Документ = СформироватьСвойДокумент(Копия);
    Если Документ.ВысотаТаблицы = 0 Или Документ.ВысотаТаблицы > 200
        Или Документ.ШиринаТаблицы = 0 Или Документ.ШиринаТаблицы > 100 Тогда
        ВызватьИсключение "Ожидается только собственный небольшой табличный отчет";
    КонецЕсли;
    Колонки = Новый Соответствие;
    СтрокаЗаголовков = 0;
    ЗаголовокНайден = Заголовок = "";
    Для НомерСтроки = 1 По Документ.ВысотаТаблицы Цикл
        Кандидат = Новый Соответствие;
        Для НомерКолонки = 1 По Документ.ШиринаТаблицы Цикл
            Текст = СокрЛП(Документ.Область(НомерСтроки, НомерКолонки).Текст);
            Если Заголовок <> "" И Текст = Заголовок Тогда
                ЗаголовокНайден = Истина;
            КонецЕсли;
            Если Текст = "Наименование" Или Текст = "Количество" Или Текст = "Цена" Или Текст = "Сумма" Тогда
                Если Кандидат.Получить(Текст) <> Неопределено Тогда
                    ВызватьИсключение "В собственной строке заголовков не должно быть дублей поля";
                КонецЕсли;
                Кандидат.Вставить(Текст, НомерКолонки);
            КонецЕсли;
        КонецЦикла;
        Если Кандидат.Количество() = 4 Тогда
            Если СтрокаЗаголовков <> 0 Тогда
                ВызватьИсключение "В этом собственном опыте только одна четырехпольная таблица";
            КонецЕсли;
            СтрокаЗаголовков = НомерСтроки;
            Колонки = Кандидат;
        КонецЕсли;
    КонецЦикла;
    Если СтрокаЗаголовков = 0 Или Не ЗаголовокНайден Тогда
        ВызватьИсключение "Не найдены настоящий заголовок и все четыре заголовка полей";
    КонецЕсли;
    Книга = Ложь;
    Ручка = Ложь;
    ИтогКоличество = 0;
    ИтогСумма = 0;
    Для НомерСтроки = СтрокаЗаголовков + 1 По Документ.ВысотаТаблицы Цикл
        Наименование = СокрЛП(Документ.Область(НомерСтроки, Колонки.Получить("Наименование")).Текст);
        Количество = ПрочитатьСвоеЧисло(Документ.Область(НомерСтроки, Колонки.Получить("Количество")));
        Цена = ПрочитатьСвоеЧисло(Документ.Область(НомерСтроки, Колонки.Получить("Цена")));
        Сумма = ПрочитатьСвоеЧисло(Документ.Область(НомерСтроки, Колонки.Получить("Сумма")));
        Если Наименование <> "Книга" И Наименование <> "Ручка"
            И (Количество <> Неопределено Или Цена <> Неопределено Или Сумма <> Неопределено) Тогда
            ВызватьИсключение "В собственном отчете без итоговых строк не должно быть посторонних числовых строк";
        КонецЕсли;
        Если Наименование = "Книга" Или Наименование = "Ручка" Тогда
            Если Количество = Неопределено Или Цена = Неопределено Или Сумма = Неопределено Тогда
                ВызватьИсключение "В реальной строке товара должны находиться три настоящих числа";
            КонецЕсли;
            Если Наименование = "Книга" Тогда
                Если Книга Или Количество <> 3 Или Цена <> 250 Или Сумма <> 750 Тогда
                    ВызватьИсключение "Книга должна выводиться ровно один раз: 3, 250, 750";
                КонецЕсли;
                Книга = Истина;
            Иначе
                Если Ручка Или Количество <> 1 Или Цена <> 50 Или Сумма <> 50 Тогда
                    ВызватьИсключение "Ручка должна выводиться ровно один раз: 1, 50, 50";
                КонецЕсли;
                Ручка = Истина;
            КонецЕсли;
            ИтогКоличество = ИтогКоличество + Количество;
            ИтогСумма = ИтогСумма + Сумма;
        КонецЕсли;
    КонецЦикла;
    Если Не Книга Или Не Ручка Или ИтогКоличество <> 4 Или ИтогСумма <> 800 Тогда
        ВызватьИсключение "Настоящие строки должны сохранить количество4 и сумму800";
    КонецЕсли;
    Возврат Документ;
КонецФункции

Функция СформироватьСвойДокумент(СвойМакет)
    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(СвойМакет);
    Документ = Новый ТабличныйДокумент;
    Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    Вывод.ОтображатьПроцентВывода = Ложь;
    Вывод.УстановитьДокумент(Документ);
    РезультатВывода = Вывод.Вывести(Процессор, Ложь);
    Если ТипЗнч(РезультатВывода) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "Не получен собственный табличный документ";
    КонецЕсли;
    Возврат РезультатВывода;
КонецФункции


Функция ПрочитатьСвоеЧисло(Ячейка)
    Если Ячейка.СодержитЗначение Тогда
        Значение = Ячейка.Значение;
        Если ТипЗнч(Значение) = Тип("Число") Тогда
            Возврат Значение;
        КонецЕсли;
        Возврат Неопределено;
    КонецЕсли;
    Текст = СтрЗаменить(СтрЗаменить(СокрЛП(Ячейка.Текст), Символ(160), ""), " ", "");
    Если Текст = "" Тогда
        Возврат Неопределено;
    КонецЕсли;
    ЕстьЦифра = Ложь;
    Для Позиция = 1 По СтрДлина(Текст) Цикл
        Знак = Сред(Текст, Позиция, 1);
        Если СтрНайти("0123456789", Знак) > 0 Тогда
            ЕстьЦифра = Истина;
        ИначеЕсли СтрНайти(",.-", Знак) = 0 Тогда
            Возврат Неопределено;
        КонецЕсли;
    КонецЦикла;
    Если Не ЕстьЦифра Тогда
        Возврат Неопределено;
    КонецЕсли;
    Возврат Число(Текст);
КонецФункции

Функция СвойОбъектРасшифровкиВСтроку(Объект)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Объект);
    Возврат Запись.Закрыть();
КонецФункции

Функция СвойОбъектРасшифровкиИзСтроки(СтрокаXML, ТребуемыйТип)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(СтрокаXML);
    Попытка
        Объект = СериализаторXDTO.ПрочитатьXML(Чтение, ТребуемыйТип);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    Если ТипЗнч(Объект) <> ТребуемыйТип Тогда
        ВызватьИсключение "Нужен полный собственный типизированный объект, не кусок ссылок";
    КонецЕсли;
    Возврат Объект;
КонецФункции
УчебныеЭлементыОформления85.Пульт

УчебныеЭлементыОформления85 → Обработки → УчебныеЭлементыОформления85 → Формы → Пульт → Модуль

Полный модуль собственной управляемой формы; здесь не выполнялся.

&НаКлиенте
Процедура Выполнить(Команда)
    Сообщить(ВыполнитьНаСервере());
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
    Возврат УчебныеЭлементыОформления85.ВыполнитьПример();
КонецФункции

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

  1. Сформировать первый настоящий документ из собственной копии полного макета. Проверить четыре заголовка, две реальные строки и все шесть чисел; запомнить фактические RGB числовых ячеек по ключам Товар:ИмяПоля.

  2. МакетОформленияКомпоновкиДанных является коллекцией значений параметров: найти предопределенный параметр ДетальныеЗаписи, затем проверить тип его Значение. Это реальная ОбластьМакетаОформленияКомпоновкиДанных, не весь макет и не ЭлементОбласти.

  3. Очистить только эту область собственной копии. Добавить основной элемент с цветом14/178/222; вставить временный серый элемент на позицию0. Проверить количество2, реальные индексы0/1 и объект через Получить(0).

  4. Сдвинуть основной элемент на-1 и проверить оба новых индекса и оба результата Получить. Удалить именно временный объект. Промежуточные две записи не передаются компоновщику: перед формированием должен остаться один основной элемент уровня0.

  5. Уровень0 для ДетальныеЗаписи обязателен по установленной справке. Оформление readonly: не заменять объект, а проверить доступность ЦветФона и установить значение внутри него. Флаг использования и само значение дополнительно читать из реальной модели.

  6. Передать полный измененный макет четвертым аргументом Выполнить стандартному генератору табличного документа. Снова проверить обе строки3/250/750 и1/50/50, количество4, сумму800; затем читать реальные ЦветФона всех шести числовых ячеек.

  7. Восстановить весь собственный макет из исходного XML, а не сбросить одно свойство цвета. Третий новый отчет должен сохранить все числа и вернуть первоначальные RGB для каждого из шести ключей.

  8. Полный XML исходного библиотечного макета и всей схемы должен остаться неизменным. Документы не сохраняются и не печатаются; для будущего просмотра остановиться в отладчике на переменных трех документов.

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

  1. Будущий запуск: операции коллекции меняют реальные позиции, после удаления остаются один элемент и уровень0. У измененного отчета именно шесть числовых ячеек имеют RGB14/178/222.

  2. Каждый из трех документов проверяется заново по настоящим данным: Книга3/250/750, Ручка1/50/50, количество4, сумма800. Проверяющий код не записывает ожидаемые числа или цвета в документ.

  3. После полного восстановления RGB каждого ключа должен совпасть с фактически прочитанным первым документом. Исходный цвет не зашит как белый и не считается известным заранее.

  4. Отрицательный опыт в своем коде: изменить основной цвет на15/178/222 при прежней проверке14/178/222. Проверка реальных ячеек должна отказать; совпадение значений только в модели макета не достаточно.

  5. Отдельный отрицательный опыт: изменить количество Книги на30 при прежних ожидаемых числах. Числовая проверка должна отказать независимо от цвета. runtimeVerifiedScenarios=0: это будущие условия приемки, не выполненный здесь тест1С.

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

Полный урок проверяет операции собственной области, три настоящих результата, шесть реальных RGB и восстановление всего макета. Здесь в1С не выполнялся.

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

  1. У ОбластьМакетаОформленияКомпоновкиДанных нет самостоятельного конструктора. Она получается как Значение настоящего параметра области полного макета; Добавить возвращает ее элемент, а не еще одну область.

  2. Очистить применяется только к области независимой копии. Не очищать библиотеку, чужой макет или весь макет вместо одной области. Копирование выполняется в памяти, новых резервных файлов нет.

  3. Для ДетальныеЗаписи всегда нужен уровень0. Этот опыт не создает положительные уровни и не проверяет иерархические группировки. Два временных элемента существуют только до компоновки; финальная область содержит один.

  4. Оформление элемента readonly, но его разрешенные параметры редактируются. Сначала проверить действительную доступность ЦветФона; не создавать параметр с произвольным именем.

  5. Цвет модели и цвет результата — разные проверки. Перед чтением RGB вызывается ПолучитьАбсолютный: у не абсолютного Цвет компоненты возвращают-1 и не различают реальные стили. Метод доступен с8.3.23 и разрешен на сервере8.5.1.1343. Это не доказательство экранного рендеринга, работы принтера или сохранения другим пользователям.

  6. Поиск координат и числовая проверка рассчитаны на собственную двухстрочную таблицу без ресурсов, итогов и объединенных числовых ячеек. Для другого отчета нужен другой контроль, а не отключение ошибок.

  7. Код работает на сервере, а клиент получает только текст итога. Не добавлять в этот модуль методы интерактивного конструктора макета оформления: они относятся к другому контексту и отдельному уроку.

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

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

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

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

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