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