Как логировать открытые окна в Конфигураторе 1С v8 для учета рабочего времени

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

Проблема автоматического учета времени программиста в среде 1С:Предприятие 8 стоит достаточно остро. Если в версии 7.7 существовали мощные расширения вроде OpenConf, позволявшие легко перехватывать события открытия окон, то в восьмой версии платформа стала более закрытой. Стандартные утилиты типа Spy++ или WinSpy зачастую видят только родительское окно V8TopLevelFrame, не позволяя «заглянуть» внутрь и понять, какой именно модуль или форма сейчас открыты. Разберем основные способы решения этой задачи, от использования низкоуровневых системных интерфейсов до специализированных плагинов.

Использование технологии Microsoft UI Automation

Проанализируем наиболее технологичный и надежный метод получения данных об окнах 1С — использование интерфейса Microsoft UI Automation. Это современный стандарт для обеспечения доступности приложений, который позволяет программно «обходить» дерево элементов управления любого окна Windows, включая внутренние окна Конфигуратора 1С.

В отличие от классических сообщений Windows (Win32 API), UI Automation предоставляет доступ к свойствам элементов, таким как Name, AutomationId и ClassName. Именно через этот интерфейс работают такие инструменты, как TurboConf и ClipAngel. Рассмотрим, как реализовать простейшее сканирование окон на языке C# (платформа .NET), используя библиотеки UIAutomationClient и UIAutomationTypes.

Для начала нам необходимо найти процесс Конфигуратора и получить доступ к его корневому элементу. Разберем пример логики:


using System.Windows.Automation;

// Получаем корневой элемент всего рабочего стола
AutomationElement rootElement = AutomationElement.RootElement;

// Настраиваем условие поиска для окна 1С
Condition condition = new PropertyCondition(AutomationElement.ProcessIdProperty, pid1c);
AutomationElement window1C = rootElement.FindFirst(TreeScope.Children, condition);

if (window1C != null)
{
    // Ищем все дочерние элементы с типом "Window" или "Pane"
    AutomationElementCollection windows = window1C.FindAll(TreeScope.Descendants, 
        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
    
    foreach (AutomationElement window in windows)
    {
        Console.WriteLine("Найдено окно: " + window.Current.Name);
    }
}

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

Автоматизация через Снегопат (Snegopat)

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

Проанализируем преимущества использования скриптов Снегопата для логгирования:

  1. Точность данных: Скрипт точно знает, какой модуль открыт (например, Справочник.Номенклатура.МодульОбъекта), даже если заголовок окна сокращен или изменен.
  2. Событийная модель: Мы можем подписаться на события смены фокуса или закрытия окна, что гораздо эффективнее постоянного опроса системы по таймеру.
  3. Доступ к тексту: Можно логировать не только факт открытия окна, но и активность внутри него (например, количество написанных строк кода).

Для реализации логгера на Снегопате обычно используются скрипты на JavaScript. Разберем логику фиксации активного окна:


// Пример логики на языке скриптов Снегопата
function onIdle() {
    var activeView = snegopat.activeView;
    if (activeView) {
        var title = activeView.title;
        // Записываем заголовок и время в лог-файл
        logToFile(title, new Date());
    }
}

Штатный параметр /LogUI и его ограничения

Выясним ситуацию с системным параметром запуска /LogUI. Некоторые разработчики пытаются использовать его для логирования действий, однако здесь есть важные нюансы. Рассмотрим, как он работает: при запуске 1С с этим флагом (например, 1cv8.exe /LogUI), платформа создает файл logui.txt в каталоге пользователя.

Важный момент: данный механизм предназначен в первую очередь для режима «Предприятие» и целей автоматизированного тестирования. В Конфигураторе этот параметр зачастую выдает пустые строки или вовсе не фиксирует активность. Разберем основные причины неэффективности /LogUI для учета часов:

Готовые инструменты и тайм-трекеры

Если разработка собственного решения кажется слишком трудозатратной, рассмотрим готовые инструменты, которые уже умеют работать с окнами 1С:

  1. TurboConf: Это расширение уже содержит в себе механизмы взаимодействия с интерфейсом 1С через UI Automation. В последних версиях разработчик добавлял инструментарий для анализа времени, проведенного в конфигураторе. Рекомендуем уточнить наличие актуальных плагинов для сбора статистики на официальном форуме проекта.
  2. ManicTime: Внешний тайм-трекер, который автоматически записывает заголовки всех активных окон. Поскольку Конфигуратор 1С выносит название редактируемого объекта в заголовок (после названия конфигурации), ManicTime отлично справляется с группировкой времени по задачам.
  3. WakaTime (с кастомными надстройками): Существуют любительские реализации плагинов, которые считывают заголовок окна 1cv8.exe и отправляют данные в популярный сервис статистики для разработчиков.

Подводя итог, можно сказать: если вам нужно максимально детальное логирование «для себя» или для автоматизации рутины, стоит смотреть в сторону UI Automation или Снегопата. Если же цель — просто калькулировать часы для отчета, оптимальным выбором станут внешние системы мониторинга активности, такие как ManicTime, которые умеют корректно перехватывать заголовки окон восьмой версии 1С.

← На главную