Как организовать выгрузку и загрузку накладных через FTP-сервер в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Организация обмена электронными документами между складом и торговыми точками — типовая задача интеграции. В платформе 1С:Предприятие 7.7 отсутствуют встроенные механизмы прямого взаимодействия с протоколом FTP, поэтому обмен реализуется либо с подключением внешних компонент, либо посредством внешних системных утилит и скриптов. Разберем архитектуру процесса, типовые проблемы протокола FTP и практические способы их решения.

Архитектура обмена данными и защита от сбоев

Прежде чем перейти к программному коду, проанализируем критические особенности работы по протоколу FTP. Стандартный обмен файлами подвержен риску состояния гонки (race condition): если магазин начинает считывать файл в тот момент, когда склад еще не завершил отправку на FTP-сервер, база данных получит поврежденную накладную.

Для надежного обмена применим следующие инженерные правила:

  1. Передача с временным расширением: на стороне склада отправляем файл с расширением .tmp, а по завершении сессии переименовываем его на сервере в рабочее расширение (.xml, .dbf или .txt). Обработка в магазине должна считывать файлы только целевого формата.
  2. Использование маркеров готовности: после отправки накладной отправляется пустой файл-флаг с идентичным именем и расширением .ok или .ready. Принимающая сторона начинает скачивание только при наличии такого маркера.
  3. Пассивный режим (PASV): клиенты за межсетевыми экранами и маршрутизаторами NAT должны принудительно подключаться в пассивном режиме, чтобы избежать блокировки портов входящими соединениями.
  4. Бинарный режим передачи: всегда используем режим передачи данных Binary (Image/TYPE I), исключая текстовый режим ASCII, который может исказить бинарные файлы или нарушить кодировку символов.
  5. Латиница в именах файлов: для предотвращения конфликтов кодировок между Linux-серверами (UTF-8) и средой 1С 7.7 (Windows-1251) все имена файлов должны формироваться строго латинскими буквами и цифрами без пробелов.
  6. Защита от дублирования: после успешного проведения документа файл на FTP-сервере удаляется либо переносится в архивный каталог, а в 1С фиксируются номера и даты принятых накладных.

Вариант 1. Использование внешней компоненты CeDataExch (APPlus.dll)

Рассмотрим реализацию отправки файлов непосредственно из кода 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();              
КонецПроцедуры

На стороне магазина применяется аналогичная последовательность действий, где вместо отправки вызывается метод получения файлов в локальный каталог, после чего задействуются встроенные методы платформы ФС.НайтиПервыйФайл() и ФС.НайтиСледующийФайл() для чтения и проведения документов.

Вариант 2. Применение внешней компоненты dialmail.dll

Популярным решением для платформы 7.7 является библиотека dialmail.dll. Она предоставляет специализированный объект для работы с сетевыми протоколами. Разберем по шагам базовый алгоритм ее подключения:

  1. Регистрируем и загружаем библиотеку в сеансе: метод ЗагрузитьВнешнююКомпоненту("dialmail.dll").
  2. Создаем объект через СоздатьОбъект("AddIn.DialMail").
  3. Настраиваем свойства соединения: адрес хоста, порт (по умолчанию 21), логин, пароль, а также обязательно включаем пассивный режим работы.
  4. Вызываем метод подключения и выполняем скачивание файлов из каталога на сервере в локальную промежуточную папку.
  5. Завершаем сеанс FTP, после чего запускаем разбор полученных файлов локальными средствами 1С.

Важно помнить: 1С 7.7 — 32-разрядное приложение. При запуске на современных 64-битных операционных системах регистрация DLL через системный реестр должна производиться только с помощью 32-разрядной утилиты regsvr32.exe, расположенной в каталоге C:\Windows\SysWOW64, либо прямым вызовом файла из каталога программы.

Вариант 3. Использование консольных утилит (cURL, Wget, WinSCP) и планировщика задач

Разберем подход, при котором сетевая передача полностью выносится за пределы 1С. Это защищает базу от зависаний интерфейса при нестабильной связи и освобождает от необходимости регистрировать библиотеки. В качестве сетевого транспорта могут выступать утилиты cURL, wget, ncftp или скрипты WinSCP.

Схема взаимодействия выглядит следующим образом:

  1. Штатный планировщик задач Windows (Task Scheduler) запускает пакетный файл или сетевую утилиту с заданной периодичностью (например, раз в 5–10 минут).
  2. Консольная утилита соединяется с FTP, выкачивает новые накладные в локальную папку обмена и удаляет успешно скачанные файлы с сервера.
  3. Выделенный сеанс 1С («робот») отслеживает появление файлов в локальной папке с помощью метода ОбработкаОжидания(), либо 1С запускается планировщиком в пакетном режиме с ключом командной строки для выполнения регламентной обработки.
  4. Обработка 1С проверяет доступность файлов на чтение, разбирает структуры данных и проводит накладные, перемещая обработанные файлы в архив.

Пример выгрузки файла на сервер через системную утилиту cURL из кода 1С:


Команда = "curl.exe -T """ + ПутьКЛокальномуФайлу + """ ftp://myserver.ru/inbox/ --user логин:пароль";
КомандаСистемы(Команда);

Такой подход обеспечивает высокую стабильность: сетевые обрывы, таймауты и ошибки переподключения берет на себя внешняя специализированная программа, а 1С работает исключительно с локальной файловой системой.

← На главную