Как запустить утилиту «Ножницы» (SnippingTool) из 1С?

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

В процессе разработки внутренних инструментов в 1С часто возникает необходимость предоставить пользователю быстрый доступ к стандартным средствам операционной системы для создания снимков экрана. Казалось бы, простая задача запуска внешнего приложения SnippingTool.exe (стандартные «Ножницы» Windows) с помощью встроенного языка 1С оборачивается неожиданной проблемой: система либо молча игнорирует команду, либо сообщает, что указанный файл не найден. При этом через обычную командную строку или диалог «Выполнить» утилита запускается без каких-либо затруднений.

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

Выясняем причину: почему стандартный запуск не работает?

Основная причина, по которой платформа 1С «не видит» исполняемый файл по классическому пути C:\Windows\System32\SnippingTool.exe, кроется в разрядности приложений. Этот механизм называется WOW64 File System Redirector (перенаправление файловой системы).

Проанализируем, как это работает изнутри:

  1. Большинство клиентских приложений 1С (тонкий или толстый клиент) работают в 32-битном режиме, тогда как современная операционная система Windows практически всегда является 64-битной.
  2. Когда 32-битная программа запрашивает доступ к системному каталогу C:\Windows\System32, операционная система автоматически и незаметно для самого приложения перенаправляет этот запрос в папку C:\Windows\SysWOW64, где содержатся совместимые 32-битные библиотеки и утилиты.
  3. Проблема заключается в том, что полноценная утилита SnippingTool.exe спроектирована как 64-битное приложение и физически находится только в оригинальном 64-битном каталоге System32. В папке SysWOW64 этой программы либо нет вообще, либо ее запуск оттуда заблокирован операционной системой.
  4. В итоге платформа 1С честно пытается обратиться по указанному пути, попадает в «зеркальную» папку для 32-битных программ и возвращает ошибку отсутствия файла.

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


// Этот код завершится ошибкой "Файл не найден" из-за редиректа WOW64
ЗапуститьПриложение("C:\Windows\System32\SnippingTool.exe");

---

Решение 1. Использование виртуального каталога Sysnative

Для обхода механизма перенаправления файловой системы разработчики Microsoft предусмотрели специальный виртуальный псевдоним (alias) — Sysnative. Это не реальная папка на диске, а виртуальный мост.

Когда 32-битное приложение обращается к путям, содержащим Sysnative вместо System32, операционная система отключает перенаправление файловой системы и предоставляет прямой доступ к оригинальной 64-битной системной папке. Обратите внимание, что сами 64-битные приложения (включая стандартный проводник Windows) этот каталог не видят.

Рассмотрим пример использования этого механизма. Самым простым синхронным вариантом запуска (если в свойствах вашей конфигурации разрешены синхронные вызовы на клиенте) является следующий код:


// Запуск с явным указанием обхода перенаправления через Sysnative
ЗапуститьПриложение("SnippingTool.exe", "C:\Windows\Sysnative");

Также можно прописать полный путь непосредственно в первой директиве метода:

ЗапуститьПриложение("C:\Windows\Sysnative\SnippingTool.exe");

Этот способ позволяет запустить оригинальное классическое окно программы «Ножницы» без вызова сторонних командных окон командного интерпретатора cmd.exe, которые часто мешают пользователю и перекрывают экран в момент захвата изображения.

---

Решение 2. Современный запуск через URI-протокол ms-screenclip (для Windows 10/11)

Если на рабочих станциях ваших пользователей установлена современная операционная система (Windows 10 или Windows 11), классическое приложение SnippingTool.exe постепенно заменяется на новое универсальное приложение «Фрагмент и набросок». В системе для него зарегистрирован специальный протокол вызова (URI-схема) — ms-screenclip:.

Этот метод является наиболее изящным, надежным и современным по нескольким причинам:

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

ЗапуститьПриложение("ms-screenclip:"); ---

Решение 3. Переход на асинхронные вызовы платформы

Начиная с версии платформы 8.3.15, компания 1С по умолчанию блокирует использование синхронных вызовов на стороне клиента (для обеспечения корректной работы в веб-клиенте и стабильности интерфейса). Попытка вызвать метод ЗапуститьПриложение напрямую приведет к ошибке: «Использование синхронных методов на клиенте запрещено!».

Чтобы написать качественный код, соответствующий современным стандартам разработки, нам необходимо использовать асинхронный метод НачатьЗапускПриложения с описанием обработчика оповещения.

Разберем по шагам реализацию двух вариантов асинхронного запуска.

Вариант А. Асинхронный запуск через протокол ms-screenclip (рекомендуемый для Win 10/11)

Этот вариант мгновенно переводит экран в режим выделения фрагмента без лишних диалоговых окон:


&НаКлиенте
Процедура СделатьСнимокЭкрана(Команда)
    
    // Описываем процедуру обратного вызова, которая сработает после попытки запуска
    Оповещение = Новый ОписаниеОповещения("ПослеЗапускаУтилиты", ЭтотОбъект);
    
    // Выполняем асинхронный запуск протокола захвата экрана
    НачатьЗапускПриложения(Оповещение, "ms-screenclip:");
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапускаУтилиты(КодВозврата, ДополнительныеПараметры) Экспорт
    // Здесь можно разместить код, выполняемый после вызова утилиты
    // Например, вывести пользователю подсказку в панели сообщений
    ПоказатьОповещениеПользователя("Режим выделения активирован", , "Используйте стандартные средства ОС для сохранения фрагмента.");
КонецПроцедуры

Вариант Б. Асинхронный запуск классических «Ножниц» через Sysnative

Если в вашей организации до сих пор используются более ранние версии Windows (например, Windows 7 или 8) или пользователям критически важно работать именно в интерфейсе старой утилиты SnippingTool, применим асинхронный запуск с использованием виртуального пути:


&НаКлиенте
Процедура ЗапуститьКлассическиеНожницы(Команда)
    
    Оповещение = Новый ОписаниеОповещения("ПослеЗапускаКлассическихНожниц", ЭтотОбъект);
    
    // Используем виртуальный каталог Sysnative для обхода файлового редиректора WOW64
    ПутьКФайлу = "C:\Windows\Sysnative\SnippingTool.exe";
    
    НачатьЗапускПриложения(Оповещение, ПутьКФайлу);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапускаКлассическихНожниц(КодВозврата, ДополнительныеПараметры) Экспорт
    // Обработка завершения вызова приложения
КонецПроцедуры

---

Дополнительный вариант: запуск через оболочку PowerShell

В редких корпоративных средах с жесткими политиками безопасности запуск исполняемых файлов напрямую из сторонних приложений (включая 1С) или вызов определенных системных протоколов может блокироваться встроенным антивирусом или групповыми политиками (AppLocker). В таких ситуациях может помочь вызов через системный интерпретатор команд PowerShell, запущенный в скрытом режиме.

Рассмотрим пример реализации такого обходного пути:


&НаКлиенте
Процедура ЗапуститьЧерезPowerShell(Команда)
    
    Оповещение = Новый ОписаниеОповещения("ПослеЗапускаЧерезPowerShell", ЭтотОбъект);
    
    // Формируем команду запуска оболочки PowerShell в скрытом режиме с передачей вызова протокола
    СтрокаЗапуска = "powershell -WindowStyle Hidden -Command ""Start-Process ms-screenclip:""";
    
    НачатьЗапускПриложения(Оповещение, СтрокаЗапуска);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапускаЧерезPowerShell(КодВозврата, ДополнительныеПараметры) Экспорт
    // Логика после выполнения команды PowerShell
КонецПроцедуры

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

← На главную