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

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

Как сохранить картинку из 1С в папку на диске

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

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

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

Материал подходит для типовых конфигураций на управляемых формах (УТ 11, ERP, Бухгалтерия 3.0, УНФ), а также для самописных решений, где картинки хранятся в реквизитах типа «ХранилищеЗначения».

Где 1С хранит картинки: три типичных места

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

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

Второе место — реквизит типа «ХранилищеЗначения». Так часто делают в самописных конфигурациях: двоичные данные картинки кладут прямо в реквизит справочника. Снаружи файл не виден, достать его можно только программно.

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

Видна в карточке товараПрисоединенный файл

Откройте список присоединенных файлов — там будет кнопка сохранения

Показывается на форме, но файла нетХранилищеЗначения

Нужна программная выгрузка через Получить()

Логотип в печатной формеОбщий макет

Ищите в конфигураторе: Общие — Макеты

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

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

В списке файлов выделите нужную строку и выполните команду «Сохранить на диск» (в некоторых конфигурациях — «Сохранить как»). 1С предложит выбрать папку и сохранит файл с исходным именем и расширением.

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

Сохранение через интерфейс
  1. 1
    Откройте карточку объекта (товар, контрагент, документ)
  2. 2
    Перейдите в список присоединенных файлов
  3. 3
    Выделите нужный файл или несколько строк
  4. 4
    Выполните команду «Сохранить на диск» и укажите папку
  5. 5
    Откройте папку и убедитесь, что файл открывается в просмотрщике

Программное сохранение картинки из хранилища значений

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Ссылка КАК Ссылка,

| Товары.Картинка КАК Картинка

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| НЕ Товары.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Папка = "D:\ВыгрузкаКартинок\";

Пока Выборка.Следующий() Цикл

Данные = Выборка.Картинка.Получить();

Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда

ИмяФайла = Папка + Строка(Выборка.Ссылка.УникальныйИдентификатор()) + ".jpg";

Данные.Записать(ИмяФайла);

КонецЕсли;

КонецЦикла;

Обратите внимание на проверку типа: если реквизит пустой, Получить() вернет Неопределено, и попытка записи вызовет ошибку. Проверка ТипЗнч отсекает такие случаи.

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Файлы.Ссылка КАК Файл,

| Файлы.Наименование КАК Наименование,

| Файлы.Расширение КАК Расширение

|ИЗ

| Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Данные = РаботаСФайлами.ДвоичныеДанныеФайла(Выборка.Файл);

Если Данные <> Неопределено Тогда

Данные.Записать("D:\ВыгрузкаКартинок\" + Выборка.Наименование + "." + Выборка.Расширение);

КонецЕсли;

КонецЦикла;

Имя справочника присоединенных файлов зависит от конфигурации: в УТ 11 это «НоменклатураПрисоединенныеФайлы», в других объектах — аналогичные. Точное имя смотрите в конфигураторе или через команду «Изменить форму» у списка файлов.

Имена файлов: как не потерять связь с товаром

Главная проблема массовой выгрузки — потом понять, какая картинка к какому товару относится. Уникальный идентификатор в имени файла надёжен, но нечитаем. Артикул удобнее, но может содержать символы, запрещенные в именах файлов Windows: \, /, :, *, ?, ", <, >, |.

Практичный вариант — формировать имя из артикула с заменой недопустимых символов, а при коллизиях добавлять порядковый номер. Альтернатива — выгружать вместе с картинками таблицу соответствия «имя файла — ссылка на товар» в CSV.

Функция БезопасноеИмя(Строка)

Запрещенные = "\/:*?""<>|";

Для Н = 1 По СтрДлина(Запрещенные) Цикл

Строка = СтрЗаменить(Строка, Сред(Запрещенные, Н, 1), "_");

КонецЦикла;

Возврат Строка;

КонецФункции

Типичные ошибки
01
Использовать наименование товара как имя файла без очистки — запрещенные символы вызовут ошибку записи
02
Не проверять результат Получить() на Неопределено — код падает на первом пустом реквизите
03
Сохранять все файлы с одним расширением jpg, хотя в базе png — картинки откроются, но прозрачность потеряется в метаданных
04
Запускать выгрузку миллиона файлов в одну папку — проводник Windows начнет тормозить, лучше раскладывать по подпапкам

Ограничения, права и проверка результата

Для программной выгрузки нужны права на чтение соответствующих справочников и возможность запуска внешних обработок (или доступ к конфигуратору). В файловой базе путь вида «D:\...» — это диск того компьютера, где запущен клиент. В клиент-серверном варианте код, выполняемый на сервере, пишет файлы на диск сервера, а не пользователя — это частая причина «файлы сохранились, но я их не вижу».

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

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

Как проверить результат

Количество файлов
Норма

Совпадает с числом элементов с картинками

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

Файлов меньше — часть реквизитов пуста или ошибки записи

Открытие файла
Норма

Картинка отображается в просмотрщике

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

Файл не открывается — записаны не двоичные данные, а, например, строка

Размер файлов
Норма

Размер в пределах десятков-сотен килобайт

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

Нулевой размер — выгружен пустой реквизит

Расположение
Норма

Файлы в ожидаемой папке

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

Файлов нет — код выполнился на сервере, ищите на диске сервера

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

Можно ли сохранить картинку из 1С без прав администратора?

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

Почему сохраненный файл не открывается?

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

Как выгрузить картинки в клиент-серверной базе на свой компьютер?

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

Как определить формат картинки, если расширение не хранится?

По сигнатуре первых байт двоичных данных: JPEG начинается с FF D8, PNG — с 89 50 4E 47, GIF — с «GIF8». В простых случаях достаточно попробовать открыть файл просмотрщиком, который сам определит формат.

Можно ли выгрузить картинки из макетов конфигурации?

Да. Откройте конфигуратор, найдите нужный макет в ветке «Общие — Макеты», откройте его и сохраните картинку через меню «Файл — Сохранить как» или скопируйте через буфер обмена в графический редактор.

Что делать, если картинок тысячи и выгрузка идет долго?

Разбейте выгрузку на порции по несколько сотен элементов, раскладывайте файлы по подпапкам (например, по первым буквам артикула) и запускайте обработку в фоновом задании, чтобы не блокировать работу пользователей.

Итог

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

Одиночные картинки сохраняйте через «Сохранить на диск» в списке присоединенных файлов. Для массовой выгрузки получайте двоичные данные из хранилища значений или через РаботаСФайлами.ДвоичныеДанныеФайла и записывайте методом Записать(). Проверяйте тип данных, очищайте имена файлов от запрещенных символов и помните: в клиент-серверной базе серверный код пишет на диск сервера.