При работе с современными конфигурациями 1С, построенными на базе Библиотеки стандартных подсистем (БСП), системные администраторы и программисты часто сталкиваются с назойливым окном: «Информационная база была перемещена или восстановлена из резервной копии». Самое неприятное в этой ситуации то, что при появлении данного сообщения система автоматически блокирует выполнение всех регламентных и фоновых заданий, связанных с внешними ресурсами (синхронизация данных, отправка почты, обмен с банками и государственными информационными системами).
В этой статье мы подробно разберем, почему этот механизм срабатывает даже тогда, когда база физически никуда не перемещалась, и проанализируем все доступные способы решения этой проблемы.
Прежде всего, разберем логику работы системы. Разработчики 1С внедрили этот функционал для защиты данных. Представим ситуацию: вы сделали копию рабочей базы для тестирования. Если в тестовой базе не отключить регламентные задания, она может начать отправлять реальные письма клиентам, выгружать дублирующие данные в «Честный знак» или выполнять обмен с клиент-банком, что приведет к катастрофическим последствиям. Чтобы этого избежать, БСП при каждом запуске сверяет текущие параметры подключения к базе с теми, что были сохранены ранее как «эталонные».
Данные сохраняются в скрытой константе ПараметрыБлокировкиРаботыСВнешнимиРесурсами. Если система обнаруживает расхождение, она считает базу «копией» и выводит предупреждение.
Проанализируем наиболее частую причину — человеческий фактор при настройке списка баз. Для БСП строки Srvr="1c-server";Ref="work_db"; и Srvr="192.168.1.10";Ref="work_db"; являются абсолютно разными, несмотря на то, что они ведут на один и тот же физический сервер.
Рассмотрим, что может вызвать конфликт:
server вместо SERVER. Механизм сравнения в некоторых версиях БСП регистрозависим.localhost или 127.0.0.1 на самом сервере при том, что пользователи подключаются по внешнему имени.serv1,serv2 против serv1;serv2).Решение: Приведите все подключения к единому стандарту. Рекомендуется использовать общее DNS-имя сервера и одинаковый регистр во всех списках информационных баз у всех пользователей. Лучшим вариантом будет создание общего файла .v8i на сетевом ресурсе.
В условиях работы SQL-кластера или кластера серверов 1С ситуация усложняется. Выясним причину: фоновое задание может запуститься на одном узле кластера, а пользователь войти через другой. Если в настройках кластера имена серверов прописаны не единообразно, система зафиксирует различие в параметре ИмяКомпьютера.
Как отмечают специалисты, регламентные задания часто формируют собственную строку соединения, используя имя рабочего сервера кластера, который их выполняет. Если это имя не совпадает с тем, что ввел пользователь при подтверждении «База перемещена», сообщение будет появляться снова и снова.
Существуют и чисто программные ошибки. Например, ошибка 00-00068833 в БСП версии 2.3.2.48 и ниже. В более новых релизах (начиная с 3.0.1.349) алгоритм сравнения стал более «умным» и научился игнорировать регистр и порядок параметров в строке соединения.
Проанализируем ситуацию с платформой: в некоторых версиях (например, 8.3.8.1747) наблюдались ложные срабатывания из-за некорректного возврата значения функцией СтрокаСоединенияИнформационнойБазы(). В таких случаях помогает обновление платформы до актуальной стабильной версии.
Если вы не можете оперативно обновить конфигурацию, можно воспользоваться механизмом расширений. Рассмотрим пример кода, который часто применяется для обхода этой проверки в модуле РегламентныеЗаданияСлужебный.
Посмотрим на пример модификации функции УстановленаБлокировкаРаботыСВнешнимиРесурсами, чтобы сделать сравнение регистронезависимым:
// В модуле РегламентныеЗаданияСлужебный
Функция УстановленаБлокировкаРаботыСВнешнимиРесурсами() Экспорт
// ... существующий код получения параметров ...
ИмяБазы = ВРег(НРег(СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(СтрокаСоединения).Ref));
СохраненноеИмяБазы = ВРег(НРег(СтроковыеФункцииКлиентСервер.ПолучитьПараметрыИзСтроки(ПараметрыБлокировки.СтрокаСоединения).Ref));
Если ИмяБазы <> СохраненноеИмяБазы Тогда
// Логика блокировки
КонецЕсли;
КонецФункции
Также можно полностью отключить проверку имени сервера, изменив параметр ПроверятьИмяСервера на Ложь в процедуре инициализации параметров блокировки. Однако помните, что это снижает уровень безопасности вашей системы.
Если сообщение появилось, и вы уверены, что база рабочая, выполните следующие действия:
ПараметрыБлокировки = Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами.Получить().Получить();
ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Ложь;
Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами.Установить(Новый ХранилищеЗначения(ПараметрыБлокировки));
Разберем по шагам, как минимизировать риск ложных срабатываний без правки кода:
srv-1c.company.local).default.vrd. Параметр ib (строка соединения) в нем должен в точности соответствовать строке в толстом/тонком клиенте.Важный совет: Если вы используете распределенные информационные базы (РИБ), будьте крайне осторожны с полным отключением этого механизма, так как он критически важен для предотвращения конфликтов номеров сообщений обмена и дублирования данных.
Подводя итог, можно сказать, что проблема «перемещенной базы» чаще всего кроется в мелочах: лишний пробел, разный регистр или использование IP-адреса вместо имени. Внимательный анализ журнала регистрации и приведение всех клиентских мест к единому стандарту подключения позволяют решить эту проблему в 90% случаев без вмешательства в программный код конфигурации.