При решении задач по регулярному обмену данными с внешними контрагентами или системами начинающие разработчики часто сталкиваются с дилеммой: написать быстрое решение «на коленке» с помощью внешних скриптов или глубоко интегрироваться в механизмы конфигурации. В этой статье мы разберем, как методологически верно реализовать выгрузку данных (например, прайс-листов или отчетов в формате dbf) на внешний FTP-сервер в среде «1С:Предприятие 8.3» на примере конфигурации «Управление торговлей 11».
Рассмотрим ситуацию, когда необходимо не просто «выкинуть» файл наружу, но и сохранить в системе «аудиторский след»: логи выгрузок, историю отправленных файлов и статусы выполнения. Проанализируем несколько подходов, от простейших обработок до использования тяжелых подсистем БСП (Библиотеки стандартных подсистем).
Самый «чистый» способ внедрения нового функционала без внесения изменений в типовую конфигурацию — это создание внешней обработки. Этот метод позволяет избежать проблем при обновлении программы и предоставляет пользователям удобный интерфейс для управления расписанием.
Разберем по шагам, как это работает:
СведенияОВнешнейОбработке(), чтобы система распознала её как подключаемую.Дополнительные отчеты и обработки.Преимущества этого подхода: выполнение происходит на стороне сервера через фоновое задание, а история запусков фиксируется в типовом журнале регистрации. Пользователи могут видеть результат выполнения в мониторе регламентных заданий.
Хотя многие считают, что подсистема «Обмен данными» нужна только для связи между двумя базами 1С, это не так. Рассмотрим ее возможности шире. В БСП существует механизм «Транспортных сообщений», который идеально подходит для нашей задачи.
Проанализируем преимущества настройки «Узла обмена» с типом транспорта FTP:
Безопасном хранилище, что исключает их кражу через консоль запросов.Интересный вариант, к которому пришел автор темы, — использование подсистемы электронного документооборота. Это решение оправдано, если выгружаемый файл по своей сути является электронным документом (например, заказом или актом сверки).
Выясним, почему это может быть удобно: в ЭДО уже реализованы механизмы «Пакетов электронных документов». При такой реализации каждый отправленный файл сохраняется в базе как присоединенный файл к техническому документу. Пользователь в любой момент может зайти в архив и посмотреть, какой именно вариант прайс-листа ушел на сервер неделю назад.
При написании кода выгрузки важно правильно инициализировать объект FTPСоединение. Посмотрим на пример кода, учитывающий современные требования безопасности и сетевых настроек:
// Настройка параметров подключения
Сервер = "ftp.example.com";
Порт = 21;
Пользователь = "admin";
Пароль = "secure_password";
ПассивныйРежим = Истина; // Важно для работы через Firewall
Попытка
Соединение = Новый FTPСоединение(Сервер, Порт, Пользователь, Пароль, , ПассивныйРежим);
// Формируем имя временного файла, чтобы избежать конфликтов
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("dbf");
// Здесь должен быть код формирования DBF через объект XBase
// ...
// Отправка файла на сервер
Соединение.Записать(ПутьКВременномуФайлу, "upload/price_list.dbf");
ЗаписатьЛогВыгрузки("Успешно отправлено", Истина);
Исключение
ИнформацияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписатьЛогВыгрузки("Ошибка: " + ИнформацияОбОшибке, Ложь);
КонецПопытки;
Важное замечание: Если принимающая сторона требует протокол SFTP (через SSH), стандартный объект FTPСоединение не подойдет, так как он поддерживает только FTP и FTPS. В этом случае мы рекомендуем использовать вызов внешних утилит, например, WinSCP, через метод ЗапуститьПриложение().
Разберем нюансы создания файла данных. Часто возникают проблемы с кодировками. По умолчанию 1С создает файлы в кодировке Windows (ANSI), но принимающие системы (особенно старые) могут ожидать DOS (OEM).
Проанализируем пример инициализации XBase:
ФайлDBF = Новый XBase;
ФайлDBF.Кодировка = КодировкаXBase.OEM; // Установка кодировки DOS
ФайлDBF.Поля.Добавить("ID", "N", 10, 0);
ФайлDBF.Поля.Добавить("NAME", "S", 100);
ФайлDBF.Поля.Добавить("PRICE", "N", 15, 2);
ФайлDBF.СоздатьФайл(ПутьКФайлу);
// Наполнение данными
Для Каждого СтрокаДанных Из ТаблицаРезультатов Цикл
ФайлDBF.Добавить();
ФайлDBF.ID = СтрокаДанных.Код;
ФайлDBF.NAME = СтрокаДанных.Наименование;
ФайлDBF.PRICE = СтрокаДанных.Цена;
ФайлDBF.Записать();
КонецЦикла;
ФайлDBF.ЗакрытьФайл();
Чтобы ваше решение было надежным и удобным для поддержки, придерживайтесь следующих правил:
ПолучитьИмяВременногоФайла(). Это гарантирует, что при одновременном запуске нескольких сессий выгрузки они не будут пытаться записать данные в один и тот же файл на диске сервера.ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище().ЖурналРегистрации с указанием разделенного имени события (например, "ОбменДанными.ВыгрузкаНаФТП").Присоединенные файлы. Это позволит хранить историю выгрузок не в логах, а в удобном для пользователя виде.Подводя итог, можно сказать: несмотря на то, что написать скрипт «на коленке» кажется быстрее, использование штатных механизмов 1С и БСП в долгосрочной перспективе экономит время на поддержку и делает систему прозрачной для конечных пользователей.