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

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

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

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

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

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

Ниже разобраны оба подхода для управляемых форм, отмечены ограничения по производительности и типичные ошибки, из-за которых картинка не отображается или форма начинает «тормозить».

Где хранить картинку: выбор источника данных

Прежде чем настраивать форму, определите, откуда табличная часть будет брать изображение. Вариантов три: собственный реквизит табличной части с типом «ХранилищеЗначения», реквизит связанного объекта (например, «ФайлКартинки» в справочнике «Номенклатура») или механизм присоединённых файлов из Библиотеки стандартных подсистем.

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

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

Варианты хранения изображения

Реквизит табличной части (ХранилищеЗначения)

Подходит для уникальных фото строки (акт, осмотр). Минус — рост размера документов и дублирование данных.

Реквизит номенклатуры

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

Присоединённые файлы (БСП)

Стандартный механизм типовых конфигураций. Требует вызова функций БСП для получения двоичных данных файла.

Способ 1: реквизит табличной части с типом «Картинка»

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

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

Заполнение реквизита формы выполняется в обработчиках: при создании формы на сервере и при изменении строки. Двоичные данные из хранилища преобразуются в картинку конструктором Новый Картинка(ДвоичныеДанные).

bsl
&НаСервере
Процедура ЗаполнитьКартинкиСтрок()
    Для Каждого Строка Из Объект.Товары Цикл
        ДанныеКартинки = Строка.ХранилищеКартинки.Получить();
        Если ДанныеКартинки <> Неопределено Тогда
            Строка.Картинка = Новый Картинка(ДанныеКартинки);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Способ 2: картинка из карточки номенклатуры

Если фото хранится в справочнике «Номенклатура» (реквизит «ФайлКартинки» или присоединённый файл), добавлять что-либо в табличную часть документа не нужно. Достаточно создать в форме документа вычисляемую колонку таблицы с типом «Картинка» и заполнять её при изменении номенклатуры в строке.

В обработчике «ТоварыНоменклатураПриИзменении» получите данные картинки по ссылке на товар и присвойте их текущей строке. Получение выполняйте на сервере, чтобы не передавать ссылку и двоичные данные между клиентом и сервером лишний раз.

bsl
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    Строка = Элементы.Товары.ТекущиеДанные;
    Строка.Картинка = ПолучитьКартинкуНоменклатуры(Строка.Номенклатура);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьКартинкуНоменклатуры(Номенклатура)
    Данные = Номенклатура.ФайлКартинки.Хранилище.Получить();
    Если Данные = Неопределено Тогда
        Возврат Новый Картинка;
    КонецЕсли;
    Возврат Новый Картинка(Данные);
КонецФункции

Учтите: при открытии существующего документа обработчик изменения не сработает, поэтому картинки нужно заполнить отдельно в «ПриСозданииНаСервере» — пройти циклом по строкам табличной части и подставить изображения. Без этого шага картинки появятся только во вновь добавленных строках.

Вывод картинки в динамическом списке

Если табличная часть построена на динамическом списке (например, произвольный запрос к регистру или списку документов с выводом изображений), используется обработчик «ПриПолученииДанныхНаСервере». В нём платформа передаёт коллекцию строк, для которых можно программно установить значение картинки.

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

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

Настройка отображения: размер, заглушка, подпись

Чтобы строки не «прыгали» по высоте, зафиксируйте размер картинки в свойствах поля формы: укажите «Высота» и «Ширина» в символах/пикселях и установите свойство «РазмерКартинки» в значение «Пропорционально» — изображение впишется в ячейку без искажения пропорций.

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

Если картинка должна быть кликабельной (например, открывать карточку товара или полноразмерное фото), используйте событие «Нажатие» поля картинки и обрабатывайте его на клиенте с передачей ключа строки.

Порядок действий для управляемой формы
  1. 1
    Определите источник изображения: реквизит строки, карточка номенклатуры или присоединённый файл
  2. 2
    Добавьте в реквизиты формы колонку таблицы с типом «Картинка»
  3. 3
    Перетащите колонку в таблицу на форме и установите вид «Поле картинки»
  4. 4
    Напишите код заполнения колонки в «ПриСозданииНаСервере» и в обработчике изменения номенклатуры
  5. 5
    Задайте фиксированный размер и картинку-заглушку для пустых строк
  6. 6
    Проверьте открытие документа с 50+ строками и оцените скорость

Производительность и ограничения

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

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

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

Частые ошибки и их признаки

Самая распространённая ошибка — картинка заполняется только при изменении строки, но не при открытии документа. Признак: в старых документах колонка пустая, в новых строках изображение появляется. Лечится заполнением колонки в «ПриСозданииНаСервере».

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

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

Типичные ошибки
01
Колонка заполняется только в обработчике изменения — в существующих документах картинок нет
02
В поле картинки передают двоичные данные вместо объекта «Картинка» — ячейка остаётся пустой
03
Серверный вызов в цикле по строкам с клиента — форма открывается очень медленно
04
В базе хранятся полноразмерные фото вместо миниатюр — раздувание базы и медленная работа
05
Не задана картинка-заглушка — пользователь не отличает пустую строку от ошибки загрузки

Проверка результата

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

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

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

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

Открытие существующего документа
Норма

Картинки видны во всех строках сразу

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

Колонка пустая до редактирования строки

Добавление новой строки
Норма

После выбора номенклатуры картинка появляется автоматически

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

Изображение появляется только после перезаписи документа

Строка без картинки
Норма

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

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

Ошибка преобразования значения или пустой квадрат

Скорость открытия формы
Норма

Время открытия сопоставимо с версией до доработки

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

Форма открывается заметно дольше, видны подвисания

Итог

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

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

Частые вопросы

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

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

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

Чаще всего дело в формате изображения или в способе его получения. Проверьте, что картинка создаётся из двоичных данных стандартного формата (PNG, JPEG), а код получения данных работает на сервере и не использует функциональность, недоступную в веб-клиенте. Также убедитесь, что не используется передача пути к локальному файлу — в веб-клиенте локальные пути недоступны.

Как вывести картинку из присоединённых файлов БСП?

Используйте функции работы с присоединёнными файлами из состава Библиотеки стандартных подсистем: получите ссылку на файл владельца (например, номенклатуры), затем двоичные данные файла, и создайте из них объект «Картинка». Логика та же, что и с реквизитом-хранилищем, отличается только способ получения двоичных данных.

Можно ли сделать так, чтобы по клику на картинку открывалось большое фото?

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

Сколько строк с картинками выдержит форма без тормозов?

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

Как убрать колонку с картинками, если она больше не нужна?

Удалите элемент колонки из дерева элементов формы, затем реквизит формы с типом «Картинка» и код, который его заполнял. Если добавлялся реквизит табличной части объекта с хранилищем значений, удаляйте его только после переноса или очистки данных — вместе с реквизитом из базы удалятся и сохранённые изображения.