При разработке отчетов для отдела кадров часто возникает задача визуализации данных. Одной из таких задач является вывод фотографий сотрудников (физических лиц) непосредственно в отчет. Это позволяет пользователям быстро идентифицировать сотрудников и проверять актуальность базы данных. В этой статье мы разберем, как правильно реализовать этот функционал, избегая типичных ошибок с производительностью и памятью сервера.
Разберем важный нюанс, упомянутый опытными разработчиками: не следует получать двоичные данные (саму картинку) напрямую в тексте запроса. Проанализируем причину. Фотографии — это «тяжелые» данные. Если ваш отчет формируется по большому количеству сотрудников, и запрос пытается выгрузить мегабайты бинарных данных в одну таблицу, это может привести к переполнению оперативной памяти сервера (особенно на 32-битных системах) и значительному замедлению работы всей базы.
Вместо этого в запросе мы получаем только Ссылку на объект, где хранится фото (например, на справочник ПрисоединенныеФайлы), а само изображение считываем непосредственно перед выводом в макет.
В современных конфигурациях, использующих Библиотеку стандартных подсистем (БСП), таких как ЗУП 3.1 или ERP, фотографии не хранятся в самом справочнике ФизическиеЛица. Посмотрим, где они находятся:
ФизическиеЛицаПрисоединенныеФайлы.ПрисоединенныеФайлы или в томах на диске.Рассмотрим по шагам программный вывод фото, если вы используете классический табличный документ и макет. Выясним, как передать картинку в ячейку.
Во-первых, подготовим макет. Создадим область (например, «Строка»), и в одной из ячеек установим тип Параметр, назовем его Фото. Очень важно: в свойствах этой ячейки в поле «Картинка» (размещение картинки) выберите значение Пропорционально. Это гарантирует, что фото не «расползется» и не исказится внутри ячейки.
Во-вторых, реализуем программный код в цикле обхода данных:
// Пример получения и вывода фото в цикле
Пока Выборка.Следующий() Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Сотрудник = Выборка.Наименование;
// Получаем двоичные данные (через функции БСП или запрос к РС)
СсылкаНаФайл = Выборка.СсылкаНаОсновноеИзображение;
Если ЗначениеЗаполнено(СсылкаНаФайл) Тогда
// Используем стандартный метод для получения данных
ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
Если ДвоичныеДанные <> Неопределено Тогда
// Создаем объект Картинка и передаем в параметр макета
ОбластьСтрока.Параметры.Фото = Новый Картинка(ДвоичныеДанные);
КонецЕсли;
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Если вы разрабатываете современный отчет на СКД, процесс немного отличается. Разберем, как сделать это эффективно:
Ссылка на присоединенный файл сотрудника.ОбщегоНазначения.ПрочитатьДанныеФайла(СсылкаНаФайл).Проанализируем преимущество этого метода: СКД сама управляет ресурсами и вызывает функцию получения картинки только для тех строк, которые непосредственно визуализируются или выводятся в итоговый документ.
Чтобы ваш отчет не стал причиной остановки работы сервера, придерживайтесь следующих правил:
1. Проверка наличия данных. Прежде чем пытаться создать объект Картинка, всегда проверяйте, заполнена ли ссылка на файл. Пустые вызовы функций замедляют формирование отчета.
2. Использование функций БСП. Старайтесь не писать прямых запросов к таблицам хранения двоичных данных (Config или системные таблицы). Используйте программный интерфейс модуля РаботаСФайлами. Он автоматически учитывает, где хранится файл — в базе или в томах на диске.
3. Предварительное сжатие. Если ваши пользователи загружают фотографии в разрешении 4K, никакой отчет не выдержит такой нагрузки. Рассмотрим возможность использования метода Картинка.Преобразовать() для уменьшения разрешения изображения «на лету» перед помещением его в отчет, если это критично для объема результирующего файла.
4. Решение бизнес-задачи. Как справедливо замечено в обсуждении, иногда пользователю не нужно видеть 500 лиц в одной таблице. Если задача стоит «узнать, у кого нет фото», эффективнее вывести текстовое поле «Есть фото» (Да/Нет) и использовать отбор, а само изображение выводить только в отдельной карточке сотрудника или при детальном просмотре.
Таким образом, мы рассмотрели основные способы вывода изображений. Сочетание правильного хранения данных в ПрисоединенныхФайлах и грамотного программного вывода через Параметры макета позволяет создавать качественные и быстрые отчеты для HR-служб.