Синтаксис и применение ЭлементРезультатаКомпоновкиДанных.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.
Синтаксис
Новый ЭлементРезультатаКомпоновкиДанныхПолное описание, параметры и ограничения
ЭлементРезультатаКомпоновкиДанных.По умолчанию
ЭлементРезультатаКомпоновкиДанных (DataCompositionResultItem)
По умолчанию
Синтаксис:
Новый ЭлементРезультатаКомпоновкиДанных
Методическая информация
Практические примеры
Оформить строку печати и изменить порядок её полей без потери данных
У собственной ячейки отдельно оформляем текст товара, числовое поле и фон. Вставляем префикс, переставляем поля, удаляем только префикс, затем очищаем и пересоздаём свою строку с оформлением.
Где и как запускать
Полный клиентский общий модуль УчебныеОбласти85 обычного приложения. Только толстый клиент; Пульт отдельным модулем ниже. Не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую учебную базу платформы 8.5.1.1343, имя конфигурации УчебныеОбластиСКД85, совместимость НеИспользовать, обычное приложение и толстый клиент. Не рабочая база. Здесь код и UI не выполнялись: runtimeVerifiedScenarios=0.
Общий модуль УчебныеОбласти85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, остальные клиентские флаги=Нет, Привилегированный=Нет. Вставьте полный модуль одного урока, включая функции. Не вставляйте его внутрь другой процедуры.
Создайте собственную обработку УчебныеОбласти85 с обычной основной формой Пульт. Кнопка Выполнить, действие ВыполнитьНажатие. Отдельный полный модуль формы дан ниже; назначьте действие кнопки и проверьте F7 перед будущим запуском.
Для диаграммы схема, настройки, макет и расшифровки создаются в памяти. Local-запрос содержит ровно Север/Книга 3 и 750, Север/Ручка 1 и 50, Юг/Книга 2 и 500. Контроль: 3 строки, 6 единиц, сумма 1300. Справочников, регистров и внешних наборов нет.
Серии диаграммы группируются по Магазин, точки по Наименование, выбран ресурс Сумма. Код берёт реально созданные объекты из Макет.Макеты. Если нужного типа нет, выдаёт ошибку: конструктор для него не придумывается.
Для урока строки печати источник другой: собственный МакетОбластиКомпоновкиДанных со строкой и ячейкой, текстом Книга и числом 750. Урок управляет полями этой ячейки и вручную выводит один собственный ЭлементРезультатаКомпоновкиДанных.
Окна сравнения открываются без имени файла. Не выбирайте печать/сохранение. Новые макеты не берутся из глобальной библиотеки и не меняют общие/пользовательские настройки оформления. Закройте только свои учебные окна вручную.
Поставьте точки останова перед выводом: изучите различия типов макетов и оформление. Сверка типов, параметров и арифметики не доказывает визуальный результат. Каждый урок запускайте отдельно и заново; 1С здесь не запускалась.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
Область = Новый МакетОбластиКомпоновкиДанных;
СтрокаОбласти = Область.Добавить(Тип("СтрокаТаблицыОбластиКомпоновкиДанных"));
СтрокаОбласти.ИдентификаторТаблицы = "own-book-appearance-85";
Ячейка = СтрокаОбласти.Ячейки.Добавить();
Поля = Ячейка.Элементы;
Товар = Поля.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
Товар.Значение = "Книга";
Сумма = Поля.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
Сумма.Значение = 750;
ПрименитьСвойПараметр(Товар.Оформление, "ЦветТекста", Новый Цвет(0, 80, 120));
ПрименитьСвойПараметр(Сумма.Оформление, "Формат", "ЧДЦ=2");
ПрименитьСвойПараметр(Ячейка.Оформление, "ЦветФона", Новый Цвет(240, 248, 255));
Исходный = ВывестиСвоюСтроку(Область);
Префикс = Поля.Вставить(0, Тип("ПолеОбластиКомпоновкиДанных"));
Префикс.Значение = "Товар: ";
Если Поля.Индекс(Префикс) <> 0 Или Поля.Получить(1) <> Товар Тогда
ВызватьИсключение "Префикс должен стоять перед своим товаром";
КонецЕсли;
Поля.Сдвинуть(Сумма, -1);
Если Поля.Получить(1) <> Сумма Тогда
ВызватьИсключение "Своя сумма не сдвинута перед товаром";
КонецЕсли;
Переставленный = ВывестиСвоюСтроку(Область);
Поля.Сдвинуть(Сумма, 1);
Поля.Удалить(Префикс);
Если Поля.Количество() <> 2 Или Поля.Получить(0) <> Товар Или Поля.Получить(1) <> Сумма Тогда
ВызватьИсключение "Удален не префикс или нарушен собственный порядок";
КонецЕсли;
Поля.Очистить();
Если Поля.Количество() <> 0 Тогда
ВызватьИсключение "Не очищены собственные поля ячейки";
КонецЕсли;
Товар = Поля.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
Товар.Значение = "Книга";
Сумма = Поля.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
Сумма.Значение = 750;
ПрименитьСвойПараметр(Товар.Оформление, "ЦветТекста", Новый Цвет(0, 80, 120));
ПрименитьСвойПараметр(Сумма.Оформление, "Формат", "ЧДЦ=2");
Если Поля.Количество() <> 2 Или Товар.Значение <> "Книга" Или Сумма.Значение <> 750 Тогда
ВызватьИсключение "Не восстановлено содержимое собственной строки";
КонецЕсли;
Восстановленный = ВывестиСвоюСтроку(Область);
Исходный.Показать("Своя строка: оформление поля и ячейки", "", Ложь);
Переставленный.Показать("Своя строка: префикс и новый порядок", "", Ложь);
Восстановленный.Показать("Своя строка: пересозданные поля", "", Истина);
КонецПроцедуры
Функция ВывестиСвоюСтроку(Область)
Элемент = Новый ЭлементРезультатаКомпоновкиДанных;
Элемент.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец;
Описание = Элемент.Макеты.Добавить();
Описание.Имя = "СвояСтрокаКниги85";
Описание.Макет = Область;
Элемент.Макет = Описание.Имя;
Документ = Новый ТабличныйДокумент;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Вывод.УстановитьДокумент(Документ);
Вывод.НачатьВывод();
Вывод.ВывестиЭлемент(Элемент);
Итог = Вывод.ЗакончитьВывод();
Если ТипЗнч(Итог) <> Тип("ТабличныйДокумент") Или Итог.ВысотаТаблицы = 0 Тогда
ВызватьИсключение "Собственная строка не выведена в табличный документ";
КонецЕсли;
Возврат Итог;
КонецФункции
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеОбластиСКД85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедуры
Процедура ПрименитьСвойПараметр(Оформление, Имя, Значение)
Параметр = Новый ПараметрКомпоновкиДанных(Имя);
Доступный = Оформление.ДоступныеПараметры.НайтиПараметр(Параметр);
Если Доступный = Неопределено Тогда
ВызватьИсключение "У этого типа оформления нет параметра " + Имя;
КонецЕсли;
Если ТипЗнч(Оформление) = Тип("ОформлениеГруппировкиДиаграммыОбластиКомпоновкиДанных") Тогда
КлючПоиска = Новый ПолеКомпоновкиДанных(Имя);
Иначе
КлючПоиска = Параметр;
КонецЕсли;
Оформление.УстановитьЗначениеПараметра(Параметр, Значение);
Установленный = Оформление.НайтиЗначениеПараметра(КлючПоиска);
Если Установленный = Неопределено Тогда
ВызватьИсключение "Установленный параметр не найден: " + Имя;
КонецЕсли;
Если Не Установленный.Использование Или Установленный.Значение <> Значение Или Оформление.Элементы.Количество() = 0 Тогда
ВызватьИсключение "Не подтверждены значение и включение параметра " + Имя;
КонецЕсли;
КонецПроцедурыУчебныеОбласти85.Пульт
УчебныеОбластиСКД85 → Обработки → УчебныеОбласти85 → Формы → Пульт → Модуль
Полный отдельный модуль своей обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеОбласти85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Проверка контекста отказывает для другой версии, имени конфигурации или активной чужой транзакции.
Объекты оформления не создаются через недокументированный Новый. У readonly-свойства получаем изменяемый контейнер; само свойство не переназначаем.
ДоступныеПараметры содержит описание допустимых параметров, Элементы — реальные значения. НайтиПараметр и НайтиЗначениеПараметра решают разные задачи.
УстановитьЗначениеПараметра включает Использование. После присваивания проверяем наличие, Значение и этот флаг; неизвестное имя не подменяется фиктивным свойством.
Новый МакетОбластиКомпоновкиДанных содержит строку таблицы и ячейку. Поля появляются только через её Элементы.Добавить/Вставить с типом ПолеОбластиКомпоновкиДанных.
ЦветТекста применяется к полю Книга, Формат=ЧДЦ=2 — к числу 750, ЦветФона — к ячейке. Оформление поля и оформление ячейки имеют разные типы и доступные параметры.
Вставить(0,Тип(...)) создаёт префикс перед товаром. Индекс и Получить проверяют реальный порядок; Сдвинуть(Сумма,-1) переносит только эту существующую сумму.
Удалить получает именно свой Префикс, не условный индекс. Очистить удаляет только поля своей ячейки, не строку источника или бизнес-данные.
После Очистить создаются новые поля с прежними литералами и заново назначается их оформление. Старые ссылки не объявляются сохранёнными; сохраняется содержание учебной строки.
Ручной элемент вывода получает именованное описание своей области, а Элемент.Макет — строковое имя, не сам объект. ТипЭлемента=НачалоИКонец; НачатьВывод, ВывестиЭлемент и ЗакончитьВывод образуют полный цикл.
Как проверить результат
Будущий ручной тест: F7 и запуск только в своём новом стенде. Если нужный тип/параметр не найден, зафиксируйте точную ошибку; успешное сообщение подставлять нельзя.
Сравнение выполняется в отдельных собственных окнах без имени файла. Визуальный результат и размеры не подтверждены статическими тестами.
Будущий тест: первый и последний документы содержат Книга и 750 с цветом текста/фоном и двумя десятичными знаками. Средний документ показывает префикс и изменённый порядок.
После удаления префикса порядок Товар/Сумма, после очистки Количество=0, после пересоздания Количество=2. В отладчике поля последнего этапа новые, их Значение снова Книга и 750.
Замените 750 на 751 только при первичном создании: конечный контроль согласованного пересоздания требует соответствующей правки; это изменение данных, а не действие формата.
Ожидаемый результат
Подготовлен полный собственный учебный опыт с выводом в память и ручным сравнением. runtimeVerifiedScenarios=0.
На что обратить внимание
Оформление результата компоновки отличается от настроек СКД и от глобальной библиотеки оформления. Здесь изменяется только собственный новый макет.
Результат вывода не равен исходным строкам запроса: высота табличного документа не должна сравниваться с количеством продаж.
Нельзя удалять/добавлять значения параметров в коллекцию, связанную с ДоступныеПараметры. Здесь значения меняются штатным методом и существующим флагом; глубокой копии всего оформления не обещаем.
ЭлементРезультата.Макет — строковое имя. Передача МакетОбласти напрямую противоречит справке; объект хранится в элементе его каталога Макеты.
Очищаем коллекцию ПОЛЕЙ собственной ячейки, не связанные с доступными параметрами коллекции оформления. Пересоздание полей не является глубокой копией или возвратом их прежней идентичности.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Подготовить собственный каталог параметров строки продажи
Различаем имя параметра и текст выражения. Создаём определения товара, количества и суммы, проверяем тип, порядок и поиск, переименовываем количество и очищаем только определения.
Где и как запускать
Серверный общий модуль УчебныеОбластиСКД85. Собственный черновик областей или параметров без запуска процессора вывода.
Подготовка
В отдельной собственной учебной базе 8.5.1.1343 создайте общий модуль УчебныеОбластиСКД85: Сервер — Да, Клиент — Нет, Глобальный — Нет, Вызов сервера — Нет, Привилегированный — Нет.
Вставьте весь приведённый модуль одного урока: экспортную процедуру и функцию СоздатьУчебнуюОбласть. Из серверного обработчика команды своей учебной обработки вызовите УчебныеОбластиСКД85.ВыполнитьПример();.
Задача — подготовить и проверить собственный каталог описаний областей или параметров. Это редактирование служебных объектов в памяти, не запуск готового отчёта и не изменение рабочего макета.
Объект ЭлементРезультатаКомпоновкиДанных здесь создаётся конструктором специально для владения собственной коллекцией Макеты. Этот элемент не передаётся процессору вывода.
У собственной области есть настоящая строка, ячейка и поле с текстовым значением. Это МакетОбластиКомпоновкиДанных, не ТабличныйДокумент и не строковое имя области.
Смотрите сообщения и значения в отладчике. Индексы начинаются с нуля; Сдвинуть принимает объект и относительное смещение, Удалить — объект, Получить — индекс.
Очистить и Удалить действуют только на заново созданные коллекции этого модуля. После удаления элементы больше не используются. Записи базы, чужие отчёты, файлы и сеть не затрагиваются.
В 1С код не запускался. Сигнатуры и readonly сверены статически с установленной справкой; ожидаемые проверки подтвердите в собственной учебной базе.
Процедура ВыполнитьПример() Экспорт
Контейнер = Новый ЭлементРезультатаКомпоновкиДанных;
ОписаниеСтроки = Контейнер.Макеты.Добавить();
ОписаниеСтроки.Имя = "УчебнаяСтрокаПродажи";
ОписаниеСтроки.Макет = СоздатьУчебнуюОбласть("Черновик параметров строки продажи");
Параметры = ОписаниеСтроки.Параметры;
Товар = Параметры.Добавить(Тип("ПараметрОбластиВыражениеКомпоновкиДанных"));
Товар.Имя = "Товар";
Товар.Выражение = "Наименование";
СуммаСтроки = Параметры.Добавить(Тип("ПараметрОбластиВыражениеКомпоновкиДанных"));
СуммаСтроки.Имя = "СуммаСтроки";
СуммаСтроки.Выражение = "Количество * Цена";
Число = Параметры.Вставить(1, Тип("ПараметрОбластиВыражениеКомпоновкиДанных"));
Число.Имя = "Количество";
Число.Выражение = "Количество";
Сообщить(Параметры.Количество() = 3);
Сообщить(Параметры.Индекс(Число) = 1);
Сообщить(Параметры.Получить(0) = Товар);
НайденнаяСумма = Параметры.Найти("СуммаСтроки");
Если НайденнаяСумма = Неопределено Тогда
ВызватьИсключение "Не найдено собственное описание параметра суммы";
КонецЕсли;
Если ТипЗнч(НайденнаяСумма) <> Тип("ПараметрОбластиВыражениеКомпоновкиДанных") Тогда
ВызватьИсключение "Для учебной суммы требуется параметр-выражение";
КонецЕсли;
Сообщить(НайденнаяСумма = СуммаСтроки);
Сообщить(НайденнаяСумма.Выражение = "Количество * Цена");
Параметры.Сдвинуть(Число, 1);
Сообщить(Параметры.Индекс(Число) = 2);
Сообщить(Параметры.Получить(1) = СуммаСтроки);
Число.Имя = "ЧислоЕдиниц";
Сообщить(Параметры.Найти("Количество") = Неопределено);
Сообщить(Параметры.Найти("ЧислоЕдиниц") = Число);
Сообщить(Число.Выражение = "Количество");
Параметры.Удалить(СуммаСтроки);
Сообщить(Параметры.Количество() = 2);
Сообщить(Параметры.Найти("СуммаСтроки") = Неопределено);
Сообщить(Параметры.Получить(1) = Число);
Параметры.Очистить();
Сообщить(Параметры.Количество() = 0);
Сообщить(ОписаниеСтроки.Параметры.Количество() = 0);
Сообщить(Контейнер.Макеты.Количество() = 1);
Сообщить(ТипЗнч(ОписаниеСтроки.Макет) = Тип("МакетОбластиКомпоновкиДанных"));
КонецПроцедуры
Функция СоздатьУчебнуюОбласть(ТекстОбласти)
Область = Новый МакетОбластиКомпоновкиДанных;
СтрокаОбласти = Область.Добавить(Тип("СтрокаТаблицыОбластиКомпоновкиДанных"));
Ячейка = СтрокаОбласти.Ячейки.Добавить();
Поле = Ячейка.Элементы.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
Поле.Значение = ТекстОбласти;
Возврат Область;
КонецФункцииРазбор по шагам
Сначала создаём своё описание области и настоящий макет с текстовым полем. Параметры берём у этого описания; переменная ссылается на его коллекцию.
Добавить требует Тип. Передаём точный ПараметрОбластиВыражениеКомпоновкиДанных, не строковое имя и не значение суммы.
Имя — название определения, Выражение — строка языка выражений СКД. У суммы сохраняется Количество * Цена, но этот урок её не исполняет.
Вставить(1, Тип(...)) ставит количество между товаром и суммой. Получить и Индекс проверяют ожидаемый порядок.
После Найти отдельно защищаемся от отсутствия элемента и проверяем точный тип перед чтением Выражение. Коллекция может содержать и параметры расшифровки другого типа.
Сдвинуть перемещает количество на одну позицию вправо. После переименования Имя поиск по старому ключу ничего не находит, поиск по новому возвращает тот же объект.
Переименование определения не изменяет Выражение: оно по-прежнему ссылается на поле Количество, а не на имя ЧислоЕдиниц.
Удаляем объект определения суммы, затем очищаем собственные параметры. Само описание области и его Макет остаются; это разные уровни объектов.
Как проверить результат
Все семнадцать сравнений должны дать Истина. Параметров сначала три, после удаления суммы два, после очистки ноль.
В отладчике найдите СуммаСтроки до удаления: это ПараметрОбластиВыражениеКомпоновкиДанных, Выражение содержит Количество * Цена.
После переименования Найти("Количество") возвращает Неопределено, а Найти("ЧислоЕдиниц") — тот же объект с неизменённым выражением.
После очистки Контейнер.Макеты содержит одно описание области; сама область не стирается вместе с коллекцией параметров.
Ожидаемый результат
Все девять операций коллекции параметров изучены на собственных определениях, без подмены текста выражения вычисленным значением.
На что обратить внимание
Readonly относится к ссылке: нельзя присвоить новый объект свойству Макеты или Параметры. Добавить и Очистить меняют содержимое полученной собственной коллекции.
Индекс и объект — разные аргументы. Удалить не принимает здесь число вместо описания, а Сдвинуть — не абсолютную будущую позицию.
Найти может вернуть Неопределено; перед чтением его результата стоит явная проверка. Имена в собственном каталоге заданы уникальными.
Это законченная задача редактирования собственного черновика. Наличие описаний не доказывает, что собран согласованный элемент для ВывестиЭлемент.
Код не выводит отчёт, не обращается к рабочей конфигурации и не запускался в 1С. Проверки описывают ожидаемое поведение учебного стенда.
Выражение не равно значению: строка Количество * Цена сама не становится числом 750. Здесь нет компоновки, вычисления, расшифровки или привязки параметров к текстовому полю области.
Текстовая область — учебный объект для владения каталогом, не доказательство готовности макета к выводу. Вычисление реальных данных показано в отдельных уроках запуска СКД.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.