Почему колонка с картинками не отображается в отчете "Прайс-лист" на СКД в 1С:УТ 11.4 и как это исправить?

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

Мы рассмотрим распространенную проблему, с которой сталкиваются разработчики при попытке вывести изображения товаров в отчетах на Системе Компоновки Данных (СКД), в частности, в отчете "Прайс-лист" в конфигурации 1С:Управление торговлей 11.4. Часто, даже после добавления поля с двоичными данными картинки в запрос и настройки форматирования, изображение не появляется в отчете. Разберем, в чем может быть причина и как ее устранить.

Анализируем начальную ситуацию: запрос готов, но картинки нет

Предположим, у нас уже есть рабочий отчет-пример, который успешно выводит номенклатуру и связанные с ней изображения. Мы знаем, что для этого требуется всего несколько строк кода. Теперь наша задача — перенести этот функционал в стандартный отчет "Прайс-лист".

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


ВЫБРАТЬ
    Цены.Номенклатура КАК Номенклатура,
    Цены.Характеристика КАК Характеристика,
    Цены.ВидЦены КАК ВидЦены,
    Цены.Цена КАК Цена,
    Цены.Упаковка КАК Упаковка,
    Цены.Валюта КАК Валюта,
    Цены.ЦеноваяГруппа КАК ЦеноваяГруппа,
    Цены.Склад КАК Склад,
    ВЫБОР
        КОГДА Цены.Остаток > 0
            ТОГДА ЗНАЧЕНИЕ(Перечисление.ДоступностьТовараДляКлиента.ПодЗаказ)
        ИНАЧЕ Цены.ОстатокТекстом
    КОНЕЦ КАК ОстатокТекстом,
    ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК Картинка
{ВЫБРАТЬ
    Номенклатура.*,
    Характеристика.*,
    ВидЦены.*,
    Цена,
    Упаковка.*,
    Валюта.*,
    ЦеноваяГруппа.*,
    Склад.*,
    Картинка}
ИЗ
    Цены КАК Цены
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
        ПО Цены.Номенклатура.ФайлКартинки = ДвоичныеДанныеФайлов.Файл
{ГДЕ
    Цены.Номенклатура.*,
    Цены.Характеристика.*,
    Цены.ВидЦены.*,
    Цены.Цена,
    Цены.Упаковка.*,
    Цены.Валюта.*,
    Цены.Склад.*}

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

Распространенные заблуждения и их анализ

Наш опыт показывает, что на этом этапе часто возникают вопросы и применяются не совсем корректные подходы:

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

Часто возникает ощущение, что в поле "Картинка" просто нет значений, поэтому оно не выводится. Однако, если мы убедились, что запрос возвращает данные в этом поле, причина кроется глубже, в самой структуре отчета СКД.

Ключевое решение: правильная структура отчета и детальные записи

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

Для корректного отображения картинок в отчете СКД необходимо выполнить следующие шаги:

  1. Убедимся, что наш запрос корректно извлекает двоичные данные файла. Используем запрос, аналогичный приведенному выше, с левым соединением к регистру ДвоичныеДанныеФайлов. Проверим, что поле ФайлКартинки в справочнике Номенклатура правильно ссылается на соответствующий элемент регистра.

    Пример запроса:

    
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        Номенклатура.Ссылка КАК Номенклатура,
        ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК Картинка
    ПОМЕСТИТЬ Картинки
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
            ПО Номенклатура.ФайлКартинки = ДвоичныеДанныеФайлов.Файл
    ;
            
    //////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Цены.Номенклатура КАК Номенклатура,
        Цены.Характеристика КАК Характеристика,
        Цены.ВидЦены КАК ВидЦены,
        Цены.Цена КАК Цена,
        Цены.Упаковка КАК Упаковка,
        Цены.Валюта КАК Валюта,
        Цены.ЦеноваяГруппа КАК ЦеноваяГруппа,
        Цены.Склад КАК Склад,
        ВЫБОР
            КОГДА Цены.Остаток > 0
                ТОГДА ЗНАЧЕНИЕ(Перечисление.ДоступностьТовараДляКлиента.ПодЗаказ)
            ИНАЧЕ Цены.ОстатокТекстом
        КОНЕЦ КАК ОстатокТекстом,
        Картинки.Картинка КАК Картинка
    ИЗ
        Цены КАК Цены
            ЛЕВОЕ СОЕДИНЕНИЕ Картинки КАК Картинки
            ПО Цены.Номенклатура = Картинки.Номенклатура
    

    Также можно получить картинки сразу в основной запрос, без создания временной таблицы, как в первом примере. Это может быть эффективнее по памяти и времени выполнения, если данных много.

  2. Правильно настроим структуру отчета в СКД. Откроем настройки отчета (например, через "Еще..." -> "Изменить вариант" -> "Структура"). Убедимся, что у нас есть необходимые группировки (например, по "Номенклатуре"), а главное — присутствуют "Детальные записи".

    Детальные записи — это самый нижний уровень детализации отчета, который отображает каждую отдельную запись, полученную из запроса. Именно здесь мы должны явно указать поле "Картинка" для вывода.

    Последовательность действий:

    1. Добавим группировку по Номенклатура, если ее еще нет.
    2. Внутри этой группировки (или на верхнем уровне, если нет других группировок, кроме детальных записей) добавим "Детальные записи".
    3. В списке полей для вывода в "Детальных записях" явно укажем поле "Картинка".
    4. Убедимся, что поле "Картинка" НЕ является ресурсом. Если оно было добавлено как ресурс, его нужно удалить из списка ресурсов.

    Часто в стандартных отчетах 1С существуют различные варианты настроек. Например, в "Прайс-листе" может быть несколько вариантов ("Прайс-лист", "Прайс-лист (контекст)"). Важно убедиться, что мы модифицируем и просматриваем именно тот вариант отчета, в котором внесли изменения в структуру. Отсутствие "Детальных записей" в нужном варианте отчета было ключевым моментом для решения проблемы.

  3. Настроим форматирование поля "Картинка".

    Перейдем на вкладку "Настройки" -> "Прочие настройки" или "Настройки полей". Для поля "Картинка" установим следующие параметры:

    • Режим вывода: "Картинка" (если доступно, это может зависеть от версии платформы).
    • Максимальная ширина/высота: Укажем необходимые значения в пикселях (например, 100x100), чтобы изображения не занимали слишком много места.
    • Расположение картинки: "Пропорционально" или "По размеру шрифта" для сохранения пропорций.

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

