Оптимизация СУБД под 1С:Предприятие 8.5: полный чек-лист от железа до запросов

27.07.26

База данных - HighLoad оптимизация

Чек-лист по оптимизации производительности 1С 8.5: ОС, PostgreSQL/MS SQL, кластер, индексы, запросы и архитектура. С конкретными параметрами, примерами «до/после» и разбором новых инструментов мониторинга в 8.5.

С выходом 8.5 многие ждут прироста производительности «из коробки» — 1С заявляет улучшения производительности, стабильности и масштабируемости в версии 8.5.1. Но платформа не вытащит базу, у которой не настроена СУБД. Пройдёмся по всем уровням.

 

1. Уровень ОС и железа

  • SSD/NVMe под данные — обязательный минимум; журналы транзакций и tempdb — на отдельные диски;
  • Linux под PostgreSQL: отключить Transparent Huge Pages, настроить классические huge pages под shared_buffers, vm.swappiness = 1–10;
  • планировщик I/O: none/mq-deadline для NVMe;
  • проверить энергосбережение CPU — governor performance, а не powersave: «плавающие» тормоза часто отсюда;
  • сеть между сервером 1С и СУБД — 10 Гбит или размещение на одном хосте; латентность здесь важнее пропускной способности.

 

2. PostgreSQL: параметры, которые чаще всего забыты

  • shared_buffers — 25% ОЗУ (не больше 40%);
  • effective_cache_size — 50–75% ОЗУ;
  • work_mem — 64–256 МБ: мало = сортировки на диске, много = риск OOM;
  • random_page_cost = 1.1–1.2 для SSD, иначе планировщик избегает индексов;
  • max_parallel_workers_per_gather = 0 для OLTP-профиля 1С (параллелизм оставляем для копии под отчёты);
  • autovacuum агрессивнее: autovacuum_vacuum_scale_factor = 0.01–0.02 для крупных таблиц регистров;
  • checkpoint_timeout = 15–30 мин, max_wal_size увеличить — реже checkpoint-штормы;
  • регулярный REINDEX/pg_repack распухших таблиц итогов.

 

 

3. MS SQL: старая классика

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

MAXDOP = 1 — рекомендация ИТС для чистого OLTP-профиля 1С. Платформа генерирует много коротких запросов, параллельные планы дают CXPACKET-ожидания и нестабильность планов. При этом значении cost threshold for parallelism не имеет смысла — параллелизм отключён на уровне сервера целиком.

MAXDOP по числу ядер в NUMA-узле, но не больше 8, плюс cost threshold for parallelism = 50–150 — вариант для смешанной нагрузки. Значение порога по умолчанию (5) откалибровано под железо середины 90-х: на современных серверах в параллель уходят даже тривиальные запросы. MAXDOP = 1 предсказуем в OLTP, но заметно растягивает закрытие месяца и тяжёлые отчёты.

Если сервер один и разнести нагрузку некуда — на SQL Server 2016+ MAXDOP задаётся не на инстансе, а на уровне базы: ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = N. Рабочая база — 1, база под отчёты или реплика — 4–8.

 

4. Кластер серверов 1С

СУБД — лишь половина связки:

  • Рабочие процессы: не один гигантский, а несколько с ограничением памяти на процесс и автоперезапуском при превышении;
  • Вынести фоновые задания на отдельный рабочий сервер через требования назначения функциональности;
  • Лицензирование, журнал регистрации и полнотекстовый поиск не должны конкурировать с пользовательскими сеансами за диск;
  • Проверить интервал перезапуска рабочих процессов — утечки памяти в долгоживущих процессах никто не отменял.

 

 

5. Индексы и структура данных

  • Добавить индексы измерениям регистров, по которым реально фильтруют отчёты (флаг «Индексировать» в конфигураторе или расширении);
  • Проверить неиспользуемые индексы (pg_stat_user_indexes / sys.dm_db_index_usage_stats) — каждый лишний индекс замедляет запись;
  • Пересчёт и установка границы рассчитанных итогов регистров — ежемесячно регламентом;
  • Отключить неиспользуемые механизмы: версионирование объектов «на всё», полнотекстовый поиск, если им никто не пользуется, историю данных без необходимости;
  • Свёртка базы, если в рабочем контуре лежит 10+ лет документов.

 

6. Оптимизация запросов — самый дешёвый прирост

Никакой конфиг не спасёт от плохого кода:

  • Запросы в цикле → один запрос с временной таблицей;
  • Соединения с виртуальными таблицами (ОстаткиИОбороты и пр.) → сначала выгрузка во временную таблицу с индексом;
  • ПОДОБНО "%..." и функции над полями в условиях убивают использование индексов;
  • РЛС (ограничения на уровне записей) — частый скрытый убийца производительности: проверяйте итоговый текст запроса;
  • Динамические списки: произвольный запрос + основная таблица, без соединений в условиях отбора.

 

7. Архитектурные приёмы

  • Тяжёлую отчётность — на копию базы (механизм копий данных / логическая репликация PostgreSQL): OLTP и OLAP на одной базе — вечный конфликт;
  • Отложенное проведение и разнесение тяжёлых движений по времени;
  • Очереди вместо синхронных обменов в пиковые часы.

 

