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

Мы рассмотрим критические параметры PostgreSQL, которые 90% администраторов оставляют по умолчанию, хотя их корректировка даёт прирост скорости в 2–5 раз. Также разберём типичные ошибки в конфигурации 1С, которые тормозят работу с базой, и аппаратные решения для крупных баз (100+ ГБ). Все рекомендации проверены на реальных внедрениях с базами от 50 ГБ до 1 ТБ.

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

Файл postgresql.conf — сердце производительности СУБД. По умолчанию он настроен на универсальную работу, но для 1С требуются специфические корректировки. Основные параметры, которые нужно изменить:

  • 🔧 shared_buffers — кэш данных в памяти. Рекомендуемое значение: 25% от оперативной памяти сервера (но не более 8 ГБ для 32-битных систем). Пример для сервера с 32 ГБ ОЗУ: shared_buffers = 8GB.
  • effective_cache_size — оценка общего объёма кэша (ОЗУ + файловая система). Установите 50–75% от ОЗУ, например: effective_cache_size = 16GB.
  • 📊 work_mem — память для сортировок и временных таблиц. Для 1С оптимально 16–64 МБ (зависит от сложности отчётов). Пример: work_mem = 32MB.
  • 🔄 maintenance_work_mem — память для операций обслуживания (VACUUM, CREATE INDEX). Минимальное значение: 512MB, для больших баз — 1–2GB.

После изменений обязательно перезапустите службу PostgreSQL:

sudo systemctl restart postgresql
⚠️ Внимание: Не устанавливайте shared_buffers более 8 ГБ на 32-битных системах — это приведёт к сбоям. Для 64-битных ограничение снимается, но значения выше 16 ГБ требуют тестирования на вашей нагрузке.

Увеличить shared_buffers до 25% ОЗУ|

Настроить effective_cache_size на 50–75% ОЗУ|

Установить work_mem в 16–64 МБ|

Проверить maintenance_work_mem (минимум 512 МБ)|

Перезапустить службу PostgreSQL-->

2. Настройка автоочистки (autovacuum) для 1С

PostgreSQL использует механизм MVCC (Multi-Version Concurrency Control), который со временем заполняет таблицы "мусором" — устаревшими версиями строк. Если не настроить автоочистку (autovacuum), база будет разрастаться, а запросы — замедляться.

Для 1С критично настроить следующие параметры в postgresql.conf:

ПараметрРекомендуемое значениеПояснение
autovacuumonВключает автоматическую очистку
autovacuum_vacuum_scale_factor0.05Запуск при 5% "мусора" (по умолчанию 0.2)
autovacuum_analyze_scale_factor0.02Обновление статистики при 2% изменений
autovacuum_vacuum_cost_limit2000Повышает интенсивность очистки (по умолчанию 200)

Для крупных баз (100+ ГБ) дополнительно настройте autovacuum_vacuum_cost_delay — уменьшение этого параметра ускорит очистку, но увеличит нагрузку на диск. Оптимальное значение: 10–20 мс (по умолчанию 20).

⚠️ Внимание: После изменений параметров autovacuum следите за нагрузкой на диск в пиковые часы. Если I/O нагрузка превышает 80%, верните autovacuum_vacuum_cost_limit к значению 500–1000.

Никогда|Раз в месяц|Раз в квартал|Только при критичных замедлениях|Не знаю, что это-->

3. Оптимизация индексов для типичных запросов 1С

1С генерирует большое количество запросов с фильтрацией по полям Ссылка, Дата, ПометкаУдаления. Если индексы на этих полях отсутствуют, PostgreSQL вынужден сканировать всю таблицу (Seq Scan), что тормозит работу.

Проверьте наличие индексов для ключевых таблиц:

-- Пример создания индекса для таблицы документов

CREATE INDEX idx_doc_date ON _Document123 (Date DESC);

CREATE INDEX idx_doc_ref ON _Document123 (Ref);

CREATE INDEX idx_doc_deletionmark ON _Document123 (DeletionMark);

Для анализа текущих индексов используйте запрос:

SELECT schemaname, tablename, indexname, idx_scan

FROM pg_stat_user_indexes

ORDER BY idx_scan DESC;

  • 📅 Индексы по датам (Date) должны быть кластеризованными (используйте CLUSTER после создания индекса).
  • 🔗 Для полей Ссылка (Ref) используйте индексы типа HASH — они быстрее для точных совпадений.
  • 🗑️ Индексы на ПометкаУдаления (DeletionMark) ускоряют запросы с фильтром "Не помечен на удаление".
💡

Перед созданием новых индексов проверьте их влияние с помощью EXPLAIN ANALYZE. Некоторые индексы могут замедлить вставку данных, если обновляются слишком часто.

4. Аппаратные решения: SSD, ОЗУ и CPU

