К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как программно добавить присоединённые файлы к документу 1С

Программное добавление присоединенных файлов к документу 1С: работа с БСП, РаботаСФайлами, примеры кода, хранение в томах, типичные ошибки и проверка результата.

Присоединённые файлы в 1С — это механизм хранения произвольных файлов (сканов, изображений, договоров, актов), привязанных к объектам информационной базы: документам, справочникам, задачам. В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) за это отвечает подсистема «Работа с файлами», а программный интерфейс предоставляет общий модуль РаботаСФайлами (в старых версиях — ПрисоединенныеФайлы).

Программное добавление файлов нужно при интеграциях: загрузке сканов из внешней системы, прикреплении PDF-счетов при обмене, массовой загрузке фотографий номенклатуры, сохранении сформированных печатных форм. Ручное прикрепление через интерфейс в таких сценариях неприемлемо из-за объёмов.

Ключевой метод — РаботаСФайлами.ДобавитьФайл(), который принимает владельца, двоичные данные или адрес во временном хранилище и возвращает ссылку на элемент справочника присоединённых файлов. Ниже разобраны подготовка, варианты вызова, хранение в томах и типичные ошибки.

Как устроено хранение присоединённых файлов в 1С

В конфигурациях на БСП для каждого типа владельца создаётся отдельный справочник присоединённых файлов, например СчетНаОплатуПокупателюПрисоединенныеФайлы или РеализацияТоваровУслугПрисоединенныеФайлы. Каждый элемент такого справочника содержит ссылку на владельца, имя файла, расширение, размер, дату и служебные поля.

Сами двоичные данные по умолчанию хранятся в информационной базе — в реквизите типа ХранилищеЗначения или в регистре сведений двоичных данных (зависит от версии БСП). Альтернатива — хранение в томах на диске: в базе остаётся только путь к файлу, а содержимое лежит в сетевом каталоге. Тома настраиваются в разделе администрирования.

Понимать структуру важно, потому что от неё зависит выбор метода: если конфигурация на БСП — используйте РаботаСФайлами; если подсистемы нет (самописная конфигурация) — придётся создавать собственный справочник и писать в него напрямую.

Подготовка: что проверить перед написанием кода

Сначала убедитесь, что подсистема работы с файлами включена. В типовых конфигурациях откройте настройки и проверьте функциональную опцию, отвечающую за хранение файлов. Если у документа в интерфейсе нет кнопки «Присоединенные файлы» — подсистема не подключена к этому типу объекта, и программный вызов тоже не сработает.

Второй шаг — определить точное имя справочника присоединённых файлов для вашего документа. Его можно посмотреть в конфигураторе или получить программно через методы БСП. Имя формируется по шаблону: имя объекта-владельца плюс суффикс «ПрисоединенныеФайлы».

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

Контрольные точки

Как проверить готовность

Кнопка присоединения файлов в форме документа
Норма

Кнопка видна, файл прикрепляется вручную

Тревожный признак

Кнопки нет — подсистема не подключена к объекту

Права пользователя
Норма

Есть право добавления в справочник присоединённых файлов

Тревожный признак

Ошибка доступа при вызове метода

Наличие общего модуля РаботаСФайлами
Норма

Модуль есть в дереве конфигурации

Тревожный признак

Модуля нет — конфигурация без БСП, нужен свой механизм

Базовый способ: метод РаботаСФайлами.ДобавитьФайл

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

ДвоичныеДанные = Новый ДвоичныеДанные("C:\Files\dogovor.pdf");

АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);

ПараметрыФайла = Новый Структура;

ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);

ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());

ПараметрыФайла.Вставить("ИмяБезРасширения", "Договор");

ПараметрыФайла.Вставить("РасширениеБезТочки", "pdf");

ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяУниверсальнаяДата());

ПрисоединенныйФайл = РаботаСФайлами.ДобавитьФайл(

ПараметрыФайла, АдресХранилища);

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

После выполнения метод возвращает ссылку на созданный элемент справочника присоединённых файлов. Сохраните её, если файл нужно будет позже найти, заменить или удалить — искать по имени файла ненадёжно, так как имена могут повторяться.

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

Добавление файла с клиента и из внешних источников

Интерактивный выбор файла пользователем

Если файл выбирает пользователь в тонком клиенте, на клиенте нельзя напрямую читать файловую систему синхронными методами в веб-клиенте. Используйте асинхронный механизм НачатьПомещениеФайла: файл помещается во временное хранилище, после чего управление передаётся на сервер, где вызывается ДобавитьФайл.

Типичная ошибка здесь — попытка вызвать Новый ДвоичныеДанные(Путь) на клиенте в веб-клиенте: метод недоступен, и код падает. Всегда разделяйте код: получение файла — на клиенте через асинхронные методы, создание присоединённого файла — в серверной процедуре.

Загрузка из внешней системы или фоновым заданием

При интеграции через HTTP-сервис или регламентное задание двоичные данные обычно приходят в теле запроса или читаются с сетевого ресурса. В этом случае код полностью серверный: получили данные, поместили в хранилище, вызвали ДобавитьФайл. Обратите внимание: фоновое задание выполняется под служебным пользователем — поле «Автор» заполняйте явно, иначе получите пустого автора или ошибку.

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

