Как программно запустить сравнение конфигурации с файлом cf и открыть окно с результатом?

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

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

Ограничения штатных ключей командной строки 1С

Проанализируем ситуацию с параметрами запуска конфигуратора. Платформа действительно предоставляет ключи /CompareCfg (сравнение конфигураций с формированием отчета) и /MergeCfg (сравнение и объединение конфигураций). Однако существует фундаментальная проблема:

Оба эти ключа предназначены исключительно для пакетного (фонового) режима работы. Когда мы запускаем Конфигуратор с этими параметрами, платформа аппаратно подавляет любой интерактив. Внутри платформы срабатывает механизм ЗапрещеноОткрытиеФорм(), который блокирует открытие любых окон. После выполнения команды Конфигуратор автоматически закрывается, не передавая управление пользователю. Именно поэтому заставить 1С штатным ключом просто "открыть окно" невозможно.

Решение с помощью эмуляции действий пользователя (AutoIt)

Раз штатные методы не работают, посмотрим на альтернативный подход — эмуляцию действий пользователя (нажатий клавиш и движений мыши). Для этого отлично подходит инструмент AutoIt. Мы можем написать код на встроенном языке 1С, который запустит конфигуратор, дождется его открытия, а затем через COM-объект AutoItX3.Control "прокликает" нужные пункты меню.

Рассмотрим пример кода, который реализует данный алгоритм:


AutoItX3 = Новый COMОбъект("AutoItX3.Control");
Shell = Новый COMОбъект("Wscript.Shell");

// Запускаем конфигуратор
WshExec = Shell.Exec("""..\1cv8.exe"" CONFIG /F ""..\База2""");

// Ожидаем некоторое время (грубый метод)
AutoItX3.Sleep(4000);

// Дожидаемся активации процесса
Пока Не Shell.AppActivate(WshExec.ProcessID) Цикл
КонецЦикла;

// Эмулируем нажатия клавиш для навигации по меню "Конфигурация -> Сравнить, объединить..."
AutoItX3.Send("{ALT}");       
AutoItX3.Sleep(500);
AutoItX3.Send("{RIGHT 2}");   
AutoItX3.Sleep(500);
AutoItX3.Send("{DOWN 10}");   
AutoItX3.Sleep(500);
AutoItX3.Send("{ENTER}");     

// Передаем путь к файлу обновления
AutoItX3.Send("..\Обновление.cf"); 
AutoItX3.Sleep(500);
AutoItX3.Send("{ENTER}");

Критика и улучшение предложенного скрипта

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

  1. Отказ от жестких таймингов: Использование метода Sleep(4000) для ожидания загрузки Конфигуратора — плохая практика. База может открываться дольше из-за холодного кэша или фоновых процессов, и скрипт нажмет кнопки «в пустоту». В AutoIt существуют методы WinWait и WinWaitActive, которые умеют дожидаться появления окна с определенным заголовком (например, содержащим слово «Конфигуратор»).
  2. Навигация по меню: Эмуляция нажатий {RIGHT 2} и {DOWN 10} очень хрупкая. Если в новой версии платформы 1С добавит новый пункт в меню «Конфигурация», порядок строк сместится, и скрипт вызовет совершенно другую команду. Более надежный способ — использовать отправку быстрых клавиш вызова меню через Alt (например, Alt+К для меню "Конфигурация", если это предусмотрено локализацией), либо обращаться к элементам интерфейса через библиотеки UIAutomation, которые умеют искать пункты меню по их внутренним именам.

Альтернативные способы автоматизации

Если цель вашей автоматизации — избавить пользователя от рутинного прокликивания одинаковых галочек, интерактивное окно сравнения можно не открывать вообще. Рассмотрим два других подхода:

  1. Пакетное объединение по шаблону настроек: Ключ /MergeCfg поддерживает параметр -Settings <путь_к_файлу>. Вы можете один раз выполнить сравнение и объединение вручную, сохранить настройки в xml-файл (через меню окна сравнения), а затем запускать скрипт, который будет выполнять слияние конфигураций автоматически в фоне, опираясь на этот файл.
  2. Использование 1C:EDT (Enterprise Development Tools): Если потребность в частом сравнении связана с процессом разработки, стоит рассмотреть переход на 1C:EDT. В этой среде конфигурация хранится в виде набора файлов (xml, bsl), и для сравнения используются стандартные инструменты Git и интерфейс Eclipse. Это позволяет открывать окна визуального сравнения (diff) напрямую средствами среды разработки или сторонними Git-клиентами, вообще минуя Конфигуратор и написание скриптов на AutoIt.
← На главную