Если программные методы не дают достаточного прироста скорости, рассмотрите апгрейд железа. Для 1С на PostgreSQL критичны:

  • 💾 Дисковая подсистема: Замените HDD на NVMe SSD (например, Samsung 980 Pro или Intel Optane). Для баз >100 ГБ используйте RAID 10 из 4 SSD.
  • 🖥️ Оперативная память: Минимальный объём — 16 ГБ для баз до 50 ГБ, 32–64 ГБ для баз 100–500 ГБ. Правило: ОЗУ должно вмещать shared_buffers + кэш ОС + рабочие нагрузки 1С.
  • ⚙️ Процессор: Для 1С важнее количество ядер, чем частота. Оптимально: Intel Xeon E5-26xx или AMD EPYC с 8+ ядрами. Избегайте процессоров с низким IPC (например, Intel Atom).

Пример конфигурации для базы 200 ГБ с 50 пользователями:

КомпонентРекомендацияПример модели
CPU16 ядер / 32 потокаAMD EPYC 7313
ОЗУ64 ГБ DDR4 ECCSamsung M393A8G40AB2
ХранилищеRAID 10 из 4 NVMe SSD2x Samsung 980 Pro 1TB
Сетевая карта10 Гбит/сIntel X550-T2
⚠️ Внимание: При использовании виртуальных машин (VMware, Hyper-V) убедитесь, что виртуальные диски настроены как Thick Provision Eager Zeroed — это исключает накладные расходы на динамическое выделение места.
Почему RAID 10 лучше RAID 5 для 1С?

RAID 5 использует чётность, что создаёт высокую нагрузку на CPU при записи. Для баз 1С с частыми транзакциями это приводит к "просадкам" производительности. RAID 10 зеркалирует данные и распределяет нагрузку, обеспечивая стабильную скорость чтения/записи даже при пиковых нагрузках.

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

Даже без изменения конфигурации 1С можно ускорить работу, если:

  1. 📋 Ограничить периоды в отчётах. Вместо "за всё время" используйте диапазоны в 1–3 месяца. Пример: в отчёте "Обороты по счёту" укажите дату начала 01.01.2026 вместо 01.01.2000.
  2. 🔄 Отключить ненужные поля в динамических списках. Каждое поле — это дополнительный JOIN или подзапрос.
  3. 🗃️ Архивировать старые данные. Перенесите документы старше 3 лет в отдельную базу с помощью обработки "ВыгрузкаЗначенийВФайл".
  4. 🛑 Запретить полные перепроведения. В настройках учётной политики отключите опцию "Перепроводить документы при изменении".

Для анализа медленных запросов используйте лог PostgreSQL. Включите логирование в postgresql.conf:

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

log_line_prefix = '%t [%p]: ' # Формат лога: время + PID процесса

После сбора логов проанализируйте их с помощью утилиты pgBadger:

pgbadger /var/log/postgresql/postgresql-*.log -o report.html
💡

80% проблем с производительностью 1С связаны с неоптимальными запросами, а не с "железом". Логирование и анализ запросов — первый шаг к ускорению.

6. Использование пула соединений (PgBouncer)

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

Установка и настройка:

# Установка (Ubuntu/Debian)

sudo apt install pgbouncer

Редактируем конфиг /etc/pgbouncer/pgbouncer.ini

[databases]

db1c = host=127.0.0.1 port=5432 dbname=base1c

[pgbouncer]

pool_mode = transaction

max_client_conn = 1000

default_pool_size = 50

Ключевые параметры:

  • 🔄 pool_mode = transaction — соединения возвращаются в пул после каждой транзакции (оптимально для 1С).
  • 📊 default_pool_size — количество соединений в пуле. Рассчитывайте как количество пользователей × 2.
  • 🚫 ignore_startup_parameters = extra_float_digits — отключает ненужные параметры, которые 1С передаёт при подключении.

После настройки измените строку подключения в 1С на:

СтрокаПодключения = "Srvr=localhost;Ref=base1c;Port=6432;Usr=user;Pwd=pass";

(Порт 6432 — стандартный для PgBouncer.)

7. Регулярное обслуживание базы: VACUUM и REINDEX

Со временем база 1С "зарастает" фрагментированными данными, что замедляет запросы. Регулярное обслуживание включает:

  1. 🧹 VACUUM FULL — физически перезаписывает таблицы, удаляя "мусор". Выполняйте раз в 1–3 месяца в нерабочее время:
    VACUUM (VERBOSE, FULL, ANALYZE) _Document123;
  2. 🔄 REINDEX — перестроение индексов. Помогает, если индексы фрагментированы:
    REINDEX TABLE _Document123;
  3. 📊 ANALYZE — обновление статистики для планировщика запросов:
    ANALYZE VERBOSE _Document123;

Для автоматического обслуживания используйте cron:

0 3   0 /usr/bin/vacuumdb --dbname=base1c --analyze --username=postgres
⚠️ Внимание: VACUUM FULL блокирует таблицы на запись. Для баз >100 ГБ используйте утилиту pg_repack — она работает без блокировок.

