База данных — это сердце любой системы 1С:Предприятие, и если оно начинает «задыхаться», то страдает вся инфраструктура: тормозит интерфейс, зависают отчёты, а пользователи теряют терпение. PostgreSQL, как самая популярная СУБД для 1С, требует грамотной настройки, особенно когда речь идёт о крупных базах с тысячами документов и сложными запросами. Многие администраторы ошибочно считают, что достаточно просто установить сервер по умолчанию — но это как купить спортивный автомобиль и ездить на нём в режиме «эко».

В этой статье мы разберём конкретные методы оптимизации, которые помогут ускорить работу PostgreSQL под 1С: от базовых настроек конфигурационного файла до тонкой настройки автовакуума и управления памятью. Важно понимать, что универсального рецепта нет — каждый случай уникален, и иногда даже мелкие изменения дают колоссальный прирост производительности. Например, правильная настройка shared_buffers может сократить время выполнения отчётов на 30-40%, а оптимизация индексов — ускорить выборки в 5-10 раз.

Мы не будем погружаться в теорию СУБД (для этого есть официальная документация), а сфокусируемся на практических шагах, которые можно применить уже сегодня. Все рекомендации протестированы на реальных базах 1С с объёмом данных от 50 ГБ и проверены на совместимость с последними версиями платформы 1С:Предприятие 8.3 и PostgreSQL 12-16. Если вы администрируете 1С на MS SQL Server, часть советов также будет полезна, но основной акцент сделан именно на PostgreSQL.

1. Оптимизация конфигурационного файла postgresql.conf

Файл postgresql.conf — это «мозг» вашей СУБД, и его настройки по умолчанию редко подходят для работы с 1С. Основная проблема в том, что PostgreSQL из коробки настроен на универсальное использование, а не на обработку большого количества транзакций и аналитических запросов, типичных для 1С. Даже на сервере с 32 ГБ ОЗУ параметры памяти могут быть занижены в 2-3 раза!

Ключевые параметры, которые нужно изменить в первую очередь:

  • 🔹 shared_buffers — кэш данных в памяти. Рекомендуемое значение: 25% от общей ОЗУ (но не более 8 ГБ для 32-битных систем). Например, для сервера с 16 ГБ ОЗУ установите shared_buffers = 4GB.
  • 🔹 effective_cache_size — предполагаемый объём кэша (ОЗУ + файловый кэш ОС). Установите 50-75% от общей ОЗУ, например effective_cache_size = 12GB.
  • 🔹 work_mem — память для сортировок и хэш-операций. Для 1С критично увеличить до 16-32 МБ (по умолчанию всего 4 МБ!), особенно если часто используются отчёты с группировками.
  • 🔹 maintenance_work_mem — память для операций обслуживания (например, VACUUM). Рекомендуем 512 МБ — 1 ГБ.
  • 🔹 max_worker_processes и max_parallel_workers — настройки параллелизма. Для многоядерных серверов увеличьте до количества логических ядер.

После изменения параметров обязательно перезагрузите сервер PostgreSQL, иначе настройки не применятся. Важно: если у вас виртуальный сервер (например, в VMware или Hyper-V), выделяйте память с запасом — динамическое распределение ОЗУ может приводить к просадкам производительности.

📊 Какой объём ОЗУ на вашем сервере 1С?
До 16 ГБ
16-32 ГБ
32-64 ГБ
Более 64 ГБ
⚠️ Внимание: Настройки shared_buffers выше 8 ГБ требуют 64-битной версии PostgreSQL и ОС. На 32-битных системах сервер просто проигнорирует значение.

2. Настройка автовакуума (autovacuum) для предотвращения раздувания базы

Одна из самых распространённых проблем в 1С — раздувание таблиц из-за частого обновления и удаления данных. PostgreSQL использует механизм MVCC (многоверсионность), который оставляет «мёртвые» строки в таблицах до их очистки. Если автовакуум работает неэффективно, база может вырасти в размере в 2-3 раза, а запросы — замедлиться на порядок.

Проверьте текущие настройки автовакуума в postgresql.conf:

  • 🔹 autovacuum = on — должен быть включён.
  • 🔹 autovacuum_vacuum_scale_factor — доля обновлённых строк, при которой запускается очистка (по умолчанию 0.2, т.е. 20%). Для 1С лучше уменьшить до 0.1 (10%).
  • 🔹 autovacuum_analyze_scale_factor — аналогично для сбора статистики. Установите 0.05 (5%).
  • 🔹 autovacuum_vacuum_cost_limit — ограничение нагрузки на систему. Увеличьте до 2000 (по умолчанию 200).

