К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как вывести картинку в табличное поле в 1С

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

Вывод картинки в табличное поле — типовая задача при разработке на платформе 1С:Предприятие: статусы документов значками, фото товаров в списке номенклатуры, индикаторы состояния в отчётах. Способ реализации зависит от режима работы формы (обычная или управляемая) и от того, где хранится изображение — в базе данных или в стандартной библиотеке картинок.

Главный принцип: табличное поле само по себе не «рисует» изображения из двоичных данных. Картинка либо назначается через механизм оформления ячеек и коллекцию «КартинкиСтрок», либо выводится через элемент формы типа «Поле картинки», связанный с реквизитом. Ниже разобраны оба подхода с рабочим кодом.

Определите режим формы и источник картинки

Прежде чем писать код, ответьте на два вопроса. Первый: форма обычная или управляемая? Синтаксис событий и механизмы оформления в них принципиально различаются, и код из одной методики не заработает в другой. Второй: откуда берётся изображение — из стандартной библиотеки картинок (БиблиотекаКартинок), из общей картинки конфигурации или из реквизита объекта, где хранятся двоичные данные файла?

Если нужны только значки-индикаторы (галочка, восклицательный знак, флажок), достаточно стандартной библиотеки — это самый простой сценарий. Если требуется показать фото товара или скан документа, придётся хранить картинку в информационной базе и преобразовывать её при выводе.

Маршрут решения

Как выбрать подход

Нужны стандартные значки статуса в строках спискаИспользуйте КартинкаЗначений колонки и БиблиотекаКартинок
Нужно отобразить фото, хранящееся в базеХраните двоичные данные в ХранилищеЗначения и выводите через поле картинки или навигационную ссылку
Форма обычная (8.2 в режиме совместимости)Используйте событие ПриВыводеСтроки табличного поля

Вывод картинки в управляемой форме через условное оформление

В управляемых формах динамических списков картинку проще всего вывести через условное оформление формы. Для колонки таблицы установите свойство «Отображать картинку» (в коде — поле оформления «Картинка»), а значение картинки задайте в зависимости от данных строки. Этот способ не требует изменения запроса и работает прямо в настройках формы.

Программно условное оформление добавляется так: создаётся элемент УсловноеОформление, в него добавляется отбор (например, «Проведен = Истина»), затем оформляемое поле и параметр «Картинка» со значением из БиблиотекаКартинок. Метод подходит, когда набор условий конечен и заранее известен.

ЭлементОформления = УсловноеОформление.Элементы.Добавить();

ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Проведен");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Истина;

ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();

ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("СтатусКартинка");

ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Картинка", БиблиотекаКартинок.Провести);

Колонка с картинкой значений в таблице значений

Если табличное поле связано с реквизитом формы типа «ТаблицаЗначений» (а не с динамическим списком), используется другой механизм. В колонке таблицы добавьте поле, в котором будет храниться индекс или сама картинка, а у элемента формы установите свойство «КартинкаЗначений» — ссылку на коллекцию картинок (элемент формы «Картинка» или реквизит типа Картинка).

Классический приём для обычных форм — колонка с типом «Картинка», заполняемая при формировании таблицы. В управляемых формах чаще применяют числовую колонку с индексом картинки и свойство «КартинкиСтрок» у таблицы формы. Тогда в ячейке автоматически отображается картинка из коллекции по её номеру.

// ТаблицаФормы связана с реквизитом "Товары"

Элементы.Товары.КартинкиСтрок = БиблиотекаКартинок.СостоянияДокумента;

// В модуле при заполнении строки:

НоваяСтрока = Товары.Добавить();

НоваяСтрока.ИндексКартинки = 1; // вторая картинка коллекции

Вывод картинки в обычной форме: событие ПриВыводеСтроки

В обычных формах (режим совместимости, старые конфигурации) оформление строк выполняется в обработчике события табличного поля «ПриВыводеСтроки». У параметра ОформлениеСтроки есть коллекция Ячейки, и у каждой ячейки доступно свойство «Картинка», а также «ОтображатьКартинку».

Типовой код выглядит так:

Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

Ячейка = ОформлениеСтроки.Ячейки.Статус;

Ячейка.ОтображатьКартинку = Истина;

Если ДанныеСтроки.Проведен Тогда

Ячейка.Картинка = БиблиотекаКартинок.Провести;

ИначеЕсли ДанныеСтроки.ПометкаУдаления Тогда

Ячейка.Картинка = БиблиотекаКартинок.ПометитьНаУдаление;

КонецЕсли;

КонецПроцедуры

Учтите, что обработчик вызывается при каждой перерисовке строки, включая прокрутку. Не выполняйте в нём запросы к базе или тяжёлые вычисления — это заметно замедлит список. Все данные для выбора картинки должны уже присутствовать в ДанныеСтроки.

Вывод фото из базы: хранение и отображение

Когда изображение хранится в базе (например, фото номенклатуры в реквизите типа ХранилищеЗначения), вывести его прямо в ячейку динамического списка нельзя — динамический список работает с данными запроса, а двоичные данные через него не передаются. Стандартное решение: отдельное поле формы «Поле картинки», которое обновляется при активизации строки табличного поля.

Для этого в управляемой форме в обработчике «ПриАктивизацииСтроки» таблицы получают двоичные данные из хранилища и помещают их во временное хранилище, а реквизиту-строке (источнику поля картинки) присваивают навигационную ссылку на это хранилище:

&НаКлиенте

Процедура СписокПриАктивизацииСтроки(Элемент)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

АдресКартинки = "";

Возврат;

КонецЕсли;

