Как правильно организовать ожидание появления файла в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Использование фиксированной паузы (например, в 15 секунд) неудобно: если сторонний софт отработает за 1 секунду, пользователь будет вынужден ждать оставшиеся 14 секунд. Рассмотрим, как организовать процесс ожидания файла грамотно и без лишней потери времени.

Вариант 1. Периодический опрос через обработку ожидания

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

Разберем по шагам реализацию этого подхода:

  1. Включаем обработку ожидания с интервалом в 1–2 секунды с помощью команды ОбработкаОжидания("ПроверитьФайлОтвета", 1);.
  2. В процедуре ПроверитьФайлОтвета проверяем наличие файла.
  3. При обнаружении файла отключаем обработку ожидания передачей нулевого интервала ОбработкаОжидания("ПроверитьФайлОтвета", 0); и считываем данные.

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


Процедура ПроверитьФайлОтвета()
    ИмяФайла = КаталогОбмена + "response.txt";
    Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
        // Отключаем таймер ожидания
        ОбработкаОжидания("ПроверитьФайлОтвета", 0);
        
        // Обрабатываем полученный ответ
        ПрочитатьИОбработатьОтвет(ИмяФайла);
    КонецЕсли;
КонецПроцедуры

Важное ограничение 1С 7.7: штатная ОбработкаОжидания останавливает свое выполнение, если у пользователя открыто модальное окно (например, предупреждение или диалог) или активировано меню программы.

Вариант 2. Использование внешних компонент и внешних событий

Чтобы избежать постоянного опроса диска в цикле и получать уведомление мгновенно при появлении файла, разберем вариант с использованием внешних компонент (например, vk_ChangeNotification или возможностей FormEx).

Данные компоненты отслеживают изменения в файловой системе Windows (используя системный механизм FileSystemWatcher) и при появлении нужного файла генерируют в 1С внешнее событие.

Схема работы при таком подходе выглядит следующим образом:

  1. Внешняя компонента подписывается на изменения в каталоге обмена.
  2. Пользователь продолжит работать с 1С без зависаний интерфейса.
  3. Как только стороннее ПО сохраняет файл на диск, система Windows фиксирует событие, а ВК передает его в 1С.
  4. В 1С срабатывает предопределенная процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные) (аналогично работе со сканером штрихкодов).

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


Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если (Источник = "FileWatcher") И (Событие = "FileCreated") Тогда
        Если Данные = "response.txt" Тогда
            ОбработатьФайлОтвета(КаталогОбмена + Данные);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Вариант 3. Синхронный запуск внешнего софта через WScript.Shell

Если стороннее приложение является консольной утилитой или исполняемым файлом .exe, выставляемым из командной строки, от таймеров можно отказаться полностью. Выясним, как выполнить запуск программы синхронно с флагом ожидания завершения.

Для этого в 1С используется объект WScript.Shell и его метод Run со значением параметра WaitOnReturn = True:


WshShell = СоздатьОбъект("WScript.Shell");
// Запуск программы с ожиданием завершения (третий параметр = 1)
КодВозврата = WshShell.Run("C:\App\processor.exe -input task.txt", 1, 1);

ИмяФайлаОтвета = КаталогОбмена + "response.txt";
Если ФС.СуществуетФайл(ИмяФайлаОтвета) = 1 Тогда
    ПрочитатьИОбработатьОтвет(ИмяФайлаОтвета);
КонецЕсли;

Ошибки при работе с файлами и способы их решения

При реализации любого из способов важно предусмотреть технические нюансы работы с файловой системой, чтобы избежать ошибок считывания:

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

Для решения этой проблемы рекомендуется использовать файлы-флаги (сигнальные файлы):

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


Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
    Попытка
        // Пробуем переименовать файл сам в себя для проверки блокировки сторонним процессом
        ФС.ПереименоватьФайл(ИмяФайла, ИмяФайла);
        
        // Если переименование прошло успешно - файл не заблокирован
        ПрочитатьИОбработатьОтвет(ИмяФайла);
        ФС.УдалитьФайл(ИмяФайла);
    Исключение
        // Файл еще дописывается внешней программой, ждем следующей итерации
    КонецПопытки;
КонецЕсли;
← На главную