Как вывести номенклатуру, изображение и цены в одну строку в отчете СКД

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда одна и та же номенклатура дублируется в строках. Это происходит в тех случаях, когда для одного товара определено несколько видов цен (например, оптовая, розничная, закупочная). Если выводить данные простым списком, СКД создает новую строку для каждого сочетания номенклатуры и цены. Ситуация усложняется, когда в этот же отчет необходимо добавить изображение товара. Разберем подробно, как решить эту задачу и добиться корректного отображения всех данных в одной строке.

Анализ причины дублирования строк

Прежде всего, проанализируем ситуацию: дублирование возникает из-за того, что в наборе данных присутствует связь "один ко многим" (одна номенклатура — много цен). Если мы просто добавим поля Номенклатура, ВидЦены и Цена в детальные записи, платформа выведет столько строк, сколько записей найдет в регистре цен. Наша задача — "развернуть" виды цен в колонки, а номенклатуру оставить уникальной строкой.

Преобразование структуры отчета в Таблицу

Самый эффективный способ избежать дублирования и вывести цены в разные столбцы — это использование структуры "Таблица" вместо обычного списка в настройках СКД. Рассмотрим, как это сделать по шагам:

  1. Перейдем на вкладку "Настройки" в схеме компоновки данных.
  2. Удалим стандартную группировку "Детальные записи".
  3. Нажмем правой кнопкой мыши на корень отчета и выберем "Новая таблица".
  4. В Строки таблицы добавим группировку по полю Номенклатура. Именно здесь мы будем выводить название товара и его изображение.
  5. В Колонки таблицы добавим группировку по полю ВидЦены. Это позволит системе создать для каждого вида цены отдельный столбец.
  6. В Выбранные поля всей таблицы (или группировки строк) добавим ресурс Цена.

Такая структура автоматически заставит СКД "схлопнуть" данные по номенклатуре. На пересечении строки товара и колонки вида цены будет отображаться соответствующее значение цены.

Вывод изображения в группировке

Когда мы используем группировку по номенклатуре, простое добавление поля изображения в "Выбранные поля" может не сработать, так как поле с типом ДвоичныеДанные или ХранилищеЗначения не может быть ключом группировки. Проанализируем способы обхода этого ограничения:

Способ 1: Добавление поля в выбранные поля группировки
В настройках группировки "Номенклатура" перейдите на вкладку "Выбранные поля". Добавьте туда поле Изображение (или ДвоичныеДанныеФайла). В современных версиях платформы 8.3 это позволяет вывести картинку рядом с наименованием, если поле не является ресурсом.

Способ 2: Использование агрегатных функций (Ресурсы)
Если первый способ не помогает, мы можем сделать поле изображения ресурсом. На вкладке "Ресурсы" добавим наше поле. В качестве выражения обычно используют функцию Максимум(). Однако для бинарных данных стандартный Максимум может работать некорректно. Попробуем прописать выражение с проверкой на пустое значение:

Максимум(ЕстьNULL(Изображение, ""))

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

Работа с типами данных изображений

Выясним причину, почему изображение может не выводиться даже при правильных настройках. В 1С изображения могут храниться по-разному. Если вы используете Библиотеку стандартных подсистем (БСП), то данные файла часто лежат в отдельной таблице. Проверьте ваш запрос: вы должны получать именно поле с типом ДвоичныеДанные. Если в результате запроса приходит NULL или неопределенный тип, картинка не отобразится.

Если изображение хранится в реквизите типа ХранилищеЗначения, рассмотрим пример выражения в вычисляемом поле для извлечения данных:


// В поле "Выражение" вычисляемого поля
ПолучитьДанныеКартинки(Номенклатура.ФайлПревью)

Где ПолучитьДанныеКартинки — это функция в общем модуле с признаком "Сервер", "Внешнее соединение", которая извлекает данные из хранилища и возвращает объект Картинка или двоичные данные.

Использование макетов для фиксации размеров

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

  1. Перейдем на закладку "Макеты".
  2. Добавим "Макет поля" для поля Изображение.
  3. В области макета выделим ячейку и через меню "Таблица - Рисунки" вставим объект "Картинка".
  4. В свойствах картинки, в поле "Данные", укажем параметр (например, ПараметрКартинка), который свяжем с нашим полем из набора данных.
  5. Установим свойство "Размер картинки" в значение "Автомасштаб" или "Пропорционально", чтобы изображения не искажались.

Тонкие настройки оформления

Чтобы отчет выглядел профессионально, проанализируем настройки на вкладке "Другие настройки":

1. Расположение полей группировок: установите значение Вместе. Это позволит вывести Номенклатуру и Изображение в одной ячейке или максимально близко друг к другу без лишних разделителей.
2. Минимальная ширина и высота: для поля с изображением обязательно задайте параметры МинимальнаяШирина и МинимальнаяВысота. Часто картинка "пропадает" просто потому, что СКД устанавливает высоту строки в 0 пикселей для пустых с ее точки зрения данных.

Используя структуру Таблицы для разворота цен и механизм Ресурсов или Макетов для вывода бинарных данных, мы получаем мощный инструмент для создания информативных прайс-листов и каталогов товаров непосредственно в 1С без использования сторонних обработок.

← На главную