АдресКартинки = ПолучитьАдресКартинки(ТекущиеДанные.Ссылка);

КонецПроцедуры

&НаСервереБезКонтекста

Функция ПолучитьАдресКартинки(Ссылка)

ДанныеКартинки = Ссылка.Фото.Получить(); // ХранилищеЗначения

Если ДанныеКартинки = Неопределено Тогда

Возврат "";

КонецЕсли;

Возврат ПоместитьВоВременноеХранилище(ДанныеКартинки, Новый УникальныйИдентификатор);

КонецФункции

Если фото нужно показывать именно в каждой строке (а не в отдельном поле), используйте таблицу значений вместо динамического списка: заполните её программно, добавьте колонку с адресами картинок во временном хранилище и выведите колонку как «Поле картинки». Это работает, но при большом объёме данных замедляет форму — загружайте картинки порционно.

Порядок действий для фото в списке
  1. 1
    Добавьте в справочник реквизит типа ХранилищеЗначения для хранения файла
  2. 2
    На форму списка добавьте реквизит-строку «АдресКартинки» и элемент «Поле картинки», связанный с ним
  3. 3
    Реализуйте обработчик ПриАктивизацииСтроки с серверным вызовом получения данных
  4. 4
    Поместите двоичные данные во временное хранилище и запишите адрес в реквизит
  5. 5
    Проверьте поведение при пустом фото и при снятии выделения со строки

Проверка результата и производительность

После внедрения проверьте три вещи. Во-первых, корректность отображения: картинка должна соответствовать данным строки, а не «залипать» от предыдущей строки — это частая ошибка при ручном заполнении оформления. Во-вторых, обновление: при изменении данных (проведении документа, замене фото) картинка должна меняться без перезапуска формы. В-третьих, скорость: прокрутка списка не должна тормозить.

Если список стал медленным после добавления картинок, типичные причины — запросы в обработчиках вывода строк, загрузка полноразмерных фото вместо уменьшенных копий и пересоздание временного хранилища при каждой активации. Для фото товаров рекомендуется хранить в базе заранее уменьшенную миниатюру отдельным реквизитом.

Контрольные точки

Как проверить результат

Соответствие картинки строке
Норма

Значок меняется вместе с данными строки при прокрутке

Тревожный признак

Во всех строках одна и та же картинка

Скорость прокрутки
Норма

Список листается без видимых задержек

Тревожный признак

Подвисания при каждом движении курсора

Пустые данные
Норма

При отсутствии фото ячейка пустая или показывает заглушку

Тревожный признак

Ошибка обращения к хранилищу или старая картинка

Частые ошибки и ограничения

Самая распространённая ошибка — попытка присвоить двоичные данные напрямую свойству «Картинка» ячейки. Свойство принимает объект типа Картинка, а не ДвоичныеДанные; преобразование выполняется через Новый Картинка(ДвоичныеДанные). Вторая типичная проблема — не установлен флаг «ОтображатьКартинку» (в обычных формах) или неверно указано свойство «КартинкиСтрок», из-за чего ячейка остаётся пустой без каких-либо сообщений об ошибке.

Ещё одно ограничение: веб-клиент и тонкий клиент по-разному работают с большими изображениями, а передача картинок на клиента увеличивает трафик. Для динамических списков в управляемых формах недоступно событие вывода строки в том виде, в каком оно есть в обычных формах, — используйте условное оформление или переходите на таблицу значений.

Типичные ошибки
01
Присвоение ДвоичныхДанных свойству Картинка вместо объекта Картинка — ячейка остаётся пустой
02
Забытое свойство ОтображатьКартинку = Истина в обычной форме — код выполняется, но ничего не меняется
03
Запрос к базе внутри ПриВыводеСтроки — список начинает тормозить при прокрутке
04
Загрузка полноразмерных фото в список — форма долго открывается и потребляет память

FAQ

Можно ли вывести картинку в динамический список без условного оформления?

Да, если добавить в запрос списка вычисляемое поле с индексом картинки (через ВЫБОР) и связать колонку со свойством «КартинкиСтрок» таблицы формы. Это быстрее условного оформления при большом числе строк.

Почему картинка отображается не во всех строках, а «прыгает» при прокрутке?

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

Как показать картинку из файла на диске, не сохраняя её в базу?

Создайте объект Картинка из файла: Новый Картинка("C:\Images\photo.jpg") — и присвойте его свойству Картинка ячейки или полю картинки. Учтите, что в клиент-серверном режиме файл должен быть доступен с той стороны, где выполняется код, а в веб-клиенте путь к локальному диску недоступен.

Поддерживает ли табличное поле картинки форматов PNG и JPG из хранилища?

Да, объект Картинка платформы понимает стандартные растровые форматы. При создании из двоичных данных формат определяется автоматически по содержимому, указывать его отдельно обычно не требуется.

Как вывести картинку в табличную часть документа, а не в список?

Табличная часть отображается той же таблицей формы. Для обычной формы используйте ПриВыводеСтроки, для управляемой — добавьте в табличную часть числовой реквизит с индексом картинки и настройте свойство «КартинкиСтрок» у элемента таблицы.

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

Веб-клиент передаёт каждое изображение браузеру отдельными запросами. Снизить задержку помогают уменьшенные миниатюры вместо исходных фото и отказ от показа картинок в каждой строке в пользу отдельного поля просмотра.

Итог

Что важно запомнить

Картинка в табличное поле выводится либо через оформление ячеек и коллекцию картинок (значки статусов), либо через поле картинки с адресом временного хранилища (фото из базы). Не выполняйте запросы в обработчиках отрисовки строк и храните для списков уменьшенные копии изображений.