Изображения товаров из базы 1С в папку на диске: от одной карточки до всего каталога

· 10 мин

Содержание

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

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

Где лежат картинки в базе: что проверить до выгрузки

Прежде чем что-то выгружать, выясните три вещи. От них зависит и способ, и код.

Как конфигурация хранит изображения

В современных типовых конфигурациях на БСП (Бухгалтерия 3.0, Управление торговлей 11, УНФ, ERP) картинка товара — это присоединённый файл. Он лежит в справочнике НоменклатураПрисоединенныеФайлы, а у номенклатуры есть реквизит со ссылкой на основное изображение.

В старых и самописных конфигурациях картинку часто хранят прямо в реквизите типа ХранилищеЗначения. Внутри может лежать объект Картинка или ДвоичныеДанные. Код выгрузки для этих двух случаев разный.

Как проверить: откройте конфигуратор, найдите справочник Номенклатура и посмотрите тип реквизитов. Если видите ссылку на ...ПрисоединенныеФайлы — первый вариант. Если ХранилищеЗначения — второй.

Где физически лежат файлы

Присоединённые файлы хранятся одним из двух способов:

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

Режим задаётся в общих настройках программы, в разделе Администрирование, группа настроек работы с файлами. Там же находится список томов хранения файлов с путями к каталогам.

Если файлы лежат в томах, картинки уже есть на диске. Но имена у них служебные, а раскиданы они по подпапкам. Чтобы получить файлы с именами по артикулу, всё равно нужна выгрузка средствами 1С.

Сколько картинок и в каком режиме работает база

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

Как выгрузить картинки из 1С штатными средствами

Штатные способы не требуют программирования. Для небольших объёмов их хватает.

Из карточки номенклатуры

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

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

Через обмен с сайтом

Обмен с сайтом в формате CommerceML выгружает каталог вместе с картинками. Его настраивают в разделе администрирования, в группе настроек обмена данными. Если указать выгрузку в каталог на диске, программа создаст файл import.xml и папку import_files с изображениями.

Минусы:

  • ❌ имена файлов служебные, а не по артикулу;
  • ❌ связь картинки с товаром придётся восстанавливать по import.xml;
  • ❌ выгружаются только товары, попавшие в настройки обмена.

Зато не нужен ни программист, ни конфигуратор. Если картинки нужны для загрузки на маркетплейс или в другой магазин, который понимает CommerceML, этого достаточно.

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

Обработки выгрузки данных в XML сохраняют справочник вместе с файлами. Но двоичные данные попадают внутрь XML в кодировке Base64. Картинку из такого файла ещё нужно декодировать, поэтому для задачи «получить папку с JPG» этот путь неудобен.

Обработка для выгрузки изображений на встроенном языке

Главный способ для массовой выгрузки. Внешняя обработка обходит все присоединённые файлы номенклатуры и пишет их в папку под именем «артикул_наименование.расширение».

Код для конфигураций на БСП

Создайте в конфигураторе внешнюю обработку (Файл → Новый → Внешняя обработка), добавьте форму, на форму — реквизит Каталог типа «Строка» и кнопку. В модуль формы вставьте код:

&НаКлиенте
Процедура Выгрузить(Команда)
	Если ПустаяСтрока(Каталог) Тогда
		Сообщить("Укажите каталог для выгрузки");
		Возврат;
	КонецЕсли;
	Количество = ВыгрузитьНаСервере(Каталог);
	Сообщить("Выгружено файлов: " + Формат(Количество, "ЧГ=0"));
КонецПроцедуры

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

	Выборка = Запрос.Выполнить().Выбрать();
	Счетчик = 0;
	Пока Выборка.Следующий() Цикл
		Данные = РаботаСФайлами.ДвоичныеДанныеФайла(Выборка.Файл, Ложь);
		Если Данные = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Счетчик = Счетчик + 1;
		Имя = ЧистоеИмя(СокрЛП(Выборка.Артикул) + "_" + СокрЛП(Выборка.Товар))
			+ "_" + Формат(Счетчик, "ЧГ=0") + "." + Выборка.Расширение;
		Данные.Записать(Каталог + ПолучитьРазделительПути() + Имя);
	КонецЦикла;
	Возврат Счетчик;
КонецФункции

&НаСервереБезКонтекста
Функция ЧистоеИмя(Знач Имя)
	Запрещенные = "\/:*?""<>|";
	Для Н = 1 По СтрДлина(Запрещенные) Цикл
		Имя = СтрЗаменить(Имя, Сред(Запрещенные, Н, 1), "-");
	КонецЦикла;
	Возврат Лев(Имя, 150);
КонецФункции

Что здесь важно:

  • РаботаСФайлами.ДвоичныеДанныеФайла — функция БСП. Она сама разбирается, лежит файл в базе или в томе. Второй параметр Ложь значит «не падать на битом файле, вернуть Неопределено».
  • Счётчик в имени нужен, потому что у одного товара бывает несколько фото. Без него файлы перезапишут друг друга.
  • ЧистоеИмя убирает символы, которые Windows не принимает в именах, и обрезает длину.

Сохраните обработку как .epf и откройте в пользовательском режиме через Файл → Открыть. Программа может спросить подтверждение на запуск внешней обработки — это защита от опасных действий, разрешите запуск, если обработку написали вы.

В клиент-серверной базе Каталог — это путь на сервере 1С, например D:\Export на машине с рабочим процессом. У пользователя, под которым работает служба 1С, должны быть права на запись в эту папку. Сетевой путь \\server\share тоже подойдёт, если у службы есть к нему доступ.

Если картинка лежит в реквизите «Хранилище значения»