Также полезно настроить автовакуум для отдельных таблиц, которые часто обновляются (например, документы или регистры накопления). Для этого используйте команду:

ALTER TABLE имя_таблицы SET (

autovacuum_vacuum_scale_factor = 0.05,

autovacuum_analyze_scale_factor = 0.02

);

Чтобы проверить, какие таблицы требуют срочной очистки, выполните запрос:

SELECT schemaname, tablename, n_dead_tup, last_autovacuum

FROM pg_stat_all_tables

WHERE n_dead_tup > 0

ORDER BY n_dead_tup DESC;

💡

Если автовакуум не справляется с нагрузкой, запустите ручную очистку в период минимальной активности: VACUUM (VERBOSE, ANALYZE);. Для крупных баз это может занять несколько часов, но значительно улучшит производительность.

3. Оптимизация индексов: что, когда и как индексировать

Неправильные индексы — это как слишком много дверей в доме: вместо ускорения они только мешают. В 1С часто создаются избыточные индексы, особенно после обновлений конфигурации или миграций. Например, платформа может автоматически добавлять индексы на поля, которые почти не используются в запросах, но при этом замедляют вставку и обновление данных.

Основные правила работы с индексами для 1С:

  • 🔹 Удалите неиспользуемые индексы. Проверьте, какие индексы не применялись более месяца:
    SELECT schemaname, tablename, indexname, idx_scan
    

    FROM pg_stat_user_indexes

    WHERE idx_scan = 0 AND schemaname NOT LIKE 'pg_%';

  • 🔹 Создавайте составные индексы для часто используемых комбинаций полей (например, Дата + Организация + Склад в регистрах накопления).
  • 🔹 Используйте частичные индексы для таблиц с историческими данными. Например, если в таблице Документ.РеализацияТоваровУслуг только 10% записей актуальны (за последний год), создайте индекс с условием:
    CREATE INDEX idx_реализация_актуальные ON документ.реализациятоваровуслуг (дата)
    

    WHERE дата > CURRENT_DATE - INTERVAL '1 year';

  • 🔹 Избегайте индексов на полях с низкой селективностью (например, ПометкаУдаления или ЭтоГруппа).

Особое внимание уделите индексам на виртуальные таблицы 1С (например, _AccumRgTn для регистров накопления). Эти таблицы часто становятся узким местом из-за большого объёма данных. Для них полезно создать индексы по измерениям, которые используются в отчётах (например, Период + Организация + Номенклатура).

Тип индекса Когда использовать Пример для 1С
B-Tree Для равенства, диапазонов, сортировки Индекс по полю Дата в документах
Hash Только для проверки равенства (=) Индекс по полю Ссылка (UID)
GIN Для полей с массивами или JSON Индекс по полю Тэги (если хранится как массив)
BRIN Для очень больших таблиц с естественной сортировкой Индекс по полю Период в регистрах накопления
Как проверить эффективность индекса?

Выполните запрос с EXPLAIN ANALYZE и посмотрите, используется ли индекс. Если в плане выполнения видна строка Seq Scan (полное сканирование таблицы) вместо Index Scan, значит индекс не помогает. Пример:

EXPLAIN ANALYZE SELECT * FROM документ.заказпокупателя WHERE дата > '2023-01-01';

4. Управление соединениями и пулами подключений

1С известна тем, что создаёт множество коротких соединений с базой данных, что может приводить к перегрузке сервера. По умолчанию PostgreSQL ограничивает количество соединений параметром max_connections (обычно 100). Если это значение слишком низкое, пользователи будут получать ошибку "Sorry, too many clients already".

Оптимальные настройки для 1С:

  • 🔹 Установите max_connections = 200-300 (зависит от количества пользователей).
  • 🔹 Используйте пул соединений (например, PgBouncer), чтобы уменьшить нагрузку. Это особенно актуально для веб-клиентов и расширений типа 1С:EDT.
  • 🔹 Настройте тайм-ауты:
    idle_in_transaction_session_timeout = '10min'  # Закрывает висящие транзакции
    

    statement_timeout = '30s' # Ограничивает время выполнения запроса

Для настройки PgBouncer добавьте в pgbouncer.ini:

[databases]

* = host=127.0.0.1 port=5432

