Работа с 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:
| Параметр | Рекомендуемое значение | Пояснение |
|---|---|---|
autovacuum | on | Включает автоматическую очистку |
autovacuum_vacuum_scale_factor | 0.05 | Запуск при 5% "мусора" (по умолчанию 0.2) |
autovacuum_analyze_scale_factor | 0.02 | Обновление статистики при 2% изменений |
autovacuum_vacuum_cost_limit | 2000 | Повышает интенсивность очистки (по умолчанию 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 пользователями:
| Компонент | Рекомендация | Пример модели |
|---|---|---|
| CPU | 16 ядер / 32 потока | AMD EPYC 7313 |
| ОЗУ | 64 ГБ DDR4 ECC | Samsung M393A8G40AB2 |
| Хранилище | RAID 10 из 4 NVMe SSD | 2x 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–3 месяца. Пример: в отчёте "Обороты по счёту" укажите дату начала
01.01.2026вместо01.01.2000. - 🔄 Отключить ненужные поля в динамических списках. Каждое поле — это дополнительный JOIN или подзапрос.
- 🗃️ Архивировать старые данные. Перенесите документы старше 3 лет в отдельную базу с помощью обработки "ВыгрузкаЗначенийВФайл".
- 🛑 Запретить полные перепроведения. В настройках учётной политики отключите опцию "Перепроводить документы при изменении".
Для анализа медленных запросов используйте лог 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С "зарастает" фрагментированными данными, что замедляет запросы. Регулярное обслуживание включает:
- 🧹 VACUUM FULL — физически перезаписывает таблицы, удаляя "мусор". Выполняйте раз в 1–3 месяца в нерабочее время:
VACUUM (VERBOSE, FULL, ANALYZE) _Document123; - 🔄 REINDEX — перестроение индексов. Помогает, если индексы фрагментированы:
REINDEX TABLE _Document123; - 📊 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С, которая будет распределять данные по партициям.
- Настроить
pg_partmanдля автоматического создания новых партиций. - Обновить запросы 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 стала работать медленнее?
Частая причина — новые индексы или триггеры, которые добавляются при обновлении конфигурации. Проверьте:
- Логи PostgreSQL на наличие медленных запросов (
log_min_duration_statement). - Список новых индексов:
SELECT * FROM pg_indexes WHERE tablename LIKE '_%' ORDER BY indexdef DESC; - Нагрузку на 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 (или в настройках информационной базы):
| Параметр | Рекомендуемое значение | Влияние |
|---|---|---|
DataBaseCacheSize | 512 (МБ) | Кэш данных 1С. Увеличивает до 1–2 ГБ для крупных баз. |
DataBasePagesCacheSize | 10000 | Кэш страниц СУБД. Оптимально: количество пользователей × 2000. |
DisableDataCompression | 0 (отключено) | Сжатие данных может замедлять работу. Отключите, если CPU загружен на 100%. |
SQLCompatibilityMode | 0 | Режим совместимости с MS SQL. Должен быть отключён для PostgreSQL. |
Также проверьте настройки фоновых заданий — если они запускаются в пиковые часы (например, обмен с сайтом или расчёт зарплаты), это может тормозить работу пользователей.
❓ Почему после оптимизации PostgreSQL 1С всё равно тормозит?
Возможные причины:
- 🔌 Сетевые проблемы: Проверьте задержку между клиентом 1С и сервером (
ping). При задержке >50 мс работа будет медленной. - 🖥️ Нехватка ресурсов на клиентских машинах: 1С требует минимум 4 ГБ ОЗУ и SSD на рабочей станции.
- 📜 Сложные отчёты: Некоторые отчёты (например, "Анализ субконто") генерируют запросы с 10+ JOIN. Оптимизируйте их через конструктор запросов.
- 🔄 Блокировки: Проверьте блокировки в 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;