Для старых конфигураций меняется только получение данных. Значение достают методом Получить() и проверяют тип:

Значение = Выборка.Ссылка.Картинка.Получить();
Если ТипЗнч(Значение) = Тип("Картинка") Тогда
	Если Значение.Формат() = ФорматКартинки.PNG Тогда
		Расширение = "png";
	ИначеЕсли Значение.Формат() = ФорматКартинки.GIF Тогда
		Расширение = "gif";
	ИначеЕсли Значение.Формат() = ФорматКартинки.BMP Тогда
		Расширение = "bmp";
	Иначе
		Расширение = "jpg";
	КонецЕсли;
	Значение.ПолучитьДвоичныеДанные().Записать(Каталог + "\" + Имя + "." + Расширение);
ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
	Значение.Записать(Каталог + "\" + Имя + ".jpg");
КонецЕсли;

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

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

Выгрузка картинок напрямую из SQL: когда это оправдано

Прямой запрос к MS SQL или PostgreSQL кажется самым быстрым путём. На практике это самый трудоёмкий вариант, и вот почему.

  1. Таблицы без человеческих имён. Справочник в СУБД называется вроде _Reference123, поле — _Fld4567. Соответствие объектов метаданных и таблиц возвращает функция ПолучитьСтруктуруХраненияБазыДанных() — её вызывают из 1С, без неё вы не найдёте нужные таблицы.
  2. Данные не в чистом виде. Значение типа ХранилищеЗначения хранится сериализованным и обычно сжатым. Поле нельзя просто сохранить как JPG: сначала его нужно распаковать и разобрать внутренний формат 1С.
  3. Тома не в базе. Если файлы хранятся в томах на диске, в SQL лежит только служебная информация, самих картинок там нет.
  4. Нет поддержки. Структура хранения не документирована как интерфейс и меняется при обновлении конфигурации.

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

-- MS SQL: какие таблицы занимают больше всего места
SELECT TOP 20 t.name AS table_name,
       SUM(a.total_pages) * 8 / 1024 AS size_mb
FROM sys.tables t
JOIN sys.partitions p ON t.object_id = p.object_id
JOIN sys.allocation_units a ON p.partition_id = a.container_id
GROUP BY t.name
ORDER BY size_mb DESC;

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

Выгрузка изображений из 1С по COM-соединению

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

Подготовка

  • 🔧 Зарегистрируйте COM-компонент: regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\comcntr.dll" от имени администратора.
  • 🔧 Разрядность программы-клиента должна совпадать с разрядностью платформы: 64-битный Python работает с 64-битной comcntr.dll.
  • 🔧 Версия comcntr.dll должна совпадать с версией платформы, на которой работает база.

Пример на Python

Надёжнее всего не тащить логику выгрузки в скрипт, а вызвать готовую серверную функцию из 1С. Добавьте в расширение конфигурации общий модуль с флагами «Сервер» и «Внешнее соединение», перенесите туда функцию ВыгрузитьНаСервере из обработки выше (с экспортом). Модуль назовём ВыгрузкаКартинок.

import win32com.client

connector = win32com.client.Dispatch("V83.COMConnector")
conn = connector.Connect(
    'File="D:\\Bases\\Trade";Usr="Администратор";Pwd="пароль"'
)
# для серверной базы: 'Srvr="srv1c";Ref="trade";Usr="...";Pwd="..."'

count = conn.ВыгрузкаКартинок.ВыгрузитьНаСервере("D:\\Export")
print("Выгружено:", count)

При COM-соединении к файловой базе код выполняется в процессе Python, поэтому путь D:\Export — на вашем компьютере. При подключении к серверной базе серверный код работает на сервере 1С, и путь снова серверный.

Пароль в строке подключения — слабое место. Заведите для выгрузки отдельного пользователя 1С с правами только на чтение справочника номенклатуры и присоединённых файлов.

Какой способ выбрать

СпособКогда подходитОграничения
Из карточки1-10 картинок, разовоТолько вручную
Обмен с сайтомНужен каталог для магазинаСлужебные имена файлов
Внешняя обработкаСотни и тысячи картинокНужен конфигуратор и права на запуск обработок
SQLБаза не открывается в 1ССжатые данные, неизвестные имена таблиц
COM-соединениеРегулярная выгрузка по расписаниюРегистрация comcntr.dll, занимает лицензию

В девяти задачах из десяти хватает обработки. COM — это та же обработка, только запущенная снаружи. SQL оставьте для аварийных случаев.

Почему картинки не выгружаются и как это исправить

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

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

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

Можно ли выгрузить картинки из 1С без конфигуратора?
Да, если хватает обмена с сайтом или ручного сохранения из карточки. Для массовой выгрузки с нужными именами без внешней обработки не обойтись, а её пишут в конфигураторе.
В каком формате выгрузятся изображения?
В том, в каком их загрузили: JPG, PNG, GIF, BMP. Платформа не конвертирует файлы при сохранении. Нужен один формат — конвертируйте после выгрузки графическим редактором или пакетной утилитой.
Как выгрузить только основное фото товара, без дополнительных?
Выбирайте в запросе не справочник присоединённых файлов, а саму номенклатуру и реквизит со ссылкой на основное изображение. Затем получайте двоичные данные по этой ссылке.
Работает ли обработка в 1С:Фреш или другом облаке?
Внешние обработки в облачных сервисах обычно ограничены: запуск разрешают только после проверки провайдером. Если запуск заблокирован, обратитесь к провайдеру или используйте выгрузку через обмен с сайтом.
Выгрузка картинок повлияет на данные в базе?
Нет. Обработка только читает файлы и пишет копии на диск. Справочники и присоединённые файлы не меняются.