В процессе разработки внутренних инструментов в 1С часто возникает необходимость предоставить пользователю быстрый доступ к стандартным средствам операционной системы для создания снимков экрана. Казалось бы, простая задача запуска внешнего приложения SnippingTool.exe (стандартные «Ножницы» Windows) с помощью встроенного языка 1С оборачивается неожиданной проблемой: система либо молча игнорирует команду, либо сообщает, что указанный файл не найден. При этом через обычную командную строку или диалог «Выполнить» утилита запускается без каких-либо затруднений.
В этой статье мы подробно разберем внутренние механизмы операционной системы Windows и платформы 1С, которые препятствуют стандартному запуску, и рассмотрим надежные программные решения, включая современные асинхронные методы и альтернативные протоколы для Windows 10 и 11.
Основная причина, по которой платформа 1С «не видит» исполняемый файл по классическому пути C:\Windows\System32\SnippingTool.exe, кроется в разрядности приложений. Этот механизм называется WOW64 File System Redirector (перенаправление файловой системы).
Проанализируем, как это работает изнутри:
C:\Windows\System32, операционная система автоматически и незаметно для самого приложения перенаправляет этот запрос в папку C:\Windows\SysWOW64, где содержатся совместимые 32-битные библиотеки и утилиты.SnippingTool.exe спроектирована как 64-битное приложение и физически находится только в оригинальном 64-битном каталоге System32. В папке SysWOW64 этой программы либо нет вообще, либо ее запуск оттуда заблокирован операционной системой.Посмотрим на классический пример кода, который гарантированно вызовет ошибку поиска файла на 64-битной операционной системе при использовании 32-битного клиента 1С:
// Этот код завершится ошибкой "Файл не найден" из-за редиректа WOW64
ЗапуститьПриложение("C:\Windows\System32\SnippingTool.exe");
---
Для обхода механизма перенаправления файловой системы разработчики Microsoft предусмотрели специальный виртуальный псевдоним (alias) — Sysnative. Это не реальная папка на диске, а виртуальный мост.
Когда 32-битное приложение обращается к путям, содержащим Sysnative вместо System32, операционная система отключает перенаправление файловой системы и предоставляет прямой доступ к оригинальной 64-битной системной папке. Обратите внимание, что сами 64-битные приложения (включая стандартный проводник Windows) этот каталог не видят.
Рассмотрим пример использования этого механизма. Самым простым синхронным вариантом запуска (если в свойствах вашей конфигурации разрешены синхронные вызовы на клиенте) является следующий код:
// Запуск с явным указанием обхода перенаправления через Sysnative
ЗапуститьПриложение("SnippingTool.exe", "C:\Windows\Sysnative");
Также можно прописать полный путь непосредственно в первой директиве метода:
ЗапуститьПриложение("C:\Windows\Sysnative\SnippingTool.exe");
Этот способ позволяет запустить оригинальное классическое окно программы «Ножницы» без вызова сторонних командных окон командного интерпретатора cmd.exe, которые часто мешают пользователю и перекрывают экран в момент захвата изображения.
---
Если на рабочих станциях ваших пользователей установлена современная операционная система (Windows 10 или Windows 11), классическое приложение SnippingTool.exe постепенно заменяется на новое универсальное приложение «Фрагмент и набросок». В системе для него зарегистрирован специальный протокол вызова (URI-схема) — ms-screenclip:.
Этот метод является наиболее изящным, надежным и современным по нескольким причинам:
Проанализируем простейший программный вызов через этот протокол:
ЗапуститьПриложение("ms-screenclip:");
---
Начиная с версии платформы 8.3.15, компания 1С по умолчанию блокирует использование синхронных вызовов на стороне клиента (для обеспечения корректной работы в веб-клиенте и стабильности интерфейса). Попытка вызвать метод ЗапуститьПриложение напрямую приведет к ошибке: «Использование синхронных методов на клиенте запрещено!».
Чтобы написать качественный код, соответствующий современным стандартам разработки, нам необходимо использовать асинхронный метод НачатьЗапускПриложения с описанием обработчика оповещения.
Разберем по шагам реализацию двух вариантов асинхронного запуска.
Этот вариант мгновенно переводит экран в режим выделения фрагмента без лишних диалоговых окон:
&НаКлиенте
Процедура СделатьСнимокЭкрана(Команда)
// Описываем процедуру обратного вызова, которая сработает после попытки запуска
Оповещение = Новый ОписаниеОповещения("ПослеЗапускаУтилиты", ЭтотОбъект);
// Выполняем асинхронный запуск протокола захвата экрана
НачатьЗапускПриложения(Оповещение, "ms-screenclip:");
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗапускаУтилиты(КодВозврата, ДополнительныеПараметры) Экспорт
// Здесь можно разместить код, выполняемый после вызова утилиты
// Например, вывести пользователю подсказку в панели сообщений
ПоказатьОповещениеПользователя("Режим выделения активирован", , "Используйте стандартные средства ОС для сохранения фрагмента.");
КонецПроцедуры
Если в вашей организации до сих пор используются более ранние версии Windows (например, Windows 7 или 8) или пользователям критически важно работать именно в интерфейсе старой утилиты SnippingTool, применим асинхронный запуск с использованием виртуального пути:
&НаКлиенте
Процедура ЗапуститьКлассическиеНожницы(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗапускаКлассическихНожниц", ЭтотОбъект);
// Используем виртуальный каталог Sysnative для обхода файлового редиректора WOW64
ПутьКФайлу = "C:\Windows\Sysnative\SnippingTool.exe";
НачатьЗапускПриложения(Оповещение, ПутьКФайлу);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗапускаКлассическихНожниц(КодВозврата, ДополнительныеПараметры) Экспорт
// Обработка завершения вызова приложения
КонецПроцедуры
---
В редких корпоративных средах с жесткими политиками безопасности запуск исполняемых файлов напрямую из сторонних приложений (включая 1С) или вызов определенных системных протоколов может блокироваться встроенным антивирусом или групповыми политиками (AppLocker). В таких ситуациях может помочь вызов через системный интерпретатор команд PowerShell, запущенный в скрытом режиме.
Рассмотрим пример реализации такого обходного пути:
&НаКлиенте
Процедура ЗапуститьЧерезPowerShell(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗапускаЧерезPowerShell", ЭтотОбъект);
// Формируем команду запуска оболочки PowerShell в скрытом режиме с передачей вызова протокола
СтрокаЗапуска = "powershell -WindowStyle Hidden -Command ""Start-Process ms-screenclip:""";
НачатьЗапускПриложения(Оповещение, СтрокаЗапуска);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗапускаЧерезPowerShell(КодВозврата, ДополнительныеПараметры) Экспорт
// Логика после выполнения команды PowerShell
КонецПроцедуры
Используя данный подход, операционная система запускает PowerShell, который работает в контексте текущего пользователя и успешно обходит ограничения перенаправления разрядности, открывая современную утилиту захвата экрана.