СКД: Использование макетов для вывода "сложных" группировок, ресурсов и итогов.

04.12.20

Разработка - Работа с интерфейсом

В данной статье я на простом примере покажу как можно использовать макеты СКД для вывода различных нестандартных вариантов группировок, ресурсов и итогов.


    В сети есть множество примеров по использованию макетов в СКД, но большинство из них показывают элементарные вещи, как-то: изменение шрифта, цвета текста или фона, т.е. то с чем вполне успешно справляется и условное оформление. Пожалуй, самым распространенным и востребованным примером использования макетов в СКД является замена в итогах надписи "Итого" на "Всего" (или любое другое необходимое слово). 
    Но макет - это не только оформление, размер шрифта или текст заголовка, мало кто знает, (или может знает, но не видит, как это применить на практике), что в параметрах макетов можно использовать выражения, а в выражениях, соответственно, можно использовать функции (например, СтрШаблон()), что открывает поистине обширные возможности. Я не случайно взял в заголовке слово «сложных» в кавычки, ведь многие вещи, кажущиеся на первый взгляд сложными, решаются средствами СКД весьма просто.

    В качестве примера, рассмотрим создание печатной формы "Анализ заказа". Дано: Компания торгует весовым товаром, например картофелем. Валюта управленческого учета – 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!
 

СКД макеты итоги

См. также

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    62985    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    18854    26    6    

41

Работа с интерфейсом Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

1500 руб.

06.10.2020    10224    7    7    

10

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    16796    mrXoxot    43    

121

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

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

27.05.2024    7349    smielka    37    

100

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    14787    913    elcoan    47    

117

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    11913    162    acces969    31    

124
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. akim2040 47 04.12.20 13:27 Сейчас в теме
Однозначно лайк!
lenna1c; extalionos; +2 Ответить
2. RomanCrow13 111 07.12.20 04:50 Сейчас в теме
Да, неплохая статья.
У меня за 3 года работы 1Сником был только один клиент, требующий отчет с жесткой структурой. Встречал тех, кто работает гораздо дольше моего, а макеты в СКД так и не использовал.
Я бы дополнил в статью информацию, как в макетах настраивать расшифровку полей.
3. user1502278 241 07.12.20 14:12 Сейчас в теме
(2)
Я бы дополнил в статью информацию, как в макетах настраивать расшифровку полей.

Спасибо за отзыв и за тему для следующей статьи :)
4. unichkin 1579 07.12.20 15:51 Сейчас в теме
Очень имею негативное впечатление от произвольных макетов в СКД. Уж очень больно их дорабатывать.. Добавляем например новый заголовок, хотим чтобы в макете он располагался выше существующих. После вставки строки - *все* строки ниже съезжают, при этом в описании группировок адрес не меняется. А если после этого случайно закрыть сохраненный макет, они сотрутся, т.к. на ячейку нет ссылки.
Стараюсь как можно реже использовать этот механизм. В данной конкретной задаче (имхо) лучше через СКД получить набор данных, и вывести его в фиксированный макет.
5. user1502278 241 07.12.20 16:08 Сейчас в теме
(4)
головок, хотим чтобы в макете он располагался выше существующих. После вставки строки - *все* строки ниже съезжают, при этом в описании группировок адрес не м


Да, к редактору макетов СКД в первое время есть вопросы, но с его "странностями" быстро свыкаешься и впоследствии они уже не кажутся такими странностями. Основываясь на до-СКД-шном опыте работы с построителем и макетами, поначалу пытаешься рисовать макеты готовыми таблицами(заголовок-таблица-подвал), а при сохранении эта вся структура ломается, что вызывает недоумение... Но вскоре выясняется, что строки в табличном документе редактора макетов автоматически сортируются и группируются по видам (заголовки, группировки, ресурсы) и в этом есть какая-то своя логика и порядок.
6. 7OH 70 08.12.20 20:35 Сейчас в теме
(4) тоже никогда не смотрел в сторону макетов по одной причине:
если структуру менять запрещаем (а мы запрещаем, так как любая смена структуры отчета и отчет идёт лесом) - то проще действительно получить данные и вывести в обычный макет.
При этом уже можно и группировки с объединением, которые СКД даже макетами не может, и другие плюшки.
unichkin; +1 Ответить
7. user1502278 241 08.12.20 21:21 Сейчас в теме
(6)
если структуру менять запрещаем (а мы запрещаем, так как любая смена структуры отчета и отчет идёт лесом) - то проще действительно получить данные и вывести в обычный макет.


