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