При работе в терминальном режиме (через RDP) часто возникает задача: 1С должна сохранить файл на локальный диск пользователя, там некая внешняя программа должна его подхватить, обработать и выдать результат, который 1С заберет обратно. Главная сложность здесь заключается в том, как организовать "ожидание" результата, не блокируя при этом работу пользователя и не перегружая систему бесконечными циклами опроса. В этой статье мы разберем несколько эффективных стратегий решения этой задачи, начиная от встроенных средств 1С и заканчивая системными инструментами мониторинга Windows.
Для того чтобы 1С не "зависала" в ожидании файла, категорически не рекомендуется использовать циклы типа Пока...Цикл с проверкой наличия файла. Вместо этого проанализируем возможности платформы по асинхронной работе. Самый простой и надежный способ для Обычных форм — использование метода ПодключитьОбработчикОжидания.
Рассмотрим алгоритм действий:
\\tsclient\C\Exchange\input.txt).Пример реализации кода в модуле формы:
Процедура ВыполнитьОбмен()
// Сохраняем файл для внешней программы
ПутьКФайлу = "\\tsclient\C\Exchange\input.txt";
ДвоичныеДанные = ПолучитьДанныеДляОбработки();
ДвоичныеДанные.Записать(ПутьКФайлу);
// Включаем мониторинг результата
ПодключитьОбработчикОжидания("ПроверитьРезультатОбработки", 1); // Опрос каждую секунду
КонецПроцедуры
Процедура ПроверитьРезультатОбработки() Экспорт
ПутьКРезультату = "\\tsclient\C\Exchange\output.txt";
ФайлРезультата = Новый Файл(ПутьКРезультату);
Если ФайлРезультата.Существует() Тогда
// Отключаем обработчик, чтобы не частить
ОтключитьОбработчикОжидания("ПроверитьРезультатОбработки");
// Читаем данные и удаляем файл
Результат = Новый ДвоичныеДанные(ПутьКРезультату);
ОбработатьПолученныйФайл(Результат);
Попытка
УдалитьФайлы(ПутьКРезультату);
Исключение
// Файл может быть еще занят внешней программой
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Чтобы внешняя программа на локальном компьютере пользователя узнала о появлении файла из 1С, ей тоже нужен механизм мониторинга. Рассмотрим использование специализированных утилит, таких как RealTimeSync (входит в состав FreeFileSync). Это решение позволяет избежать написания собственных сервисов.
Проанализируем принцип работы:
RealTimeSync на отслеживание конкретной папки на локальном диске..bat или .cmd), который передает этот файл в вашу обрабатывающую программу.Если вы хотите реализовать решение без стороннего ПО, разберем вариант использования скрипта PowerShell на локальной машине. Мы можем задействовать класс .NET System.IO.FileSystemWatcher, который подписывается на события операционной системы и не потребляет ресурсы процессора на постоянный опрос.
Пример скрипта PowerShell, который можно запустить в фоновом режиме на ПК пользователя:
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Exchange"
$watcher.Filter = "input.txt"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$action = {
$path = $Event.SourceEventArgs.FullPath
# Запуск вашей программы обработки
Start-Process "C:\ProgramFiles\Processor.exe" -ArgumentList "/file $path" -Wait
# После обработки создаем файл-флаг или результирующий файл
New-Item -Path "C:\Exchange\output.txt" -ItemType File -Force
}
Register-ObjectEvent $watcher "Created" -Action $action
while ($true) { sleep 5 }
Этот скрипт будет "спать" до тех пор, пока в папке не появится файл input.txt, после чего мгновенно выполнит заданное действие.
При работе через RDP-каналы часто возникает проблема: файл уже появился в каталоге, но он еще не до конца записан или заблокирован процессом записи. В этом случае 1С при попытке чтения получит ошибку или пустые данные. Выясним, как этого избежать.
Профессиональным подходом считается использование файла-флага:
result.data.result.ready.result.ready.result.data, после чего удаляет оба файла.Для системных администраторов и опытных разработчиков рассмотрим возможность использования WMI (Windows Management Instrumentation). В операционной системе Windows можно создать запрос на событие создания файла, который будет перехвачен скриптом. Это позволяет интегрировать мониторинг глубоко в ОС.
Также стоит упомянуть технологию RDP Virtual Channels. Это наиболее быстрый способ передачи данных, так как он не использует файловую систему и сетевые шары, а передает байты напрямую через протокол RDP. Однако для этого требуется написание или использование готовых внешних компонент (ВК) для 1С, которые умеют взаимодействовать с клиентской частью удаленного рабочего стола.
Подведем итог: для большинства задач в 1С 8 ОФ оптимальным решением будет связка ПодключитьОбработчикОжидания на стороне сервера и скрипт FileSystemWatcher (или утилита мониторинга) на стороне клиента. Это обеспечит минимальную задержку (менее 1 секунды) и высокую стабильность обмена без избыточной нагрузки на CPU.