Как получить файлы, привязанные к объекту в 1С:Документооборот?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

В процессе разработки в 1С:Документооборот часто возникает задача программного получения двоичных данных файлов, которые закреплены за определенным объектом-владельцем. Вопрос хранения файлов в системе может вызывать сложности, так как архитектура хранения претерпевала изменения от версии к версии. Давайте разберемся, как правильно подходить к этой задаче, учитывая различия в структуре метаданных.

Понимание архитектуры хранения файлов

Первым делом важно осознать, где именно могут располагаться файлы в конфигурации «1С:Документооборот». Существует два основных способа: физическое хранение на диске в томах или хранение двоичных данных непосредственно в базе данных (SQL). Независимо от способа, справочник Файлы является центральной точкой входа.

В более старых редакциях и версиях ДО информация о двоичных данных могла храниться в регистрах сведений, таких как ДвоичныеДанныеФайлов или ХранимыеФайлыВерсий. Если вы работаете с современной версией КОРП, эти регистры могут быть недоступны или помечены как «Удалить», а данные теперь инкапсулированы внутри справочника ВерсииФайлов.

Рекомендуемый способ: использование штатного API

Вместо того чтобы напрямую обращаться к таблицам базы данных, что может привести к ошибкам при обновлении системы или нарушению логики блокировок, мы настоятельно рекомендуем использовать штатные методы, предоставляемые системой. Это наиболее безопасный и универсальный подход.

Для получения двоичных данных воспользуемся методом общего модуля РаботаСФайламиВызовСервера. Этот метод берет на себя всю «грязную работу»: он проверяет, где лежит файл, и извлекает его содержимое.

Рассмотрим пример кода для реализации этой задачи:


// Предположим, у нас есть ссылка на файл из справочника "Файлы"
// СсылкаФайла = ...; 

Результат = РаботаСФайламиВызовСервера.ДанныеФайлаИДвоичныеДанные(СсылкаФайла);

// Теперь в переменной "Результат" содержатся данные о файле
// включая его двоичные данные.
Если Результат <> Неопределено Тогда
    ДвоичныеДанные = Результат.ДвоичныеДанные;
    // Дальнейшая обработка данных
КонецЕсли;

Алгоритм действий при поиске файлов по владельцу

Чтобы найти все файлы, относящиеся к определенному документу или справочнику, выполним следующие шаги:

  1. Формирование запроса: Создадим запрос к справочнику Файлы, отбирая записи по полю ВладелецФайла.
  2. Перебор результатов: Пройдемся по выборке полученных ссылок.
  3. Получение данных: Для каждой ссылки вызовем API-функцию, например, РаботаСФайлами.ПолучитьДанныеФайла или упомянутый выше метод вызова сервера.

Давайте посмотрим, как может выглядеть фрагмент запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Файлы.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Файлы КАК Файлы
    |ГДЕ
    |    Файлы.ВладелецФайла = &Владелец";

Запрос.УстановитьПараметр("Владелец", СсылкаНаОбъект);
РезультатЗапроса = Запрос.Выполнить();

Почему не стоит использовать прямой доступ к таблицам?

Мы настоятельно советуем избегать «ручного» обращения к хранилищам значений, если в этом нет острой необходимости. Прямые запросы к таблицам имеют ряд существенных минусов:

Таким образом, использование штатного API — это профессиональный подход, который делает ваше решение устойчивым к изменениям и оптимизированным для работы в реальных бизнес-задачах.

← На главную