Как организовать мониторинг и автоматическую обработку файлов между 1С в RDP-сессии и локальным ПК

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

При работе в терминальном режиме (через RDP) часто возникает задача: 1С должна сохранить файл на локальный диск пользователя, там некая внешняя программа должна его подхватить, обработать и выдать результат, который 1С заберет обратно. Главная сложность здесь заключается в том, как организовать "ожидание" результата, не блокируя при этом работу пользователя и не перегружая систему бесконечными циклами опроса. В этой статье мы разберем несколько эффективных стратегий решения этой задачи, начиная от встроенных средств 1С и заканчивая системными инструментами мониторинга Windows.

Использование встроенных механизмов 1С: Обработчик ожидания

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

Рассмотрим алгоритм действий:

  1. 1С сохраняет исходный файл на диск (например, через проброшенный ресурс \\tsclient\C\Exchange\input.txt).
  2. Запускается обработчик ожидания с интервалом в 1–2 секунды.
  3. Процедура обработчика проверяет наличие результирующего файла.
  4. Как только файл найден, обработчик отключается, и данные считываются в 1С.

Пример реализации кода в модуле формы:


Процедура ВыполнитьОбмен()
    // Сохраняем файл для внешней программы
    ПутьКФайлу = "\\tsclient\C\Exchange\input.txt";
    ДвоичныеДанные = ПолучитьДанныеДляОбработки();
    ДвоичныеДанные.Записать(ПутьКФайлу);
    
    // Включаем мониторинг результата
    ПодключитьОбработчикОжидания("ПроверитьРезультатОбработки", 1); // Опрос каждую секунду
КонецПроцедуры

Процедура ПроверитьРезультатОбработки() Экспорт
    ПутьКРезультату = "\\tsclient\C\Exchange\output.txt";
    ФайлРезультата = Новый Файл(ПутьКРезультату);
    
    Если ФайлРезультата.Существует() Тогда
        // Отключаем обработчик, чтобы не частить
        ОтключитьОбработчикОжидания("ПроверитьРезультатОбработки");
        
        // Читаем данные и удаляем файл
        Результат = Новый ДвоичныеДанные(ПутьКРезультату);
        ОбработатьПолученныйФайл(Результат);
        
        Попытка
            УдалитьФайлы(ПутьКРезультату);
        Исключение
            // Файл может быть еще занят внешней программой
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Мониторинг на стороне клиента: Утилита RealTimeSync

Чтобы внешняя программа на локальном компьютере пользователя узнала о появлении файла из 1С, ей тоже нужен механизм мониторинга. Рассмотрим использование специализированных утилит, таких как RealTimeSync (входит в состав FreeFileSync). Это решение позволяет избежать написания собственных сервисов.

Проанализируем принцип работы:

Использование PowerShell для событийного мониторинга

Если вы хотите реализовать решение без стороннего ПО, разберем вариант использования скрипта 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С при попытке чтения получит ошибку или пустые данные. Выясним, как этого избежать.

Профессиональным подходом считается использование файла-флага:

  1. Программа-обработчик сохраняет результат в файл result.data.
  2. Только после успешного закрытия этого файла программа создает пустой файл result.ready.
  3. 1С в своем обработчике ожидания проверяет наличие именно result.ready.
  4. Когда 1С видит флаг, она гарантированно может прочитать result.data, после чего удаляет оба файла.

Продвинутые методы: WMI и Виртуальные каналы

Для системных администраторов и опытных разработчиков рассмотрим возможность использования WMI (Windows Management Instrumentation). В операционной системе Windows можно создать запрос на событие создания файла, который будет перехвачен скриптом. Это позволяет интегрировать мониторинг глубоко в ОС.

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

Подведем итог: для большинства задач в 1С 8 ОФ оптимальным решением будет связка ПодключитьОбработчикОжидания на стороне сервера и скрипт FileSystemWatcher (или утилита мониторинга) на стороне клиента. Это обеспечит минимальную задержку (менее 1 секунды) и высокую стабильность обмена без избыточной нагрузки на CPU.

← На главную