Почему 1С работает только на пропатченном PostgreSQL
Содержание
Патч PostgreSQL для 1С нужен потому, что оригинальный PostgreSQL не рассчитан на то, как платформа 1С работает с базой. Платформа создаёт огромное число временных таблиц, шлёт сложные запросы с десятками соединений и ждёт определённых планов выполнения. Обычная сборка с сайта postgresql.org на таких нагрузках тормозит, а местами ведёт себя непредсказуемо. Доработанные сборки (их выпускают для 1С отдельно) убирают эти узкие места.
Типичная ситуация: сисадмин поставил свежий PostgreSQL из репозитория дистрибутива, база запустилась, пользователи зашли. Через две недели проведение документов растянулось с секунд до минут, а в списке процессов висят запросы, которые «вчера» отрабатывали мгновенно. Причина часто не в железе, а в том, что СУБД вообще не та, под которую платформа писалась.
Ниже по порядку: что именно меняют патчи, как совместить сборку с платформой, как обновить сервер и где обычно ошибаются.
Что меняется в работе сервера после патча
Платформа 1С при проведении документа создаёт временные таблицы десятками и сотнями. В обычном PostgreSQL каждая такая таблица оставляет следы в системных каталогах (pg_class, pg_attribute). Каталоги пухнут, автовакуум не успевает, и запросы к системным таблицам становятся заметно медленнее.
Доработанные сборки уменьшают эту нагрузку. Заодно они корректируют работу планировщика: он реже выбирает вложенные циклы там, где нужен хеш-join, и точнее оценивает число строк для условий, которые формирует платформа.
Что это даёт на практике:
- ⚡ быстрее проведение и закрытие месяца в больших базах;
- 📉 меньше «прыжков» времени запроса: сегодня 3 секунды, завтра 40;
- 🧹 каталоги не раздуваются, автовакуум справляется;
- 🔒 меньше долгих блокировок на системных таблицах.
Выигрыш заметнее всего на базах от 20–30 ГБ и при десятках одновременных пользователей. На маленькой базе в 1–2 ГБ разницу можно и не увидеть.
Какие ошибки закрывают доработанные сборки
Патчи не только ускоряют, они ещё и исправляют поведение, на котором платформа спотыкается. Эти проблемы пользователи видят как «странные» сбои, хотя код конфигурации ни при чём.
| Симптом | Что происходит |
|---|---|
| Запрос внезапно стал в разы медленнее без изменений в данных | планировщик выбрал неудачный план из-за неверной оценки числа строк |
| Падение или зависание при массовой работе с временными таблицами | перегруженные системные каталоги |
| Ошибка сортировки или различия в порядке записей | различия в правилах сравнения строк |
| Рост базы без видимой причины | вакуум не очищает раздутые служебные структуры |
Точный перечень изменений зависит от выпуска сборки. Его публикует разработчик сборки вместе с каждой версией, и читать его нужно перед обновлением, а не после.
Не рассчитывайте, что патч «вылечит» плохо написанный запрос или неправильные настройки памяти. Он убирает проблемы СУБД, а не конфигурации.
Как понять, что вам не хватает патча
Прямого индикатора нет, но набор признаков говорит сам за себя. Если совпадают два-три пункта, сборку стоит проверить в первую очередь.
- 🐢 Медленное проведение документов при слабой загрузке процессора и диска.
- 📈 Системные таблицы
pg_classиpg_attributeзанимают гигабайты при небольшой самой базе. - 🔁 Автовакуум почти всегда занят системными таблицами.
- 🎲 Одинаковый запрос то летает, то «думает» минуту, а данные не менялись.
Для проверки сравните размеры системных каталогов командой SELECT pg_size_pretty(pg_total_relation_size('pg_attribute'));. Если цифра в разы больше ожидаемой, значит временные таблицы оставляют мусор, и пора выяснить, какая сборка стоит на сервере.
Безопасность: чем опасны старые версии PostgreSQL
PostgreSQL регулярно получает исправления уязвимостей. Каждая младшая версия (например, 16.х) закрывает найденные дыры: от повышения привилегий до чтения чужих данных. Сервер, который не обновляли два-три года, содержит десятки известных уязвимостей, и описания их публичны.
Для 1С риск конкретный: в базе лежит бухгалтерия, зарплата, персональные данные сотрудников. Если порт СУБД открыт из внешней сети, а версия старая, найти такой сервер сканером несложно.
Минимум, который стоит сделать:
- Держать порт
5432закрытым для интернета, пускать только с адреса сервера 1С. - Обновлять младшие версии не реже раза в полгода.
- Не использовать для 1С учётную запись
postgresс простым паролем. - Проверить
pg_hba.conf: никаких записей с методомtrustдля сетевых подключений.
Обновление младшей версии (16.2 → 16.4) в рамках одной ветки обычно проходит без переноса данных. Меняются только исполняемые файлы.
Как совместить версию PostgreSQL и платформу
Не любая версия PostgreSQL подходит к любой платформе. Платформа 1С официально поддерживает определённые ветки СУБД, и список меняется от релиза к релизу. Работать «неподдерживаемая» связка может, но при проблемах вы окажетесь без поддержки.
Порядок проверки:
- Узнайте точный номер платформы (например,
8.3.xx.xxxx) на сервере 1С. - Откройте описание этого релиза и найдите раздел о поддерживаемых СУБД.
- Сверьте мажорную ветку PostgreSQL (14, 15, 16 и так далее) с этим списком.
- Убедитесь, что сборка именно доработанная, а не обычная.
Сборка и платформа связаны не жёстко: одну сборку PostgreSQL обычно можно использовать с несколькими релизами платформы. Но при смене мажорной ветки СУБД всегда сначала проверяйте совместимость, а потом уже планируйте окно обслуживания.
| Что меняете | Что проверять | Риск |
|---|---|---|
| Младшая версия СУБД | заметки к сборке | низкий |
| Мажорная ветка СУБД | совместимость с платформой, перенос данных | средний |
| Платформу 1С | список поддерживаемых СУБД | средний |
| Платформу и СУБД вместе | всё сразу | высокий, делайте по очереди |
Как установить патч: пошаговая инструкция
Ниже сценарий для обновления младшей версии на сервере с Windows. На Linux логика та же, отличается способ установки: пакеты из репозитория сборки.
Подготовка
- 💾 Сделайте резервные копии всех баз и самого кластера.
- 📝 Запишите текущую версию:
SELECT version();вpsql. - 📁 Скопируйте
postgresql.confиpg_hba.confв отдельную папку. - 🕐 Выберите время, когда в базах никто не работает .
Перед любыми изменениями на сервере СУБД проверьте, что резервная копия восстанавливается. Копия, которую ни разу не разворачивали, копией считать нельзя.
Установка
- Остановите рабочие процессы и службу сервера 1С, чтобы не осталось активных соединений.
- Остановите службу PostgreSQL.
- Запустите установщик новой сборки. Каталог данных укажите тот же, что и у старой.
- Если установщик предлагает инициализировать кластер заново, откажитесь. Иначе есть риск затереть данные.
- Запустите службу PostgreSQL и проверьте журнал на ошибки запуска.
- Выполните
SELECT version();и убедитесь, что версия сменилась. - Запустите сервер 1С и откройте несколько баз.
Затем проверьте, что настройки на месте: сравните свои копии postgresql.conf и pg_hba.conf с рабочими. Установщик иногда подставляет значения по умолчанию.
Если нужна конкретная версия сборки
Иногда нужна не последняя сборка, а определённая: например, чтобы совпала с тестовым стендом или потому, что новая ещё не проверена на вашей нагрузке. Тогда:
- скачайте именно нужный дистрибутив, а не «последний»;
- на Linux закрепите версию пакета, чтобы автоматическое обновление не перешло на следующую;
- в Windows храните установщик рядом с документацией по серверу: старые версии потом найти сложнее.
# Debian/Ubuntu: запретить автоматическое обновление пакета
sudo apt-mark hold имя-пакета-postgresql
# Снять запрет, когда будете готовы обновляться
sudo apt-mark unhold имя-пакета-postgresql
Имя пакета зависит от сборки, посмотрите его командой dpkg -l | grep postgres.
Установка на Linux: что отличается
На Linux доработанную сборку обычно ставят из подключённого репозитория разработчика, а не из репозитория дистрибутива. Это важно: одноимённые пакеты в системном репозитории могут оказаться обычными, и менеджер пакетов с радостью «обновит» вашу сборку на стандартную.
Что сделать до первого обновления:
- Подключите репозиторий сборки и проверьте приоритет источников.
- Выясните, откуда установлен пакет:
apt policy имя-пакета(Debian, Ubuntu) илиdnf info имя-пакета(семейство RHEL). - Закрепите версию, как показано выше, если обновление должно идти вручную.
- Проверьте права на каталог данных: владелец должен остаться
postgres.
После установки откройте журнал службы командой journalctl -u postgresql -n 100 и убедитесь, что кластер запустился без предупреждений.
Настройки после обновления: что проверить
Обновление сборки не заменяет настройку. Для 1С типовые параметры задают исходя из объёма памяти сервера и числа пользователей. Ориентиры для выделенного сервера СУБД с 32 ГБ памяти (подбирайте под свою нагрузку):
| Параметр | Ориентир | Зачем |
|---|---|---|
shared_buffers | около 25% памяти, то есть 8 ГБ | кэш страниц данных |
work_mem | 16-64 МБ | сортировки и хеш-соединения |
maintenance_work_mem | 1-2 ГБ | вакуум и построение индексов |
effective_cache_size | 50-75% памяти | подсказка планировщику |
max_connections | с запасом под число сеансов | каждое соединение занимает память |
Проверка простая: SHOW имя_параметра; для каждого. Если после установки значения оказались стандартными (например, shared_buffers в 128 МБ), вернитесь к сохранённой копии postgresql.conf и перенесите свои строки.
Не копируйте чужой конфиг целиком. Параметры подбирают под память и диски конкретного сервера, а перенос «как у соседа» нередко ухудшает ситуацию.
Что стоит проверить через неделю после обновления:
- 📊 время типичных операций: проведение документов, формирование тяжёлого отчёта;
- 🧾 размер базы и динамику его роста;
- 🐌 долгие запросы в журнале (параметр
log_min_duration_statementпокажет всё, что дольше заданного порога, скажем 5 секунд); - 🧹 работу автовакуума: он не должен постоянно «догонять».
Если картина стала лучше, зафиксируйте версию сборки и дату в документации по серверу. Через год вы не вспомните, что и когда ставили.
Можно ли автоматизировать обновление
Можно, но с оговорками. Полностью автоматическое обновление СУБД на боевом сервере 1С — плохая идея: служба перезапустится в рабочее время, а пользователи потеряют сеанс.
Разумная схема:
- 🔔 автоматически только уведомление о выходе новой версии;
- 🧪 обновление сначала на тестовой копии сервера;
- 🛠️ боевой сервер — по расписанию в нерабочее окно, с предварительным бэкапом в том же скрипте;
- 📄 лог выполнения скрипта сохраняется и проверяется.
Простой пример скрипта-каркаса для Linux, который делает копию и только потом обновляет пакеты:
#!/bin/bash
set -e
BACKUP=/backup/pg_$(date +%F).sql.gz
sudo -u postgres pg_dumpall | gzip > "$BACKUP"
systemctl stop postgresql
apt-get install --only-upgrade имя-пакета-postgresql
systemctl start postgresql
sudo -u postgres psql -c "SELECT version();"
Для баз в сотни гигабайт pg_dumpall будет идти часами. Там используйте физическое резервирование (pg_basebackup) или снимки диска.
Проверьте, что скрипт не ломает рабочие соединения: службу сервера 1С в сценарии лучше останавливать явно.
Типичные ошибки при обновлении
Большинство проблем после обновления повторяется из раза в раз.
- ❌ Поставили обычный PostgreSQL поверх доработанного. Версия вроде совпала, а поведение изменилось. Проверяйте источник сборки.
- ❌ Перепутали мажорную и младшую версию. Между мажорными ветками каталог данных несовместим, нужен перенос.
- ❌ Не вернули настройки. После установки
shared_buffersиwork_memстали стандартными, а база тормозит. - ❌ Не пересобрали статистику. После переноса данных выполните
ANALYZE, иначе планировщик работает вслепую. - ❌ Обновили в рабочее время без остановки службы 1С.
Если после обновления всё равно медленно:
- Выполните
ANALYZEпо базам. - Проверьте, применились ли ваши параметры в
postgresql.conf(SHOW shared_buffers;). - Посмотрите журнал PostgreSQL на ошибки и предупреждения.
- При необходимости откатитесь на прежнюю сборку: каталог данных и копия конфигурации у вас есть.
Откат младшей версии обычно проходит просто. Откат мажорной версии без резервной копии невозможен.
Частые вопросы
Можно ли 1С работать на обычном PostgreSQL без патча?
Нужно ли ставить патч, если база маленькая?
Как узнать, какая у меня сборка?
SELECT version(); в psql или через pgAdmin и посмотрите строку версии и сведения о сборке. Источник установки лучше дополнительно проверить в списке установленных программ.