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