MS SQL Server под 1С:Предприятием 8.3: что происходит внутри базы и как ускорить её работу
Содержание
В клиент-серверном варианте 1С SQL Server только хранит данные и выполняет запросы. Бизнес-логику он не исполняет. Запрос на языке 1С переводит в SQL рабочий процесс сервера 1С (rphost), а пользователь с СУБД напрямую вообще не общается. Поэтому работа SQL Server в 1С ускоряется двумя путями: настройкой самой СУБД (память, параллелизм, tempdb, статистика) и правкой запросов в конфигурации.
Частое заблуждение — «база тормозит, значит, нужен сервер мощнее». На практике медленную 1С на SQL чаще лечат регламентом обслуживания и одним-двумя параметрами СУБД, чем покупкой железа.
Кто за что отвечает: клиент, кластер 1С и СУБД
Цепочка в клиент-серверном режиме выглядит так.
- 💻 Клиент 1С (тонкий клиент или веб-клиент) показывает формы и отправляет вызовы на сервер.
- 🧭 Агент сервера 1С (
ragent, порт 1540) принимает подключение и передаёт его менеджеру кластера (rmngr, порт 1541). - ⚙️ Рабочий процесс (
rphost) исполняет серверный код конфигурации, строит SQL-текст и отправляет его в СУБД. - 🗄️ SQL Server (по умолчанию порт 1433) выполняет запрос и возвращает строки рабочему процессу.
Отсюда практические выводы:
- 🔌 Сеть между сервером 1С и SQL Server должна быть быстрой и стабильной: каждый вызов — это десятки обращений к СУБД. Лучший вариант — оба сервиса на одной машине или в одной стойке.
- 🔐 Права на SQL выдают учётной записи, которую 1С указывает в параметрах информационной базы, а не пользователям 1С.
- 🧮 Лицензии 1С и SQL Server — разные вещи. Клиентские лицензии 1С не покрывают лицензирование СУБД.
Как база 1С появляется в SQL Server
Базу создают в консоли администрирования кластера: новая информационная база, тип СУБД MSSQLServer, имя сервера баз данных, имя базы, логин и пароль пользователя СУБД. Галка «Создать базу данных
в случае её отсутствия» поручает создание самой 1С.
Для создания логину нужна серверная роль dbcreator. После этого его достаточно оставить владельцем только своей базы (db_owner). Давать sysadmin для повседневной работы незачем.
Сопоставление (collation) 1С задаёт сама при создании базы. Если базу создают заранее средствами SQL Server, выбирайте кириллическое сопоставление без учёта регистра, например Cyrillic_General_CI_AS.
Как 1С раскладывает данные по таблицам SQL Server
Откройте базу 1С в SQL Server Management Studio — и увидите сотни таблиц с именами вроде _Reference25, _Document117, _AccumRg2045. Это не мусор, а схема, которую платформа генерирует по метаданным конфигурации.
| Префикс таблицы | Что хранит |
|---|---|
_Reference | справочники |
_Document | шапки документов |
_Document…_VT… | табличные части документов |
_AccumRg | движения регистров накопления |
_AccumRgT | итоги регистров накопления |
_InfoRg | регистры сведений |
_AccRg | движения регистров бухгалтерии |
_Const | константы |
_Enum | перечисления |
Поля тоже обезличены: _Fld1234, _IDRRef, _Date_Time, _Posted. Служебные таблицы без подчёркивания (Config, Params, Files, DBSchema) хранят саму конфигурацию и параметры базы.
Как узнать, какая таблица за что отвечает
Соответствие имён метаданным выдаёт встроенная функция ПолучитьСтруктуруХраненияБазыДанных(). Её запускают из обработки или консоли кода:
Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Строка Из Структура Цикл
Сообщить(Строка.Метаданные + " = " + Строка.ИмяТаблицы);
КонецЦикла;
Второй параметр Истина возвращает имена в терминах СУБД. Без этого не прочитать ни план запроса, ни отчёт о блокировках: в них только _AccumRg2045.
Не меняйте данные в таблицах 1С напрямую через SQL. Платформа не узнает об изменении: итоги, кэши и обмены разойдутся с реальностью. Читать можно, писать — только средствами 1С.
Индексы
Платформа сама создаёт кластерный индекс и индексы по ссылке, коду, наименованию, дате и измерениям регистров. Свойство реквизита «Индексировать» в конфигураторе добавляет ещё один. Индексы, созданные вручную в SQL, пропадут при следующей реструктуризации базы, так что такой «тюнинг» живёт до первого обновления.
Что происходит с запросом 1С на стороне СУБД
Текст на языке запросов 1С рабочий процесс транслирует в T-SQL. Несколько моментов, которые видны в профайлере и объясняют поведение базы:
- 📦 Временные таблицы (
ПОМЕСТИТЬ ВТ_…) превращаются в таблицы#ttвtempdb. Отсюда нагрузка наtempdbв тяжёлых отчётах. - 🔗 Разыменование через точку (
Документ.Контрагент.ИНН) даёт дополнительные соединения. Цепочка через составной тип — по соединению на каждый возможный тип. - 📊 Виртуальные таблицы
ОстаткииОстаткиИОборотычитают таблицы итогов_AccumRgT. Если итоги не пересчитаны или отключены, СУБД перебирает движения целиком. - 🔒 Управляемые блокировки 1С ставит в своём менеджере блокировок, а СУБД работает в режиме версионирования строк (
READ_COMMITTED_SNAPSHOT). Поэтому чтение не ждёт записи, как в старом автоматическом режиме.
Как писать запросы, которые SQL выполняет быстро
- Ставьте условия в параметры виртуальной таблицы, а не в
ГДЕпосле неё. Иначе СУБД сначала посчитает остатки по всем организациям, а потом отфильтрует. - Не соединяйте с подзапросами — выносите их во временные таблицы и индексируйте по полю соединения (
ИНДЕКСИРОВАТЬ ПО). - Не используйте
ИЛИв условиях соединения: оптимизатор часто уходит в полный просмотр. Помогает разбиение на два запроса сОБЪЕДИНИТЬ ВСЕ. - Отбирайте по полям, на которых есть индекс, и в порядке этого индекса.
- Не обращайтесь к базе в цикле: один запрос на 1 000 строк быстрее тысячи запросов по одной.
План выполнения конкретного запроса 1С снимают в технологическом журнале (событие DBMSSQL со свойством planSQLText) или в SQL Server Profiler / Extended Events, отфильтровав по имени базы.
Типичные проблемы производительности и что с ними делать
Ещё две частые причины, которые не видны в SQL:
- 🧾 Отключённые или не пересчитанные итоги регистров. Проверяются в режиме 1С:Предприятие:
Все функции → Стандартные → Управление итогами(пункт «Все функции» включается в параметрах программы). - 🐢 Отладка на рабочем сервере. Включённая отладка на кластере заметно замедляет рабочие процессы.
Настройка SQL Server под нагрузку 1С
Параметры ниже меняют на уровне экземпляра. Это общие для всех баз 1С рекомендации, а не «серебряная пуля»: после каждого изменения смотрите на поведение под реальной нагрузкой.
| Параметр | Что поставить | Зачем |
|---|---|---|
max server memory | вся память минус 4–8 ГБ на ОС, плюс память под rphost, если 1С на том же сервере | иначе SQL заберёт всё и вытеснит процессы 1С |
max degree of parallelism (MAXDOP) | 1 | запросы 1С короткие, параллельные планы чаще мешают |
Файлы tempdb | по одному на ядро, до 8 файлов одинакового размера, на быстром диске | снижает конкуренцию за служебные страницы |
| Модель восстановления | SIMPLE или FULL с бэкапом журнала | см. раздел о копиях |
| Автоприрост файлов | фиксированный, в мегабайтах (например, 512–1024 МБ), а не в процентах | рост на 10 % от 300 ГБ замораживает базу |
Авто-сжатие (AUTO_SHRINK) | выключено | сжатие фрагментирует индексы |
Команды для MAXDOP и памяти (пример для сервера с 64 ГБ, где 1С стоит на той же машине):
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'max degree of parallelism', 1; RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 40960; RECONFIGURE;
Здесь 40 ГБ отдано SQL Server, 24 ГБ — ОС и рабочим процессам 1С. Если 1С живёт на отдельном сервере, SQL можно отдать около 56 ГБ.
Учётной записи службы SQL Server дайте право Windows «Выполнение задач по обслуживанию томов» (Perform volume maintenance tasks). Тогда файлы данных растут без заполнения нулями — секунды вместо минут.
Диски: файлы данных, журнал транзакций и tempdb лучше разнести по разным томам на SSD. Журнал пишется последовательно и особенно чувствителен к задержкам записи.
Регламентное обслуживание
Без обслуживания база деградирует даже на мощном железе. Минимальный план в SQL Server Agent:
Очистка кэша планов выполняется командой DBCC FREEPROCCACHE. Сразу после неё запросы на несколько минут станут медленнее, пока планы не скомпилируются заново, поэтому её ставят в ночное окно.
Мониторинг и диагностика: где искать причину
Разбирайте проблему сверху вниз — от ощущения пользователя до конкретного запроса.
- Консоль кластера 1С. Список сеансов и соединений показывает, какой сеанс занят, сколько времени он в вызове СУБД и чья блокировка его держит.
- Монитор активности SSMS. Вкладки процессов, ожиданий и дорогих запросов дают картину «здесь и сейчас».
- Динамические представления SQL Server. Текущие ожидания и блокировки видны в
sys.dm_exec_requests, накопленная статистика ожиданий — вsys.dm_os_wait_stats. - Технологический журнал 1С. Файл
logcfg.xmlв каталогеconfплатформы включает сбор событий. Для СУБД нужныDBMSSQLс длительностью выше порога, для блокировок —TLOCK,TTIMEOUT,TDEADLOCK. - Query Store (SQL Server 2016 и новее) хранит историю планов и показывает, когда запрос «переключился» на плохой план.
Пример быстрого запроса: кто сейчас кого блокирует.
SELECT r.session_id, r.blocking_session_id, r.wait_type,
r.wait_time, DB_NAME(r.database_id) AS db, t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id <> 0;
Технологический журнал без фильтров за час забивает диск гигабайтами и сам нагружает сервер. Включайте его с отбором по базе и длительности, на ограниченное время.
Номер сеанса SQL из этого запроса сопоставляют с соединением 1С в консоли кластера: там видно имя пользователя 1С и что он делает.
Резервное копирование и восстановление базы 1С на SQL
Выгрузка .dt из конфигуратора — не замена резервной копии. Она требует монопольного доступа, на больших базах идёт часами и не даёт восстановиться на момент времени. Основной инструмент — бэкап средствами SQL Server.
| Схема | Модель восстановления | Что делать | Потеря данных при сбое |
|---|---|---|---|
| Простая | SIMPLE | полная копия ночью + разностная днём | до последней копии |
| На момент времени | FULL | полная раз в сутки + журнал каждые 15–30 минут | минуты |
BACKUP DATABASE [buh] TO DISK = N'D:\Backup\buh_full.bak'
WITH COMPRESSION, CHECKSUM, INIT;
Для модели FULL бэкап журнала по расписанию обязателен — иначе файл .ldf будет расти до заполнения диска.
Восстановление
- Восстановите копию в новую базу SQL с другим именем, а не поверх рабочей, — пока не убедитесь, что копия нужная.
- В консоли кластера зарегистрируйте информационную базу, указав это имя базы SQL.
- Если это копия для тестов, сразу включите в её параметрах блокировку регламентных заданий. Иначе тестовая копия начнёт выгружать данные в банк, ЭДО и узлы обмена от имени рабочей.
- Проверьте вход и ключевые отчёты, затем переключайте пользователей.
Восстановление поверх рабочей базы обрывает все сеансы и стирает данные, внесённые после копии. Делайте это только в согласованное окно и после отдельной копии текущего состояния.
Копии храните не на том же сервере, что и SQL, и регулярно проверяйте их пробным восстановлением: непроверенный бэкап — это надежда, а не копия.
Частые вопросы
Можно ли перенести базу 1С с файлового варианта на SQL Server без потери данных?
.dt в конфигураторе, создайте пустую базу на кластере с типом СУБД MSSQLServer и загрузите в неё файл. Данные, пользователи и настройки переносятся целиком.