8. Что даёт именно 8.5

    Полезное для диагностики — HTTP-интерфейс метрик кластера серверов, расширенный в 8.5.3–8.5.4: показатели рабочих процессов, менеджера кластера и рабочих серверов отдаются наружу и снимаются любым внешним мониторингом без сторонних обвязок на COM/RAS. Журнал регистрации в 8.5 развивали в другую сторону — аудит прав и отказоустойчивый сервис ЖР; таймингов запросов там нет, за ними по-прежнему идём в техножурнал и в средства СУБД.

Тайминги запросов — где их брать на самом деле:

1. ТЖ с отбором по длительности. Дешевле, чем кажется, если не включать всё подряд. conf/logcfg.xml:

xml

<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\tj" history="24">
    <event><eq property="name" value="DBPOSTGRS"/><ge property="duration" value="3000000"/></event>
    <event><eq property="name" value="DBMSSQL"/><ge property="duration" value="3000000"/></event>
    <event><eq property="name" value="TLOCK"/></event>
    <event><eq property="name" value="TDEADLOCK"/></event>
    <property name="all"/>
  </log>
</config>

duration в микросекундах, 3000000 = 3 с. Файл подхватывается без перезапуска сервера, обычно в течение минуты.

2. Замеры времени БСП («Оценка производительности»). Включается в разделе «Администрирование → Оценка производительности», данные копятся в регистре сведений «Замеры времени», дальше APDEX по ключевым операциям. Это то, что реально стоит показывать заказчику как «до/после».

3. Уровень СУБД. PostgreSQL — pg_stat_statements плюс log_min_duration_statement; MS SQL — Query Store или Extended Events. Здесь тайминги честнее всего, потому что видно и план, и частоту вызова.

 

9. Методика вместо шаманства

APDEX по ключевым операциям до и после, одна итерация = одно изменение = один замер. Иначе через месяц никто не вспомнит, что именно помогло.

 

Вывод

Производительность 1С — это слоёный пирог: железо → ОС → СУБД → кластер → структура данных → код. Ковырять только один слой бессмысленно. Переход на 8.5 — хороший повод пройти весь чек-лист сверху вниз.

Сталкивались с нюансами на 8.5 — делитесь в комментариях, соберём статистику по релизу.

Вступайте в нашу телеграмм-группу Инфостарт

оптимизация производительности 1С 8.5 PostgreSQL MS SQL кластер серверов индексы оптимизация запросов APDEX мониторинг репликация

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

HighLoad оптимизация Разработчик 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    15322    ivanov660    48    

57

HighLoad оптимизация Разработчик 1С:Предприятие 8 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    16131    ivanov660    39    

62

HighLoad оптимизация Разработчик Россия Бесплатно (free)

А вы знали, что сервер 1С при соединении с базой на сервере PostgreSQL самостоятельно устанавливает некоторые параметры? Это важно знать при настройке сервера и отладке долгих запросов. Предлагаю разобраться.

27.08.2024    10039    soulner    10    

41

HighLoad оптимизация Технологический журнал Системный администратор Разработчик Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    18751    ivanov660    13    

64

HighLoad оптимизация Разработчик 1С:Предприятие 8 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    24647    Evg-Lylyk    73    

46

HighLoad оптимизация Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    14357    spyke    29    

54
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. paulwist 22.07.26 08:33 Сейчас в теме
Лицензирование, журнал регистрации и полнотекстовый поиск не должны конкурировать с пользовательскими сеансами за диск


Как технически решается разделение "конкуренции" для ЖР и полнотекстовый поиск??
4. qwerty1414 118 22.07.26 12:59 Сейчас в теме
(1)
Как технически решается разделение "конкуренции" для ЖР и полнотекстовый поиск??

Спасибо за вопрос.

Механизм один: в кластере 1С это сервисы, а не «фоновая активность», и каждый сервис можно привязать к конкретному рабочему серверу через требования назначения функциональности. Объекты требования там прямо так и называются: «Соединение сервиса журналов регистрации», «Соединение сервиса полнотекстового поиска данных», «Соединение сервиса лицензирования». Типовая схема — сервер А обслуживает только клиентские соединения, сервер Б (можно слабый, но со своим диском) забирает служебные сервисы и фоновые задания. Плюс на рабочем сервере имеет смысл включить флаг «Менеджер под каждый сервис»: тогда сервисы разъезжаются по отдельным процессам rmngr и как минимум становится видно, кто именно ест диск.

По ЖР конкретика такая. Он пишется файлом в каталог сервера (srvinfo\reg_1541<uuid>\1Cv8Log), штатного параметра «путь к ЖР» нет — выносим симлинком (mklink /D в Windows, ln -s или mount --bind в Linux) на отдельный том. Но сначала я бы уменьшил сам поток: снять регистрацию событий «Доступ», «Транзакции», отладочных — на активной базе полное логирование даёт десятки ГБ в сутки, и это основной источник конкуренции, а не расположение файла. Плюс разделение хранения по суткам и автоматическое сокращение по сроку. На Linux ещё есть вариант отдавать ЖР в syslog — запись уходит в системный демон.

