Ситуация, когда данные в информационной базе начинают «жить своей жизнью» — очищаться, изменяться или перезаписываться без участия пользователя, — является критической для любого предприятия. Особенно остро это ощущается в таких конфигурациях, как 1С:Бухгалтерия 3.0 КОРП, где автоматизация процессов тесно переплетена с внешними обменами. Рассмотрим ситуацию, когда документы РезервыПоОплатеТруда самопроизвольно очищаются, а Журнал регистрации фиксирует загадочное COM-соединение. Проанализируем причины этого явления и разберем по шагам методы обнаружения «виновника».
Прежде чем приступать к активному поиску, проанализируем механику проблемы. Если документ был заполнен и проведен, а через 10–15 минут данные в нем исчезли, это означает, что некий внешний процесс инициировал программную перезапись объекта. В Журнале регистрации это часто выглядит как сеанс с типом COM-соединение. Основная сложность заключается в том, что стандартный журнал не всегда показывает IP-адрес или имя компьютера, с которого пришел запрос.
Наиболее вероятной причиной в 90% случаев является наличие забытой копии базы данных. Рассмотрим типичный сценарий: администратор сделал копию «боевой» базы для тестов или разработки. При запуске копии система задает вопрос: «Информационная база перемещена или является копией?». Если был выбран вариант «Я передвинул ее», 1С не блокирует регламентные задания. В итоге копия базы по расписанию запускает обмен данными (например, с ЗУП), подключается по COM к «боевой» базе и, не обнаружив в себе актуальных данных по резервам, «транслирует» эту пустоту в основную базу, затирая корректные сведения.
Рассмотрим самый надежный способ идентификации источника подключения. Журнал регистрации дает нам лишь факт события, но Технологический журнал позволяет увидеть сетевые параметры. Для этого нам необходимо создать или отредактировать файл logcfg.xml, который располагается в каталоге conf на сервере 1С.
Проанализируем пример настройки, которая позволит отловить входящие соединения:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\LOGS\COM_CONN" history="24">
<event>
<eq property="Name" value="CONN"/>
</event>
<event>
<eq property="Name" value="PROC"/>
</event>
<property name="All"/>
</log>
</config>
В данном логе мы сможем найти событие CONN, которое содержит атрибут t:computerName или IP-адрес источника. Это позволит нам точно определить физический сервер или рабочую станцию, с которой инициируется COM-объект.
Разберем, как поймать соединение в режиме реального времени. Если изменения происходят периодически (раз в 10–15 минут), мы можем использовать консоль «Администрирование серверов 1С Предприятия».
COM-соединение.netstat -anb на сервере приложений Windows, чтобы увидеть, какой процесс rphost.exe принимает входящее соединение по порту и с какого IP-адреса оно пришло.Если административные методы не дают быстрого результата, мы можем прибегнуть к «партизанскому» методу — внедрению кода-ловушки непосредственно в объект документа. Рассмотрим подробнее, как это реализовать. В модуле объекта документа РезервыПоОплатеТруда в процедуре ПередЗаписью добавим блок записи в Журнал регистрации расширенной информации.
Посмотрим на пример кода:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
// Сюда попадают изменения, идущие через COM/обмен
ТекстДляЛога = СтрШаблон("ВНИМАНИЕ! Изменение документа через COM. Компьютер: %1, Пользователь: %2, База: %3",
ИмяКомпьютера(), ИмяПользователя(), СтрокаСоединенияИнформационнойБазы());
ЗаписьЖурналаРегистрации("ПоискВзломщика", УровеньЖурналаРегистрации.Предупреждение, , , ТекстДляЛога);
КонецЕсли;
КонецПроцедуры
Функция СтрокаСоединенияИнформационнойБазы() крайне важна: если соединение инициировано из другой базы 1С, она может вернуть параметры подключения именно той, другой базы, что мгновенно раскроет местоположение копии.
Выясним, как COM-объекты ведут себя на уровне операционной системы. Когда внешнее приложение подключается к 1С через COM, на стороне клиента или сервера (в зависимости от архитектуры) запускается процесс dllhost.exe (DCOM DLL Host Process), который загружает библиотеку comcntlev83.exe.
Используя «Монитор ресурсов» Windows, мы можем отследить активность этих процессов. Обратите внимание на сетевые подключения процесса dllhost.exe — там будет указан адрес сервера 1С, а в колонке «Пользователь» будет указана учетная запись, от имени которой запущен скрипт или база-копия. Часто это бывает техническая учетная запись, под которой работают службы 1С на тестовых серверах.
После того как мы нашли и «убили» несанкционированное соединение, важно предотвратить рецидив. Разберем основные правила гигиены при работе с копиями баз:
Бухгалтерия 3.0 КОРП зайдите в раздел «Администрирование» — «Синхронизация данных» — «Настройки синхронизации». Убедитесь, что нет активных узлов обмена с ЗУП, использующих COM-подключение, которые не должны работать в автоматическом режиме.Таким образом, комбинируя методы анализа Технологического журнала, мониторинга активных сеансов и программных методов логирования, мы можем быстро локализовать источник нежелательных изменений и навести порядок в ИТ-инфраструктуре предприятия.