Извлечение присоединённых файлов и данных из базы 1С

· 10 мин

Содержание

Чаще всего «вытащить файл из 1С» означает достать скан, договор или картинку, которые кто-то прикрепил к документу или элементу справочника. И почти всегда для этого не нужен ни конфигуратор, ни SQL: откройте присоединённый файл в режиме 1С:Предприятие и сохраните его на диск. Это самый быстрый и безопасный путь.

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

Сначала разберитесь, где лежит файл

Прежде чем вытаскивать, поймите, что именно и откуда вы достаёте. От этого зависит способ.

  • 📎 Присоединённый файл — скан, PDF, фото или документ, который пользователь прикрепил к объекту базы (счёту, договору, номенклатуре). Хранится либо внутри информационной базы, либо в томах на диске.
  • 🗂️ Макет или картинка из конфигурации — печатная форма, логотип, картинка. Это часть конфигурации, а не пользовательские данные. Достаётся через конфигуратор.
  • 💽 Сама база — файл .1CD или выгрузка .dt. Это не «файл внутри 1С», а копия базы целиком; о ней — в разделе про резервные копии.

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

Если файл кто-то недавно открывал на редактирование, его копия могла остаться в рабочем каталоге пользователя (временная папка). Это не замена нормальной выгрузке, но иногда выручает, когда база уже недоступна.

Самый простой способ: сохранить присоединённый файл вручную

Для одного-двух файлов не нужно ничего программировать.

  1. Откройте объект, к которому прикреплён файл: документ, элемент справочника, задачу.
  2. На форме найдите команду работы с присоединёнными файлами. В типовых конфигурациях это кнопка со скрепкой либо пункт в меню Ещё; откроется список прикреплённых файлов объекта.
  3. Выделите нужный файл.
  4. В командной панели списка (или в меню Ещё) выберите команду сохранения файла на диск и укажите папку.

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

Когда файлов у одного объекта много, но они всё же исчислимы, удобнее выделить в списке сразу несколько строк (с Ctrl или Shift) и сохранить их одной командой в выбранный каталог — если конфигурация такую групповую выгрузку поддерживает.

Сколько файлов нужно вытащить и откуда?

Массовая выгрузка файлов внешней обработкой

Когда файлов десятки и сотни, вручную их не натыкаешь. Решение — внешняя обработка (.epf), которая обходит присоединённые файлы и записывает каждый на диск.

Логика у неё одна независимо от конфигурации:

  1. Запросом получить список элементов справочника присоединённых файлов (по нужному объекту или по всем).
  2. Для каждого получить двоичные данные файла .
  3. Записать данные на диск под именем файла.

Двоичные данные в типовых конфигурациях хранятся либо в реквизите самого файла типа ХранилищеЗначения, либо в отдельном регистре сведений, либо в томе. Поэтому ключевой момент — правильно получить ДвоичныеДанные. Если данные лежат в реквизите-хранилище, код записи выглядит так:

Данные = ЭлементФайла.ХранилищеФайла.Получить();
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
    ПутьФайла = КаталогВыгрузки + ЭлементФайла.Наименование + "." + ЭлементФайла.Расширение;
    Данные.Записать(ПутьФайла);
КонецЕсли;

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

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

Чтобы потом не разбирать свалку из тысяч файлов, сразу раскладывайте их по папкам — например, по объекту-владельцу или по дате. Служебное имя (код или GUID) полезно оставить в имени файла префиксом: два скана с одинаковым названием «Договор.pdf» иначе перезапишут друг друга. И запускайте такую обработку на копии базы: выгрузка больших объёмов данных нагружает сервер, а на рабочей базе это почувствуют пользователи.

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

Перед массовой выгрузкой
Выполнено: 0 / 4

Макеты, картинки и конфигурацию достаём через конфигуратор

Через конфигуратор вытаскивают не пользовательские файлы, а части самой конфигурации: печатные формы, логотипы, встроенные документы.

  • Макет (печатная форма, двоичные данные). Откройте конфигурацию, найдите нужный объект, раскройте ветку Макеты, откройте макет. Табличный документ сохраняется командой сохранения в файл (.mxl, Excel, PDF); макет типа «Двоичные данные» выгружается на диск как файл.
  • Общие картинки. В ветке Общие → Общие картинки каждую картинку можно сохранить в файл.
  • Вся конфигурация. Меню Конфигурация → Сохранить конфигурацию в файл создаёт файл .cf — это слепок конфигурации, а не данные.

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

Прямой доступ к базе через SQL: почему «дамп колонки» не сработает

Для клиент-серверных баз (MS SQL, PostgreSQL) возникает соблазн вытащить файл прямо запросом к таблице. На практике это почти всегда тупик, и вот почему.

  • Имена таблиц и полей в базе 1С обфусцированы: вместо понятного «ПрисоединённыеФайлы» вы увидите что-то вроде _Reference123 и _Fld456. Сопоставить их с объектами без дополнительных данных трудно.
  • Двоичные данные хранятся не как «сырой» файл, а в служебном формате ХранилищеЗначения: это обёртка с заголовком, и содержимое часто сжато. Выгрузив поле в файл напрямую, вы получите не PDF или картинку, а нечитаемый блок с мусором в начале.
  • Любая прямая правка базы через SQL не поддерживается фирмой 1С и может нарушить целостность. Для чтения риск меньше, но распаковать формат вручную всё равно сложнее, чем прочитать данные средствами 1С.

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