Чем проще? Придется кодить - получить макет, заполнить параметры, вывести, вот это вот все. Т.е. вместо того чтобы сделать все в одной СКД-шке, вам нужно:
1) Отдельный запрос
2) Отдельный макет
3) Отдельный обработчик получения данных, расчета итогов и вывода.

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

Ну и, собственно, это примеры того как можно сделать, если вам проще с обычными макетами работать - никто ж не запрещает, но, согласитесь, знать несколько способов решения задачи никогда не повредит.
LimarenkoA; +1 Ответить
12. 7OH 70 08.12.20 21:38 Сейчас в теме
(7)
1) Отдельный запрос
2) Отдельный макет
3) Отдельный обработчик получения данных, расчета итогов и вывода.

1 и 3 сделает сама СКД - тут сложностей ноль - код вывода в таблицу\дерево на каждом сайте можно найти.
Вот 2 - согласен, но если нужно именно красиво и быстро - обычный макет плюс пара циклов рулят.
При этом его и поддерживать будет проще, нежели макеты в СКД.
8. user1502278 241 08.12.20 21:23 Сейчас в теме
(6)
При этом уже можно и группировки с объединением, которые СКД даже макетами не может

Не совсем понял, какие группировки с объединением СКД не может, приведёте пример?
10. 7OH 70 08.12.20 21:29 Сейчас в теме
(8)
первый ряд - надпись сумма (на 8 ячеек - объединенная)
второй ряд - 8 колонок складов, например.
Увы - даже макеты этому не помогут - только ручная постобработка.
11. user1502278 241 08.12.20 21:37 Сейчас в теме
(10)
первый ряд - надпись сумма (на 8 ячеек - объединенная)
второй ряд - 8 колонок складов, например.
Увы - даже макеты этому не помогут - только ручная постобработка.

Ну т.е. первая строка группировки, допустим, какая-то номенклатура, общее количество остатка,
а вторая склады с разворотом остатка по всем складам? Такое решается на СКД.
14. 7OH 70 08.12.20 21:43 Сейчас в теме
(11) попробуйте сделать хотя бы вот так.
Можно сначала погуглить - все попытки это сделать обычно приводят к постобработке ручками.
Прикрепленные файлы:
15. user1502278 241 08.12.20 21:57 Сейчас в теме
(14)
сначала погуглить - все попытки это сделать обычно приводят к постобработке ручками.
Прикрепленные файлы:


Т.е. первая группировка склад, у нее "показатель" организация, вторая - номенклатура, показатели - цена по типу цен с указанием типа цен в заголовке, я правильно понял?
9. user1503726 08.12.20 21:27 Сейчас в теме
У меня не получилось вывести в СКД нечто вроде планировщика. С раскраской клеточек в зависимости от каких-то показателей, которые в самом СКД не выводятся.
Условное оформление требует наличия показателя для условия в готовом виде. А если показатель есть, то условное оформление уже как рабочий инструмент и носитель информации и не требуется, только как элемент дизайна.
13. user1502278 241 08.12.20 21:42 Сейчас в теме
(9) В данном примере я использовал поле "Порядок" для условного оформления(раскраски строк), при этом в сам отчет оно нигде не выводится. Если вы в макете не укажете параметры для вывода ненужных вам полей - они не выведутся.
user1503726; +1 Ответить
Оставьте свое сообщение