Как программно выгрузить изображения номенклатуры из 1С на FTP-сервер?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

В современной практике автоматизации часто возникает необходимость синхронизации данных между 1С и внешними системами, например, интернет-магазинами или мобильными приложениями. Одной из самых распространенных задач является выгрузка изображений товаров на FTP-сервер. В конфигурациях на базе Библиотеки Стандартных Подсистем (БСП), таких как 1С:Розница 2.3, работа с файлами имеет свои особенности.

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

Общая схема решения задачи

Процесс выгрузки можно разделить на четыре ключевых этапа, которые мы последовательно реализуем:

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

Шаг 1: Получение ссылок на присоединенные файлы

В конфигурациях БСП файлы хранятся в специальных подчиненных справочниках. Для номенклатуры это обычно справочник НоменклатураПрисоединенныеФайлы. Нам необходимо получить не только саму ссылку на файл, но и код или артикул владельца (номенклатуры), чтобы сформировать понятное имя файла для FTP.

Проанализируем текст запроса, который позволит нам собрать необходимые данные:


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

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

Обратите внимание, что мы добавили условие НЕ ПометкаУдаления, чтобы не выгружать неактуальные изображения. Также важно понимать, что поле ВладелецФайла ссылается на объект Справочник.Номенклатура.

Шаг 2: Работа с FTP-соединением

Для взаимодействия с сервером в платформе используется объект FTPСоединение. Выясним важный технический момент: при создании соединения крайне рекомендуется использовать пассивный режим. Это позволит избежать блокировок со стороны брандмауэров (firewalls).

Рассмотрим синтаксис инициализации соединения:


// Параметры: Адрес, Порт, Логин, Пароль, Прокси, ПассивныйРежим
ПассивныйРежим = Истина;
Попытка
    Соединение = Новый FTPСоединение("ftp.mysite.ru", 21, "admin", "password123", , ПассивныйРежим);
Исключение
    Сообщить("Ошибка подключения к FTP: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Шаг 3: Полный алгоритм выгрузки с использованием временных файлов

Теперь объединим всё вышесказанное в единый цикл обработки. Важно учитывать контекст исполнения: код должен выполняться &НаСервере. Так как напрямую передать двоичные данные из базы на FTP нельзя, мы сначала записываем их в «песочницу» — каталог временных файлов сервера.

Разберем готовый код процедуры:


&НаСервере
Процедура ВыгрузитьКартинкиНаFTP()

    // 1. Инициализация FTP
    Соединение = Новый FTPСоединение("ftp.example.com", 21, "user", "pass", , Истина);
    
    // 2. Получение данных запросом
    Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, ВладелецФайла.Код КАК Код ИЗ Справочник.НоменклатураПрисоединенныеФайлы");
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // 3. Получаем двоичные данные файла через методы БСП
        // Используем общий модуль РаботаСФайлами (входит в состав БСП)
        Попытка
            ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(Выборка.Ссылка);
        Исключение
            Продолжить; // Если файл не найден в хранилище, пропускаем
        КонецПопытки;
        
        // 4. Создаем временный файл на сервере
        ИмяВременногоФайла = ПолучитьВременноеИмяФайла("jpg");
        ДанныеФайла.Записать(ИмяВременногоФайла);
        
        // 5. Формируем путь на FTP (например, в папку img с именем по коду товара)
        ИмяФайлаНаFTP = "/public_html/img/" + СокрЛП(Выборка.Код) + ".jpg";
        
        // 6. Записываем файл на удаленный сервер
        Попытка
            Соединение.Записать(ИмяВременногоФайла, ИмяФайлаНаFTP);
        Исключение
            Сообщить("Не удалось отправить файл для кода " + Выборка.Код);
        КонецПопытки;
        
        // 7. Обязательно удаляем временный файл после отправки
        УдалитьФайлы(ИмяВременногоФайла);
        
    КонецЦикла;
    
    Соединение.Закрыть();
    
КонецПроцедуры

Важные рекомендации и оптимизация

При реализации этой задачи мы можем столкнуться с рядом нюансов, которые существенно влияют на стабильность системы:

  1. Оптимизация размера: Фотографии в 1С часто имеют высокое разрешение. Если вы выгружаете их для сайта, стоит предварительно уменьшить их размер прямо в коде 1С, используя объект Картинка и метод Преобразовать(). Это ускорит выгрузку и сэкономит место на сервере.
  2. Права доступа: Код выполняется на стороне сервера 1С. Убедитесь, что у пользователя ОС, под которым запущен сервис 1C:Enterprise Server, есть права на чтение и запись в папку, возвращаемую функцией КаталогВременныхФайлов().
  3. Таймауты: При выгрузке больших объемов данных (тысячи картинок) FTP-соединение может обрываться. В таких случаях целесообразно делать «паузы» или переподключаться к серверу каждые 100-200 файлов.
  4. Структура папок: Перед выгрузкой рекомендуется проверять существование каталога на FTP методом Соединение.НайтиФайлы(). Если каталога нет, его нужно создать командой Соединение.СоздатьКаталог(), иначе метод Записать() выдаст ошибку доступа.

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

← На главную