Рассмотрим задачу, с которой часто сталкиваются разработчики при автоматизации рабочих мест: как сделать процесс фотографирования товара через веб-камеру «бесшовным». Вместо того чтобы пользователь вручную открывал папку и выбирал файл после съемки, мы реализуем автоматический захват последнего созданного снимка сразу после закрытия программы камеры.
В текущей реализации пользователь нажимает кнопку, запускается внешнее приложение, происходит съемка, и после закрытия приложения пользователь вынужден вручную выбирать файл. Чтобы убрать лишние действия, нам необходимо изменить логику взаимодействия 1С с файловой системой.
Чтобы избежать путаницы с файлами, выделим отдельную папку для обмена снимками. Перед запуском процесса фотографирования мы будем очищать эту папку. Это гарантирует, что после закрытия камеры в директории будет находиться именно тот файл, который нам нужен.
Для очистки папки в 1С воспользуемся методом УдалитьФайлы():
// Очистка папки перед запуском камеры
МассивФайлов = НайтиФайлы("C:\Photos\Temp\", "*.*");
Для Каждого Файл Из МассивФайлов Цикл
УдалитьФайлы(Файл.ПолноеИмя);
КонецЦикла;
Чтобы 1С знала, когда именно пользователь закончил съемку, необходимо запускать приложение камеры в модальном режиме (в контексте управления процессами ОС). Мы используем ЗапуститьПриложение() или WScript.Shell, чтобы дождаться завершения процесса камеры.
Если используется стандартный запуск, система может продолжить выполнение кода 1С до того, как пользователь сделает фото. Чтобы «приостановить» работу программы, проанализируем состояние процесса камеры.
После того как управление вернулось в 1С (то есть процесс камеры завершен), мы проверяем содержимое нашей папки. Поскольку мы очистили её заранее, нам нужно просто считать единственный имеющийся там файл.
Реализуем логику обработки:
// Ожидаем завершения, затем ищем файл
МассивФайлов = НайтиФайлы("C:\Photos\Temp\", "*.jpg");
Если МассивФайлов.Количество() > 0 Тогда
ПутьКФайлу = МассивФайлов[0].ПолноеИмя;
// Загружаем файл в объект 1С (например, в хранилище значений)
Картинка = Новый Картинка(ПутьКФайлу);
Объект.Фотография = Новый ХранилищеЗначения(Картинка.ПолучитьДвоичныеДанные());
// Опционально: очищаем папку после обработки
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
Если ваша камера или используемая утилита поддерживают аргументы командной строки, вы можете упростить работу еще сильнее. Передавая в камеру путь сохранения с именем, содержащим Код товара, вы исключаете поиск файла вообще.
ИмяФайла = "C:\Photos\" + Объект.Код + ".jpg".ЗапуститьПриложение("camera.exe /save " + ИмяФайла).Часто возникает искушение использовать ПодключитьОбработчикОжидания() для постоянной проверки папки. Однако мы не рекомендуем этот путь, так как он создает ненужную нагрузку на систему и работает нестабильно на мобильных устройствах или слабых компьютерах. Описанный выше алгоритм «запуск - ожидание закрытия - проверка» является более профессиональным и надежным решением.
Мы проанализировали процесс автоматизации и выявили, что достаточно управлять жизненным циклом файла: очистка папки -> запуск процесса -> ожидание завершения -> чтение результата. Используя такие объекты, как НайтиФайлы и ХранилищеЗначения, вы легко избавите пользователей от рутинного выбора файлов из проводника.