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

Системный администратор 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Давайте вместе рассмотрим ситуацию, когда после серьезного сбоя базы данных PostgreSQL и последующего восстановления, пользовательские варианты отчетов, созданные через расширения в 1С:Предприятии (в данном случае УТ 11.4), перестают отображаться в интерфейсе пользователя. При этом мы выяснили, что предопределенные варианты отчетов и пользовательские варианты для стандартных отчетов видны без проблем. Самое интригующее — данные этих "пропавших" вариантов отчетов, предположительно, существуют в таблице reference67, но система 1С их почему-то не подхватывает. Разберем эту сложную проблему, пытаясь понять как логику хранения 1С, так и возможные причины сбоев в PostgreSQL.

Разбираемся с хранением пользовательских вариантов отчетов в 1С

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

  1. Предопределенные варианты отчетов: Эти варианты создаются разработчиком в режиме Конфигуратора. Они являются частью самой конфигурации или расширения и хранятся непосредственно в схеме компоновки данных отчета. Их видимость обычно стабильна, так как они встроены в метаданные.
  2. Пользовательские варианты отчетов: Эти варианты сохраняются конечными пользователями непосредственно в режиме 1С:Предприятия. Они позволяют гибко настраивать отчеты под конкретные нужды, сохранять эти настройки и использовать их в дальнейшем. Пользовательские варианты отчетов хранятся в информационной базе, обычно в специализированных хранилищах, таких как "Хранилище вариантов отчетов" или "Хранилище пользовательских настроек отчетов", которые, в свою очередь, представлены системными таблицами базы данных.

В нашем случае, пользовательские варианты отчетов, созданные для отчетов из расширений, перестали быть видимыми. При этом автор темы указывает на несколько таблиц, которые были восстановлены из бэкапа: _frmdtsettings, Reference262, Reference250, Reference125, ReferenceChngR20769, reference67. Особое внимание уделяется таблице reference67, где, как утверждает автор, "все варианты отчетов есть".

Почему же данные есть, а отображения нет? Мы можем предположить несколько причин, по которым такое может происходить:

  1. Проблемы с вспомогательными таблицами или связями: Помимо самой таблицы, содержащей данные настроек (например, reference67), 1С использует множество вспомогательных системных таблиц для хранения метаданных, связей между объектами, информации о владельцах настроек (пользователях) и т.д. Возможно, при восстановлении базы данных или в результате сбоя, были повреждены или некорректно восстановлены именно эти связующие таблицы, которые "регистрируют" пользовательские варианты отчетов для определенного отчета и пользователя. Например, могут быть нарушены связи, указывающие, к какому именно отчету и к какому расширению относится данный вариант.
  2. Кэширование данных: 1С активно использует различные механизмы кэширования (на уровне сервера 1С:Предприятия, на уровне клиента). После серьезного сбоя и восстановления базы данных, кэш может содержать устаревшие или некорректные данные. Мы можем попробовать очистить кэш на клиентах и на сервере 1С:Предприятия.
  3. Внутренняя перерегистрация объектов 1С: Иногда после восстановления базы данных, или при обновлении платформы, или конфигурации, 1С может требовать "перерегистрации" своих внутренних объектов. Запуск конфигуратора с ключом для обновления информационной базы (например, /UpdateDBCfg) частично помогает, но, как мы видим, восстанавливает только предопределенные варианты. Возможно, требуется более глубокая процедура, которая, к сожалению, не всегда документирована для конечного пользователя или администратора.
  4. Особенности работы расширений: Отчеты, добавленные через расширения, работают в своем изолированном контексте. Возможно, что проблема специфична для взаимодействия механизма сохранения пользовательских настроек с расширениями, особенно если были повреждены данные, связывающие расширение с его объектами и их настройками.

К сожалению, в рамках данного обсуждения на форуме не было найдено прямого решения или указания на конкретную "еще одну таблицу", которая бы полностью решила проблему видимости вариантов отчетов. Однако мы видим, что фокус обсуждения быстро сместился на диагностику причин самого сбоя PostgreSQL, что является критически важным для предотвращения подобных ситуаций в будущем.

Анализ конфигурации PostgreSQL: предотвращение будущих сбоев

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

Мы видим, что в конфигурационном файле postgresql.conf есть секция # CUSTOMIZED OPTIONS, которая содержит актуальные настройки, переопределяющие или дополняющие стандартные закомментированные параметры. Давайте разберем их.


