Как получить массив присоединенных к документу файлов в 1С:УНФ 3.0?

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

При разработке и доработке конфигураций на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Управление нашей фирмой 3.0, 1С:ERP или 1С:Управление торговлей 11, часто возникает задача программно получить список всех файлов, прикрепленных к определенному документу или элементу справочника. Разберем, как правильно решить эту задачу с помощью штатных механизмов БСП и альтернативных способов.

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

Способ 1. Использование штатной процедуры БСП РаботаСФайлами

Основная причина возникновения ошибок при программном обращении к подсистеме работы с файлами — опечатка в имени экспортного метода общего модуля. В типовых конфигурациях на актуальных версиях БСП (включая ветку 3.1.10) процедура называется РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту (без дублирования слова «Заполнить»).

Посмотрим на пример правильного вызова этой процедуры:


МассивФайлов = Новый Массив;
РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ДокументСсылка, МассивФайлов);

Разберем по шагам особенности функционирования данного метода:

  1. Передача параметров: Первым параметром передается ссылка на объект-владелец (например, ДокументСсылка.ЗаказПокупателя), вторым — предварительно инициализированная переменная с типом Массив. Метод не создает массив заново и не очищает его, а последовательно добавляет найденные элементы через метод Добавить().
  2. Автоматическая фильтрация: Процедура самостоятельно отбирает только действующие файлы, исключая те, у которых установлен признак ПометкаУдаления = Истина.
  3. Контекст выполнения: Метод доступен только на стороне сервера (серверный модуль, толстый клиент или внешнее соединение). Попытка вызвать его в контексте тонкого клиента приведет к ошибке компиляции.
  4. Проверка метаданных: Для корректной работы метода ссылка на объект должна входить в определяемый тип ВладелецПрисоединенныхФайлов. При необходимости программной проверки перед вызовом можно использовать функцию РаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(ДокументСсылка).
  5. Права доступа (RLS): Метод выполняется в контексте текущего сеанса. Если у пользователя действуют ограничения прав на чтение присоединенных файлов конкретного объекта, коллекция вернется пустой либо возникнет ошибка прав. В фоновых задачах или служебных алгоритмах вызов можно выполнять с предварительной установкой конструкции УстановитьПривилегированныйРежим(Истина).

Способ 2. Получение списка файлов через прямой запрос

Если требуется получить файлы с дополнительными условиями (например, отобрать файлы по конкретному автору, дате создания, расширению) или обойти типовой механизм, можно обратиться напрямую к таблице базы данных. В архитектуре БСП для каждого типа владельца формируется отдельный справочник хранения присоединенных файлов с именем вида <ИмяОбъекта>ПрисоединенныеФайлы.

Рассмотрим пример формирования запроса для документа ЗаказПокупателя:


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

Запрос.УстановитьПараметр("Владелец", ДокументСсылка);
МассивФайлов = Запрос.Выполнить().ВыгрузитьКолонку("Ссылка");

Этот способ дает гибкость в условиях отбора и позволяет сразу получить массив ссылок методом ВыгрузитьКолонку() без предварительного создания пустой коллекции.

Способ 3. Вызов функции РаботаСФайламиСлужебный.ВсеПодчиненныеФайлы

В общем модуле РаботаСФайламиСлужебный предусмотрена экспортная функция ВсеПодчиненныеФайлы(ВладелецФайлов). Посмотрим на вариант ее вызова:

МассивФайлов = РаботаСФайламиСлужебный.ВсеПодчиненныеФайлы(ДокументСсылка);

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

Оптимизация чтения содержимого полученных файлов

Если массив ссылок формируется для дальнейшей выгрузки, отправки по электронной почте или передачи через API, не следует считывать двоичные данные каждого файла по отдельности в цикле. Чтение каждого файла единичным вызовом приводит к множественным обращениям к базе данных или файловому тому.

Для пакетного чтения двоичных данных рекомендуется использовать специализированную функцию БСП:


// Возвращает соответствие вида "СсылкаНаФайл -> ДвоичныеДанные"
СоответствиеДанных = РаботаСФайлами.ДвоичныеДанныеФайлов(МассивФайлов, Ложь);

Использование пакетного метода значительно сокращает время выполнения операций ввода-вывода при работе с большим количеством присоединенных файлов.

← На главную