Разбор информационной базы 1С 8.3 по шагам: журнал, блокировки, таблицы, индексы
Содержание
Проанализировать базу 1С — значит последовательно проверить четыре слоя: журнал регистрации и технологический журнал (что падает), замер производительности (что тормозит), блокировки (кто кого ждёт) и физическую структуру в СУБД (размер таблиц, индексы, статистика). Начинать стоит с технологического журнала: в нём остаются ошибки, длинные запросы и конфликты блокировок с точным временем и пользователем.
Типичная ситуация: главбух жалуется, что «проведение реализации с утра идёт по минуте, а вчера было мгновенно». Без анализа ответ один — «перезагрузим сервер». С анализом через полчаса видно, что виноват регламентный обмен, который держит блокировку на регистре взаиморасчётов. Порядок работы эксперта как раз и переводит разговор из догадок в факты.
Подготовка к анализу базы 1С: что собрать до первого замера
Анализ без исходных данных превращается в гадание. До того как что-то включать, зафиксируйте картину.
📌 Что записать:
- точный симптом: какая операция, у каких пользователей, во сколько, сколько секунд;
- вариант работы: файловая база или клиент-серверная, какая СУБД (MS SQL Server, PostgreSQL);
- номер платформы (
Справка → О программе) и релиз конфигурации; - число активных пользователей в момент проблемы;
- что менялось накануне: обновление, новая доработка, перенос на другой сервер, включение обмена.
📌 Какие права нужны:
- администратор информационной базы — для журнала регистрации и замеров;
- доступ к каталогу установки платформы на сервере 1С — для технологического журнала;
- доступ к СУБД с правом чтения системных представлений — для анализа индексов.
Тяжёлые проверки (тестирование и исправление, перестроение индексов) делайте на копии базы или в нерабочее время. Перед любой операцией, которая меняет данные или структуру, нужна свежая резервная копия.
Отдельно договоритесь, где будет лежать технологический журнал. За час активной работы с полным набором событий он легко вырастает до гигабайтов, поэтому нужен диск с запасом и не системный.
Инструменты анализа: от встроенных в 1С до профессиональных
Под каждую задачу — свой инструмент. Ни один из них не закрывает всё сразу.
| Инструмент | Что показывает | Где взять | Когда применять |
|---|---|---|---|
| Журнал регистрации | Кто, когда и что делал; ошибки на уровне прикладной логики | Администрирование → Обслуживание → Журнал регистрации | Первичный разбор жалобы |
| Технологический журнал | Исключения, длительные запросы к СУБД, ожидания и взаимоблокировки | Файл logcfg.xml на сервере | Любой сбой и торможение |
| Замер производительности | Строки кода и их долю во времени выполнения | Конфигуратор, режим отладки | Медленная конкретная операция |
| Оценка производительности (APDEX) | Время ключевых операций по дням | Подсистема в типовых конфигурациях на БСП | Долгосрочное наблюдение |
| Консоль кластера | Сеансы, соединения, нагрузку на рабочие процессы | Утилита администрирования серверов 1С | Зависания «здесь и сейчас» |
| Тестирование и исправление | Логическую и ссылочную целостность, итоги | Конфигуратор, меню Администрирование | Ошибки данных, битые ссылки |
| Средства СУБД | Размер таблиц, фрагментацию, планы запросов | SQL Server Management Studio, psql | Анализ структуры и индексов |
| Центр управления производительностью (ЦУП) | Сводный мониторинг кластера | Корпоративный инструментальный пакет | Крупные внедрения, постоянный контроль |
💡 Для файловой базы набор беднее: консоли кластера и СУБД нет, зато есть утилита chdbfl.exe в каталоге bin платформы. Она проверяет физическую целостность файла 1Cv8.1CD, но запускать её можно только когда в базе никто не работает
.
Технологический журнал 1С: как включить и найти критичные ошибки
Технологический журнал включается файлом logcfg.xml. Его кладут в каталог conf установленной платформы, например C:\Program Files\1cv8\conf\. Платформа перечитывает настройку сама, перезапускать службу не нужно: запись начинается примерно через минуту.
Рабочий минимальный конфиг для поиска ошибок, долгих запросов и проблем с блокировками:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\techlog" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="TTIMEOUT"/>
</event>
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<event>
<eq property="name" value="DBMSSQL"/>
<gt property="duration" value="1000000"/>
</event>
<event>
<eq property="name" value="DBPOSTGRS"/>
<gt property="duration" value="1000000"/>
</event>
<property name="all"/>
</log>
</config>
Что здесь важно:
- 🔹
history="24"— журнал хранится 24 часа, старые файлы удаляются автоматически; - 🔹
durationв платформе 8.3 задаётся в микросекундах, поэтому1000000— запросы дольше одной секунды; - 🔹
EXCP— исключения,TTIMEOUT— превышение времени ожидания блокировки,TDEADLOCK— взаимоблокировка; - 🔹 событие
DBMSSQLпишется для MS SQL Server,DBPOSTGRS— для PostgreSQL; лишнее можно убрать.
Не оставляйте полный журнал включённым на неделю — он забьёт диск и сам станет причиной торможения. Собрали материал за проблемный период — переименуйте logcfg.xml или удалите его.
Как читать технологический журнал
Каждый процесс пишет в свой подкаталог (rphost_1234, rmngr_5678), внутри — файлы по часам вида 26100709.log. Строка начинается со времени и длительности, дальше идёт имя события и свойства.
Быстрый поиск без специальных программ:
:: все исключения за период
findstr /s /c:",EXCP," D:\techlog\*.log > excp.txt
:: все взаимоблокировки
findstr /s /c:",TDEADLOCK," D:\techlog\*.log > deadlocks.txt
На Linux то же самое делает grep -r ",EXCP," /var/techlog > excp.txt.
В найденных строках смотрите свойства Usr (пользователь), Context (стек вызовов встроенного языка) и Descr (текст ошибки). Именно Context показывает модуль и строку, где упало.
💡 Для больших объёмов удобнее разбор скриптом: сгруппировать события DBMSSQL по контексту и сложить длительности. Пять-шесть контекстов, которые дают основную сумму времени, — это и есть список задач на оптимизацию.
Диагностика производительности: ищем узкое место
Когда медленная операция известна, переходите к замеру производительности. Он показывает, какая строка кода сколько времени заняла.
Пошагово: замер в конфигураторе
- Откройте базу в конфигураторе и запустите её в режиме отладки (
F5). - В конфигураторе включите замер: меню
Отладка → Замер производительности. - В пользовательском режиме выполните проблемную операцию, например проведите документ.
- Снова выберите
Отладка → Замер производительности— замер остановится, откроется результат. - Отсортируйте строки по проценту времени. Двойной щелчок по строке открывает модуль на этом месте.
Строка, которая забирает 60–80% времени, почти всегда оказывается одним из трёх: запрос в цикле, обращение через точку к реквизитам ссылки (Документ.Контрагент.ИНН внутри перебора) или запрос без условий по индексируемым полям.
Если замер не показывает виновника
Бывает, что код быстрый, а операция всё равно долгая. Тогда время уходит вне кода:
- ⏳ ожидание блокировки — ищите
TTIMEOUTиTLOCKв технологическом журнале; - 🗄️ медленный запрос на стороне СУБД — смотрите план запроса в средствах СУБД;
- 🌐 сеть между клиентом и сервером — сравните время той же операции, запущенной на самом сервере;
- 💾 диск — проверьте очередь диска на сервере СУБД в момент проблемы.
Для постоянного наблюдения включите подсистему оценки производительности. В типовых конфигурациях на БСП её флажок находится в Администрирование → Обслуживание. Она копит время ключевых операций и считает индекс APDEX. Падение индекса с 0,9 до 0,7 за неделю — повод разбираться до того, как пожалуются пользователи.
Блокировки и взаимоблокировки: как выявить и снять причину
Классический текст ошибки, с которым приходят пользователи:
Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки
Это значит: одна транзакция держит данные, вторая ждёт и по истечении таймаута падает.
Как найти, кто держит блокировку
- В технологическом журнале найдите событие
TTIMEOUT— у него есть свойствоWaitConnectionsс номерами соединений, которые мешали. - По номеру соединения в событиях
TLOCKтого же времени найдите контекст — код, который захватил блокировку. - Посмотрите свойство
Regions— какое пространство блокировок (регистр, справочник) стало предметом конфликта.
Для взаимоблокировок (TDEADLOCK) то же самое: в свойстве DeadlockConnectionIntersections перечислены пары соединений и ресурсы, на которых они сцепились.
💡 Для сбора TLOCK добавьте в logcfg.xml отдельный блок <event> с этим именем, но включайте его коротким окном — событие очень частое.
Что обычно оказывается причиной
| Причина | Как проявляется | Что делать |
|---|---|---|
| Длинная транзакция (обмен, закрытие месяца) | Таймауты у всех, кто проводит документы этого периода | Перенести регламент на ночь, дробить транзакции |
| Автоматический режим блокировок | Блокировки целых таблиц на уровне СУБД | Проверить свойство «Режим управления блокировкой данных» у конфигурации |
| Запрос внутри транзакции читает лишнее | Блокировка шире, чем нужно | Уточнить условия запроса и измерения в блокировке |
| Разный порядок захвата ресурсов | Взаимоблокировки в парах операций | Захватывать данные в одном порядке во всех местах кода |
Завершить «зависший» сеанс в консоли кластера можно, но его транзакция откатится, а пользователь потеряет несохранённые данные. Предупредите человека и делайте это, только когда виновник однозначно найден.
Анализ структуры базы данных: размер таблиц, фрагментация и индексы
В клиент-серверной базе часть проблем живёт не в 1С, а в СУБД: разросшиеся таблицы, фрагментированные индексы, устаревшая статистика.
Какие таблицы занимают место
Таблицы в СУБД называются техническими именами: _AccumRg123, _InfoRg45, _Document67. Чтобы сопоставить их с объектами конфигурации, в 1С есть метод встроенного языка ПолучитьСтруктуруХраненияБазыДанных(). Он возвращает таблицу с колонками «ИмяТаблицыХранения» и «ИмяТаблицы».
Размер таблиц в MS SQL Server:
SELECT TOP 20
t.name AS table_name,
SUM(p.rows) AS rows_count,
SUM(a.total_pages) * 8 / 1024 AS size_mb
FROM sys.tables t
JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id IN (0,1)
JOIN sys.allocation_units a ON p.partition_id = a.container_id
GROUP BY t.name
ORDER BY size_mb DESC;
Частая находка — огромные таблицы регистрации изменений с окончанием ChngR. Это значит, что обмен с каким-то узлом давно не работает, а изменения для него копятся. Помогает восстановить обмен или удалить неиспользуемый узел плана обмена.
Фрагментация индексов в MS SQL Server
SELECT OBJECT_NAME(s.object_id) AS table_name,
i.name AS index_name,
s.avg_fragmentation_in_percent,
s.page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') s
JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id
WHERE s.page_count > 1000 AND s.avg_fragmentation_in_percent > 10
ORDER BY s.avg_fragmentation_in_percent DESC;
Ориентир из рекомендаций Microsoft:
| Фрагментация | Действие |
|---|---|
| до 5–10% | Ничего не делать |
| 10–30% | ALTER INDEX ... REORGANIZE |
| больше 30% | ALTER INDEX ... REBUILD |
Маленькие индексы (до 1000 страниц) не трогайте: у них высокий процент фрагментации ни на что не влияет.
Статистика и PostgreSQL
Устаревшая статистика ломает планы запросов сильнее, чем фрагментация. В MS SQL обновить её по всей базе можно командой EXEC sp_updatestats;.
В PostgreSQL смотрите «мёртвые» строки, которые копятся после изменений:
SELECT relname, n_live_tup, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 20;
Если у крупных таблиц n_dead_tup сопоставим с n_live_tup, а last_autovacuum пустой или старый, автоочистка не справляется. Тогда выполняют VACUUM ANALYZE по таблице и пересматривают настройки autovacuum.
REBUILD и VACUUM FULL нагружают сервер и могут блокировать таблицу. Пользователи в это время будут получать таймауты, поэтому такие операции — только в окно обслуживания.
Логическая целостность
Структура данных в СУБД может быть в порядке, а внутри 1С — битые ссылки и неверные итоги. Для этого в конфигураторе есть Администрирование → Тестирование и исправление. Флажки «Проверка логической целостности», «Проверка ссылочной целостности» и «Пересчёт итогов» закрывают большую часть случаев. Режим требует монопольного доступа — все пользователи должны выйти.
Регулярный мониторинг и автоматизация анализа
Разовый анализ находит проблему. Регулярный — ловит её раньше, чем пользователи.
📊 Что поставить на расписание:
- обслуживание индексов и статистики — задание SQL Server Agent или план обслуживания раз в неделю, ночью;
- для PostgreSQL — контроль autovacuum и еженедельный
ANALYZEкрупных таблиц; - архивирование и отправку журнала регистрации, если он разросся;
- выгрузку показателя APDEX и сравнение с прошлой неделей.
🔔 Какие события делать триггерами для оповещения:
- появление
TDEADLOCKв технологическом журнале; - более N событий
TTIMEOUTза час (порог подберите по своей базе, например 10); - запросы к СУБД дольше 30 секунд;
- рост размера базы больше чем на 10% за сутки;
- остаток места на диске с журналами меньше 20%.
Для технологического журнала на постоянной основе оставляют облегчённый конфиг: только EXCP, TDEADLOCK, TTIMEOUT и запросы дольше нескольких секунд. Такой журнал весит в разы меньше и не мешает работе.
Простейшая автоматизация — скрипт по расписанию, который раз в час ищет TDEADLOCK в свежих файлах и отправляет письмо или сообщение в мессенджер. Для крупных баз удобнее связка сбора журналов в систему анализа логов и дашборд с графиками.
Ошибки, которые искажают результат анализа
- ❌ Анализ на тестовой копии без нагрузки. Блокировки и конкуренция за ресурсы проявляются только при одновременной работе. На пустой копии виден лишь медленный код.
- ❌ Журнал без фильтра по длительности. Тысячи быстрых запросов прячут несколько медленных. Фильтр
durationобязателен. - ❌ Перестроение всех индексов подряд. Время уходит на маленькие таблицы, а сервер получает нагрузку без пользы.
- ❌ Вывод по одному замеру. Первое выполнение медленнее из-за пустого кэша. Замеряйте операцию 2–3 раза.
- ❌ Поиск виновника по жалобе, а не по журналу. Жалуется тот, кто ждёт, а не тот, кто держит блокировку.
Частые вопросы
Можно ли проанализировать файловую базу теми же средствами?
chdbfl.exe.Замедляет ли технологический журнал работу базы?
Сколько хранить технологический журнал?
history в logcfg.xml задаёт срок в часах.Почему после переноса на новый сервер база стала медленнее?
Чем отличаются TTIMEOUT и TDEADLOCK?
TTIMEOUT — транзакция ждала блокировку дольше таймаута и упала. TDEADLOCK — две транзакции ждали друг друга, и платформа принудительно завершила одну из них.