Что делать, если копия базы 1С случайно выполнила обмен с рабочим сайтом?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Ситуация, когда тестовая копия базы данных 1С (особенно старых редакций, таких как Управление торговлей 10.3, Комплексная автоматизация 1.1 или Управление производственным предприятием 1.3) случайно запускает сессию обмена с боевым интернет-магазином, является одной из самых неприятных в практике администраторов и разработчиков. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) предусмотрена автоматическая защита, которая при переносе базы блокирует все внешние соединения до подтверждения администратором. Однако в классических решениях на обычных формах такой защиты «из коробки» нет.

В этой статье мы подробно рассмотрим, какие критические последствия влечет за собой подобная оплошность, как оперативно исправить возникшие сбои на стороне сайта под управлением «1С-Битрикс» и какие превентивные меры помогут навсегда застраховаться от повторения этого сценария.

Основные угрозы и последствия случайного обмена

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

  1. Перехват и потеря заказов. Во время обмена 1С запрашивает у Битрикса новые заказы. Сайт формирует XML-пакет, содержащий новые заказы с флагом успешного импорта UPDATED_1C = N. Копия базы успешно скачивает этот пакет и отправляет сайту подтверждение об успешном приеме. Сайт переключает флаг в положение UPDATED_1C = Y. В итоге реальная рабочая база при очередном сеансе обмена эти заказы просто не увидит, так как для сайта они уже считаются обработанными.
  2. Затирание актуальных остатков и цен. Тестовая копия базы, сделанная некоторое время назад, содержит неактуальную информацию о наличии товаров на складах и ценах. Запустив обмен, она выгружает эти устаревшие данные на сайт. Покупатели получают возможность заказывать отсутствующие товары по неверным ценам.
  3. Сбой нумерации пакетов и транзакций. Обмен фиксирует временные метки последней успешной транзакции. Сдвиг этих меток на стороне сайта из-за подключения копии может привести к ошибкам вида «Пакет был получен ранее» при попытке следующего подключения из рабочей базы.

Шаг 1. Восстанавливаем упущенные заказы на сайте

Проанализируем ситуацию с заказами. Если в период проведения несанкционированного обмена на сайте создавались новые заказы покупателей, они были помечены сайтом как выгруженные в 1С. Чтобы вернуть их в рабочую базу, нам необходимо сбросить этот статус.

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

  1. Переходим в административную панель «1С-Битрикс».
  2. Открываем раздел управления заказами.
  3. Находим заказы, созданные в период работы копии базы.
  4. Вносим в каждый заказ любое минимальное изменение (например, добавляем пробел в комментарии менеджера) и сохраняем его. Принудительное сохранение сбрасывает флаг выгрузки в 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С успешно заберет их к себе.

Шаг 2. Восстанавливаем актуальные цены и остатки товаров

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

Для этого выполним следующие действия в рабочей программе 1С:

  1. Переходим в настройки узла обмена с сайтом (справочник НастройкиОбменаСВариантами или настройки интеграции).
  2. На вкладке выгрузки каталога товаров временно отключаем режим «Выгружать только изменения».
  3. Запускаем интерактивный обмен в режиме «Полная выгрузка данных».

Этот процесс сформирует полные XML-файлы со всеми товарными позициями, актуальными остатками по складам и действующими прайс-листами, полностью перетерев некорректную информацию, отправленную из копии.

Шаг 3. Устраняем ошибку рассинхронизации («Пакет был получен ранее»)

Если после инцидента рабочая база выдает ошибку синхронизации, это означает, что временная метка сессии на стороне сайта ушла вперед. Чтобы исправить это, проанализируем настройки интеграции в «1С-Битрикс»:

  1. В админке сайта перейдем по пути: «Магазин» -> «Настройки» -> «Интеграция с 1С».
  2. Откроем настройки профиля обмена заказами.
  3. Найдем поле, фиксирующее дату и время последней успешной выгрузки, и очистим его (или установим дату на один день назад).
  4. Сохраним настройки и повторим обмен из рабочей 1С.

Как гарантированно предотвратить запуск обмена в копиях баз?

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

Метод 1. Ключ запуска для отключения регламентных заданий

При разворачивании файловых копий баз данных на локальном компьютере, запускайте их через ярлык со специальным ключом командной строки: /AllowExecuteScheduledJobs -Off. Данный параметр полностью блокирует выполнение любых регламентных и фоновых заданий в данном сеансе, включая автоматический запуск модулей обмена.

Метод 2. Использование файла hosts для изоляции сетевых запросов

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

Откройте файл C:\Windows\System32\drivers\etc\hosts от имени администратора и добавьте строчку:

127.0.0.1 имя_вашего_сайта.ru

Теперь любые попытки 1С отправить HTTP-запрос к вашему реальному сайту будут заворачиваться на ваш собственный компьютер, и обмен гарантированно завершится ошибкой подключения, никак не повредив рабочему сайту.

Метод 3. Программное отключение в модуле приложения

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


Процедура ПередЗапускомПрограммы(Отказ)
    ИмяРабочегоСервера = "WORK-SERVER";
    Если ВРег(ИмяКомпьютера()) <> ВРег(ИмяРабочегоСервера) Тогда
        // Мы запустили копию базы на локальном ПК
        Предупреждение("Внимание! Запущена тестовая копия базы данных. Сетевые обмены и регламентные задания будут заблокированы!");
    КонецЕсли;
КонецПроцедуры

Применяя данные подходы, вы сможете безопасно проводить тестирование и доработку конфигураций на локальных копиях, не рискуя нарушить стабильную работу продакшн-системы и не теряя заказы покупателей.

← На главную