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