Как устранить зависание регламентного задания и ошибку Transferred a partial file при обмене через FTP?

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

При организации автоматического обмена данными в «1С:Розница 1.0» (и других конфигурациях на платформе 8.3 или 8.1) администраторы часто сталкиваются с ситуацией, когда регламентное задание «зависает» в статусе «Выполняется». При этом ручной запуск того же самого обмена проходит без ошибок. Ситуация осложняется появлением в журнале регистрации или консоли кластера специфического сообщения: Ошибка при вызове метода контекста (НайтиФайлы): Ошибка работы с Интернет: ftp:// Transferred a partial file.

В этой статье мы подробно разберем, почему возникает эта проблема, чем отличается фоновый процесс от интерактивного и как правильно настроить сетевое окружение и код 1С, чтобы обмен работал стабильно.

Различие между ручным и автоматическим запуском

Первым делом проанализируем, почему ручной запуск обмена работает, а регламентное задание — нет. Когда вы запускаете обмен вручную, процесс выполняется в контексте вашего текущего пользователя Windows. Регламентное же задание выполняется на стороне сервера 1С под учетной записью службы (например, USRNBF или LocalSystem). Рассмотрим основные факторы влияния:

  1. Настройки прокси-сервера: Параметры прокси могут быть заданы в браузере или системных настройках вашего пользователя, но отсутствовать у пользователя службы 1С.
  2. Доступ к временным папкам: Метод НайтиФайлы активно использует системную папку Temp. Если у пользователя службы ограничены права на запись или очистку этой папки, процесс может блокироваться.
  3. Сетевые ограничения: Фаерволы и антивирусы могут разрешать сетевую активность интерактивным приложениям, но блокировать неопознанные запросы от фоновых служб.

Анализ ошибки Transferred a partial file

Эта ошибка генерируется библиотекой libcurl, которую платформа 1С использует для работы с протоколами передачи данных. Код ошибки означает, что фактический объем полученных данных не совпал с ожидаемым (указанным в заголовке или определенным при листинге каталога). Выясним основные причины:

Настройка сетевого экрана (на примере Kerio Control)

Многие системные администраторы ограничиваются открытием порта 21 для FTP, однако для стабильной работы 1С в режиме регламентных заданий этого недостаточно. Рассмотрим правильную настройку портов:

Для работы протокола FTP требуется не один, а два канала: управляющий (порт 21) и канал данных. В пассивном режиме (PASV), который является стандартом для работы через современные фаерволы, сервер сообщает клиенту случайный номер порта из высокого диапазона для передачи данных.

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

  1. Откройте диапазон портов для пассивного режима. Обычно это порты 49152–65535. Конкретный диапазон лучше уточнить в настройках вашего FTP-сервера.
  2. В Kerio Control проверьте работу службы Protocol Inspector. Попробуйте создать отдельное правило для IP-адреса сервера 1С, где инспектор протоколов для FTP будет отключен. Это исключит ложные срабатывания защиты на специфические запросы 1С.
  3. Убедитесь, что порты 20, 21 и 22 (если используется SFTP) открыты в обе стороны.

Оптимизация программного кода обмена

Часто проблема кроется в том, как именно инициируется соединение в общем модуле ПроцедурыОбменаДанными. Разберем, какие параметры объекта FTPСоединение критически важны для стабильности.

Посмотрим на пример правильной инициализации соединения с установкой таймаутов:


// Пример инициализации защищенного соединения с таймаутом
ТаймаутСоединения = 60; // Время в секундах
ПассивныйРежим = Истина; // Обязательно для работы через фаерволы

Попытка
    Соединение = Новый FTPСоединение(АдресСервера, Порт, Пользователь, Пароль, Прокси, ПассивныйРежим, ТаймаутСоединения);
    СписокФайлов = Соединение.НайтиФайлы(ПутьНаСервере, "*.zip");
Исключение
    ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;

Важный момент: Если параметр Таймаут не указан, 1С может ожидать ответа бесконечно, что и приводит к «зависанию» регламентного задания. Всегда устанавливайте разумный предел (60-120 секунд).

Диагностика через Технологический журнал

Если в обычном Журнале Регистрации пусто, единственным способом понять причину зависания является настройка Технологического журнала (ТЖ). Он позволит увидеть системные вызовы в момент вызова метода НайтиФайлы.

Создайте файл logcfg.xml в папке настроек сервера 1С со следующим содержанием:


<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
  <log location="C:\LOGS\FTP_Trace" history="24">
    <event>
      <eq property="Name" value="EXCP"/>
    </event>
    <event>
      <eq property="Name" value="SCALL"/>
    </event>
    <property name="AllProperties"/>
  </log>
</config>

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

Рекомендации по обслуживанию папки обмена

Метод НайтиФайлы на FTP-сервере работает достаточно медленно, так как запрашивает полный листинг директории. Если в папке обмена скопились тысячи архивных файлов, выполнение команды может занимать длительное время, вызывая таймауты и ошибки «частичной передачи».

Рекомендуем придерживаться следующих правил:

Подводя итог, можно сказать, что «зависание» — это почти всегда следствие бесконечного таймаута при ожидании ответа от сервера в условиях блокировки портов данных. Настройка пассивного режима в коде 1С и открытие соответствующего диапазона портов в Kerio Control решают проблему в большинстве случаев.

← На главную