Разработка и Конфигурация · 11 мин
Как вывести картинку в табличное поле в 1С
Как вывести картинку в табличное поле 1С: оформление ячеек, коллекция картинок, хранение изображений в базе. Примеры кода для управляемых и обычных форм.
Вывод картинки в табличное поле — типовая задача при разработке на платформе 1С:Предприятие: статусы документов значками, фото товаров в списке номенклатуры, индикаторы состояния в отчётах. Способ реализации зависит от режима работы формы (обычная или управляемая) и от того, где хранится изображение — в базе данных или в стандартной библиотеке картинок.
Главный принцип: табличное поле само по себе не «рисует» изображения из двоичных данных. Картинка либо назначается через механизм оформления ячеек и коллекцию «КартинкиСтрок», либо выводится через элемент формы типа «Поле картинки», связанный с реквизитом. Ниже разобраны оба подхода с рабочим кодом.
Определите режим формы и источник картинки
Прежде чем писать код, ответьте на два вопроса. Первый: форма обычная или управляемая? Синтаксис событий и механизмы оформления в них принципиально различаются, и код из одной методики не заработает в другой. Второй: откуда берётся изображение — из стандартной библиотеки картинок (БиблиотекаКартинок), из общей картинки конфигурации или из реквизита объекта, где хранятся двоичные данные файла?
Если нужны только значки-индикаторы (галочка, восклицательный знак, флажок), достаточно стандартной библиотеки — это самый простой сценарий. Если требуется показать фото товара или скан документа, придётся хранить картинку в информационной базе и преобразовывать её при выводе.
Как выбрать подход
Вывод картинки в управляемой форме через условное оформление
В управляемых формах динамических списков картинку проще всего вывести через условное оформление формы. Для колонки таблицы установите свойство «Отображать картинку» (в коде — поле оформления «Картинка»), а значение картинки задайте в зависимости от данных строки. Этот способ не требует изменения запроса и работает прямо в настройках формы.
Программно условное оформление добавляется так: создаётся элемент УсловноеОформление, в него добавляется отбор (например, «Проведен = Истина»), затем оформляемое поле и параметр «Картинка» со значением из БиблиотекаКартинок. Метод подходит, когда набор условий конечен и заранее известен.
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Проведен");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("СтатусКартинка");
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Картинка", БиблиотекаКартинок.Провести);
Колонка с картинкой значений в таблице значений
Если табличное поле связано с реквизитом формы типа «ТаблицаЗначений» (а не с динамическим списком), используется другой механизм. В колонке таблицы добавьте поле, в котором будет храниться индекс или сама картинка, а у элемента формы установите свойство «КартинкаЗначений» — ссылку на коллекцию картинок (элемент формы «Картинка» или реквизит типа Картинка).
Классический приём для обычных форм — колонка с типом «Картинка», заполняемая при формировании таблицы. В управляемых формах чаще применяют числовую колонку с индексом картинки и свойство «КартинкиСтрок» у таблицы формы. Тогда в ячейке автоматически отображается картинка из коллекции по её номеру.
// ТаблицаФормы связана с реквизитом "Товары"
Элементы.Товары.КартинкиСтрок = БиблиотекаКартинок.СостоянияДокумента;
// В модуле при заполнении строки:
НоваяСтрока = Товары.Добавить();
НоваяСтрока.ИндексКартинки = 1; // вторая картинка коллекции
Вывод картинки в обычной форме: событие ПриВыводеСтроки
В обычных формах (режим совместимости, старые конфигурации) оформление строк выполняется в обработчике события табличного поля «ПриВыводеСтроки». У параметра ОформлениеСтроки есть коллекция Ячейки, и у каждой ячейки доступно свойство «Картинка», а также «ОтображатьКартинку».
Типовой код выглядит так:
Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Ячейка = ОформлениеСтроки.Ячейки.Статус;
Ячейка.ОтображатьКартинку = Истина;
Если ДанныеСтроки.Проведен Тогда
Ячейка.Картинка = БиблиотекаКартинок.Провести;
ИначеЕсли ДанныеСтроки.ПометкаУдаления Тогда
Ячейка.Картинка = БиблиотекаКартинок.ПометитьНаУдаление;
КонецЕсли;
КонецПроцедуры
Учтите, что обработчик вызывается при каждой перерисовке строки, включая прокрутку. Не выполняйте в нём запросы к базе или тяжёлые вычисления — это заметно замедлит список. Все данные для выбора картинки должны уже присутствовать в ДанныеСтроки.
Вывод фото из базы: хранение и отображение
Когда изображение хранится в базе (например, фото номенклатуры в реквизите типа ХранилищеЗначения), вывести его прямо в ячейку динамического списка нельзя — динамический список работает с данными запроса, а двоичные данные через него не передаются. Стандартное решение: отдельное поле формы «Поле картинки», которое обновляется при активизации строки табличного поля.
Для этого в управляемой форме в обработчике «ПриАктивизацииСтроки» таблицы получают двоичные данные из хранилища и помещают их во временное хранилище, а реквизиту-строке (источнику поля картинки) присваивают навигационную ссылку на это хранилище:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
АдресКартинки = "";
Возврат;
КонецЕсли;
АдресКартинки = ПолучитьАдресКартинки(ТекущиеДанные.Ссылка);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьАдресКартинки(Ссылка)
ДанныеКартинки = Ссылка.Фото.Получить(); // ХранилищеЗначения
Если ДанныеКартинки = Неопределено Тогда
Возврат "";
КонецЕсли;
Возврат ПоместитьВоВременноеХранилище(ДанныеКартинки, Новый УникальныйИдентификатор);
КонецФункции
Если фото нужно показывать именно в каждой строке (а не в отдельном поле), используйте таблицу значений вместо динамического списка: заполните её программно, добавьте колонку с адресами картинок во временном хранилище и выведите колонку как «Поле картинки». Это работает, но при большом объёме данных замедляет форму — загружайте картинки порционно.
- 1Добавьте в справочник реквизит типа ХранилищеЗначения для хранения файла
- 2На форму списка добавьте реквизит-строку «АдресКартинки» и элемент «Поле картинки», связанный с ним
- 3Реализуйте обработчик ПриАктивизацииСтроки с серверным вызовом получения данных
- 4Поместите двоичные данные во временное хранилище и запишите адрес в реквизит
- 5Проверьте поведение при пустом фото и при снятии выделения со строки
Проверка результата и производительность
После внедрения проверьте три вещи. Во-первых, корректность отображения: картинка должна соответствовать данным строки, а не «залипать» от предыдущей строки — это частая ошибка при ручном заполнении оформления. Во-вторых, обновление: при изменении данных (проведении документа, замене фото) картинка должна меняться без перезапуска формы. В-третьих, скорость: прокрутка списка не должна тормозить.
Если список стал медленным после добавления картинок, типичные причины — запросы в обработчиках вывода строк, загрузка полноразмерных фото вместо уменьшенных копий и пересоздание временного хранилища при каждой активации. Для фото товаров рекомендуется хранить в базе заранее уменьшенную миниатюру отдельным реквизитом.
Как проверить результат
Значок меняется вместе с данными строки при прокрутке
Во всех строках одна и та же картинка
Список листается без видимых задержек
Подвисания при каждом движении курсора
При отсутствии фото ячейка пустая или показывает заглушку
Ошибка обращения к хранилищу или старая картинка
Частые ошибки и ограничения
Самая распространённая ошибка — попытка присвоить двоичные данные напрямую свойству «Картинка» ячейки. Свойство принимает объект типа Картинка, а не ДвоичныеДанные; преобразование выполняется через Новый Картинка(ДвоичныеДанные). Вторая типичная проблема — не установлен флаг «ОтображатьКартинку» (в обычных формах) или неверно указано свойство «КартинкиСтрок», из-за чего ячейка остаётся пустой без каких-либо сообщений об ошибке.
Ещё одно ограничение: веб-клиент и тонкий клиент по-разному работают с большими изображениями, а передача картинок на клиента увеличивает трафик. Для динамических списков в управляемых формах недоступно событие вывода строки в том виде, в каком оно есть в обычных формах, — используйте условное оформление или переходите на таблицу значений.
FAQ
Можно ли вывести картинку в динамический список без условного оформления?
Да, если добавить в запрос списка вычисляемое поле с индексом картинки (через ВЫБОР) и связать колонку со свойством «КартинкиСтрок» таблицы формы. Это быстрее условного оформления при большом числе строк.
Почему картинка отображается не во всех строках, а «прыгает» при прокрутке?
Признак того, что значение картинки вычисляется в обработчике вывода строки с опорой на неактуальные данные или кэш. Перенесите логику в данные строки: пусть индекс картинки хранится в самой таблице или вычисляется запросом.
Как показать картинку из файла на диске, не сохраняя её в базу?
Создайте объект Картинка из файла: Новый Картинка("C:\Images\photo.jpg") — и присвойте его свойству Картинка ячейки или полю картинки. Учтите, что в клиент-серверном режиме файл должен быть доступен с той стороны, где выполняется код, а в веб-клиенте путь к локальному диску недоступен.
Поддерживает ли табличное поле картинки форматов PNG и JPG из хранилища?
Да, объект Картинка платформы понимает стандартные растровые форматы. При создании из двоичных данных формат определяется автоматически по содержимому, указывать его отдельно обычно не требуется.
Как вывести картинку в табличную часть документа, а не в список?
Табличная часть отображается той же таблицей формы. Для обычной формы используйте ПриВыводеСтроки, для управляемой — добавьте в табличную часть числовой реквизит с индексом картинки и настройте свойство «КартинкиСтрок» у элемента таблицы.
Почему в веб-клиенте картинки в списке грузятся медленнее, чем в тонком?
Веб-клиент передаёт каждое изображение браузеру отдельными запросами. Снизить задержку помогают уменьшенные миниатюры вместо исходных фото и отказ от показа картинок в каждой строке в пользу отдельного поля просмотра.
Что важно запомнить
Картинка в табличное поле выводится либо через оформление ячеек и коллекцию картинок (значки статусов), либо через поле картинки с адресом временного хранилища (фото из базы). Не выполняйте запросы в обработчиках отрисовки строк и храните для списков уменьшенные копии изображений.