С полнотекстовым поиском нюанс: его индекс хранится не файлами, а в самой базе (_FULLTEXTINDEX*), поэтому средствами 1С «на другой диск» его не унести — конкуренция идёт за диск СУБД. Что реально помогает: расписание (типовое «Обновление индекса ППД» крутится с интервалом около минуты — в рабочее время ставим 5–15 минут, слияние индексов только ночью) и сужение области индексирования, потому что по умолчанию в индекс попадает почти всё, включая реквизиты, по которым никто никогда не искал. На уровне СУБД таблицы индекса можно вынести в отдельную файловую группу или tablespace, но приём нетиповой — после реструктуризации размещение слетает, нужен контроль.
triviumfan; +1 – Ответить
2. nefertum_mortis 22.07.26 10:23 Сейчас в теме
Очередной нейрослоп.
5. qwerty1414 118 22.07.26 13:00 Сейчас в теме
(2) Готов обсудить по существу. Что конкретно в статье неверно — параметры PostgreSQL, схема выноса сервисов через ТНФ, рекомендации по расписанию ПТП?
10. nefertum_mortis 27.07.26 22:18 Сейчас в теме
(5) Речь в первую очередь про саму манеру подачи: заголовки, разбивка на разделы, финальная фраза — всё это очень сильно отдает llm.

Что касается содержания, то оно не особо-то и соответствует названию статьи.
Все эти рекомендации с тем же успехом применимы к 8.3. Заявленные примеры до/после — отсутствуют.

duration в микросекундах, 3000000 = 3 с.

Нет, duration — это десятитысячные доли, а микросекунды — это durationus.
Поэтому при настройке вида
<ge property="duration" value="3000000"/>
логироваться будут запросы от 5 минут.

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

С оговорками на то, что:
1. На постоянку на проде такое делать не стоит, это отладочный флаг.
2. Если не увеличить диапазон доступных портов, а на сервере живет несколько rphost'ов (а именно так вы и предлагаете сделать в п. 4), то будете ловить ошибки про ненайденный процесс.

На Linux ещё есть вариант отдавать ЖР в syslog

Каким образом, если не секрет? Перенаправлять вывод ibcmd?
triviumfan; +1 – Ответить
11. triviumfan 103 30.07.26 14:22 Сейчас в теме
(10) Справедливое замечание. Многие путаются с этим Duration и Durationus. Какой только ***** поменял их...
https://its.1c.ru/db/v854doc#bookmark:adm:TI000000841
3. paulwist 22.07.26 12:04 Сейчас в теме
3. MS SQL: старая классика

MAXDOP = 1 для OLTP-нагрузки, cost threshold for parallelism


Кстати, что вы хотели сказать этой фразой??
6. qwerty1414 118 22.07.26 13:04 Сейчас в теме
Справедливое замечание,

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

Первый — MAXDOP = 1. Классическая рекомендация ИТС для баз 1С: платформа генерирует много коротких запросов, параллельные планы дают CXPACKET-ожидания и нестабильность планов. При этом значении cost threshold for parallelism действительно ни на что не влияет — параллелизм выключен целиком, и упоминание порога рядом с ним лишнее.

Второй — MAXDOP по числу ядер в NUMA-узле (но не больше 8) плюс cost threshold в районе 50–150. Значение по умолчанию у порога — 5, оно из середины девяностых, и на современном железе это означает, что в параллель уходят даже тривиальные запросы. Такой вариант имеет смысл при смешанной нагрузке: MAXDOP = 1 предсказуем в OLTP, но заметно растягивает закрытие месяца и тяжёлые отчёты.

Если сервер один, практичный компромисс — задавать MAXDOP не на инстансе, а на уровне базы: на SQL Server 2016+ через ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = N. Рабочая база — 1, база под отчёты или реплика — 4–8.

Внесу правку в текст, спасибо.
7. paulwist 22.07.26 14:40 Сейчас в теме
Отлично разделили/описали.

(6)
в параллель уходят даже тривиальные запросы.


Подушню немного :)

Тут бы слово тривиальны поставить в кавывчки, поскольку если план определяется как TRIVIAL, то поиск оптимального плана прекращается, те тривиальный план никогда не может стать параллельным (конечно, можно заставить, но это уже будет при других условиях) :)
8. Kluch 23.07.26 15:12 Сейчас в теме

8. Что даёт именно 8.5
В журнал регистрации добавлена аналитика по производительности — тайминги выполнения запросов и нагрузка на сервер. Это не замена техножурналу, но быстрые проблемные запросы теперь видно без разворачивания полного ТЖ.


Откуда такая информация и как это настроить?
9. qwerty1414 118 27.07.26 18:39 Сейчас в теме
(8) Дополнил статью
12. x-Ally 31.07.26 07:00 Сейчас в теме
По поводу кластера 1С и количество соединений на рабочий процесс 1с - а есть какие то конкретные цифры, чтобы работало лучше?
Стандартная настройка предполагает 256 соединений на процесс.
Для отправки сообщения требуется регистрация/авторизация