Выгрузка картинок номенклатуры из базы 1С на диск, в обмен и по ссылке

· 9 мин

Содержание

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

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

Где 1С хранит фотографии товаров

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

КонфигурацияГде лежит картинкаКак добраться
БП 3.0, УТ 11, КА 2, ERPСправочник присоединённых файлов НоменклатураПрисоединенныеФайлы; основная картинка — ссылка в реквизите ФайлКартинки карточкиЧерез программный интерфейс работы с файлами
УТ 10.3, УПП 1.3 (пришли с 8.2)Справочник ХранилищеДополнительнойИнформации, реквизит Хранилище типа ХранилищеЗначения; в карточке — ссылка ОсновноеИзображениеЧерез метод Получить() хранилища
Нетиповые доработкиРеквизит или табличная часть типа ХранилищеЗначения прямо в справочникеЧерез Получить()

В конфигурациях на БСП у файлов два варианта размещения:

  • 🗄️ в информационной базе — двоичные данные лежат в служебных таблицах, база растёт вместе с количеством фото;
  • 💽 в томах на диске — администратор задаёт каталоги томов, 1С складывает туда файлы под своими именами и в своей структуре папок.

Вариант смотрят в Администрирование → Общие настройки, блок про работу с файлами. Если используются тома, копия папки тома — это резервная копия, а не выгрузка: имена файлов не связаны с наименованием товара, и сопоставить их вручную нельзя.

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

Сохранить несколько фото вручную из карточки

Если нужно 5–10 картинок, программировать незачем.

  1. Откройте карточку номенклатуры.
  2. Перейдите к присоединённым файлам: в типовых конфигурациях на 8.3 это команда или ссылка «Файлы» в шапке карточки, рядом с картинкой.
  3. Выделите нужное изображение и откройте его карточку.
  4. Выберите «Сохранить как» и укажите папку на диске.

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

Ручной способ сохраняет исходный файл с тем расширением, с которым его загружали. Ничего не пережимается.

Выгрузка фото через стандартные обмены данными

Типовые механизмы обмена тоже умеют отдавать картинки, но каждый по-своему.

Обмен с сайтом в формате CommerceML

В УТ 11, КА и ERP есть обмен с сайтами. При выгрузке каталога 1С формирует файл import.xml и кладёт картинки товаров в подпапку import_files. В XML у товара прописан относительный путь к его картинке.

Как получить фото этим путём:

  1. Откройте настройки обмена с сайтами в разделе интеграции с другими программами.
  2. Создайте узел обмена и выберите выгрузку в каталог на диске, а не на адрес сайта.
  3. Включите выгрузку картинок товаров.
  4. Запустите обмен и заберите содержимое import_files.

Плюс способа: связь «товар → фото» уже есть в import.xml, по идентификатору товара. Минус: имена файлов в import_files служебные, и для склада или маркетплейса их придётся переименовать скриптом по данным XML.

Универсальная выгрузка в XML

Обработка «Выгрузка и загрузка данных XML» переносит справочник вместе с присоединёнными файлами в другую базу. Значения типа ХранилищеЗначения и двоичные данные попадают внутрь XML строкой Base64.

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

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

Главный рабочий инструмент — внешняя обработка. Она выбирает товары с картинками, получает двоичные данные и записывает каждую в файл с именем по артикулу или коду.

Пример для БП 3.0 и УТ 11

Код берёт основную картинку каждого товара через функцию БСП РаботаСФайлами.ДвоичныеДанныеФайла. Функция сама разбирается, лежит файл в базе или в томе.