bsl
Функция ПрикрепитьФайлКДокументу(ДокументСсылка, ДвоичныеДанные, ИмяФайла)
	Части = СтрРазделить(ИмяФайла, ".");
	Расширение = Части[Части.ВГраница()];
	Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
	ПараметрыФайла = Новый Структура;
	ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);
	ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
	ПараметрыФайла.Вставить("ИмяБезРасширения", СтрЗаменить(ИмяФайла, "." + Расширение, ""));
	ПараметрыФайла.Вставить("РасширениеБезТочки", Расширение);
	ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяУниверсальнаяДата());
	Возврат РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, Адрес);
КонецФункции

Конфигурация без БСП: собственный механизм хранения

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

НовыйФайл = Справочники.ФайлыДокументов.СоздатьЭлемент();

НовыйФайл.Владелец = ДокументСсылка;

НовыйФайл.ИмяФайла = "Скан акта.pdf";

НовыйФайл.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные,

Новый СжатиеДанных(9));

НовыйФайл.Записать();

Используйте сжатие данных при помещении в хранилище значений — это заметно сокращает рост базы при хранении сканов и изображений. Учтите ограничение: хранение больших файлов внутри базы ускоряет её раздувание и замедляет резервное копирование. При объёмах от нескольких гигабайт планируйте вынос в тома или во внешнее файловое хранилище.

Хранение в томах и контроль результата

Если в настройках включено хранение файлов в томах, метод ДобавитьФайл сам запишет данные на диск и сохранит в базе только путь. Программно различать режимы не нужно — БСП делает это прозрачно. Но при переносе базы или настройке нового сервера проверьте доступность каталога томов для пользователя, под которым работает сервер 1С, иначе файлы «потеряются»: ссылки есть, а содержимое не открывается.

Проверка результата после программного добавления: откройте документ в режиме предприятия, перейдите к присоединённым файлам и откройте файл на просмотр. Программно убедиться в корректности можно, получив данные обратно через РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл) и сравнив размер с исходным.

Типичные ошибки и их устранение

Первая распространённая проблема — передача в метод пути к файлу вместо адреса временного хранилища. Метод ожидает именно адрес, полученный через ПоместитьВоВременноеХранилище; строка с путём вызовет ошибку или пустой файл.

Вторая ошибка — неправильный разбор имени файла: расширение должно передаваться без точки, а имя — без расширения. Если передать «договор.pdf» целиком в ИмяБезРасширения, получите файл «договор.pdf.pdf». Третья типичная ситуация — дубли при повторном запуске обработки: перед добавлением проверяйте, нет ли уже файла с таким именем у владельца, если дубли недопустимы.

Типичные ошибки
01
Передача пути к файлу вместо адреса временного хранилища — метод не находит данные
02
Расширение с точкой или имя с расширением — двойное расширение в имени файла
03
Повторный запуск обработки без проверки существующих файлов — дубли у документа
04
Вызов синхронных файловых методов в веб-клиенте — код недоступен и падает
05
Игнорирование прав служебного пользователя фонового задания — молчаливый отказ в доступе
Итог

Что важно запомнить

В конфигурациях на БСП файл прикрепляется методом РаботаСФайлами.ДобавитьФайл: данные — во временное хранилище, владелец, имя и расширение — в параметрах. В конфигурации без БСП создаётся собственный справочник с хранилищем значений. После добавления всегда проверяйте, что файл открывается из документа, а при массовой загрузке тестируйте обработку на копии базы.

Частые вопросы

Как найти все присоединённые файлы конкретного документа запросом?

Запросом к справочнику присоединённых файлов с отбором по реквизиту «ВладелецФайла»: ВЫБРАТЬ Ссылка ИЗ Справочник.РеализацияТоваровУслугПрисоединенныеФайлы ГДЕ ВладелецФайла = &Владелец. Точное имя справочника зависит от типа документа — смотрите его в конфигураторе.

Можно ли прикрепить файл к непроведённому документу?

Да. Присоединение файлов не связано с проведением: владельцем может быть любая существующая ссылка, включая помеченные на удаление документы. Главное — чтобы ссылка была записана в базу, а не существовала только в памяти как объект.

Как заменить содержимое уже прикреплённого файла?

Используйте метод РаботаСФайлами.ОбновитьФайл или создайте новую версию через механизм версионирования, если он включён. Простое перезаписывание реквизитов элемента справочника в обход методов БСП может нарушить служебные данные (размер, подпись, дату изменения).

Почему файл добавился, но не открывается из документа?

Наиболее вероятные причины: данные не были помещены во временное хранилище (передан пустой адрес), недоступен каталог тома хранения при файловом режиме хранения, либо файл был добавлен с пустыми двоичными данными. Проверьте размер файла в карточке присоединённого файла — нулевой размер указывает на проблему при передаче данных.

Как ограничить размер загружаемых файлов программно?

Перед вызовом ДобавитьФайл проверьте размер двоичных данных методом ДвоичныеДанные.Размер() и сравните с допустимым порогом, отклонив слишком большие файлы с понятным сообщением. Дополнительно можно ограничивать расширения по белому списку, чтобы исключить загрузку исполняемых файлов.

Работает ли ДобавитьФайл при вызове через COM-соединение или веб-сервис?

Да, метод серверный и доступен в любом серверном контексте. Учитывайте две особенности: код выполняется под пользователем соединения (нужны права на справочник файлов и документ), а двоичные данные должны быть корректно переданы в базу — через параметр метода веб-сервиса или чтение с диска сервера.