При разработке печатных форм в современных конфигурациях 1С, таких как Управление торговлей 11, ERP или Комплексная автоматизация, программисты часто сталкиваются с задачей вывода изображений номенклатуры или других присоединенных файлов. Сложность заключается в том, что система может хранить файлы двумя способами: непосредственно в информационной базе или в томах на диске. Рассмотрим, как написать универсальный код, который будет корректно работать в обоих случаях.
Начинающие разработчики часто пытаются самостоятельно анализировать тип хранения файла через перечисление ТипыХраненияФайлов. Проанализируем ситуацию: если файл хранится в информационной базе, мы можем получить его двоичные данные из реквизита. Если же файл хранится в томах на диске, нам нужно знать полный сетевой путь. Попытка прописать логику вручную, как в примере ниже, часто ведет к ошибкам доступа или некорректной работе в веб-клиенте:
Если Выборка.ФайлКартинки.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда
// Попытка получить картинку напрямую по пути может не сработать из-за прав доступа
ОбластьСтрока.Параметры.ПараметрКартинка = Новый Картинка(Выборка.ФайлКартинки.ПутьКФайлу);
КонецЕсли;
Такой подход считается плохой практикой, так как он не учитывает права доступа RLS, особенности работы сервера приложений и необходимость очистки временных ресурсов.
Выясним причину, по которой стоит использовать Библиотеку стандартных подсистем (БСП). Программный интерфейс БСП предоставляет функции, которые сами определяют, где лежит файл, проверяют права текущего пользователя и возвращают готовую ссылку на временное хранилище или двоичные данные. Разберем по шагам, как это реализовать.
Для конфигураций на базе БСП (версии 2.x и 3.x) основным инструментом является модуль ПрисоединенныеФайлы. Самый надежный способ получить данные для вывода — использовать метод ПолучитьДанныеФайла.
Рассмотрим пример правильного кода для модуля печати:
// Получаем структуру с данными файла через стандартную функцию БСП
ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(Выборка.ФайлКартинки);
// Проверяем, удалось ли получить ссылку на двоичные данные
Если ЗначениеЗаполнено(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла) Тогда
// Создаем объект Картинка, извлекая данные из временного хранилища
КартинкаОбъект = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
// Устанавливаем параметр в области макета
ОбластьСтрока.Параметры.ПараметрКартинка = КартинкаОбъект;
КонецЕсли;
Важный момент: функция ПрисоединенныеФайлы.ПолучитьДанныеФайла возвращает структуру, в которой поле СсылкаНаДвоичныеДанныеФайла содержит адрес во временном хранилище. Это работает одинаково и для файлов в базе, и для файлов в томах. Сервер 1С сам сходит на диск, прочитает файл и поместит его в хранилище, доступное клиенту.
Чтобы картинка отобразилась корректно, мало просто передать объект Картинка в параметр. Проанализируем настройки самого макета:
ПараметрКартинка).Если нам необходимо вывести, например, прайс-лист с сотнями фотографий, вызов функции ПолучитьДанныеФайла в цикле может существенно замедлить формирование отчета. Посмотрим на ситуацию глубже: каждое обращение к файлу на диске — это ресурсозатратная операция.
В современных редакциях БСП (3.0 и выше) рекомендуется использовать кэширование или методы пакетного получения данных, если они доступны в вашей версии библиотеки. Также полезно добавить проверку на наличие файла, чтобы избежать пустых рамок в документе:
Если НЕ ЗначениеЗаполнено(Выборка.ФайлКартинки) Тогда
// Можно вывести картинку-заглушку "Нет фото"
// ОбластьСтрока.Параметры.ПараметрКартинка = БиблиотекаКартинок.ПустаяКартинка;
Продолжить;
КонецЕсли;
Иногда даже при правильном коде картинка не выводится. Выясним возможные причины:
УстановитьПривилегированныйРежим(Истина).rphost) должен иметь права доступа к сетевой папке. Если служба запущена от имени LocalSystem, она не сможет "увидеть" сетевой путь \\Server\Volume$. Убедитесь, что права на уровне ОС настроены корректно.Таким образом, использование штатных функций РаботаСФайлами.ДанныеФайла или ПрисоединенныеФайлы.ПолучитьДанныеФайла является единственным верным и универсальным способом вывода изображений, гарантирующим стабильную работу системы независимо от топологии хранения данных.