В сети есть множество примеров по использованию макетов в СКД, но большинство из них показывают элементарные вещи, как-то: изменение шрифта, цвета текста или фона, т.е. то с чем вполне успешно справляется и условное оформление. Пожалуй, самым распространенным и востребованным примером использования макетов в СКД является замена в итогах надписи "Итого" на "Всего" (или любое другое необходимое слово).
Но макет - это не только оформление, размер шрифта или текст заголовка, мало кто знает, (или может знает, но не видит, как это применить на практике), что в параметрах макетов можно использовать выражения, а в выражениях, соответственно, можно использовать функции (например, СтрШаблон()), что открывает поистине обширные возможности. Я не случайно взял в заголовке слово «сложных» в кавычки, ведь многие вещи, кажущиеся на первый взгляд сложными, решаются средствами СКД весьма просто.
В качестве примера, рассмотрим создание печатной формы "Анализ заказа". Дано: Компания торгует весовым товаром, например картофелем. Валюта управленческого учета – USD. Под заказ отгружается(резервируется) товар разных серий с собственных складов, а в случае нехватки - заказывается дополнительно у поставщиков. Количество заказанного у поставщика товара может не совпадать с полученным в итоге ввиду «усушки». Заказ поставщику может быть сделан в отличной от исходного заказа валюте. По каждому заказу клиент хочет видеть количество (вес) отгруженного/ожидаемого от поставщиков товара, потери (усушку) и итоговое количество отгруженного товара с учетом "усушки". Желаемая печатная форма выглядит, допустим, вот так:
Здесь оранжевой строкой выделен сам заказ покупателя, белые строки – резервы товаров под заказ из имеющихся в наличии, серые – товар заказанный у других поставщиков.
Т.е. из 10000кг:
- 1500 было у нас на складах,
- 8000 мы заказали у других поставщиков,
- 60 потеряно в процессе усушки.
Итого недогруз составляет 560кг.
Итак, поехали! Мы сформировали необходимые нам наборы данных (тексты запросов опускаем за ненадобностью):
Названия полей говорят сами за себя, остановлюсь лишь на поле «Порядок». Оно определяет тип строки и используется для сортировки, в условном оформлении и при расчете некоторых итогов, это поле может принимать следующие значения:
1 – сам заказ покупателя (оранжевая строка);
2 – зарезервированные/отгруженные товары (белые строки);
3 – товары заказанные у поставщика (серые строки).
В наборе данных «ПараметрыУсушки» получаются значения параметра «Усушка» (в данном случае, в разрезе складов, но не принципиально).
В наборе данных «Курс», соответственно, курсы валют.
Теперь нам необходимо все это красиво вывести в нашу печатную форму.
1. Для начала небольшой лайфхак с выравниванием. В печатной форме две группировки: по договорам/сериям и по складам, состав колонок незначительно отличается, при этом важно, чтобы колонки с одинаковыми показателями выводились друг под другом. Бонусом, подвалом идет строка с курсом.
Если мы просто попробуем вывести данные группировками,
то они выведутся вразнобой, без какого-либо выравнивания, даже колонки с одинаковым наименованием могут получиться разной ширины. Чтобы все вывелось красиво и ровно, нам нужно выводить нашу печатную форму через таблицу:
Да, для вывода таблица не обязана иметь колонки, в нашем случае достаточно строк. При этом, стоит заметить, что выравнивание по колонкам ресурсов сохранится. Но поскольку мы хотим видеть заголовки и у группировки по складам (а таблица выдаст нам один общий заголовок на все группировки), нам необходимо добавить макет заголовка группировки:
Задача выравнивания решена. Переходим к более интересным вопросам.
2. По умолчанию цена выводится в валюте упр. учета - USD, но если заказ поставщику был оформлен в другой валюте (например, в евро), то необходимо вывести цену в евро из заказа и, в скобках, цену в USD пересчитанную по текущему курсу:
Разумеется, данную задачу, как и любую другую, можно решить несколькими способами, например, через выражения представления полей, но самый универсальный и гибкий вариант, на мой взгляд – через использование макетов. Как уже было сказано в начале статьи, в параметрах макета можно использовать выражения, воспользуемся же этим. Создадим макет группировки (тип макета - заголовок) с указанием необходимых нам полей в качестве параметров:
при этом для параметра «Цена» зададим следующее выражение:
ВЫБОР КОГДА Валюта = &Бакс ТОГДА
Цена
ИНАЧЕ
СтрШаблон("%1 %2 ($%3)", Валюта, ЦенаДокумента, Формат(ЦенаДокумента*Курс, "ЧДЦ=2"))
КОНЕЦ
Здесь:
Валюта – это валюта заказа,
&Бакс - параметр СКД, определяет валюту USD,
ЦенаДокумента – цена в валюте заказа,
Курс - соответственно курс этой валюты к USD.
Т.е. когда валюта документа USD – выводится обычная цена, в противном случае выводится строка согласно заданному шаблону. Выделение ячейки фоном зеленого цвета выполняется обычным условным оформлением, на этом подробно останавливаться не будем и перейдем к следующему «кейсу».
3. В итогах необходимо вывести, количество отгружено/зарезервировано, показатель усушки и остаток с учетом усушки. В зависимости от значения остатка (положительное/отрицательное) необходимо менять текст названия итога (Перегруз/недогруз):
Покажем, как это сделать на примере группировки "Склады". Создадим макет группировки, тип макета – Общий итог заголовок:
Помните при описании наборов данных я отдельно выделил поле «Порядок»? Это поле используется при расчете следующих ресурсов:
Ресурс «Количество» – показывает, сколько мы не допоставляем товара:
Ресурс «Усушка» – это тоже обычный ресурс, рассчитанный общим итогом, без учета строки заказа:
Аналогично рассчитан и ресурс КоличествоПоставлено:
Итак, у нас есть посчитанное значение ресурса «Усушка», теперь для того чтобы вывести итоговое количество с учетом усушки нам не нужно рассчитывать какой-то новый ресурс или модифицировать расчет ресурса «Количество», мы просто в параметрах макета для параметра «Количество» записываем выражение: Количество – Усушка. Таким образом, используя макет мы вывели в одну колонку сразу три различных итоговых показателя, причем один из них дорассчитали непосредственно в макете.
Последний параметр этого макета – «Груз» используется для обозначения «Перегруз»/ «Недогруз» и тоже рассчитывается непосредственно в макете следующим образом:
ВЫБОР
КОГДА Количество - Усушка < 0 ТОГДА "Перегруз"
ИНАЧЕ "Недогруз"
КОНЕЦ
(Привет тем, кто искал как заменить слово «Итого» в итогах :))
Таким образом, мы видим, что грамотное использование макетов системы компоновки данных позволяет строить достаточно сложные отчеты и печатные формы, используя лишь средства СКД и не прибегая непосредственно к написанию кода (код выражений не в счет).
P.S. И в качестве бонуса: как добавить подобную печатную форму к заказу? Очень просто.
Добавляем отчет в конфигурацию:
Создаем у отчета команду «Анализ заказа»:
у команды указываем Тип параметра команды – ДокументСсылка.ЗаказПокупателя (или любые другие нужные нам объекты метаданных), выбираем группу Панель навигации формы.
В обработчике команды прописываем соответствующий вызов формы отчета с параметрами:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы = Новый Структура("Отбор, КлючНазначенияИспользования, СформироватьПриОткрытии, Заголовок",
Новый Структура("Заказ", ПараметрКоманды), "_АнализЗаказа", Истина, СтрШаблон("Анализ заказа %1", ПараметрКоманды));
ОткрытьФорму("Отчет._АнализЗаказа.Форма.ФормаОтчета", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, Истина, ПараметрыВыполненияКоманды.Окно);
КонецПроцедуры
Теперь при открытии управляемой формы заказа покупателя в нем будет доступна команда «Анализ заказа» при клике на которую автоматически сформируется отчет с отбором по данному заказу:
Enjoy!