Берем полный Основной макет и создаем собственную независимую копию через XML-строку. В ее реальной области ДетальныеЗаписи проверяем очистку, добавление, вставку, индексы, получение, сдвиг и удаление. В итоговой области оставляем один элемент уровня0; настоящий отчет должен сохранить числа и получить фон14/178/222 в шести ячейках, затем вернуть исходные цвета.
Где и как запускать
Полный серверный общий модуль нового собственного стенда УчебныеЭлементыОформления85; отдельный модуль формы запуска ниже.
Подготовка
Создать НОВУЮ отдельную пустую учебную базу ровно8.5.1.1343: конфигурация УчебныеЭлементыОформления85, совместимость Не использовать. Без бизнес-объектов, заданий, подписок и расширений; не рабочую базу и не ее копию.
Конфигуратор → Общие → Общие модули → УчебныеЭлементыОформления85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить полный основной код урока и все его функции.
Конфигуратор → Обработки → УчебныеЭлементыОформления85 → Формы → Пульт: управляемая форма, команда Выполнить, действие Выполнить и кнопка с этой командой. Отдельный полный модуль запуска приведен ниже; реквизиты не нужны.
Сохранить и обновить свою базу данных (F7), открыть обработку в новом своем клиенте. Здесь F7 и1С не выполнялись: это будущая ручная проверка.
Собственный Local-запрос содержит только Книга3/250/750 и Ручка1/50/50; выбранные поля Наименование, Количество, Цена, Сумма и одна группа деталей. Нет ресурсов, итоговых строк, собственного условного оформления или иных таблиц.
Макет Основной только читается. Каждая изменяемая копия создается из полного XML в памяти; библиотечный объект, общие макеты и пользовательские настройки не изменяются.
Поставить точки останова после получения Область и перед компоновкой измененного макета. Нужна реальная область ДетальныеЗаписи; при отсутствии код остановится, а не создаст неизвестный объект через несуществующий конструктор.
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.ВыполнитьПример();
КонецФункцииРазбор по шагам
Сформировать первый настоящий документ из собственной копии полного макета. Проверить четыре заголовка, две реальные строки и все шесть чисел; запомнить фактические RGB числовых ячеек по ключам Товар:ИмяПоля.
МакетОформленияКомпоновкиДанных является коллекцией значений параметров: найти предопределенный параметр ДетальныеЗаписи, затем проверить тип его Значение. Это реальная ОбластьМакетаОформленияКомпоновкиДанных, не весь макет и не ЭлементОбласти.
Очистить только эту область собственной копии. Добавить основной элемент с цветом14/178/222; вставить временный серый элемент на позицию0. Проверить количество2, реальные индексы0/1 и объект через Получить(0).
Сдвинуть основной элемент на-1 и проверить оба новых индекса и оба результата Получить. Удалить именно временный объект. Промежуточные две записи не передаются компоновщику: перед формированием должен остаться один основной элемент уровня0.
Уровень0 для ДетальныеЗаписи обязателен по установленной справке. Оформление readonly: не заменять объект, а проверить доступность ЦветФона и установить значение внутри него. Флаг использования и само значение дополнительно читать из реальной модели.
Передать полный измененный макет четвертым аргументом Выполнить стандартному генератору табличного документа. Снова проверить обе строки3/250/750 и1/50/50, количество4, сумму800; затем читать реальные ЦветФона всех шести числовых ячеек.
Восстановить весь собственный макет из исходного XML, а не сбросить одно свойство цвета. Третий новый отчет должен сохранить все числа и вернуть первоначальные RGB для каждого из шести ключей.
Полный XML исходного библиотечного макета и всей схемы должен остаться неизменным. Документы не сохраняются и не печатаются; для будущего просмотра остановиться в отладчике на переменных трех документов.
Как проверить результат
Будущий запуск: операции коллекции меняют реальные позиции, после удаления остаются один элемент и уровень0. У измененного отчета именно шесть числовых ячеек имеют RGB14/178/222.
Каждый из трех документов проверяется заново по настоящим данным: Книга3/250/750, Ручка1/50/50, количество4, сумма800. Проверяющий код не записывает ожидаемые числа или цвета в документ.
После полного восстановления RGB каждого ключа должен совпасть с фактически прочитанным первым документом. Исходный цвет не зашит как белый и не считается известным заранее.
Отрицательный опыт в своем коде: изменить основной цвет на15/178/222 при прежней проверке14/178/222. Проверка реальных ячеек должна отказать; совпадение значений только в модели макета не достаточно.
Отдельный отрицательный опыт: изменить количество Книги на30 при прежних ожидаемых числах. Числовая проверка должна отказать независимо от цвета. runtimeVerifiedScenarios=0: это будущие условия приемки, не выполненный здесь тест1С.
Ожидаемый результат
Полный урок проверяет операции собственной области, три настоящих результата, шесть реальных RGB и восстановление всего макета. Здесь в1С не выполнялся.
На что обратить внимание
У ОбластьМакетаОформленияКомпоновкиДанных нет самостоятельного конструктора. Она получается как Значение настоящего параметра области полного макета; Добавить возвращает ее элемент, а не еще одну область.
Очистить применяется только к области независимой копии. Не очищать библиотеку, чужой макет или весь макет вместо одной области. Копирование выполняется в памяти, новых резервных файлов нет.
Для ДетальныеЗаписи всегда нужен уровень0. Этот опыт не создает положительные уровни и не проверяет иерархические группировки. Два временных элемента существуют только до компоновки; финальная область содержит один.
Оформление элемента readonly, но его разрешенные параметры редактируются. Сначала проверить действительную доступность ЦветФона; не создавать параметр с произвольным именем.
Цвет модели и цвет результата — разные проверки. Перед чтением RGB вызывается ПолучитьАбсолютный: у не абсолютного Цвет компоненты возвращают-1 и не различают реальные стили. Метод доступен с8.3.23 и разрешен на сервере8.5.1.1343. Это не доказательство экранного рендеринга, работы принтера или сохранения другим пользователям.
Поиск координат и числовая проверка рассчитаны на собственную двухстрочную таблицу без ресурсов, итогов и объединенных числовых ячеек. Для другого отчета нужен другой контроль, а не отключение ошибок.
Код работает на сервере, а клиент получает только текст итога. Не добавлять в этот модуль методы интерактивного конструктора макета оформления: они относятся к другому контексту и отдельному уроку.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.