Решение проблемы дублирования картинок

После успешного вывода изображений мы можем столкнуться с новой проблемой: картинки выводятся несколько раз на каждую строку, или не совсем так, как мы ожидали. Это обычно связано с некорректными настройками группировок или детальных записей, либо с ошибками в самом запросе, которые приводят к дублированию строк данных.

Чтобы устранить дублирование, выполним следующие шаги:

  1. Проверим запрос на уникальность строк. Убедимся, что запрос не возвращает повторяющиеся строки для одной и той же номенклатуры. Если используются сложные соединения, удостоверимся, что они не порождают лишние записи. Возможно, понадобится использовать РАЗЛИЧНЫЕ в запросе или более тщательно проработать условия соединений.

    Пример (если номенклатура может иметь несколько картинок, но нам нужна только одна):

    
    ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура,
        МАКСИМУМ(ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла) КАК Картинка
    ПОМЕСТИТЬ Картинки
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
            ПО Номенклатура.ФайлКартинки = ДвоичныеДанныеФайлов.Файл
    СГРУППИРОВАТЬ ПО
        Номенклатура.Ссылка
    ;
            
    //////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ...
        Картинки.Картинка КАК Картинка
    ИЗ
        Цены КАК Цены
            ЛЕВОЕ СОЕДИНЕНИЕ Картинки КАК Картинки
            ПО Цены.Номенклатура = Картинки.Номенклатура
    

    Использование функции МАКСИМУМ с группировкой по номенклатуре позволяет выбрать одну картинку, если их несколько.

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

    • Убедимся, что поле "Картинка" присутствует только на том уровне, где ожидается его вывод (например, в "Детальных записях" или в группировке по Номенклатура, если картинка одна на всю группу).
    • Если мы используем макеты СКД, проверим, как там настроена привязка параметров и вывод изображений.
  3. Используем "Дополнительную информацию" в колонках (если применимо). В некоторых случаях, когда требуется вывести дополнительную информацию (включая картинки) в виде отдельной колонки, можно использовать механизм "Дополнительной информации". Однако, как показывает практика, для прямых изображений это может работать не всегда, и чаще всего требуется либо прямое поле в детальных записях, либо программная вставка. Если же вы попытались использовать этот механизм, убедитесь, что поле настроено как "Выводимое" и что для него также правильно задан "Режим вывода" как "Картинка".

Общие рекомендации при работе с картинками в СКД

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

  2. Версии платформы: Начиная с платформы 1С:Предприятие 8.3.14, СКД получила значительно улучшенные возможности по работе с изображениями, позволяя выводить их напрямую без необходимости программной обработки. Если вы работаете на более ранних версиях, возможно, вам придется прибегнуть к программному формированию отчета в процедуре ПриКомпоновкеРезультата() модуля отчета. При этом мы сначала отключаем стандартную обработку отчета (`СтандартнаяОбработка = Ложь`), формируем табличный документ, а затем обходим его ячейки и вставляем изображения с помощью объекта РисунокТабличногоДокумента.

  3. Отладка: Если картинки все еще не отображаются, используем отладчик. Проверим, какие данные возвращает запрос в поле "Картинка". Убедимся, что это действительно двоичные данные. Далее, на этапе компоновки, можно проверить, как СКД обрабатывает это поле и какие настройки применяются.

  4. Внешние отчеты: Для типовых конфигураций, таких как УТ 11.4, часто существуют готовые внешние отчеты "Прайс-лист с картинками", которые уже включают необходимую логику. Изучение таких готовых решений может дать ценные подсказки и ускорить процесс разработки.

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

← На главную