Ситуация, когда тестовая копия базы данных 1С (особенно старых редакций, таких как Управление торговлей 10.3, Комплексная автоматизация 1.1 или Управление производственным предприятием 1.3) случайно запускает сессию обмена с боевым интернет-магазином, является одной из самых неприятных в практике администраторов и разработчиков. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) предусмотрена автоматическая защита, которая при переносе базы блокирует все внешние соединения до подтверждения администратором. Однако в классических решениях на обычных формах такой защиты «из коробки» нет.
В этой статье мы подробно рассмотрим, какие критические последствия влечет за собой подобная оплошность, как оперативно исправить возникшие сбои на стороне сайта под управлением «1С-Битрикс» и какие превентивные меры помогут навсегда застраховаться от повторения этого сценария.
Когда копия базы данных, содержащая устаревшие сведения, инициирует сеанс связи с сайтом, происходят три критических сбоя:
UPDATED_1C = N. Копия базы успешно скачивает этот пакет и отправляет сайту подтверждение об успешном приеме. Сайт переключает флаг в положение UPDATED_1C = Y. В итоге реальная рабочая база при очередном сеансе обмена эти заказы просто не увидит, так как для сайта они уже считаются обработанными.Проанализируем ситуацию с заказами. Если в период проведения несанкционированного обмена на сайте создавались новые заказы покупателей, они были помечены сайтом как выгруженные в 1С. Чтобы вернуть их в рабочую базу, нам необходимо сбросить этот статус.
Выясним масштаб проблемы. Если за время некорректного обмена поступило всего несколько заказов, мы можем применить ручной метод:
Если же заказов поступило много, ручной метод неэффективен. В этом случае администратору сайта необходимо выполнить специальный PHP-скрипт в панели Битрикса (раздел «Настройки» -> «Инструменты» -> «PHP-командная строка»):
use Bitrix\Main\Loader;
use Bitrix\Sale\Order;
Loader::includeModule('sale');
// Задаем интервал времени, в который произошел инцидент
$dateStart = new \Bitrix\Main\Type\DateTime('2023-10-26 08:00:00');
$dateEnd = new \Bitrix\Main\Type\DateTime('2023-10-26 12:00:00');
$dbOrders = Order::getList([
'filter' => [
'>=DATE_INSERT' => $dateStart,
'<=DATE_INSERT' => $dateEnd,
]
]);
while ($orderData = $dbOrders->fetch()) {
$order = Order::load($orderData['ID']);
$order->setField('UPDATED_1C', 'N');
$order->save();
}
После выполнения данного скрипта все заказы за указанный промежуток времени снова станут доступны для импорта. При следующем регламентном запуске обмена рабочая база 1С успешно заберет их к себе.
Поскольку копия выгрузила на сайт устаревшую информацию о товарах, нам необходимо принудительно перезаписать ее актуальными данными из рабочей базы.
Для этого выполним следующие действия в рабочей программе 1С:
НастройкиОбменаСВариантами или настройки интеграции).Этот процесс сформирует полные XML-файлы со всеми товарными позициями, актуальными остатками по складам и действующими прайс-листами, полностью перетерев некорректную информацию, отправленную из копии.
Если после инцидента рабочая база выдает ошибку синхронизации, это означает, что временная метка сессии на стороне сайта ушла вперед. Чтобы исправить это, проанализируем настройки интеграции в «1С-Битрикс»:
Чтобы больше никогда не сталкиваться с подобными критическими ситуациями, внедрим надежные методы защиты при работе с тестовыми копиями баз данных.
Метод 1. Ключ запуска для отключения регламентных заданий
При разворачивании файловых копий баз данных на локальном компьютере, запускайте их через ярлык со специальным ключом командной строки: /AllowExecuteScheduledJobs -Off. Данный параметр полностью блокирует выполнение любых регламентных и фоновых заданий в данном сеансе, включая автоматический запуск модулей обмена.
Метод 2. Использование файла hosts для изоляции сетевых запросов
Самый простой и надежный способ защиты, не требующий программирования. Перед запуском копии базы на локальном компьютере добавьте перенаправление домена вашего сайта на локальный адрес.
Откройте файл C:\Windows\System32\drivers\etc\hosts от имени администратора и добавьте строчку:
127.0.0.1 имя_вашего_сайта.ru
Теперь любые попытки 1С отправить HTTP-запрос к вашему реальному сайту будут заворачиваться на ваш собственный компьютер, и обмен гарантированно завершится ошибкой подключения, никак не повредив рабочему сайту.
Метод 3. Программное отключение в модуле приложения
Если вы являетесь разработчиком, полезно внедрить защиту на уровне конфигурации. Добавим предопределенный обработчик в модуле обычного приложения, который будет проверять имя компьютера при старте:
Процедура ПередЗапускомПрограммы(Отказ)
ИмяРабочегоСервера = "WORK-SERVER";
Если ВРег(ИмяКомпьютера()) <> ВРег(ИмяРабочегоСервера) Тогда
// Мы запустили копию базы на локальном ПК
Предупреждение("Внимание! Запущена тестовая копия базы данных. Сетевые обмены и регламентные задания будут заблокированы!");
КонецЕсли;
КонецПроцедуры
Применяя данные подходы, вы сможете безопасно проводить тестирование и доработку конфигураций на локальных копиях, не рискуя нарушить стабильную работу продакшн-системы и не теряя заказы покупателей.