В практике администрирования и разработки 1С часто возникает соблазн произвести отладку сложных ошибок на «живых» данных. Одной из идей, приходящих в голову, является подключение второго, отладочного сервера 1С к той же самой базе данных SQL, с которой работает основной промышленный сервер. В этой статье мы разберем, почему такой подход считается критической ошибкой, какие процессы происходят «под капотом» системы и к каким фатальным последствиям это может привести.
Рассмотрим ситуацию: администратор полагает, что если на втором сервере не запускать алгоритмы записи данных, то работа будет безопасной. Это заблуждение. Проанализируем работу платформы 1С:Предприятие. Даже если пользователь просто заходит в систему и открывает отчет, сервер приложений выполняет ряд обязательных операций записи в таблицы СУБД:
IBSessions. Когда два независимых кластера пытаются одновременно управлять записями в этой таблице, возникают конфликты индексов и блокировки на уровне СУБД.Params, записывая туда служебную информацию о состоянии конфигурации, статистике и временных флагах..lgd (хранение в базе данных), оба сервера начнут одновременно писать в одни и те же таблицы журнала. Это неизбежно приведет к жестким блокировкам (Deadlocks) и резкому падению производительности основного сервера.Разберем подробнее, как 1С работает с блокировками. Система использует двухслойную модель: логические блокировки на уровне сервера 1С и транзакционные блокировки на уровне СУБД. Проблема заключается в том, что каждый сервер 1С хранит таблицу своих логических блокировок в собственной оперативной памяти.
Рассмотрим пример. Если пользователь на Сервере №1 начал редактировать документ РеализацияТоваровУслуг, Сервер №1 установил объектную блокировку. Сервер №2 ничего не знает об этой блокировке. Если в это же время через Сервер №2 (отладочный) будет предпринята попытка программного изменения этого же документа, возникнет ситуация, когда бизнес-логика 1С не сможет предотвратить конфликт. В лучшем случае один из пользователей получит ошибку от SQL-сервера, в худшем — данные будут записаны некорректно, что нарушит целостность информационной базы.
Сервер 1С активно использует кэширование для ускорения работы. В оперативной памяти рабочих процессов rphost хранятся структуры таблиц, скомпилированные модули и значения констант. Проанализируем ситуацию динамического обновления конфигурации (так называемого «обновления демоном»).
Когда на основном сервере происходит обновление метаданных, он знает об изменениях и обновляет свой кэш. Однако второй сервер (отладочный) об этом не уведомляется. Его кэш мгновенно становится неактуальным или «битым». Попытка выполнить код на «протухших» метаданных может привести к:
Выясним причину, по которой даже отключение регламентных заданий в консоли кластера на втором сервере не гарантирует безопасности. Некоторые фоновые процессы инициируются платформой автоматически для поддержания жизнедеятельности базы:
Для оптимизации записи новых объектов сервер 1С резервирует для себя диапазоны идентификаторов (GUID) и номеров документов. Если подключены два сервера, возникает риск коллизии:
Сервер №1 зарезервировал номера с 100 по 200. Сервер №2, не видя этого в оперативной памяти первого сервера, может начать выдавать те же самые номера. В результате при попытке записи пользователь получит критическую ошибку Объект с таким номером/кодом уже существует, хотя визуально номера свободны.
Если вам жизненно необходимо провести отладку на текущих данных, мы рекомендуем использовать следующие проверенные методы вместо опасных экспериментов со вторым сервером:
Если вы используете MS SQL Server версии Enterprise (или Standard в новых версиях), вы можете создать «снимок» базы данных. Это мгновенная копия, которая не занимает места вначале и работает по принципу «копирование при записи».
Алгоритм действий:
Вместо создания второго сервера, можно включить режим отладки на основном сервере, но минимизировать риски:
HTTP протокол отладки, он создает меньшую нагрузку на сеть и стабильнее работает через брандмауэры.Для крупных баз данных (терабайтных объемов), где обычное восстановление из бэкапа длится долго, стоит настроить механизм Log Shipping или AlwaysOn с возможностью чтения со вторичной реплики. Это позволит иметь актуальную копию базы для отладки с минимальным отставанием от оригинала (обычно несколько секунд или минут).
Резюме: Подключение двух серверов 1С к одной базе данных SQL — это «мина замедленного действия». Несмотря на кажущийся профит в скорости развертывания отладочной среды, риски потери данных и остановки бизнес-процессов несоизмеримо выше. Платформа 1С:Предприятие проектировалась исходя из принципа «один кластер — одна база данных», и нарушение этого принципа снимает любые гарантии стабильности системы.