listen_addresses = '*'
shared_buffers = 16103MB # 25% of RAM
temp_buffers = 128MB
work_mem = 256MB
maintenance_work_mem = 256MB
max_files_per_process = 10000
max_parallel_workers_per_gather = 1
max_parallel_maintenance_workers = 6 # Количество CPU/4, минимум 2, максимум 6
commit_delay = 1000
max_wal_size = 4GB
min_wal_size = 2GB
checkpoint_timeout = 15min
effective_cache_size = 48311MB # 75% of RAM
from_collapse_limit = 8
join_collapse_limit = 8
autovacuum_max_workers = 12 # Количество CPU/2, минимум 2
vacuum_cost_limit = 1200 # 100* autovacuum_max_workers
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.005
max_locks_per_transaction = 1024
escape_string_warning = off
standard_conforming_strings = off
shared_preload_libraries = 'online_analyze, plantuner'
online_analyze.threshold = 50
online_analyze.scale_factor = 0.1
online_analyze.enable = on
online_analyze.verbose = off
online_analyze.min_interval = 10000
online_analyze.table_type = 'temporary'
plantuner.fix_empty_table = on

Настройки WAL (Write-Ahead Log)

Журнал предзаписи (WAL) — это краеугольный камень отказоустойчивости PostgreSQL. Все изменения сначала записываются в WAL, а затем уже в саму базу данных. В случае сбоя, PostgreSQL использует WAL для восстановления базы до последнего консистентного состояния.

  1. wal_level = replica (закомментировано в секции WAL, но важно для 1С): Для 1С:Предприятия рекомендуется устанавливать значение replica или logical. Это необходимо для корректной работы репликации и некоторых расширений. Отсутствие явной настройки может означать использование значения по умолчанию (обычно replica для современных версий), но всегда лучше убедиться, что оно установлено.
  2. fsync = on (закомментировано): Этот параметр определяет, будет ли PostgreSQL принудительно сбрасывать данные на диск для обеспечения безопасности при сбоях. Его отключение (off) значительно увеличивает производительность, но также в разы повышает риск потери данных и повреждения базы при внезапном отключении питания или аппаратном сбое. Если вы используете RAID-контроллер с кэшем в режиме write-back, крайне важно убедиться, что контроллер имеет батарейку или конденсатор для защиты кэша (BBU/FBU). Если такой защиты нет, fsync должен быть on.
  3. synchronous_commit = on (закомментировано): Этот параметр определяет, будет ли транзакция считаться зафиксированной только после того, как её записи в WAL будут физически сброшены на диск. Отключение этого параметра (off) может повысить производительность, так как система не будет ждать сброса данных на диск для каждой транзакции. Однако при этом возникает небольшой риск потери последних нескольких транзакций (обычно в течение 0.5-1 секунды) в случае жесткого сбоя сервера. База данных при этом останется целостной, но может "откатиться" на очень короткий промежуток времени. Для 1С часто рекомендуют комбинацию fsync = on и synchronous_commit = off как баланс между скоростью и безопасностью.
  4. max_wal_size = 4GB и min_wal_size = 2GB: Эти параметры совместно с checkpoint_timeout регулируют частоту контрольных точек (checkpoint). Контрольные точки — это моменты, когда все "грязные" страницы из оперативной памяти (измененные, но не записанные на диск) принудительно сбрасываются на постоянное хранилище.
    • Увеличение max_wal_size позволяет системе дольше не выполнять контрольные точки, что может улучшить производительность во время активной записи, но увеличит время восстановления базы данных после сбоя.
    • min_wal_size определяет минимальный объем WAL-файлов, которые система должна сохранять.
    • Значения 2-4 ГБ для max_wal_size и min_wal_size являются хорошим выбором для активных баз 1С.
  5. checkpoint_timeout = 15min: Этот параметр задает максимальный интервал между контрольными точками. Если max_wal_size достигается быстрее, чем истекает checkpoint_timeout, контрольная точка будет выполнена раньше. Значение 15 минут в сочетании с max_wal_size = 4GB является разумным для большинства систем 1С, но может потребовать корректировки в зависимости от интенсивности записи.

Настройки буферов памяти