[pgbouncer]

pool_mode = transaction

max_client_conn = 500

default_pool_size = 50

⚠️ Внимание: Если используете 1С:Предприятие в файловом варианте (без сервера 1С), пул соединений не поможет — каждая сессия будет открывать своё соединение. В этом случае увеличьте max_connections до 500-1000.

5. Оптимизация запросов 1С: что можно сделать без изменения кода

Многие тормоза в 1С связаны не с самой СУБД, а с неэффективными запросами, которые генерирует платформа. К счастью, часть проблем можно решить без правки конфигурации:

  • 🔹 Отключите ненужные поля в динамических списках. Чем меньше данных запрашивается, тем быстрее работает отчёт. Например, в списке документов часто хватает только Ссылка, Дата и Номер.
  • 🔹 Используйте отборы по индексированным полям. Если в запросе есть условие ГДЕ Номенклатура = &Номенклатура, убедитесь, что на поле Номенклатура есть индекс.
  • 🔹 Разбивайте сложные отчёты на части. Вместо одного огромного запроса с 20 joins лучше сделать несколько простых и объединить результаты на стороне 1С.
  • 🔹 Настройте кэширование временных таблиц. В postgresql.conf увеличьте temp_buffers = 64MB (по умолчанию 8 МБ).

Чтобы найти самые медленные запросы, включите логгирование в postgresql.conf:

log_min_duration_statement = 1000  # Логировать запросы медленнее 1 секунды

log_line_prefix = '%t [%p]: ' # Добавлять время и PID процесса

После этого проанализируйте лог (/var/log/postgresql/postgresql-14-main.log) на предмет повторяющихся медленных запросов. Часто оказывается, что 80% нагрузки создают всего 2-3 типа запросов (например, построение отчёта «Ведомость по товарам» с группировкой по 10 полям).

Убрать лишние поля из выборки|Добавить индексы на поля в условии WHERE|Разбить сложный запрос на несколько простых|Проверить лог на медленные запросы|Увеличить temp_buffers до 64 МБ-->

6. Аппаратные рекомендации: железо под 1С + PostgreSQL

Даже идеально настроенный PostgreSQL не спасёт ситуацию, если сервер «слаб» для текущей нагрузки. Для 1С с базой данных на PostgreSQL критичны следующие характеристики:

  • 🔹 ОЗУ: Миimum 16 ГБ для базы до 50 ГБ, 32 ГБ+ для баз 100 ГБ и более. Правило простое: shared_buffers + work_mem × max_connections не должны превышать 70% от общей ОЗУ.
  • 🔹 Диски: SSD NVMe (PCIe 3.0/4.0) дают прирост производительности в 5-10 раз по сравнению с SATA SSD, особенно для операций записи (например, при проведении документов). Для крупных баз (100 ГБ+) рассмотрите RAID 10 из NVMe.
  • 🔹 CPU: Лучше выбрать процессор с большим количеством ядер (например, Intel Xeon Gold или AMD EPYC), чем с высокой тактовой частотой. 1С хорошо распараллеливает нагрузку по ядрам.
  • 🔹 Сеть: Для кластерных конфигураций (например, 1С:Сервер + PostgreSQL на разных машинах) используйте 10 Гбит/с подключение.

Если бюджет ограничен, в первую очередь вкладывайтесь в диски и ОЗУ — они дают максимальный прирост производительности. Например, переход с HDD на NVMe может сократить время выполнения отчётов с 5 минут до 20 секунд.

Характеристика Минимум Рекомендуемо Для крупных баз (100 ГБ+)
ОЗУ 8 ГБ 32 ГБ 64-128 ГБ
Диски SATA SSD NVMe PCIe 3.0 RAID 10 из NVMe PCIe 4.0
CPU 4 ядра / 8 потоков 8 ядер / 16 потоков 16+ ядер / 32+ потока
Сеть 1 Гбит/с 10 Гбит/с 10 Гбит/с + Jumbo Frames
⚠️ Внимание: Если используете виртуальный сервер (например, в облаке), убедитесь, что виртуальные диски имеют низкую задержку (<1 мс). В противном случае даже SSD не даст ожидаемого прироста.

7. Мониторинг и регулярное обслуживание

