Мы рассмотрим распространенную проблему, с которой сталкиваются разработчики при попытке вывести изображения товаров в отчетах на Системе Компоновки Данных (СКД), в частности, в отчете "Прайс-лист" в конфигурации 1С:Управление торговлей 11.4. Часто, даже после добавления поля с двоичными данными картинки в запрос и настройки форматирования, изображение не появляется в отчете. Разберем, в чем может быть причина и как ее устранить.
Предположим, у нас уже есть рабочий отчет-пример, который успешно выводит номенклатуру и связанные с ней изображения. Мы знаем, что для этого требуется всего несколько строк кода. Теперь наша задача — перенести этот функционал в стандартный отчет "Прайс-лист".
Мы сохраняем стандартный отчет "Прайс-лист" как внешний отчет, убеждаемся, что режим совместимости установлен корректно (что часто бывает важно для модифицированных конфигураций). Затем модифицируем текст запроса, добавляя в него поле, которое будет содержать двоичные данные картинки. Давайте посмотрим на пример такого запроса:
ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
Цены.Характеристика КАК Характеристика,
Цены.ВидЦены КАК ВидЦены,
Цены.Цена КАК Цена,
Цены.Упаковка КАК Упаковка,
Цены.Валюта КАК Валюта,
Цены.ЦеноваяГруппа КАК ЦеноваяГруппа,
Цены.Склад КАК Склад,
ВЫБОР
КОГДА Цены.Остаток > 0
ТОГДА ЗНАЧЕНИЕ(Перечисление.ДоступностьТовараДляКлиента.ПодЗаказ)
ИНАЧЕ Цены.ОстатокТекстом
КОНЕЦ КАК ОстатокТекстом,
ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК Картинка
{ВЫБРАТЬ
Номенклатура.*,
Характеристика.*,
ВидЦены.*,
Цена,
Упаковка.*,
Валюта.*,
ЦеноваяГруппа.*,
Склад.*,
Картинка}
ИЗ
Цены КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
ПО Цены.Номенклатура.ФайлКартинки = ДвоичныеДанныеФайлов.Файл
{ГДЕ
Цены.Номенклатура.*,
Цены.Характеристика.*,
Цены.ВидЦены.*,
Цены.Цена,
Цены.Упаковка.*,
Цены.Валюта.*,
Цены.Склад.*}
В этом запросе мы используем левое соединение с регистром сведений ДвоичныеДанныеФайлов, чтобы получить данные картинки, связанные с файлом номенклатуры. После выполнения запроса мы видим, что поле "Картинка" действительно появляется в наборе данных СКД. Мы также настраиваем форматирование для этого поля, указывая максимальную ширину и высоту, как это делали в рабочем примере. Однако, несмотря на все эти шаги, колонка с картинками по-прежнему не выводится в отчете.
Наш опыт показывает, что на этом этапе часто возникают вопросы и применяются не совсем корректные подходы:
Часто возникает ощущение, что в поле "Картинка" просто нет значений, поэтому оно не выводится. Однако, если мы убедились, что запрос возвращает данные в этом поле, причина кроется глубже, в самой структуре отчета СКД.
После многочисленных попыток и анализа различных подходов мы приходим к главному выводу: проблема чаще всего заключается в отсутствии детальных записей или некорректной настройке группировок в структуре отчета СКД.
Для корректного отображения картинок в отчете СКД необходимо выполнить следующие шаги:
Убедимся, что наш запрос корректно извлекает двоичные данные файла. Используем запрос, аналогичный приведенному выше, с левым соединением к регистру ДвоичныеДанныеФайлов. Проверим, что поле ФайлКартинки в справочнике Номенклатура правильно ссылается на соответствующий элемент регистра.
Пример запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Номенклатура.Ссылка КАК Номенклатура,
ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК Картинка
ПОМЕСТИТЬ Картинки
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
ПО Номенклатура.ФайлКартинки = ДвоичныеДанныеФайлов.Файл
;
//////////////////////////////////////////////////////////////
ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
Цены.Характеристика КАК Характеристика,
Цены.ВидЦены КАК ВидЦены,
Цены.Цена КАК Цена,
Цены.Упаковка КАК Упаковка,
Цены.Валюта КАК Валюта,
Цены.ЦеноваяГруппа КАК ЦеноваяГруппа,
Цены.Склад КАК Склад,
ВЫБОР
КОГДА Цены.Остаток > 0
ТОГДА ЗНАЧЕНИЕ(Перечисление.ДоступностьТовараДляКлиента.ПодЗаказ)
ИНАЧЕ Цены.ОстатокТекстом
КОНЕЦ КАК ОстатокТекстом,
Картинки.Картинка КАК Картинка
ИЗ
Цены КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ Картинки КАК Картинки
ПО Цены.Номенклатура = Картинки.Номенклатура
Также можно получить картинки сразу в основной запрос, без создания временной таблицы, как в первом примере. Это может быть эффективнее по памяти и времени выполнения, если данных много.
Правильно настроим структуру отчета в СКД. Откроем настройки отчета (например, через "Еще..." -> "Изменить вариант" -> "Структура"). Убедимся, что у нас есть необходимые группировки (например, по "Номенклатуре"), а главное — присутствуют "Детальные записи".
Детальные записи — это самый нижний уровень детализации отчета, который отображает каждую отдельную запись, полученную из запроса. Именно здесь мы должны явно указать поле "Картинка" для вывода.
Последовательность действий:
Номенклатура, если ее еще нет.Часто в стандартных отчетах 1С существуют различные варианты настроек. Например, в "Прайс-листе" может быть несколько вариантов ("Прайс-лист", "Прайс-лист (контекст)"). Важно убедиться, что мы модифицируем и просматриваем именно тот вариант отчета, в котором внесли изменения в структуру. Отсутствие "Детальных записей" в нужном варианте отчета было ключевым моментом для решения проблемы.
Настроим форматирование поля "Картинка".
Перейдем на вкладку "Настройки" -> "Прочие настройки" или "Настройки полей". Для поля "Картинка" установим следующие параметры:
С платформы 8.3.14 появилась возможность выводить картинки в СКД без постобработки, что значительно упрощает задачу. Для более ранних версий или в случаях, когда требуется особая логика, возможно придется прибегать к программному формированию табличного документа с последующей вставкой объектов РисунокТабличногоДокумента.
После успешного вывода изображений мы можем столкнуться с новой проблемой: картинки выводятся несколько раз на каждую строку, или не совсем так, как мы ожидали. Это обычно связано с некорректными настройками группировок или детальных записей, либо с ошибками в самом запросе, которые приводят к дублированию строк данных.
Чтобы устранить дублирование, выполним следующие шаги:
Проверим запрос на уникальность строк. Убедимся, что запрос не возвращает повторяющиеся строки для одной и той же номенклатуры. Если используются сложные соединения, удостоверимся, что они не порождают лишние записи. Возможно, понадобится использовать РАЗЛИЧНЫЕ в запросе или более тщательно проработать условия соединений.
Пример (если номенклатура может иметь несколько картинок, но нам нужна только одна):
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
МАКСИМУМ(ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла) КАК Картинка
ПОМЕСТИТЬ Картинки
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
ПО Номенклатура.ФайлКартинки = ДвоичныеДанныеФайлов.Файл
СГРУППИРОВАТЬ ПО
Номенклатура.Ссылка
;
//////////////////////////////////////////////////////////////
ВЫБРАТЬ
...
Картинки.Картинка КАК Картинка
ИЗ
Цены КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ Картинки КАК Картинки
ПО Цены.Номенклатура = Картинки.Номенклатура
Использование функции МАКСИМУМ с группировкой по номенклатуре позволяет выбрать одну картинку, если их несколько.
Проанализируем структуру отчета СКД. Дублирование картинок часто возникает, если поле "Картинка" выводится на каждом уровне группировки, а не только на уровне детальных записей или на том уровне, где оно логически должно быть уникальным. Откроем структуру отчета и проверим, на каких уровнях (группировки, детальные записи) выведено поле "Картинка". Если оно не привязано к конкретному полю, например, к номенклатуре, то может повторяться.
Номенклатура, если картинка одна на всю группу).Используем "Дополнительную информацию" в колонках (если применимо). В некоторых случаях, когда требуется вывести дополнительную информацию (включая картинки) в виде отдельной колонки, можно использовать механизм "Дополнительной информации". Однако, как показывает практика, для прямых изображений это может работать не всегда, и чаще всего требуется либо прямое поле в детальных записях, либо программная вставка. Если же вы попытались использовать этот механизм, убедитесь, что поле настроено как "Выводимое" и что для него также правильно задан "Режим вывода" как "Картинка".
Хранение двоичных данных: Картинки могут храниться в реквизитах типа ХранилищеЗначения непосредственно в справочниках (например, Справочник.Номенклатура.Картинка), или в отдельных регистрах сведений (например, РегистрСведений.ДвоичныеДанныеФайлов). Важно, чтобы в запросе мы правильно получали именно двоичные данные, а не ссылку на файл или хранилище.
Версии платформы: Начиная с платформы 1С:Предприятие 8.3.14, СКД получила значительно улучшенные возможности по работе с изображениями, позволяя выводить их напрямую без необходимости программной обработки. Если вы работаете на более ранних версиях, возможно, вам придется прибегнуть к программному формированию отчета в процедуре ПриКомпоновкеРезультата() модуля отчета. При этом мы сначала отключаем стандартную обработку отчета (`СтандартнаяОбработка = Ложь`), формируем табличный документ, а затем обходим его ячейки и вставляем изображения с помощью объекта РисунокТабличногоДокумента.
Отладка: Если картинки все еще не отображаются, используем отладчик. Проверим, какие данные возвращает запрос в поле "Картинка". Убедимся, что это действительно двоичные данные. Далее, на этапе компоновки, можно проверить, как СКД обрабатывает это поле и какие настройки применяются.
Внешние отчеты: Для типовых конфигураций, таких как УТ 11.4, часто существуют готовые внешние отчеты "Прайс-лист с картинками", которые уже включают необходимую логику. Изучение таких готовых решений может дать ценные подсказки и ускорить процесс разработки.
Следуя этим рекомендациям, вы сможете успешно вывести колонку с картинками в вашем отчете на СКД и решить проблему, с которой сталкиваются многие разработчики.