Как передать команду или данные в уже запущенный тонкий клиент 1С из командной строки?

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

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

Метод 1. Использование внешних навигационных ссылок (протокол e1cib)

Рассмотрим стандартный механизм платформы, который позволяет открывать конкретные объекты или выполнять действия через ссылки. Платформа 1С умеет регистрировать протоколы e1c и e1cib в операционной системе. Если тонкий клиент уже запущен с определенными параметрами соединения, повторный вызов исполняемого файла с указанием ссылки часто приводит к активации уже существующего окна.

Проанализируем ситуацию: если мы выполним команду в консоли, указав путь к информационной базе и навигационную ссылку, система проверит наличие активного сеанса. Если база совпадает, 1С не будет запрашивать пароль (особенно при использовании Windows-авторизации) и просто перейдет по ссылке. Пример структуры команды:

1cv8c.exe ENTERPRISE /S "Server\Base" /URL "e1cib/data/Документ.РеализацияТоваровУслуг?ref=..."

Важный нюанс: Чтобы передать произвольные данные, мы можем использовать параметры запуска в навигационной ссылке или вызвать обработку, которая считает нужную информацию. Однако этот метод не всегда «бесшовен», так как может инициировать кратковременное появление окна заставки.

Метод 2. Механизм внешних событий и внешние компоненты (Native API)

Это один из самых «чистых» и профессиональных способов «дернуть» клиент. Разберем его по шагам. Идея заключается в том, что внутри 1С загружается внешняя компонента (ВК), которая открывает в отдельном потоке TCP-порт или слушает системные сообщения. Когда из командной строки на этот порт приходит пакет данных, ВК генерирует событие в 1С.

Для обработки таких сигналов в модуле управляемого приложения или в форме используется предопределенная процедура ОбработкаВнешнегоСобытия. Рассмотрим пример кода, который будет принимать данные:


Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если Источник = "MyExternalTrigger" Тогда
        Если Событие = "ExecuteCommand" Тогда
            // Здесь мы разбираем полученные данные
            Сообщить("Получена команда извне: " + Данные);
            // Вызываем нужную экспортную процедуру
            ВыполнитьДействиеПоКоманде(Данные);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Чтобы отправить данные из командной строки, можно использовать простые утилиты типа curl или ncat, если ваша ВК подняла локальный HTTP- или TCP-сервер. Например:

curl http://localhost:8080/send?command=OpenOrder123

Преимущество этого метода в том, что 1С реагирует мгновенно, не требуя фокуса окна и не создавая новых процессов 1cv8c.

Метод 3. Система взаимодействия (Collaboration System)

Если в вашей конфигурации настроена Система взаимодействия, мы можем использовать ее HTTP API для передачи сообщений конкретному пользователю. Выясним причину, почему это удобно: сообщение приходит на сервер системы взаимодействия, который моментально «проталкивает» его в клиентское приложение пользователя.

В коде 1С мы подписываемся на получение сообщения через МенеджерСистемыВзаимодействия. Когда внешний скрипт отправляет HTTP-запрос к серверу системы взаимодействия, у клиента срабатывает обработчик:


Процедура ПриПолученииСообщения(Сообщение, ДополнительныеПараметры)
    // Проверяем, что сообщение пришло от нашей внешней системы
    Если Сообщение.Текст = "ОБНОВИТЬ_ДАННЫЕ" Тогда
        ЭтаФорма.ОбновитьОтображениеДанных();
    КонецЕсли;
КонецПроцедуры

Этот способ позволяет взаимодействовать с клиентом даже удаленно, не ограничиваясь рамками одного компьютера или локальной сети.

Метод 4. Использование механизма Automation (COM GetActiveObject)

Посмотрим на ситуацию со стороны Windows. Запущенный экземпляр 1С регистрируется в таблице запущенных объектов (Running Object Table). С помощью скрипта на VBScript или PowerShell мы можем «подцепиться» к уже работающему приложению.

Рассмотрим пример скрипта на PowerShell, который находит окно 1С и вызывает метод глобального модуля:


$1c = [Runtime.InteropServices.Marshal]::GetActiveObject("V83.Application")
$1c.ВнешнееСоединение_ВыполнитьКоманду("ОткрытьФорму", "Справочник.Номенклатура")

Обратите внимание: Для работы этого метода 1С должна быть запущена как COM-сервер (обычно это происходит автоматически для первого запущенного экземпляра), и у пользователя должны быть соответствующие права. Это позволяет управлять интерфейсом напрямую, передавая команды в контекст запущенного сеанса.

Метод 5. Мониторинг файловой системы (Trigger Files)

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

Алгоритм действий следующий:

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

Команда из консоли в этом случае выглядит предельно просто:

echo OpenTask:777 > C:\Temp\1c_cmd.txt

Хотя этот метод имеет небольшую задержку (равную интервалу обработчика ожидания), он является максимально надежным и не требует регистрации библиотек или сложных настроек сети.

Подведение итогов

Мы рассмотрели пять различных подходов к задаче «дерганья» тонкого клиента. Выбор конкретного метода зависит от ваших требований к скорости реакции и технической сложности:

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

← На главную