Выгрузка картинок номенклатуры из базы 1С на диск, в обмен и по ссылке
Содержание
Выгрузить одно фото из 1С можно прямо из карточки товара: откройте присоединённый файл и сохраните его на диск. Для сотен и тысяч картинок ручной путь не годится, нужна внешняя обработка, которая берёт двоичные данные каждого файла и пишет их в папку с понятным именем, например по артикулу.
Частое заблуждение: «фото лежат где-то в папке 1С, надо только найти её». Чаще всего папки нет. Картинки хранятся внутри информационной базы, а если и вынесены на диск в тома, то под служебными именами, по которым товар не опознать. Поэтому выгрузка фото из 1С почти всегда идёт через программу, а не через проводник.
Где 1С хранит фотографии товаров
От способа хранения зависит, каким методом выгружать. В современных конфигурациях на платформе 8.3 и в старых конфигурациях, перенесённых с 8.2, устройство разное.
| Конфигурация | Где лежит картинка | Как добраться |
|---|---|---|
| БП 3.0, УТ 11, КА 2, ERP | Справочник присоединённых файлов НоменклатураПрисоединенныеФайлы; основная картинка — ссылка в реквизите ФайлКартинки карточки | Через программный интерфейс работы с файлами |
| УТ 10.3, УПП 1.3 (пришли с 8.2) | Справочник ХранилищеДополнительнойИнформации, реквизит Хранилище типа ХранилищеЗначения; в карточке — ссылка ОсновноеИзображение | Через метод Получить() хранилища |
| Нетиповые доработки | Реквизит или табличная часть типа ХранилищеЗначения прямо в справочнике | Через Получить() |
В конфигурациях на БСП у файлов два варианта размещения:
- 🗄️ в информационной базе — двоичные данные лежат в служебных таблицах, база растёт вместе с количеством фото;
- 💽 в томах на диске — администратор задаёт каталоги томов, 1С складывает туда файлы под своими именами и в своей структуре папок.
Вариант смотрят в Администрирование → Общие настройки, блок про работу с файлами. Если используются тома, копия папки тома — это резервная копия, а не выгрузка: имена файлов не связаны с наименованием товара, и сопоставить их вручную нельзя.
Перед массовой выгрузкой узнайте у разработчика, какой у вас реквизит основной картинки. В доработанных базах фото часто лежат не там, где у типовой конфигурации.
Сохранить несколько фото вручную из карточки
Если нужно 5–10 картинок, программировать незачем.
- Откройте карточку номенклатуры.
- Перейдите к присоединённым файлам: в типовых конфигурациях на 8.3 это команда или ссылка «Файлы» в шапке карточки, рядом с картинкой.
- Выделите нужное изображение и откройте его карточку.
- Выберите «Сохранить как» и укажите папку на диске.
В УТ 10.3 и УПП путь другой: в карточке номенклатуры откройте дополнительную информацию (изображения), выделите картинку и сохраните её из формы просмотра.
Ручной способ сохраняет исходный файл с тем расширением, с которым его загружали. Ничего не пережимается.
Выгрузка фото через стандартные обмены данными
Типовые механизмы обмена тоже умеют отдавать картинки, но каждый по-своему.
Обмен с сайтом в формате CommerceML
В УТ 11, КА и ERP есть обмен с сайтами. При выгрузке каталога 1С формирует файл import.xml и кладёт картинки товаров в подпапку import_files. В XML у товара прописан относительный путь к его картинке.
Как получить фото этим путём:
- Откройте настройки обмена с сайтами в разделе интеграции с другими программами.
- Создайте узел обмена и выберите выгрузку в каталог на диске, а не на адрес сайта.
- Включите выгрузку картинок товаров.
- Запустите обмен и заберите содержимое
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 здесь условное: исходный формат в хранилище мог быть любым. Как определить реальный формат, разобрано ниже.
Как запустить обработку
- Откройте файл
.epfчерезФайл → Открыть. - Если база на БСП, обработку может потребоваться сначала зарегистрировать в дополнительных отчётах и обработках, а пользователю дать право открывать внешние обработки.
- Сначала прогоните выгрузку на копии базы или с отбором по одной группе товаров, проверьте имена и открываемость файлов.
Отдача фото по ссылке через HTTP-сервис
Когда фото нужны сайту, мобильному приложению или складскому терминалу постоянно, файлы на диске быстро устаревают. Надёжнее отдавать картинку по запросу прямо из базы.
Схема такая:
- В расширении конфигурации создайте HTTP-сервис с корневым URL, например
catalog. - Добавьте шаблон URL
/photo/{code}и методGET. - Опубликуйте базу на веб-сервере (Apache или IIS) с включёнными HTTP-сервисами.
- Клиент обращается по адресу вида
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) |
|---|---|
| JPEG | FF D8 FF |
| PNG | 89 50 4E 47 |
| GIF | 47 49 46 38 |
| BMP | 42 4D |
Кириллица в имени. Windows такие имена понимает, а часть сайтов, FTP-клиентов и архиваторов на других системах — нет. Для выгрузки на сайт или маркетплейс берите имена из кода или артикула латиницей и цифрами.
Недопустимые символы. Артикулы вида 12/45 или A:15 ломают путь к файлу. В примере выше их заменяет функция БСП; в старых конфигурациях замените \ / : * ? " < > | на подчёркивание сами.
Base64 из XML. Если картинки пришли в XML строкой, раскодируйте её функцией Base64Значение(Строка): она возвращает двоичные данные, которые записываются в файл тем же методом Записать().
Тяжёлые BMP. В старых базах встречаются фото по 5–10 МБ в BMP. 1С сохранит их как есть. Пережимайте в JPEG уже после выгрузки, внешней утилитой пакетной конвертации.
Выгрузка фото по расписанию
Для регулярной передачи фото на сайт или в маркетплейс-сервис выгрузку автоматизируют. Есть два пути.
Регламентное задание в расширении
- В расширении создайте общий модуль с флагом «Сервер» и экспортную процедуру выгрузки.
- Создайте регламентное задание и укажите эту процедуру как имя метода.
- Включите задание и задайте расписание, например каждую ночь в 02:00.
- В БП 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-файле лежит открытым текстом, поэтому заведите для этого отдельного пользователя только с правами на чтение номенклатуры.