При разработке отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда одна и та же номенклатура дублируется в строках. Это происходит в тех случаях, когда для одного товара определено несколько видов цен (например, оптовая, розничная, закупочная). Если выводить данные простым списком, СКД создает новую строку для каждого сочетания номенклатуры и цены. Ситуация усложняется, когда в этот же отчет необходимо добавить изображение товара. Разберем подробно, как решить эту задачу и добиться корректного отображения всех данных в одной строке.
Прежде всего, проанализируем ситуацию: дублирование возникает из-за того, что в наборе данных присутствует связь "один ко многим" (одна номенклатура — много цен). Если мы просто добавим поля Номенклатура, ВидЦены и Цена в детальные записи, платформа выведет столько строк, сколько записей найдет в регистре цен. Наша задача — "развернуть" виды цен в колонки, а номенклатуру оставить уникальной строкой.
Самый эффективный способ избежать дублирования и вывести цены в разные столбцы — это использование структуры "Таблица" вместо обычного списка в настройках СКД. Рассмотрим, как это сделать по шагам:
Номенклатура. Именно здесь мы будем выводить название товара и его изображение.ВидЦены. Это позволит системе создать для каждого вида цены отдельный столбец.Цена.Такая структура автоматически заставит СКД "схлопнуть" данные по номенклатуре. На пересечении строки товара и колонки вида цены будет отображаться соответствующее значение цены.
Когда мы используем группировку по номенклатуре, простое добавление поля изображения в "Выбранные поля" может не сработать, так как поле с типом ДвоичныеДанные или ХранилищеЗначения не может быть ключом группировки. Проанализируем способы обхода этого ограничения:
Способ 1: Добавление поля в выбранные поля группировки
В настройках группировки "Номенклатура" перейдите на вкладку "Выбранные поля". Добавьте туда поле Изображение (или ДвоичныеДанныеФайла). В современных версиях платформы 8.3 это позволяет вывести картинку рядом с наименованием, если поле не является ресурсом.
Способ 2: Использование агрегатных функций (Ресурсы)
Если первый способ не помогает, мы можем сделать поле изображения ресурсом. На вкладке "Ресурсы" добавим наше поле. В качестве выражения обычно используют функцию Максимум(). Однако для бинарных данных стандартный Максимум может работать некорректно. Попробуем прописать выражение с проверкой на пустое значение:
Максимум(ЕстьNULL(Изображение, ""))
Важно помнить, что если в запросе поле имеет тип ХранилищеЗначения, его необходимо преобразовать в ДвоичныеДанные, чтобы СКД могла обработать его как картинку.
Выясним причину, почему изображение может не выводиться даже при правильных настройках. В 1С изображения могут храниться по-разному. Если вы используете Библиотеку стандартных подсистем (БСП), то данные файла часто лежат в отдельной таблице. Проверьте ваш запрос: вы должны получать именно поле с типом ДвоичныеДанные. Если в результате запроса приходит NULL или неопределенный тип, картинка не отобразится.
Если изображение хранится в реквизите типа ХранилищеЗначения, рассмотрим пример выражения в вычисляемом поле для извлечения данных:
// В поле "Выражение" вычисляемого поля
ПолучитьДанныеКартинки(Номенклатура.ФайлПревью)
Где ПолучитьДанныеКартинки — это функция в общем модуле с признаком "Сервер", "Внешнее соединение", которая извлекает данные из хранилища и возвращает объект Картинка или двоичные данные.
Для достижения идеального визуального результата, когда нужно жестко задать размер картинки в ячейке, рекомендуется использовать Макеты СКД. Рассмотрим этот процесс:
Изображение.ПараметрКартинка), который свяжем с нашим полем из набора данных.Чтобы отчет выглядел профессионально, проанализируем настройки на вкладке "Другие настройки":
1. Расположение полей группировок: установите значение Вместе. Это позволит вывести Номенклатуру и Изображение в одной ячейке или максимально близко друг к другу без лишних разделителей.
2. Минимальная ширина и высота: для поля с изображением обязательно задайте параметры МинимальнаяШирина и МинимальнаяВысота. Часто картинка "пропадает" просто потому, что СКД устанавливает высоту строки в 0 пикселей для пустых с ее точки зрения данных.
Используя структуру Таблицы для разворота цен и механизм Ресурсов или Макетов для вывода бинарных данных, мы получаем мощный инструмент для создания информативных прайс-листов и каталогов товаров непосредственно в 1С без использования сторонних обработок.