Как правильно перевести доработанную УПП с файловой базы на клиент-серверную? Подробный чек-лист и подводные камни

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Перевод крупной и сильно доработанной базы данных «1С:Управление производственным предприятием» (УПП) с файлового режима работы на клиент-серверный вариант (на базе MS SQL Server) — это серьезный шаг, требующий глубокого понимания технических нюансов платформы «1С:Предприятие» и особенностей работы СУБД. В файловом режиме многие ошибки проектирования кода и запросов остаются незамеченными, так как вся база данных фактически крутится в рамках одного локального процесса на компьютере пользователя. Клиент-серверный режим жестко разделяет контекст исполнения и накладывает строгие требования к качеству кода.

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

1. Разделение контекста исполнения и серверный код

В клиент-серверном режиме код может выполняться как на стороне клиента (в интерактивной сессии пользователя), так и на стороне сервера приложений 1С. Рассмотрим основные проблемы, возникающие из-за этого разделения:

  1. Передача мутабельных значений. Это одна из самых частых причин падения доработанного кода. Мутабельные значения (например, ТаблицаЗначений, ДеревоЗначений, ДокументОбъект, СправочникОбъект) не могут быть переданы с клиента на сервер или обратно в качестве параметров процедур и функций общих модулей, у которых установлен флаг вызова сервера. Проанализируем все доработанные общие модули и функции. Если требуется передать данные таблицы значений на сервер, необходимо предварительно преобразовать ее в массив структур или передавать данные порциями через сериализацию.
  2. Интерактивные методы в серверных процедурах. В файловой базе вызов диалоговых окон (таких как Предупреждение(), Вопрос(), ПоказатьПредупреждение()) или методов открытия форм (ОткрытьФорму()) внутри модулей объектов или серверных общих модулей проходил незамеченным. На сервере приложений 1С нет интерфейса пользователя. Любая попытка вызвать интерактивный метод на сервере приведет к аварийному завершению транзакции. Необходимо вынести все интерфейсные вызовы строго на клиентскую сторону.
  3. Разрядность внешних компонент и COM-соединений. Файловые базы запускаются в 32-битном окружении клиента. Сервер приложений 1С чаще всего устанавливается в 64-битной редакции. Если в вашей УПП используются внешние компоненты (например, библиотеки интеграции с торговым оборудованием, весами, сканерами) или COM-объекты вроде Новый COMОбъект("Excel.Application") для загрузки прайс-листов, они перестанут работать на сервере. Рабочий процесс сервера rphost (64-бит) физически не может загрузить 32-битные библиотеки. Нам потребуется либо перерегистрировать данные компоненты в службе компонентов Windows (COM+), либо переписать алгоритмы обработки файлов с использованием платформенных механизмов без прямого обращения к COM.
  4. Работа с временными файлами. Выясним причину ошибок при работе с файловой системой. В файловом режиме пути к каталогам на «клиенте» и «сервере» идентичны. В серверной архитектуре вызов функции КаталогВременныхФайлов() вернет путь на диске сервера 1С, к которому у клиентского компьютера нет прямого доступа. Посмотрим на пример правильного обмена файлами между клиентом и сервером с использованием временного хранилища:

// На клиенте помещаем файл во временное хранилище
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);

// Передаем АдресХранилища на сервер
ВыполнитьОбработкуНаСервере(АдресХранилища);

// На сервере получаем данные
&НаСервере
Процедура ВыполнитьОбработкуНаСервере(АдресХранилища)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    // Производим чтение и обработку файла на стороне сервера...
КонецПроцедуры

2. Специфика выполнения запросов в MS SQL Server

