При организации автоматического обмена данными в «1С:Розница 1.0» (и других конфигурациях на платформе 8.3 или 8.1) администраторы часто сталкиваются с ситуацией, когда регламентное задание «зависает» в статусе «Выполняется». При этом ручной запуск того же самого обмена проходит без ошибок. Ситуация осложняется появлением в журнале регистрации или консоли кластера специфического сообщения: Ошибка при вызове метода контекста (НайтиФайлы): Ошибка работы с Интернет: ftp:// Transferred a partial file.
В этой статье мы подробно разберем, почему возникает эта проблема, чем отличается фоновый процесс от интерактивного и как правильно настроить сетевое окружение и код 1С, чтобы обмен работал стабильно.
Первым делом проанализируем, почему ручной запуск обмена работает, а регламентное задание — нет. Когда вы запускаете обмен вручную, процесс выполняется в контексте вашего текущего пользователя Windows. Регламентное же задание выполняется на стороне сервера 1С под учетной записью службы (например, USRNBF или LocalSystem). Рассмотрим основные факторы влияния:
НайтиФайлы активно использует системную папку Temp. Если у пользователя службы ограничены права на запись или очистку этой папки, процесс может блокироваться.Эта ошибка генерируется библиотекой libcurl, которую платформа 1С использует для работы с протоколами передачи данных. Код ошибки означает, что фактический объем полученных данных не совпал с ожидаемым (указанным в заголовке или определенным при листинге каталога). Выясним основные причины:
Многие системные администраторы ограничиваются открытием порта 21 для FTP, однако для стабильной работы 1С в режиме регламентных заданий этого недостаточно. Рассмотрим правильную настройку портов:
Для работы протокола FTP требуется не один, а два канала: управляющий (порт 21) и канал данных. В пассивном режиме (PASV), который является стандартом для работы через современные фаерволы, сервер сообщает клиенту случайный номер порта из высокого диапазона для передачи данных.
Проанализируем необходимые шаги по настройке:
49152–65535. Конкретный диапазон лучше уточнить в настройках вашего FTP-сервера.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-сервере работает достаточно медленно, так как запрашивает полный листинг директории. Если в папке обмена скопились тысячи архивных файлов, выполнение команды может занимать длительное время, вызывая таймауты и ошибки «частичной передачи».
Рекомендуем придерживаться следующих правил:
/backup.libcurl на старых версиях платформы.1C:Enterprise Server. Это позволит мгновенно выявить проблемы с правами доступа к интернету или папкам.Подводя итог, можно сказать, что «зависание» — это почти всегда следствие бесконечного таймаута при ожидании ответа от сервера в условиях блокировки портов данных. Настройка пассивного режима в коде 1С и открытие соответствующего диапазона портов в Kerio Control решают проблему в большинстве случаев.