Как достать файлы из резервной копии и из томов

Если рабочая база недоступна или файл случайно удалили, источником становится резервная копия.

Файлы хранятся в информационной базе. Тогда они внутри выгрузки .dt или файла .1CD. Разверните копию базы в отдельную (тестовую) информационную базу и выгрузите файлы из неё штатными способами. Разворачивайте копию отдельно, не поверх рабочей базы, иначе потеряете текущие данные.

Файлы хранятся в томах на диске. Здесь важный нюанс: в .dt таких файлов нет — там только ссылки. Каждый файл лежит в каталоге тома под служебным именем, обычно без расширения. Настоящее имя и объект, к которому он относится, хранятся в базе. Поэтому:

  1. Восстановите каталоги томов из резервной копии файловой системы (их бэкапят отдельно от базы).
  2. Чтобы вернуть файлам осмысленные имена, сопоставьте служебные имена с данными базы — проще всего той же внешней обработкой, которая читает присоединённые файлы и пишет их на диск под нормальными именами.

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

Отсюда практический вывод: если файлы вынесены в тома, бэкап базы без бэкапа каталогов томов неполон — восстановить вложения из одного .dt не получится. Настройте регулярное резервное копирование и каталогов томов тоже, а не только базы.

Автоматическая выгрузка файлов по расписанию

Когда файлы нужно выгружать регулярно (например, передавать сканы в смежную систему), настройте автоматизацию.

  • Регламентное задание. Оформите выгрузку как процедуру в общем модуле и повесьте на регламентное/фоновое задание с нужным расписанием. В клиент-серверном варианте оно отработает на сервере без участия пользователя; путь выгрузки должен быть доступен серверу 1С.
  • Запуск обработки из командной строки. Внешнюю обработку можно выполнить без интерактивного входа, запустив 1С:Предприятие в пакетном режиме с параметром /Execute и указанием пути к .epf и строки соединения с базой. Это удобно ставить в планировщик задач ОС.
  • COM-соединение. Из внешней программы или скрипта можно подключиться к базе и вызвать выгрузку программно. Способ рабочий, но капризный к версиям и разрядности платформы, поэтому для разовой задачи проще обработка, а для регулярной — регламентное задание.

Любую автовыгрузку сначала обкатайте на копии базы и ограничьте объём (одна папка, один период), чтобы первый же запуск не завалил диск сотнями гигабайт сканов.

Если база повреждена и файлы не достаются

Когда база не открывается или часть данных «не читается», сперва приводят в порядок саму базу, и только потом вытаскивают файлы.

Для файловой базы (.1CD) запустите утилиту проверки и восстановления chdbfl.exe из каталога bin установленной платформы. Она найдёт и по возможности исправит нарушения физической целостности файла базы.

Работайте только с копией файла базы. Перед запуском chdbfl.exe сделайте копию .1CD: если восстановление пройдёт неудачно, у вас останется исходный файл.

Для баз, которые всё же открываются, но с ошибками, используйте конфигуратор: Администрирование → Тестирование и исправление информационной базы. Эта операция требует монопольного доступа — перед запуском предупредите пользователей и убедитесь, что все вышли из базы, иначе их сеансы прервутся.

Если штатные средства не помогают, существуют сторонние утилиты, которые открывают файл .1CD напрямую и выгружают таблицы, включая присоединённые файлы. Пользуйтесь ими осознанно: они не поддерживаются фирмой 1С, работают не со всеми версиями формата и годятся как крайняя мера, когда база иначе не открывается. Основной путь всё равно — восстановление из резервной копии.

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

Файл сохранился без расширения или не открывается — что не так?
Скорее всего имя собрали без расширения. У присоединённого файла расширение хранится отдельным реквизитом — добавляйте его к имени при записи. Если данные брали прямо из SQL, файл будет «битым» из-за служебного формата хранения: читайте средствами 1С.
Можно ли вытащить файл, не заходя в базу под пользователем?
Да, внешнюю обработку можно запустить в пакетном режиме через параметр /Execute, передав строку соединения. Права на объекты у используемой учётной записи при этом всё равно должны быть.
Почему вложения не восстановились из выгрузки `.dt`?
Значит, файлы хранятся в томах на диске, а не в базе. В .dt их нет, только ссылки. Нужен отдельный бэкап каталогов томов.
Как вытащить сразу все файлы по всем документам?
Внешней обработкой: запросом обойти справочник присоединённых файлов целиком и записать каждый на диск. Разложите по папкам (например, по объекту-владельцу), чтобы не запутаться в тысячах файлов.
Безопасно ли лезть в базу SQL-запросами, чтобы достать файлы?
Для чтения риск меньше, чем для записи, но смысла мало: данные лежат в служебном формате и имена таблиц обфусцированы. Прямые изменения базы через SQL не поддерживаются 1С. Читайте файлы встроенным языком.