8. Альтернативные решения: TimescaleDB и Partitioning

Если база 1С превышает 500 ГБ и содержит много исторических данных, рассмотрите:

  • 📅 Partitioning по датам: Разделение крупных таблиц (например, _Document123) на месячные или квартальные части. Пример:
    CREATE TABLE _Document123 (
    

    id SERIAL,

    date DATE NOT NULL,

    data JSONB

    ) PARTITION BY RANGE (date);

  • TimescaleDB: Расширение для PostgreSQL, оптимизированное для временных рядов. Подходит для баз с большим количеством документов за длительный период.

Для реализации partitioning потребуется:

  1. Создать функцию-триггер в 1С, которая будет распределять данные по партициям.
  2. Настроить pg_partman для автоматического создания новых партиций.
  3. Обновить запросы 1С, чтобы они использовали PARTITION FOR (RANGE).

Пример создания партиции для 2026 года:

CREATE TABLE _Document123_y2026 PARTITION OF _Document123

FOR VALUES FROM ('2026-01-01') TO ('2026-01-01');

💡

Partitioning ускоряет запросы с фильтрацией по дате в 5–10 раз, но требует изменения конфигурации 1С. Подходит только для опытных администраторов.

FAQ: Частые вопросы по ускорению 1С на PostgreSQL

❓ Почему после обновления 1С база на PostgreSQL стала работать медленнее?

Частая причина — новые индексы или триггеры, которые добавляются при обновлении конфигурации. Проверьте:

  1. Логи PostgreSQL на наличие медленных запросов (log_min_duration_statement).
  2. Список новых индексов: SELECT * FROM pg_indexes WHERE tablename LIKE '_%' ORDER BY indexdef DESC;
  3. Нагрузку на CPU/Disk во время пиковых замедлений (используйте htop или iotop).

Если проблема появилась после обновления платформы 1С, откат до предыдущей версии может помочь. Также проверьте, не включился ли режим совместимости с MS SQL (параметр SQLCompatibilityMode в conf.cfg).

❓ Как проверить, что PostgreSQL использует индексы?

Используйте EXPLAIN ANALYZE перед запросом. Пример:

EXPLAIN ANALYZE SELECT * FROM _Document123 WHERE Date > '2026-01-01';

В результатах ищите:

  • Index Scan — запрос использует индекс (хорошо).
  • Seq Scan — полное сканирование таблицы (плохо).
  • Bitmap Heap Scan — комбинация индексов (нормально для сложных запросов).

Если видите Seq Scan, добавьте индекс на поле, по которому идёт фильтрация.

❓ Можно ли ускорить 1С, перенеся PostgreSQL на другой сервер?

Да, если:

  • Текущий сервер перегружен другими задачами (например, одновременно работает 1С, веб-сервер и файловое хранилище).
  • Сетевое соединение между сервером 1С и PostgreSQL медленнее 1 Гбит/с.
  • Дисковая подсистема текущего сервера — HDD или низкопроизводительный SSD.

Оптимальная схема:

  • Сервер 1С и сервер PostgreSQL соединены напрямую кабелем 10 Гбит/с.
  • PostgreSQL работает на выделенном сервере с NVMe SSD и 32+ ГБ ОЗУ.
  • Сетевая задержка (ping) между серверами не превышает 1 мс.

Для переноса используйте pg_dump + pg_restore с опцией --jobs=4 (параллельное восстановление).

❓ Какие настройки 1С влияют на скорость работы с PostgreSQL?

Критичные параметры в файле conf.cfg (или в настройках информационной базы):

ПараметрРекомендуемое значениеВлияние
DataBaseCacheSize512 (МБ)Кэш данных 1С. Увеличивает до 1–2 ГБ для крупных баз.
DataBasePagesCacheSize10000Кэш страниц СУБД. Оптимально: количество пользователей × 2000.
DisableDataCompression0 (отключено)Сжатие данных может замедлять работу. Отключите, если CPU загружен на 100%.
SQLCompatibilityMode0Режим совместимости с MS SQL. Должен быть отключён для PostgreSQL.

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

❓ Почему после оптимизации PostgreSQL 1С всё равно тормозит?

Возможные причины:

  1. 🔌 Сетевые проблемы: Проверьте задержку между клиентом 1С и сервером (ping). При задержке >50 мс работа будет медленной.
  2. 🖥️ Нехватка ресурсов на клиентских машинах: 1С требует минимум 4 ГБ ОЗУ и SSD на рабочей станции.
  3. 📜 Сложные отчёты: Некоторые отчёты (например, "Анализ субконто") генерируют запросы с 10+ JOIN. Оптимизируйте их через конструктор запросов.
  4. 🔄 Блокировки: Проверьте блокировки в PostgreSQL:
    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

    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;