Организация обмена электронными документами между складом и торговыми точками — типовая задача интеграции. В платформе 1С:Предприятие 7.7 отсутствуют встроенные механизмы прямого взаимодействия с протоколом FTP, поэтому обмен реализуется либо с подключением внешних компонент, либо посредством внешних системных утилит и скриптов. Разберем архитектуру процесса, типовые проблемы протокола FTP и практические способы их решения.
Прежде чем перейти к программному коду, проанализируем критические особенности работы по протоколу FTP. Стандартный обмен файлами подвержен риску состояния гонки (race condition): если магазин начинает считывать файл в тот момент, когда склад еще не завершил отправку на FTP-сервер, база данных получит поврежденную накладную.
Для надежного обмена применим следующие инженерные правила:
.tmp, а по завершении сессии переименовываем его на сервере в рабочее расширение (.xml, .dbf или .txt). Обработка в магазине должна считывать файлы только целевого формата..ok или .ready. Принимающая сторона начинает скачивание только при наличии такого маркера.Binary (Image/TYPE I), исключая текстовый режим ASCII, который может исказить бинарные файлы или нарушить кодировку символов.Рассмотрим реализацию отправки файлов непосредственно из кода 1С 7.7 с помощью внешней компоненты. Подключение компоненты выполняется методом ЗагрузитьВнешнююКомпоненту(), после чего создается объект AddIn.CeDataExch.
Посмотрим на пример процедуры отправки документа на складской FTP-сервер:
Процедура ОтправитьНаФТП(ФайлНаДиске, НазваниеФайла)
// Проверяем наличие и регистрируем компоненту в различных каталогах базы
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "APPlus.dll") <> 1 Тогда
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "ExtForms\" + "APPlus.dll") <> 1 Тогда
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "APPlus.dll") <> 1 Тогда
Предупреждение("Компонента APPlus.dll не найдена!");
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ФТП = СоздатьОбъект("AddIn.CeDataExch");
ФТП.FtpOpenSession();
// Выполняем подключение к FTP-серверу
Результат = ФТП.FtpConnect("ftp.myserver.ru", "ИмяПользователя", "Пароль");
Если Результат = 0 Тогда
// При успешном подключении загружаем файл на сервер
Результат = ФТП.FtpPutFile(ФайлНаДиске, "invoice\" + НазваниеФайла);
Если Результат <> 0 Тогда
Сообщить("Не удалось отправить файл по причине: " + ФТП.ErrDescription(Результат), "!");
КонецЕсли;
Иначе
Сообщить("Не удалось подключиться по причине: " + ФТП.ErrDescription(Результат), "!");
КонецЕсли;
ФТП.FtpCloseSession();
КонецПроцедуры
На стороне магазина применяется аналогичная последовательность действий, где вместо отправки вызывается метод получения файлов в локальный каталог, после чего задействуются встроенные методы платформы ФС.НайтиПервыйФайл() и ФС.НайтиСледующийФайл() для чтения и проведения документов.
Популярным решением для платформы 7.7 является библиотека dialmail.dll. Она предоставляет специализированный объект для работы с сетевыми протоколами. Разберем по шагам базовый алгоритм ее подключения:
ЗагрузитьВнешнююКомпоненту("dialmail.dll").СоздатьОбъект("AddIn.DialMail").Важно помнить: 1С 7.7 — 32-разрядное приложение. При запуске на современных 64-битных операционных системах регистрация DLL через системный реестр должна производиться только с помощью 32-разрядной утилиты regsvr32.exe, расположенной в каталоге C:\Windows\SysWOW64, либо прямым вызовом файла из каталога программы.
Разберем подход, при котором сетевая передача полностью выносится за пределы 1С. Это защищает базу от зависаний интерфейса при нестабильной связи и освобождает от необходимости регистрировать библиотеки. В качестве сетевого транспорта могут выступать утилиты cURL, wget, ncftp или скрипты WinSCP.
Схема взаимодействия выглядит следующим образом:
ОбработкаОжидания(), либо 1С запускается планировщиком в пакетном режиме с ключом командной строки для выполнения регламентной обработки.Пример выгрузки файла на сервер через системную утилиту cURL из кода 1С:
Команда = "curl.exe -T """ + ПутьКЛокальномуФайлу + """ ftp://myserver.ru/inbox/ --user логин:пароль";
КомандаСистемы(Команда);
Такой подход обеспечивает высокую стабильность: сетевые обрывы, таймауты и ошибки переподключения берет на себя внешняя специализированная программа, а 1С работает исключительно с локальной файловой системой.