Файловая СУБД платформы 1С прощает разработчикам множество вольностей при составлении запросов. При переходе на MS SQL Server вы можете столкнуться со строгими ограничениями промышленной базы данных:

  1. Ограничения по работе со строками неограниченной длины. MS SQL Server запрещает использовать поля неограниченной длины в операциях группировки (СГРУППИРОВАТЬ ПО), сортировки (УПОРЯДОЧИТЬ ПО), а также при использовании конструкции ВЫБРАТЬ РАЗЛИЧНЫЕ или при соединении таблиц. Если в доработанных отчетах или модулях проведения УПП использовались подобные конструкции с текстовыми полями неограниченной длины, запросы начнут выдавать критическую ошибку СУБД. Решением является ограничение длины строки в самом запросе с помощью функции ПОДСТРОКА().
  2. Неявные соединения и ограничение на количество таблиц. Сложные запросы в УПП, содержащие обращения через точку к реквизитам справочников (например, Номенклатура.СтатьяЗатрат.ВидРасходов...), платформа 1С на уровне СУБД автоматически разворачивает в левые соединения (LEFT JOIN). MS SQL Server имеет физическое ограничение на количество связываемых таблиц в рамках одного запроса (обычно не более 256). Если лимит превышен, запрос аварийно завершится. Перепишем такие тяжелые конструкции с использованием временных таблиц.
  3. Обработка пустых значений и NULL. При левом соединении таблиц в случае отсутствия сопоставляемой строки СУБД возвращает значение NULL. В файловой базе сравнение с пустой ссылкой или неопределенным значением могло отрабатывать корректно за счет внутренних алгоритмов платформы. В MS SQL Server сравнение с NULL требует явного использования функции ЕСТЬNULL(), иначе вы рискуете получить пустые строки в отчетах или неверный расчет себестоимости при проведении документов.

3. Настройка блокировок данных (Крайне важно для УПП)

Перевод базы УПП на клиент-серверный режим напрямую влияет на параллельную работу пользователей. Рассмотрим подробнее этот аспект:

Старые редакции «Управление производственным предприятием» по умолчанию используют автоматический режим блокировок. В файловом режиме при записи документа блокируется вся таблица целиком, но из-за высокой скорости локального диска пользователи этого практически не замечали. На сервере MS SQL Server блокировки накладываются на уровне отдельных строк. В автоматическом режиме это приводит к лавинообразному росту взаимных блокировок (Deadlocks) и ошибкам ожидания освобождения ресурсов при одновременной работе нескольких пользователей.

Для минимизации этой проблемы настоятельно рекомендуется перевести конфигурацию (или хотя бы наиболее нагруженные документы проведения) на управляемый режим блокировок. Это потребует детального аудита кода проведения документов и явного прописывания блокировок в модулях проведения с использованием объекта БлокировкаДанных.

4. Подготовка регламентных и фоновых заданий

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

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

5. Администрирование и тюнинг СУБД MS SQL Server

Для обеспечения максимальной производительности системы после перехода на клиент-сервер необходимо выполнить базовые настройки СУБД:

6. Пошаговая методология тестирования перехода

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

  1. Создание тестового контура. Развернем тестовый сервер приложений 1С и тестовый сервер MS SQL Server. Загрузим туда актуальную копию рабочей файловой базы УПП.
  2. Техническое тестирование программистом. Проверим проведение основных видов документов, формирование ключевых отчетов, работу всех внешних печатных форм и обработок выгрузки. Запустим глобальный поиск по конфигурации на наличие методов Предупреждение, Вопрос в модулях объектов.
  3. Нагрузочное тестирование пользователями. Привлечем к тестированию ключевых пользователей из каждого отдела (бухгалтерия, склад, продажи, закупки). Поручим им выполнить стандартные ежедневные операции в тестовой клиент-серверной базе (создание заказов, реализаций, проведение требований-накладных, формирование ведомостей). Никто лучше самих пользователей не знает специфику работы доработанных механизмов.
  4. Сравнение результатов. Выполним групповое перепроведение документов за определенный период (например, за последний месяц) в тестовой клиент-серверной базе и сравним оборотно-сальдовую ведомость и отчеты по затратам с оригинальной файловой базой. Показатели должны полностью совпадать.

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

← На главную