Эффективное использование оперативной памяти критически важно для производительности PostgreSQL.

  1. shared_buffers = 16103MB (25% от ОЗУ): Это основной буфер, который PostgreSQL использует для кэширования данных и индексов. Значение в 25% от доступной оперативной памяти является хорошей отправной точкой. Увеличение этого параметра обычно положительно сказывается на производительности, поскольку больше данных может храниться в памяти, уменьшая количество обращений к диску. Однако слишком большое значение может привести к конкуренции за память с операционной системой и другими процессами, вызывая своппинг, что, наоборот, ухудшит производительность. Мы рекомендуем экспериментировать, постепенно увеличивая его и отслеживая нагрузку на диск.
  2. temp_buffers = 128MB: Максимальный объем памяти, который каждая сессия может использовать для временных буферов. Временные буферы используются для кэширования временных таблиц и временных файлов, создаваемых при сложных запросах. Значение 128 МБ подходит для большинства случаев.
  3. work_mem = 256MB: Лимит памяти для операций сортировки и хэширования в рамках одного запроса. Если запросу требуется больше памяти, чем установлено в work_mem, он будет использовать временные файлы на диске, что значительно медленнее. Каждая сессия может использовать несколько блоков work_mem одновременно. Значение 256 МБ довольно щедрое и может быть адекватным для сложных отчетов 1С. Мы рекомендуем внимательно отслеживать логи PostgreSQL на предмет сообщений о превышении work_mem, чтобы при необходимости его скорректировать.
  4. maintenance_work_mem = 256MB: Лимит памяти, используемый для операций обслуживания, таких как VACUUM, ANALYZE, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY. Увеличение этого параметра (например, до 512 МБ или 1 ГБ для больших баз) может ускорить эти операции.
  5. effective_cache_size = 48311MB (75% от ОЗУ): Этот параметр не выделяет память напрямую, а информирует оптимизатор запросов о предполагаемом размере дискового кэша, доступного для одного запроса. Оптимизатор использует это значение при принятии решения о том, стоит ли использовать индексное сканирование или последовательное сканирование таблицы. Установка этого параметра в 50-75% от общего объема оперативной памяти является распространенной практикой.

Настройки автовакуума

Автовакуум (autovacuum) — это критически важный фоновый процесс в PostgreSQL, который предотвращает раздувание таблиц (bloat) и очищает "мертвые" строки, оставшиеся после операций UPDATE и DELETE. Без регулярного вакуума база данных будет расти, а производительность ухудшаться.

  1. autovacuum_max_workers = 12 (Количество CPU/2, минимум 2): Этот параметр определяет максимальное количество процессов автовакуума, которые могут работать одновременно. Значение 12 для многоядерного сервера является агрессивным и обычно эффективным, так как 1С может генерировать большой объем "мертвых" строк. Мы рекомендуем подбирать это значение, исходя из количества ядер процессора, чтобы не перегружать систему.
  2. vacuum_cost_limit = 1200 (100 * autovacuum_max_workers): Этот параметр ограничивает "стоимость" операций вакуума. Автовакуум работает, исходя из бюджетной модели, чтобы не мешать другим операциям. Увеличение лимита позволяет автовакууму выполнять больше работы за один цикл. Значение 1200 при 12 воркерах является логичным продолжением рекомендованной формулы.
  3. autovacuum_naptime = 20s: Период (в секундах) между запусками автовакуума на каждой базе данных. Значение 20 секунд указывает на довольно частую проверку, что хорошо для активно изменяющихся баз 1С.
  4. autovacuum_vacuum_scale_factor = 0.01: Доля от числа строк таблицы, при превышении которой запускается VACUUM. Значение 0.01 (1%) является очень низким и агрессивным, что заставляет автовакуум запускаться чаще. Это помогает поддерживать таблицы в актуальном состоянии и предотвращать раздувание.
  5. autovacuum_analyze_scale_factor = 0.005: Доля от числа строк таблицы, при превышении которой запускается ANALYZE (обновление статистики). Значение 0.005 (0.5%) еще более агрессивно, чем для VACUUM. Частое обновление статистики критически важно для оптимизатора запросов 1С, так как он сможет принимать более точные решения о планах выполнения запросов.

Расширения для оптимизации 1С: `online_analyze` и `plantuner`

Эти расширения специально разработаны для улучшения производительности PostgreSQL в связке с 1С:Предприятием.

  1. shared_preload_libraries = 'online_analyze, plantuner': Этот параметр загружает указанные библиотеки при старте PostgreSQL-сервера. Это необходимо для того, чтобы расширения были доступны.
  2. online_analyze.enable = on: Включает функциональность расширения online_analyze. Этот модуль позволяет обновлять статистику для таблиц сразу после операций INSERT, UPDATE, DELETE или SELECT INTO, что особенно полезно для временных таблиц (online_analyze.table_type = 'temporary'), активно используемых в 1С. Это помогает оптимизатору запросов принимать более правильные решения, особенно если стандартный автовакуум не успевает оперативно обновлять статистику для быстро меняющихся данных.
    • online_analyze.threshold = 50: Минимальное количество измененных строк, после которого запускается онлайн-анализ.
    • online_analyze.scale_factor = 0.1: Процент от количества строк таблицы, после изменения которого запускается онлайн-анализ.
    • online_analyze.min_interval = 10000: Минимальный интервал между запусками анализа для одной таблицы (в миллисекундах).
  3. plantuner.fix_empty_table = on: Включает функциональность расширения plantuner. Этот модуль помогает оптимизировать планы выполнения запросов, добавляя поддержку указаний для планировщика и улучшая планирование запросов с недавно созданными пустыми таблицами. В 1С часто создаются и используются временные таблицы, которые на момент планирования запроса могут быть пустыми, что приводит к неоптимальным планам выполнения. plantuner помогает решить эту проблему.