Оптимизация — это не разовое мероприятие, а постоянный процесс. Без мониторинга вы не узнаете, когда база снова начнёт тормозить. Минимальный набор инструментов для наблюдения за PostgreSQL:

  • 🔹 pgBadger — анализирует логи и строит отчёты по медленным запросам.
  • 🔹 pg_stat_statements — расширение для сбора статистики по запросам. Установите его и включите в postgresql.conf:
    shared_preload_libraries = 'pg_stat_statements'
    

    pg_stat_statements.track = all

  • 🔹 Grafana + Prometheus — для визуализации метрик (нагрузка на CPU, ОЗУ, диски, количество соединений).
  • 🔹 check_postgres — скрипт для nagios/zabbix, который проверяет здоровье базы.

Регулярно (раз в неделю) выполняйте:

# Проверка раздутых таблиц

SELECT nspname || '.' || relname AS table,

pg_size_pretty(pg_total_relation_size(relid)) AS size,

n_dead_tup AS dead_rows

FROM pg_stat_user_tables

ORDER BY n_dead_tup DESC

LIMIT 10;

Проверка блокировок

SELECT blocked_locks.pid AS blocked_pid,

blocking_locks.pid AS blocking_pid,

blocked_activity.usename AS blocked_user,

blocking_activity.usename AS blocking_user,

blocked_activity.query AS blocked_statement

FROM pg_catalog.pg_locks blocked_locks

JOIN pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid

JOIN pg_catalog.pg_locks blocking_locks

ON blocking_locks.locktype = blocked_locks.locktype

AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE

AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation

AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page

AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple

AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid

AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid

AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid

AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid

AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid

AND blocking_locks.pid != blocked_locks.pid

JOIN pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid

WHERE NOT blocked_locks.GRANTED;

💡

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

FAQ: Частые вопросы по оптимизации PostgreSQL для 1С

Как понять, что тормозит именно база, а не 1С?

Откройте Диспетчер задач (Windows) или htop (Linux) и проверьте:

  • 🔹 Нагрузка на CPU: если postgres процесс потребляет 80-100% — проблема в запросах.
  • 🔹 Дисковая активность: если wait I/O высокий — тормозит хранилище.
  • 🔹 ОЗУ: если swapping (подкачка) активна — не хватает памяти.

Также проверьте логи 1С (1Cv8.log) на ошибки типа "Timeout expired" — они указывают на проблемы с соединением.

Можно ли использовать PostgreSQL 16 с 1С 8.3?

Да, но с оговорками:

  • 🔹 1С:Предприятие 8.3.20+ официально поддерживает PostgreSQL 16.
  • 🔹 Для более старых версий 1С (8.3.18 и ниже) может потребоваться ручная доработка конфигурации.
  • 🔹 Перед обновлением сделайте резервную копию и протестируйте на тестовом стенде.

Преимущества PostgreSQL 16 для 1С: улучшенная работа с большими объёмами данных и более эффективный автовакуум.

Как часто нужно делать VACUUM FULL?

VACUUM FULL — это «тяжёлая артиллерия», которая полностью перестраивает таблицу. Используйте её только в крайних случаях:

  • 🔹 После массового удаления данных (например, очистки истории).
  • 🔹 Если pg_repack не справился с раздутыми таблицами.
  • 🔹 Не чаще 1 раза в 3-6 месяцев для крупных баз.

Для регулярной очистки лучше использовать VACUUM (VERBOSE, ANALYZE) или pg_repack.

Помогает ли дефрагментация диска для SSD?

Нет, для SSD дефрагментация не только бесполезна, но и вредна — она сокращает ресурс накопителя. Вместо этого:

  • 🔹 Используйте TRIM (для Linux: fstrim -av).
  • 🔹 Настройте random_page_cost = 1.1 в postgresql.conf (по умолчанию 4.0 для HDD).
  • 🔹 Убедитесь, что файловая система оптимизирована для SSD (например, ext4 или XFS с параметром discard).
Что делать, если после оптимизации база стала работать медленнее?

Вернитесь к предыдущим настройкам и проверьте:

  • 🔹 Не перегружен ли сервер другими задачами (например, резервным копированием).
  • 🔹 Не конфликтуют ли новые индексы с существующими (используйте EXPLAIN ANALYZE).
  • 🔹 Не изменилась ли структура данных в 1С (например, после обновления конфигурации).
  • 🔹 Не включён ли synchronous_commit = off (это ускоряет запись, но может привести к потере данных при сбое).

Часто проблема кроется в неверной интерпретации советов. Например, слишком большое значение shared_buffers может привести к свапу (подкачке), что резко замедлит работу.