Разработка и Конфигурация · 12 мин
Как программно добавить присоединённые файлы к документу 1С
Программное добавление присоединенных файлов к документу 1С: работа с БСП, РаботаСФайлами, примеры кода, хранение в томах, типичные ошибки и проверка результата.
Присоединённые файлы в 1С — это механизм хранения произвольных файлов (сканов, изображений, договоров, актов), привязанных к объектам информационной базы: документам, справочникам, задачам. В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) за это отвечает подсистема «Работа с файлами», а программный интерфейс предоставляет общий модуль РаботаСФайлами (в старых версиях — ПрисоединенныеФайлы).
Программное добавление файлов нужно при интеграциях: загрузке сканов из внешней системы, прикреплении PDF-счетов при обмене, массовой загрузке фотографий номенклатуры, сохранении сформированных печатных форм. Ручное прикрепление через интерфейс в таких сценариях неприемлемо из-за объёмов.
Ключевой метод — РаботаСФайлами.ДобавитьФайл(), который принимает владельца, двоичные данные или адрес во временном хранилище и возвращает ссылку на элемент справочника присоединённых файлов. Ниже разобраны подготовка, варианты вызова, хранение в томах и типичные ошибки.
Как устроено хранение присоединённых файлов в 1С
В конфигурациях на БСП для каждого типа владельца создаётся отдельный справочник присоединённых файлов, например СчетНаОплатуПокупателюПрисоединенныеФайлы или РеализацияТоваровУслугПрисоединенныеФайлы. Каждый элемент такого справочника содержит ссылку на владельца, имя файла, расширение, размер, дату и служебные поля.
Сами двоичные данные по умолчанию хранятся в информационной базе — в реквизите типа ХранилищеЗначения или в регистре сведений двоичных данных (зависит от версии БСП). Альтернатива — хранение в томах на диске: в базе остаётся только путь к файлу, а содержимое лежит в сетевом каталоге. Тома настраиваются в разделе администрирования.
Понимать структуру важно, потому что от неё зависит выбор метода: если конфигурация на БСП — используйте РаботаСФайлами; если подсистемы нет (самописная конфигурация) — придётся создавать собственный справочник и писать в него напрямую.
Подготовка: что проверить перед написанием кода
Сначала убедитесь, что подсистема работы с файлами включена. В типовых конфигурациях откройте настройки и проверьте функциональную опцию, отвечающую за хранение файлов. Если у документа в интерфейсе нет кнопки «Присоединенные файлы» — подсистема не подключена к этому типу объекта, и программный вызов тоже не сработает.
Второй шаг — определить точное имя справочника присоединённых файлов для вашего документа. Его можно посмотреть в конфигураторе или получить программно через методы БСП. Имя формируется по шаблону: имя объекта-владельца плюс суффикс «ПрисоединенныеФайлы».
Третий момент — права. Пользователь, от имени которого выполняется код (в том числе пользователь фонового задания или веб-сервиса), должен иметь права на добавление элементов справочника присоединённых файлов и на чтение документа-владельца. При вызове из внешнего соединения это частая причина молчаливых сбоев.
Как проверить готовность
Кнопка видна, файл прикрепляется вручную
Кнопки нет — подсистема не подключена к объекту
Есть право добавления в справочник присоединённых файлов
Ошибка доступа при вызове метода
Модуль есть в дереве конфигурации
Модуля нет — конфигурация без БСП, нужен свой механизм
Базовый способ: метод РаботаСФайлами.ДобавитьФайл
Основной сценарий выглядит так: двоичные данные файла помещаются во временное хранилище, затем вызывается метод добавления с указанием владельца. Минимальный пример на сервере:
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Files\dogovor.pdf");
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ИмяБезРасширения", "Договор");
ПараметрыФайла.Вставить("РасширениеБезТочки", "pdf");
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяУниверсальнаяДата());
ПрисоединенныйФайл = РаботаСФайлами.ДобавитьФайл(
ПараметрыФайла, АдресХранилища);
В разных версиях БСП сигнатура метода отличается: в старых релизах параметры передаются позиционно (владелец, имя, расширение и т.д.), в новых — структурой. Перед написанием кода откройте модуль РаботаСФайлами в конфигураторе и посмотрите актуальную сигнатуру именно вашей версии — это избавит от ошибок «Несоответствие числа параметров».
После выполнения метод возвращает ссылку на созданный элемент справочника присоединённых файлов. Сохраните её, если файл нужно будет позже найти, заменить или удалить — искать по имени файла ненадёжно, так как имена могут повторяться.
- 1Получите двоичные данные файла: с диска, из HTTP-ответа или из хранилища значений
- 2Поместите данные во временное хранилище функцией ПоместитьВоВременноеХранилище
- 3Сформируйте структуру параметров: владелец, имя без расширения, расширение, автор
- 4Вызовите РаботаСФайлами.ДобавитьФайл и сохраните возвращённую ссылку
- 5Проверьте результат: откройте документ и убедитесь, что файл виден и открывается
Добавление файла с клиента и из внешних источников
Интерактивный выбор файла пользователем
Если файл выбирает пользователь в тонком клиенте, на клиенте нельзя напрямую читать файловую систему синхронными методами в веб-клиенте. Используйте асинхронный механизм НачатьПомещениеФайла: файл помещается во временное хранилище, после чего управление передаётся на сервер, где вызывается ДобавитьФайл.
Типичная ошибка здесь — попытка вызвать Новый ДвоичныеДанные(Путь) на клиенте в веб-клиенте: метод недоступен, и код падает. Всегда разделяйте код: получение файла — на клиенте через асинхронные методы, создание присоединённого файла — в серверной процедуре.
Загрузка из внешней системы или фоновым заданием
При интеграции через HTTP-сервис или регламентное задание двоичные данные обычно приходят в теле запроса или читаются с сетевого ресурса. В этом случае код полностью серверный: получили данные, поместили в хранилище, вызвали ДобавитьФайл. Обратите внимание: фоновое задание выполняется под служебным пользователем — поле «Автор» заполняйте явно, иначе получите пустого автора или ошибку.
При массовой загрузке (тысячи файлов) оборачивайте каждый файл в отдельную транзакцию или обрабатывайте пачками с обработкой исключений: один битый файл не должен останавливать всю загрузку. Ошибки логируйте в журнал регистрации с указанием имени файла и владельца.
Функция ПрикрепитьФайлКДокументу(ДокументСсылка, ДвоичныеДанные, ИмяФайла)
Части = СтрРазделить(ИмяФайла, ".");
Расширение = Части[Части.ВГраница()];
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("ВладелецФайлов", ДокументСсылка);
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ИмяБезРасширения", СтрЗаменить(ИмяФайла, "." + Расширение, ""));
ПараметрыФайла.Вставить("РасширениеБезТочки", Расширение);
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяУниверсальнаяДата());
Возврат РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, Адрес);
КонецФункцииКонфигурация без БСП: собственный механизм хранения
В самописных конфигурациях без Библиотеки стандартных подсистем модуля РаботаСФайлами нет. Типовое решение — создать справочник «ФайлыДокументов» с реквизитами: Владелец (ссылка на документы), ИмяФайла, Расширение и ДанныеФайла типа ХранилищеЗначения. Программное добавление сводится к созданию элемента справочника:
НовыйФайл = Справочники.ФайлыДокументов.СоздатьЭлемент();
НовыйФайл.Владелец = ДокументСсылка;
НовыйФайл.ИмяФайла = "Скан акта.pdf";
НовыйФайл.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные,
Новый СжатиеДанных(9));
НовыйФайл.Записать();
Используйте сжатие данных при помещении в хранилище значений — это заметно сокращает рост базы при хранении сканов и изображений. Учтите ограничение: хранение больших файлов внутри базы ускоряет её раздувание и замедляет резервное копирование. При объёмах от нескольких гигабайт планируйте вынос в тома или во внешнее файловое хранилище.
Хранение в томах и контроль результата
Если в настройках включено хранение файлов в томах, метод ДобавитьФайл сам запишет данные на диск и сохранит в базе только путь. Программно различать режимы не нужно — БСП делает это прозрачно. Но при переносе базы или настройке нового сервера проверьте доступность каталога томов для пользователя, под которым работает сервер 1С, иначе файлы «потеряются»: ссылки есть, а содержимое не открывается.
Проверка результата после программного добавления: откройте документ в режиме предприятия, перейдите к присоединённым файлам и откройте файл на просмотр. Программно убедиться в корректности можно, получив данные обратно через РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл) и сравнив размер с исходным.
Типичные ошибки и их устранение
Первая распространённая проблема — передача в метод пути к файлу вместо адреса временного хранилища. Метод ожидает именно адрес, полученный через ПоместитьВоВременноеХранилище; строка с путём вызовет ошибку или пустой файл.
Вторая ошибка — неправильный разбор имени файла: расширение должно передаваться без точки, а имя — без расширения. Если передать «договор.pdf» целиком в ИмяБезРасширения, получите файл «договор.pdf.pdf». Третья типичная ситуация — дубли при повторном запуске обработки: перед добавлением проверяйте, нет ли уже файла с таким именем у владельца, если дубли недопустимы.
Что важно запомнить
В конфигурациях на БСП файл прикрепляется методом РаботаСФайлами.ДобавитьФайл: данные — во временное хранилище, владелец, имя и расширение — в параметрах. В конфигурации без БСП создаётся собственный справочник с хранилищем значений. После добавления всегда проверяйте, что файл открывается из документа, а при массовой загрузке тестируйте обработку на копии базы.
Частые вопросы
Как найти все присоединённые файлы конкретного документа запросом?
Запросом к справочнику присоединённых файлов с отбором по реквизиту «ВладелецФайла»: ВЫБРАТЬ Ссылка ИЗ Справочник.РеализацияТоваровУслугПрисоединенныеФайлы ГДЕ ВладелецФайла = &Владелец. Точное имя справочника зависит от типа документа — смотрите его в конфигураторе.
Можно ли прикрепить файл к непроведённому документу?
Да. Присоединение файлов не связано с проведением: владельцем может быть любая существующая ссылка, включая помеченные на удаление документы. Главное — чтобы ссылка была записана в базу, а не существовала только в памяти как объект.
Как заменить содержимое уже прикреплённого файла?
Используйте метод РаботаСФайлами.ОбновитьФайл или создайте новую версию через механизм версионирования, если он включён. Простое перезаписывание реквизитов элемента справочника в обход методов БСП может нарушить служебные данные (размер, подпись, дату изменения).
Почему файл добавился, но не открывается из документа?
Наиболее вероятные причины: данные не были помещены во временное хранилище (передан пустой адрес), недоступен каталог тома хранения при файловом режиме хранения, либо файл был добавлен с пустыми двоичными данными. Проверьте размер файла в карточке присоединённого файла — нулевой размер указывает на проблему при передаче данных.
Как ограничить размер загружаемых файлов программно?
Перед вызовом ДобавитьФайл проверьте размер двоичных данных методом ДвоичныеДанные.Размер() и сравните с допустимым порогом, отклонив слишком большие файлы с понятным сообщением. Дополнительно можно ограничивать расширения по белому списку, чтобы исключить загрузку исполняемых файлов.
Работает ли ДобавитьФайл при вызове через COM-соединение или веб-сервис?
Да, метод серверный и доступен в любом серверном контексте. Учитывайте две особенности: код выполняется под пользователем соединения (нужны права на справочник файлов и документ), а двоичные данные должны быть корректно переданы в базу — через параметр метода веб-сервиса или чтение с диска сервера.