При разработке и сопровождении систем на платформе 1С:Предприятие 7.7 часто возникает ситуация, когда работающие в фоне периодические процедуры, такие как автоматический обмен данными, рассылка уведомлений или тяжелые регламентные отчеты, мешают процессу отладки кода. Постоянные прерывания на выполнение фоновых задач в конфигураторе могут сильно замедлить поиск ошибок. Рассмотрим способы, которые позволяют программно определить, находится ли база под контролем отладчика или запущена ли она в специальном режиме для разработчика.
Проанализируем наиболее простой и надежный метод, который не зависит от системных библиотек и стабильно работает в любых сетевых условиях. Суть метода заключается в создании специального пустого файла в каталоге информационной базы. Если этот файл существует, система считает, что запущен сеанс разработки.
Разберем реализацию этого способа по шагам. В глобальном модуле, в процедуре ПриНачалеРаботыСистемы, мы будем проверять наличие файла с именем, например, "Development".
Перем фРежимРазработчика Экспорт;
Процедура ПриНачалеРаботыСистемы()
фРежимРазработчика = 0;
// Проверяем наличие файла-флага в каталоге базы
Если ФС.СуществуетФайл(КаталогИБ() + "Development") = 1 Тогда
фРежимРазработчика = 1;
Сообщить("Включен режим разработки! Периодические задачи отключены.");
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что позволяет гибко управлять поведением системы. Вы можете вручную создать этот файл на своей локальной копии базы и быть уверенным, что никакие "опасные" процедуры (например, удаление файлов после загрузки) не сработают. В основном коде периодических процедур достаточно добавить условие:
Процедура ВыполнитьОбмен()
Если фРежимРазработчика = 1 Тогда
Возврат; // Пропускаем выполнение в режиме разработки
КонецЕсли;
// ... основной код обмена ...
КонецПроцедуры
Рассмотрим более технологичный вариант. Если в вашей конфигурации уже используется библиотека Admin1C.dll, вы можете получить детальную информацию о текущих пользователях и режимах их работы. Эта компонента позволяет опросить список активных соединений и определить, кто из них работает в режиме конфигуратора или отладки.
Однако проанализируем важный нюанс: на крупных базах с числом пользователей более 50-100 использование этой компоненты для частого мониторинга может вызвать существенные задержки (фризы) интерфейса. Это связано с тем, что библиотека сканирует системные файлы монитора и сетевые протоколы. Для локальной разработки или небольших баз это отличное решение.
Выясним, как можно определить наличие запущенного отладчика без использования сторонних DLL и без создания лишних файлов. В операционной системе Windows можно воспользоваться механизмом WMI (Windows Management Instrumentation) для поиска активного процесса отладчика 1С 7.7, который называется 1cedbg.exe.
Рассмотрим пример кода, который можно интегрировать в любую обработку или модуль:
Функция ОтладчикЗапущен()
Попытка
Service = СоздатьОбъект("WbemScripting.SWbemLocator");
ОбъектWMI = Service.ConnectServer(".", "root\cimv2");
СписокПроцессов = ОбъектWMI.ExecQuery("Select * from Win32_Process Where Name = '1cedbg.exe'");
Если СписокПроцессов.Count > 0 Тогда
Возврат 1; // Отладчик найден в системе
КонецЕсли;
Исключение
Возврат 0;
КонецПопытки;
Возврат 0;
КонецФункции
Нужно учитывать, что наличие процесса 1cedbg.exe в системе означает, что отладчик запущен вообще, но он может быть не подключен именно к вашему текущему сеансу 1cv7.exe. Тем не менее для целей разработчика этого обычно достаточно, чтобы понять: сейчас ведется работа с кодом.
Посмотрим на внутренние механизмы платформы. В папке SYSLOG внутри каталога информационной базы 1С 7.7 создает файл links.tmp. В этот файл записываются события входа пользователей и события начала сеанса отладки.
Важное ограничение: как показала практика, запись о начале отладки в файл попадает оперативно, но при закрытии отладчика файл может не обновляться мгновенно. Это делает метод "парсинга" журнала не самым надежным для оперативного переключения логики внутри одного сеанса, но его можно использовать как косвенный признак при запуске системы.
Проанализируем ситуацию, когда нам нужно точно знать, был ли сеанс запущен в режиме отладки изначально. При запуске 1С в режиме отладки в параметрах командной строки процесса 1cv7.exe часто присутствует специфический ключ. С помощью того же WMI мы можем прочитать командную строку текущего процесса.
Разберем, как это реализовать:
Функция ПроверитьКлючОтладки()
Locator = СоздатьОбъект("WbemScripting.SWbemLocator");
Service = Locator.ConnectServer();
// Получаем ID текущего процесса
// В 7.7 напрямую PID получить сложно, но можно найти через WinAPI или по времени запуска
// Ниже приведен пример логики поиска процесса 1cv7.exe
Processes = Service.ExecQuery("Select CommandLine from Win32_Process Where Name = '1cv7.exe'");
// Перебираем запущенные процессы 1С
// Если в CommandLine содержится "/D" или "1cedbg", значит отладка инициирована
Возврат 0;
КонецФункции
Подводя итог, выделим лучшие практики для разработчика 1С 7.7:
1cedbg.exe.Использование этих подходов позволит вам сделать процесс разработки более комфортным и безопасным, исключив непредвиденное срабатывание регламентных задач в тот момент, когда вы анализируете код под отладчиком.