В современной практике автоматизации часто возникает необходимость синхронизации данных между 1С и внешними системами, например, интернет-магазинами или мобильными приложениями. Одной из самых распространенных задач является выгрузка изображений товаров на FTP-сервер. В конфигурациях на базе Библиотеки Стандартных Подсистем (БСП), таких как 1С:Розница 2.3, работа с файлами имеет свои особенности.
В этой статье мы подробно рассмотрим, как программно извлечь картинки из базы данных и передать их на удаленный сервер, проанализируем типичные ошибки и разберем работающие примеры кода.
Процесс выгрузки можно разделить на четыре ключевых этапа, которые мы последовательно реализуем:
В конфигурациях БСП файлы хранятся в специальных подчиненных справочниках. Для номенклатуры это обычно справочник НоменклатураПрисоединенныеФайлы. Нам необходимо получить не только саму ссылку на файл, но и код или артикул владельца (номенклатуры), чтобы сформировать понятное имя файла для FTP.
Проанализируем текст запроса, который позволит нам собрать необходимые данные:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураПрисоединенныеФайлы.Ссылка КАК СсылкаНаФайл,
| НоменклатураПрисоединенныеФайлы.ВладелецФайла.Код КАК КодНоменклатуры,
| НоменклатураПрисоединенныеФайлы.Наименование КАК ИмяФайла
|ИЗ
| Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
|ГДЕ
| НЕ НоменклатураПрисоединенныеФайлы.ПометкаУдаления";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Обратите внимание, что мы добавили условие НЕ ПометкаУдаления, чтобы не выгружать неактуальные изображения. Также важно понимать, что поле ВладелецФайла ссылается на объект Справочник.Номенклатура.
Для взаимодействия с сервером в платформе используется объект FTPСоединение. Выясним важный технический момент: при создании соединения крайне рекомендуется использовать пассивный режим. Это позволит избежать блокировок со стороны брандмауэров (firewalls).
Рассмотрим синтаксис инициализации соединения:
// Параметры: Адрес, Порт, Логин, Пароль, Прокси, ПассивныйРежим
ПассивныйРежим = Истина;
Попытка
Соединение = Новый FTPСоединение("ftp.mysite.ru", 21, "admin", "password123", , ПассивныйРежим);
Исключение
Сообщить("Ошибка подключения к FTP: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Теперь объединим всё вышесказанное в единый цикл обработки. Важно учитывать контекст исполнения: код должен выполняться &НаСервере. Так как напрямую передать двоичные данные из базы на 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. Обязательно удаляем временный файл после отправки
УдалитьФайлы(ИмяВременногоФайла);
КонецЦикла;
Соединение.Закрыть();
КонецПроцедуры
При реализации этой задачи мы можем столкнуться с рядом нюансов, которые существенно влияют на стабильность системы:
Картинка и метод Преобразовать(). Это ускорит выгрузку и сэкономит место на сервере.КаталогВременныхФайлов().Соединение.НайтиФайлы(). Если каталога нет, его нужно создать командой Соединение.СоздатьКаталог(), иначе метод Записать() выдаст ошибку доступа.Проанализировав ситуацию, мы видим, что связка БСП + FTPСоединение + Временные файлы является наиболее надежным способом реализации обмена. Использование системных механизмов 1С позволяет гибко управлять именами файлов и гарантирует корректную передачу данных без потери качества.