Изображения товаров из базы 1С в папку на диске: от одной карточки до всего каталога
Содержание
Одну картинку из 1С выгружают прямо из карточки: открыть элемент номенклатуры, перейти к присоединённым файлам и сохранить нужный файл на диск. Чтобы выгрузить изображения всего каталога, нужна внешняя обработка на встроенном языке: она обходит справочник присоединённых файлов, получает двоичные данные каждого файла и записывает их в папку с понятными именами — по артикулу или коду.
Способов пять: вручную из карточки, через обмен с сайтом, обработкой, запросом к SQL и по COM-соединению из внешней программы. Какой выбрать, зависит от того, сколько картинок нужно, как база хранит файлы и есть ли у вас права администратора.
Где лежат картинки в базе: что проверить до выгрузки
Прежде чем что-то выгружать, выясните три вещи. От них зависит и способ, и код.
Как конфигурация хранит изображения
В современных типовых конфигурациях на БСП (Бухгалтерия 3.0, Управление торговлей 11, УНФ, ERP) картинка товара — это присоединённый файл. Он лежит в справочнике НоменклатураПрисоединенныеФайлы, а у номенклатуры есть реквизит со ссылкой на основное изображение.
В старых и самописных конфигурациях картинку часто хранят прямо в реквизите типа ХранилищеЗначения. Внутри может лежать объект Картинка или ДвоичныеДанные. Код выгрузки для этих двух случаев разный.
Как проверить: откройте конфигуратор, найдите справочник Номенклатура и посмотрите тип реквизитов. Если видите ссылку на ...ПрисоединенныеФайлы — первый вариант. Если ХранилищеЗначения — второй.
Где физически лежат файлы
Присоединённые файлы хранятся одним из двух способов:
- 🗄️ в самой информационной базе — данные файлов записаны в служебный регистр;
- 📁 в томах на диске — база хранит только ссылку, а сам файл лежит в каталоге тома.
Режим задаётся в общих настройках программы, в разделе Администрирование, группа настроек работы с файлами. Там же находится список томов хранения файлов с путями к каталогам.
Если файлы лежат в томах, картинки уже есть на диске. Но имена у них служебные, а раскиданы они по подпапкам. Чтобы получить файлы с именами по артикулу, всё равно нужна выгрузка средствами 1С.
Сколько картинок и в каком режиме работает база
Пять-десять картинок проще сохранить руками. Сотни и тысячи — только программно. Для файловой базы прямой SQL-запрос невозможен: там нет СУБД. Для клиент-серверной базы учтите, что серверный код обработки пишет файлы на диск сервера 1С, а не на ваш компьютер.
Как выгрузить картинки из 1С штатными средствами
Штатные способы не требуют программирования. Для небольших объёмов их хватает.
Из карточки номенклатуры
- Откройте карточку товара.
- Щёлкните по изображению или по ссылке на присоединённые файлы (иконка скрепки в командной панели).
- В списке файлов выделите нужный.
- Найдите в меню
Ещёкоманду сохранения файла на компьютер и укажите папку.
Файл сохранится в исходном формате — 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");
КонецЕсли;
Здесь Картинка в Выборка.Ссылка.Картинка — имя реквизита в вашей конфигурации, подставьте своё. В запросе выбирайте Ссылка, а не сам реквизит: поля типа «Хранилище значения» запрос не возвращает.
Выгрузка картинок напрямую из SQL: когда это оправдано
Прямой запрос к MS SQL или PostgreSQL кажется самым быстрым путём. На практике это самый трудоёмкий вариант, и вот почему.
- Таблицы без человеческих имён. Справочник в СУБД называется вроде
_Reference123, поле —_Fld4567. Соответствие объектов метаданных и таблиц возвращает функцияПолучитьСтруктуруХраненияБазыДанных()— её вызывают из 1С, без неё вы не найдёте нужные таблицы. - Данные не в чистом виде. Значение типа
ХранилищеЗначенияхранится сериализованным и обычно сжатым. Поле нельзя просто сохранить как JPG: сначала его нужно распаковать и разобрать внутренний формат 1С. - Тома не в базе. Если файлы хранятся в томах на диске, в SQL лежит только служебная информация, самих картинок там нет.
- Нет поддержки. Структура хранения не документирована как интерфейс и меняется при обновлении конфигурации.
Оправдан этот путь в одном случае: 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 оставьте для аварийных случаев.
Почему картинки не выгружаются и как это исправить
comcntr.dll той же разрядности и версии, что и клиентская программа.Пара советов по скорости. На десятках тысяч файлов обработка может идти долго — запускайте её вне рабочего времени. Если выгрузку прерывали, перед повторным запуском проверяйте Новый Файл(Путь).Существует() и пропускайте уже записанные картинки.