В процессе разработки интерфейсов на платформе 1С 8.3 (Управляемые формы) часто возникает задача визуализации данных. Вывод изображения номенклатуры непосредственно в форме списка значительно повышает удобство работы пользователя, позволяя быстрее идентифицировать нужный товар. В этой статье мы подробно разберем, как реализовать отображение картинки для текущей строки списка, рассмотрим особенности работы с Библиотекой стандартных подсистем (БСП) и затронем вопросы оптимизации производительности.
Прежде чем приступать к написанию программного кода, нам необходимо подготовить саму управляемую форму. Разберем по шагам, какие элементы нужно добавить:
ФормаСписка справочника Номенклатура).АдресКартинки. Тип данных этого реквизита должен быть Строка. Именно в нем будет храниться навигационная ссылка на изображение.АдресКартинки в дерево элементов формы. По умолчанию платформа создаст Поле ввода. Нам нужно изменить его вид.Поле картинки. Также рекомендуем отключить заголовок для экономии места и настроить желаемый размер (ширину и высоту) области отображения.Самый распространенный сценарий — отображение картинки того товара, на котором в данный момент установлен курсор. Для этого мы будем использовать событие таблицы СписокПриАктивизацииСтроки. Рассмотрим алгоритм действий.
Проанализируем ситуацию: каждый раз, когда пользователь перемещается по списку, срабатывает клиентское событие. Нам нужно получить ссылку на текущую номенклатуру, обратиться к серверу (если данные не доступны на клиенте), получить адрес картинки и вернуть его в наш реквизит формы.
Посмотрим на пример кода, который можно использовать в качестве основы:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Вызываем серверную функцию для получения адреса изображения
АдресКартинки = ПолучитьАдресКартинкиНаСервере(ТекущиеДанные.Ссылка);
Иначе
АдресКартинки = "";
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьАдресКартинкиНаСервере(Знач НоменклатураСсылка)
// В простейшем случае, если картинка хранится в реквизите типа ХранилищеЗначения
Возврат ПолучитьНавигационнуюСсылку(НоменклатураСсылка, "ОсновноеИзображение");
КонецФункции
Важно помнить, что каждый переход по строкам списка провоцирует вызов серверного контекста, что может негативно сказаться на отзывчивости интерфейса, особенно при медленном соединении. Выясним, как это оптимизировать.
Если в вашем динамическом списке уже присутствует ссылка на объект, мы можем попробовать получить навигационную ссылку прямо на клиенте. Рассмотрим подробнее: метод ПолучитьНавигационнуюСсылку() может работать на стороне клиента, если передать в него ссылку на объект и имя реквизита. Это позволяет избежать лишних обращений к серверу.
Пример оптимизированного кода на клиенте:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущаяСтрока = Элементы.Список.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено Тогда
// Пытаемся получить ссылку без ухода на сервер
АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущаяСтрока, "ФайлКартинки");
КонецЕсли;
КонецПроцедуры
В типовых решениях, построенных на базе Библиотеки стандартных подсистем (БСП), механизм хранения файлов сложнее. Картинки хранятся не в самом справочнике Номенклатура, а в подчиненном справочнике присоединенных файлов. Проанализируем решение для таких конфигураций, как Управление Торговлей 11.
В этом случае нам необходимо использовать функции общих модулей БСП, таких как РаботаСФайлами или ПрисоединенныеФайлы. Разберем по шагам правильный подход:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
// Для УТ 11 часто используется Номенклатура из данных строки
АдресКартинки = ПолучитьАдресКартинкиБСП(ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьАдресКартинкиБСП(Номенклатура)
// Проверяем, заполнено ли основное изображение
ФайлКартинки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "ФайлКартинки");
Если Не ФайлКартинки.Пустая() Тогда
// Используем стандартный метод БСП для получения данных файла
// УникальныйИдентификатор формы передается для привязки временного хранилища к жизни формы
ДанныеФайла = РаботаСФайлами.ДанныеФайла(ФайлКартинки, ЭтаФорма.УникальныйИдентификатор);
Возврат ДанныеФайла.СсылкаНаДвоичныеДанныеФайла;
Иначе
Возврат "";
КонецЕсли;
КонецФункции
Проанализируем известную проблему: в некоторых версиях платформы при включенном режиме Иерархический список или Дерево событие ПриАктивизацииСтроки может вести себя некорректно или не срабатывать при выборе папок. Именно поэтому в типовых решениях часто разделяют форму на две части: слева дерево групп, справа — список номенклатуры. Если вы столкнулись с тем, что код не срабатывает, убедитесь, что в свойствах Динамического Списка корректно настроена основная таблица и тип данных.
Если вы решите выводить картинку не только для текущей строки, но и прямо в колонку списка для всех строк, стоит учитывать следующие моменты:
ХранилищеЗначения не сработает. Всегда используйте методы РаботаСФайлами.ДанныеФайла, так как они умеют прозрачно для вас извлекать файл из внешнего хранилища и помещать его во временное хранилище сеанса.УникальныйИдентификатор формы в функцию ПоместитьВоВременноеХранилище. Это критически важно: так платформа поймет, что картинку нужно удалить из оперативной памяти сервера сразу после закрытия пользователем окна списка.Если пользователи жалуются на «подтормаживание» при быстром пролистывании списка (скроллинге), мы можем применить хитрость. Вместо мгновенной загрузки картинки в ПриАктивизацииСтроки, мы будем запускать ПодключитьОбработчикОжидания с задержкой в 0.3–0.5 секунды. Если пользователь просто пролистал строку, обработчик будет перезапущен, и серверный вызов произойдет только тогда, когда пользователь остановится на конкретном товаре. Это существенно снижает нагрузку на сервер и сеть.
Мы рассмотрели основные и продвинутые способы вывода изображений. Выбор конкретного метода зависит от архитектуры вашей конфигурации (наличие БСП) и требований к скорости интерфейса. Помните, что визуализация должна помогать пользователю, а не замедлять его работу.