Перевод крупной и сильно доработанной базы данных «1С:Управление производственным предприятием» (УПП) с файлового режима работы на клиент-серверный вариант (на базе MS SQL Server) — это серьезный шаг, требующий глубокого понимания технических нюансов платформы «1С:Предприятие» и особенностей работы СУБД. В файловом режиме многие ошибки проектирования кода и запросов остаются незамеченными, так как вся база данных фактически крутится в рамках одного локального процесса на компьютере пользователя. Клиент-серверный режим жестко разделяет контекст исполнения и накладывает строгие требования к качеству кода.
Разберем по шагам все критические аспекты, которые необходимо проверить и подготовить перед миграцией, чтобы система заработала стабильно, без ошибок и зависаний.
В клиент-серверном режиме код может выполняться как на стороне клиента (в интерактивной сессии пользователя), так и на стороне сервера приложений 1С. Рассмотрим основные проблемы, возникающие из-за этого разделения:
ТаблицаЗначений, ДеревоЗначений, ДокументОбъект, СправочникОбъект) не могут быть переданы с клиента на сервер или обратно в качестве параметров процедур и функций общих модулей, у которых установлен флаг вызова сервера. Проанализируем все доработанные общие модули и функции. Если требуется передать данные таблицы значений на сервер, необходимо предварительно преобразовать ее в массив структур или передавать данные порциями через сериализацию.Предупреждение(), Вопрос(), ПоказатьПредупреждение()) или методов открытия форм (ОткрытьФорму()) внутри модулей объектов или серверных общих модулей проходил незамеченным. На сервере приложений 1С нет интерфейса пользователя. Любая попытка вызвать интерактивный метод на сервере приведет к аварийному завершению транзакции. Необходимо вынести все интерфейсные вызовы строго на клиентскую сторону.Новый COMОбъект("Excel.Application") для загрузки прайс-листов, они перестанут работать на сервере. Рабочий процесс сервера rphost (64-бит) физически не может загрузить 32-битные библиотеки. Нам потребуется либо перерегистрировать данные компоненты в службе компонентов Windows (COM+), либо переписать алгоритмы обработки файлов с использованием платформенных механизмов без прямого обращения к COM.КаталогВременныхФайлов() вернет путь на диске сервера 1С, к которому у клиентского компьютера нет прямого доступа. Посмотрим на пример правильного обмена файлами между клиентом и сервером с использованием временного хранилища:
// На клиенте помещаем файл во временное хранилище
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
// Передаем АдресХранилища на сервер
ВыполнитьОбработкуНаСервере(АдресХранилища);
// На сервере получаем данные
&НаСервере
Процедура ВыполнитьОбработкуНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Производим чтение и обработку файла на стороне сервера...
КонецПроцедуры
Файловая СУБД платформы 1С прощает разработчикам множество вольностей при составлении запросов. При переходе на MS SQL Server вы можете столкнуться со строгими ограничениями промышленной базы данных:
СГРУППИРОВАТЬ ПО), сортировки (УПОРЯДОЧИТЬ ПО), а также при использовании конструкции ВЫБРАТЬ РАЗЛИЧНЫЕ или при соединении таблиц. Если в доработанных отчетах или модулях проведения УПП использовались подобные конструкции с текстовыми полями неограниченной длины, запросы начнут выдавать критическую ошибку СУБД. Решением является ограничение длины строки в самом запросе с помощью функции ПОДСТРОКА().Номенклатура.СтатьяЗатрат.ВидРасходов...), платформа 1С на уровне СУБД автоматически разворачивает в левые соединения (LEFT JOIN). MS SQL Server имеет физическое ограничение на количество связываемых таблиц в рамках одного запроса (обычно не более 256). Если лимит превышен, запрос аварийно завершится. Перепишем такие тяжелые конструкции с использованием временных таблиц.NULL. В файловой базе сравнение с пустой ссылкой или неопределенным значением могло отрабатывать корректно за счет внутренних алгоритмов платформы. В MS SQL Server сравнение с NULL требует явного использования функции ЕСТЬNULL(), иначе вы рискуете получить пустые строки в отчетах или неверный расчет себестоимости при проведении документов.Перевод базы УПП на клиент-серверный режим напрямую влияет на параллельную работу пользователей. Рассмотрим подробнее этот аспект:
Старые редакции «Управление производственным предприятием» по умолчанию используют автоматический режим блокировок. В файловом режиме при записи документа блокируется вся таблица целиком, но из-за высокой скорости локального диска пользователи этого практически не замечали. На сервере MS SQL Server блокировки накладываются на уровне отдельных строк. В автоматическом режиме это приводит к лавинообразному росту взаимных блокировок (Deadlocks) и ошибкам ожидания освобождения ресурсов при одновременной работе нескольких пользователей.
Для минимизации этой проблемы настоятельно рекомендуется перевести конфигурацию (или хотя бы наиболее нагруженные документы проведения) на управляемый режим блокировок. Это потребует детального аудита кода проведения документов и явного прописывания блокировок в модулях проведения с использованием объекта БлокировкаДанных.
В файловой базе регламентные задания не запускаются автоматически, если не организован специальный выделенный сеанс (так называемый вспомогательный клиент или «архивариус»). В клиент-серверном режиме все регламентные задания стартуют автоматически непосредственно на сервере 1С сразу после подключения информационной базы.
Важное правило безопасности: перед первой загрузкой базы на сервер 1С в утилите администрирования кластера необходимо установить флаг «Блокировка регламентных заданий включена». Если этого не сделать, сразу после старта сервера могут запуститься тяжелые доработанные регламентные операции: автоматическая рассылка писем клиентам с тестовой базы, обмены с сайтом или внешними системами, закрытие месяца или пересчет итогов. Это приведет к порче данных во внешних системах и перегрузке неочищенного SQL-сервера. Запускайте и тестируйте регламентные задания поочередно, предварительно проверив их код на корректность выполнения в серверном контексте.
Для обеспечения максимальной производительности системы после перехода на клиент-сервер необходимо выполнить базовые настройки СУБД:
rphost) из оперативной памяти в своп-файл, что вызовет жесткие зависания всей системы. Ограничьте параметр Max Server Memory в настройках СУБД так, чтобы оставалось достаточно памяти для процессов 1С и операционной системы.TempDB активно используется сервером 1С для работы с временными таблицами в запросах. Разместите файлы базы TempDB на самых быстрых дисковых накопителях (SSD/NVMe). Также разбейте основной файл данных TempDB на несколько равных частей (рекомендуется создавать количество файлов, равное числу ядер процессора, но не более 8 файлов) для снижения конкуренции за распределение страниц.Shared Memory (Общая память). Это позволит серверу приложений 1С обмениваться данными с СУБД напрямую через оперативную память, минуя сетевой стек TCP/IP, что ускорит работу запросов на 10-20%.Full). В этом режиме файл журнала транзакций (.ldf) будет непрерывно расти и быстро заполнит весь жесткий диск, если не настроено регулярное резервное копирование транзакций. Для баз 1С на этапе тестирования и начального перехода рекомендуется установить простую модель восстановления (Simple), при которой журнал транзакций автоматически очищается после фиксации изменений.Перевод рабочей базы «вживую» без предварительной подготовки категорически запрещен. Проанализируем правильный алгоритм организации тестирования:
Предупреждение, Вопрос в модулях объектов.Соблюдение данного чек-листа и последовательное выполнение всех этапов тестирования позволит вам перевести сильно кастомизированную базу УПП на клиент-серверную архитектуру плавно, безболезненно и без остановки бизнес-процессов предприятия.