Как вывести картинку номенклатуры в форму списка в 1С 8.3?

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

В процессе разработки интерфейсов на платформе 1С 8.3 (Управляемые формы) часто возникает задача визуализации данных. Вывод изображения номенклатуры непосредственно в форме списка значительно повышает удобство работы пользователя, позволяя быстрее идентифицировать нужный товар. В этой статье мы подробно разберем, как реализовать отображение картинки для текущей строки списка, рассмотрим особенности работы с Библиотекой стандартных подсистем (БСП) и затронем вопросы оптимизации производительности.

Подготовительный этап: настройка реквизитов формы

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

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

Реализация базовой логики через событие активизации строки

Самый распространенный сценарий — отображение картинки того товара, на котором в данный момент установлен курсор. Для этого мы будем использовать событие таблицы СписокПриАктивизацииСтроки. Рассмотрим алгоритм действий.

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

Посмотрим на пример кода, который можно использовать в качестве основы:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Вызываем серверную функцию для получения адреса изображения
        АдресКартинки = ПолучитьАдресКартинкиНаСервере(ТекущиеДанные.Ссылка);
    Иначе
        АдресКартинки = "";
    КонецЕсли;
КонецПроцедуры

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

Оптимизация: использование навигационных ссылок без серверных вызовов

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

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

Пример оптимизированного кода на клиенте:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    ТекущаяСтрока = Элементы.Список.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено Тогда
        // Пытаемся получить ссылку без ухода на сервер
        АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущаяСтрока, "ФайлКартинки");
    КонецЕсли;
КонецПроцедуры

Реализация в современных конфигурациях (УТ 11, ERP, КА)

В типовых решениях, построенных на базе Библиотеки стандартных подсистем (БСП), механизм хранения файлов сложнее. Картинки хранятся не в самом справочнике Номенклатура, а в подчиненном справочнике присоединенных файлов. Проанализируем решение для таких конфигураций, как Управление Торговлей 11.

В этом случае нам необходимо использовать функции общих модулей БСП, таких как РаботаСФайлами или ПрисоединенныеФайлы. Разберем по шагам правильный подход:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
        // Для УТ 11 часто используется Номенклатура из данных строки
        АдресКартинки = ПолучитьАдресКартинкиБСП(ТекущиеДанные.Ссылка);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьАдресКартинкиБСП(Номенклатура)
    // Проверяем, заполнено ли основное изображение
    ФайлКартинки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "ФайлКартинки");
    
    Если Не ФайлКартинки.Пустая() Тогда
        // Используем стандартный метод БСП для получения данных файла
        // УникальныйИдентификатор формы передается для привязки временного хранилища к жизни формы
        ДанныеФайла = РаботаСФайлами.ДанныеФайла(ФайлКартинки, ЭтаФорма.УникальныйИдентификатор);
        Возврат ДанныеФайла.СсылкаНаДвоичныеДанныеФайла;
    Иначе
        Возврат "";
    КонецЕсли;
КонецФункции

Нюансы отображения при иерархическом просмотре

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

Продвинутые техники: производительность и миниатюры

Если вы решите выводить картинку не только для текущей строки, но и прямо в колонку списка для всех строк, стоит учитывать следующие моменты:

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

Если пользователи жалуются на «подтормаживание» при быстром пролистывании списка (скроллинге), мы можем применить хитрость. Вместо мгновенной загрузки картинки в ПриАктивизацииСтроки, мы будем запускать ПодключитьОбработчикОжидания с задержкой в 0.3–0.5 секунды. Если пользователь просто пролистал строку, обработчик будет перезапущен, и серверный вызов произойдет только тогда, когда пользователь остановится на конкретном товаре. Это существенно снижает нагрузку на сервер и сеть.

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

← На главную