Прочие важные настройки

  1. listen_addresses = '*': Позволяет PostgreSQL принимать соединения со всех сетевых интерфейсов. Для производственной среды рекомендуется указывать конкретные IP-адреса, чтобы повысить безопасность.
  2. max_files_per_process = 10000: Максимальное число файлов, которое может быть одновременно открыто каждым серверным подпроцессом. Значение 10000 является высоким и достаточным для 1С, которая может открывать множество файлов.
  3. commit_delay = 1000: Задержка в микросекундах перед сбросом WAL на диск. Это позволяет собрать несколько транзакций и сбросить их одной операцией, что может улучшить производительность дисковой подсистемы.
  4. max_parallel_workers_per_gather = 1 и max_parallel_maintenance_workers = 6: Эти параметры управляют параллельным выполнением запросов и операций обслуживания. Для 1С часто не рекомендуется использовать агрессивное распараллеливание запросов из-за особенностей их формирования, поэтому max_parallel_workers_per_gather = 1 является разумным. А вот для операций обслуживания (например, VACUUM или CREATE INDEX), параллелизм может быть полезен, отсюда max_parallel_maintenance_workers = 6.

Дополнительные рекомендации по диагностике и стабильности

Чтобы минимизировать риск повторения подобных сбоев и обеспечить максимальную стабильность системы, мы рекомендуем обратить внимание на следующие аспекты:

  1. Дисковая подсистема: Использование SSD-дисков является стандартом для серверов 1С с PostgreSQL. В сочетании с RAID-массивом (например, RAID10) и контроллером с кэшем и защитой от потери питания (BBU/FBU) это обеспечивает высокую производительность и отказоустойчивость. Автор темы подтвердил использование SSD, что является хорошей новостью.
  2. Операционная система: Linux, как указано в обсуждении, является предпочтительной операционной системой для PostgreSQL из-за лучшей производительности, стабильности и меньших накладных расходов по сравнению с Windows.
  3. Настройки BIOS/UEFI и ОС:
    • Отключение HyperThreading: В некоторых случаях, особенно при высоких нагрузках на CPU, отключение технологии HyperThreading в BIOS/UEFI может улучшить стабильность и предсказуемость производительности сервера БД.
    • Энергосберегающие режимы: Убедитесь, что все энергосберегающие режимы (Power Saving) отключены как в BIOS/UEFI, так и в операционной системе. Эти режимы могут вызывать непредсказуемые задержки и негативно сказываться на производительности БД.
  4. Логи PostgreSQL: Убедитесь, что уровень логирования PostgreSQL настроен достаточно подробно, чтобы в случае нового сбоя можно было получить максимум информации о причинах. Мы рекомендуем включить логирование медленных запросов, ошибок и сообщений о критических событиях.
  5. Регулярное резервное копирование: Вне зависимости от настроек WAL и надежности оборудования, регулярные бэкапы всей информационной базы (включая использование архивирования WAL, если archive_mode = on) являются вашей последней линией защиты от потери данных.
  6. Проверка целостности 1С: После любого восстановления базы данных критически важно выполнить проверку целостности информационной базы средствами 1С (например, через команду chdbfl.exe или утилиты администрирования 1С). Это поможет выявить и, возможно, исправить логические ошибки в структуре данных 1С, которые могли возникнуть в результате сбоя или некорректного восстановления.

Таким образом, хотя мы не смогли найти прямого решения проблемы с видимостью пользовательских вариантов отчетов из расширений в данной теме форума, мы провели детальный анализ конфигурации PostgreSQL, который является основой для стабильной работы 1С:Предприятия. Правильная настройка WAL, буферов памяти, автовакуума и использование специализированных расширений, таких как online_analyze и plantuner, могут значительно снизить вероятность возникновения аппаратных и программных сбоев, подобных описанному. В случае повторения проблемы с вариантами отчетов, рекомендуется обращаться в службу поддержки 1С с максимально подробным описанием ситуации и логов.

← На главную