&НаСервереБезКонтекста
Функция ВыгрузитьКартинкиНаСервере(Каталог)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Номенклатура.Код КАК Код,
	|	Номенклатура.Артикул КАК Артикул,
	|	Номенклатура.ФайлКартинки КАК Файл,
	|	Номенклатура.ФайлКартинки.Расширение КАК Расширение
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.ФайлКартинки <> ЗНАЧЕНИЕ(Справочник.НоменклатураПрисоединенныеФайлы.ПустаяСсылка)
	|	И НЕ Номенклатура.ПометкаУдаления";

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

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

		ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(Выборка.Файл, Ложь);
		Если ДвоичныеДанные = Неопределено Тогда
			Продолжить; // файл потерян в томе или пуст
		КонецЕсли;

		ОсноваИмени = ?(ЗначениеЗаполнено(Выборка.Артикул),
			СокрЛП(Выборка.Артикул) + "_" + СокрЛП(Выборка.Код),
			СокрЛП(Выборка.Код));
		ОсноваИмени = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ОсноваИмени, "_");

		ИмяФайла = Каталог + ПолучитьРазделительПути() + ОсноваИмени + "." + НРег(Выборка.Расширение);
		ДвоичныеДанные.Записать(ИмяФайла);
		Выгружено = Выгружено + 1;

	КонецЦикла;

	Возврат Выгружено;

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

Почему имя собрано из артикула и кода: артикулы бывают пустыми и повторяются, а код номенклатуры в справочнике уникален. Без кода два товара с одинаковым артикулом перезапишут фото друг друга.

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

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

Все фото товара, а не только основное

У товара бывает 3–5 картинок. Чтобы выгрузить все, выбирайте не реквизит карточки, а сам справочник НоменклатураПрисоединенныеФайлы с отбором по полю ВладелецФайла. Номер в имени файла (АРТ-15_1.jpg, АРТ-15_2.jpg) добавляйте счётчиком в цикле по владельцу.

Пример для УТ 10.3 и УПП

В старых конфигурациях фото лежит в хранилище значения. Метод Получить() возвращает объект Картинка, у которого есть ПолучитьДвоичныеДанные().

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Хранилище.Объект.Код КАК Код,
|	Хранилище.Хранилище КАК Хранилище
|ИЗ
|	Справочник.ХранилищеДополнительнойИнформации КАК Хранилище
|ГДЕ
|	Хранилище.ВидДанных = ЗНАЧЕНИЕ(Перечисление.ВидыДополнительнойИнформацииОбъектов.Изображение)
|	И Хранилище.Объект ССЫЛКА Справочник.Номенклатура";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Значение = Выборка.Хранилище.Получить();
	Если ТипЗнч(Значение) = Тип("Картинка") Тогда
		ИмяФайла = Каталог + "\" + СокрЛП(Выборка.Код) + ".jpg";
		Значение.ПолучитьДвоичныеДанные().Записать(ИмяФайла);
	КонецЕсли;
КонецЦикла;

Расширение .jpg здесь условное: исходный формат в хранилище мог быть любым. Как определить реальный формат, разобрано ниже.

Как запустить обработку

  1. Откройте файл .epf через Файл → Открыть.
  2. Если база на БСП, обработку может потребоваться сначала зарегистрировать в дополнительных отчётах и обработках, а пользователю дать право открывать внешние обработки.
  3. Сначала прогоните выгрузку на копии базы или с отбором по одной группе товаров, проверьте имена и открываемость файлов.

Отдача фото по ссылке через HTTP-сервис

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

Схема такая:

  1. В расширении конфигурации создайте HTTP-сервис с корневым URL, например catalog.
  2. Добавьте шаблон URL /photo/{code} и метод GET.
  3. Опубликуйте базу на веб-сервере (Apache или IIS) с включёнными HTTP-сервисами.
  4. Клиент обращается по адресу вида http://сервер/имябазы/hs/catalog/photo/00-00000015.

Обработчик метода:

Функция ФотоGET(Запрос)

	Код = Запрос.ПараметрыURL["code"];
	Товар = Справочники.Номенклатура.НайтиПоКоду(Код);
	Если Товар.Пустая() Или Не ЗначениеЗаполнено(Товар.ФайлКартинки) Тогда
		Возврат Новый HTTPСервисОтвет(404);
	КонецЕсли;

	ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(Товар.ФайлКартинки, Ложь);
	Если ДвоичныеДанные = Неопределено Тогда
		Возврат Новый HTTPСервисОтвет(404);
	КонецЕсли;

	Расширение = НРег(Товар.ФайлКартинки.Расширение);
	ТипКонтента = ?(Расширение = "png", "image/png", "image/jpeg");

	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-Type", ТипКонтента);
	Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
	Возврат Ответ;

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

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

Если фото запрашивают часто, поставьте перед 1С кеширующий прокси. Каждый запрос к HTTP-сервису занимает сеанс и рабочий процесс сервера 1С.

Форматы, расширения и имена файлов

Большинство проблем после выгрузки картинок связано не с 1С, а с тем, как файл назван и в каком он формате.

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

ФорматПервые байты (HEX)
JPEGFF D8 FF
PNG89 50 4E 47
GIF47 49 46 38
BMP42 4D

Кириллица в имени. Windows такие имена понимает, а часть сайтов, FTP-клиентов и архиваторов на других системах — нет. Для выгрузки на сайт или маркетплейс берите имена из кода или артикула латиницей и цифрами.

Недопустимые символы. Артикулы вида 12/45 или A:15 ломают путь к файлу. В примере выше их заменяет функция БСП; в старых конфигурациях замените \ / : * ? " < > | на подчёркивание сами.

Base64 из XML. Если картинки пришли в XML строкой, раскодируйте её функцией Base64Значение(Строка): она возвращает двоичные данные, которые записываются в файл тем же методом Записать().

Тяжёлые BMP. В старых базах встречаются фото по 5–10 МБ в BMP. 1С сохранит их как есть. Пережимайте в JPEG уже после выгрузки, внешней утилитой пакетной конвертации.

Диагностика: выберите симптом

Выгрузка фото по расписанию

Для регулярной передачи фото на сайт или в маркетплейс-сервис выгрузку автоматизируют. Есть два пути.

Регламентное задание в расширении

  1. В расширении создайте общий модуль с флагом «Сервер» и экспортную процедуру выгрузки.
  2. Создайте регламентное задание и укажите эту процедуру как имя метода.
  3. Включите задание и задайте расписание, например каждую ночь в 02:00.
  4. В БП 3.0 и УТ 11 проверить и поправить расписание можно в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания.

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

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

Планировщик Windows и параметр /Execute

Для файловой базы подойдёт запуск обработки из командной строки по расписанию:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Base\Trade" /N "Выгрузка" /P "пароль" /Execute "D:\Scripts\ExportPhoto.epf" /DisableStartupMessages

Обработка должна в обработчике ПриОткрытии выполнить выгрузку и закрыть сеанс командой ЗавершитьРаботуСистемы(Ложь). Пароль в bat-файле лежит открытым текстом, поэтому заведите для этого отдельного пользователя только с правами на чтение номенклатуры.

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

Можно ли выгрузить фото из 1С без программиста?
Да, если картинок немного: сохраните их по одной из карточек товаров. Для массовой выгрузки нужна обработка; готовую обработку под вашу конфигурацию лучше проверить на копии базы.
Сколько места займут выгруженные фото?
Столько же, сколько они занимают в базе: 1С хранит исходные файлы без пересжатия. 5000 товаров по 300 КБ — около 1,5 ГБ.
Выгрузятся ли фото помеченных на удаление товаров?
Только если не исключить их отбором. В примере обработки помеченные товары отсекаются условием на пометку удаления.
Почему после переноса файлов в тома база не уменьшилась?
Место в файловой базе освобождается после сжатия таблиц через тестирование и исправление, в SQL-базе — после обслуживания на стороне СУБД.
Можно ли так же выгрузить сканы документов?
Да. Логика та же, меняется справочник присоединённых файлов: у каждого вида объектов он свой, например для документов реализации или договоров.