При работе с внешними системами обмена данными разработчики 1С часто сталкиваются с использованием протокола FTP. Однако штатные механизмы платформы имеют свои скрытые ограничения, которые проявляются при росте объемов данных. Типичная ситуация: пока в папке на сервере находится несколько сотен или тысяч файлов, всё работает идеально. Но как только их количество переваливает за отметку в 50 000 – 70 000, 1С начинает выдавать неопределенную ошибку «Ошибка работы с Интернет» на этапе установления соединения, хотя сторонние клиенты (например, FileZilla) продолжают работать стабильно.
В данной статье мы разберем причины такого поведения платформы, проанализируем технические нюансы работы с библиотеками Windows и рассмотрим эффективные способы решения проблемы.
Давайте проанализируем, как объект FTPСоединение взаимодействует с сервером. В основе реализации этого объекта в 1С лежат системные библиотеки Windows, в частности WinInet. Когда мы инициализируем соединение, платформа выполняет ряд служебных операций.
Основная проблема заключается в следующем: при попытке войти в директорию или даже просто проверить права доступа, клиент (1С) может неявно запрашивать полный листинг файлов (команды LIST или NLST). Если в одной папке накоплено 70 000 файлов, серверу требуется значительное время, чтобы сформировать текстовый список этих файлов и передать его по сети.
Рассмотрим по шагам, что происходит «под капотом»:
MaxListFiles, которое по умолчанию может составлять 10 000 или 15 000 записей. При превышении этого лимита сервер просто разрывает соединение.Как показала практика, наиболее простым и надежным «костылем» в рамках стандартного функционала 1С является разделение файлов по подпапкам. Если бизнес-логика позволяет, не храните все объекты в корне или одной папке. Оптимальный предел для комфортной работы 1С — до 10 000 файлов в одной директории.
Рассмотрим пример кода для подключения, где мы предварительно обеспечиваем логику распределения:
ПассивныйРежим = Истина;
Попытка
Соединение = Новый FTPСоединение(АдресСервера, Порт, Логин, Пароль, , ПассивныйРежим, 60);
// Вместо работы с корнем, переходим в конкретную подпапку
Соединение.УстановитьТекущийКаталог("/Upload/Folder_01/");
Исключение
ЗаписьЖурналаРегистрации("FTP.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Важный момент: Обязательно используйте ПассивныйРежим = Истина. В этом режиме клиент инициирует передачу данных, что помогает обходить ограничения брандмауэров, которые часто становятся дополнительной причиной разрыва соединения при длительных операциях.
Если изменить структуру папок на сервере невозможно, следует отказаться от стандартного FTPСоединение в пользу более мощных инструментов. Одним из лучших решений является использование библиотеки WinSCP. Она работает быстрее, стабильнее и позволяет гибко настраивать таймауты, не завися от ограничений WinInet.
Разберем, как подключить и использовать WinSCP в 1С:
WinSCP .NET Assembly и зарегистрируйте DLL в системе или используйте её как COM-объект.
// Пример использования через COM-объект
Сессия = Новый COMОбъект("WinSCP.Session");
ОпцииСессии = Новый COMОбъект("WinSCP.SessionOptions");
ОпцииСессии.Protocol = 0; // FTP
ОпцииСессии.HostName = "ftp.yourserver.com";
ОпцииСессии.UserName = "login";
ОпцииСессии.Password = "password";
ОпцииСессии.Timeout = 120; // Увеличиваем таймаут до 2 минут
Попытка
Сессия.Open(ОпцииСессии);
// В WinSCP можно получать файлы напрямую, не сканируя всю папку
Сессия.GetFiles("/remote/path/large_file.txt", "C:\local\path\").Check();
Сессия.Close();
Исключение
Сообщить("Ошибка WinSCP: " + ОписаниеОшибки());
КонецПопытки;
Главное преимущество WinSCP заключается в том, что он умеет работать с «потоковым» получением списка файлов и не пытается загрузить всё дерево каталогов в память 1С сразу, что предотвращает ошибки переполнения и таймаутов.
Для простых операций (загрузить/выгрузить файл) отлично подходит консольная утилита curl.exe. Она доступна во всех современных версиях Windows и крайне нетребовательна к ресурсам. Проанализируем пример вызова из 1С:
КомандаЗапуска = "curl -u login:password ftp://server.com/folder/file.zip -o C:\temp\file.zip --connect-timeout 60";
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Параметр --connect-timeout позволяет жестко задать время ожидания ответа, что спасает при работе с переполненными папками.
Проблема «70 000 файлов» — это классический случай столкновения высокоуровневой платформы 1С с системными лимитами. Если вы столкнулись с подобным:
Помните, что стабильность обмена данными напрямую зависит от того, насколько эффективно мы управляем ожиданиями системы и ресурсами сервера.