Почему 1С:Предприятие 8.3 с БП 3.0 и Бит.Финанс работает медленно и зависает?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

Мы часто сталкиваемся с ситуацией, когда система 1С начинает работать медленно, подвисать или даже полностью зависать на определенных операциях. Такая проблема может значительно снижать продуктивность работы и вызывать затруднения у пользователей. В данном руководстве мы подробно разберем, как диагностировать и устранить причины замедления работы 1С:Бухгалтерии 3.0, особенно если она доработана с использованием решения Бит.Финанс и развернута на клиент-серверной архитектуре с SQL Server.

Представим себе типичную ситуацию: у нас есть база 1С:Бухгалтерии 3.0, расположенная на мощном сервере, но при проведении таких документов, как «Реализация товаров и услуг» или «Отчет комиссионера», возникают задержки в 15-20 секунд и более. Что же может быть причиной такого поведения и как мы можем с этим справиться?

Диагностика проблемы: С чего начать?

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

  1. Проверим типовую конфигурацию и наличие доработок.

    В нашем случае, база не является типовой, она отраслевая с Бит.Финанс и имеет минимальные расширения. Это критически важная информация, поскольку доработки и расширения (как наши, так и от поставщика отраслевого решения) часто становятся источником проблем. Они могут вызывать непредвиденные блокировки или неоптимизированные запросы к базе данных. Проанализируйте, какие именно доработки присутствуют в системе и как они взаимодействуют с типовыми механизмами.

  2. Выполним замер производительности в отладчике 1С.

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

    1. Создадим копию базы данных: Никогда не проводите эксперименты на рабочей базе. Всегда создавайте копию и работайте с ней. Это золотое правило предотвратит случайное повреждение данных.
    2. Запустим 1С в режиме отладчика: Запустите конфигурацию в режиме предприятия (F5) с подключенным отладчиком.
    3. Включим замер производительности: В меню отладчика выберите пункт «Замер производительности». Это позволит системе фиксировать время выполнения различных участков кода.
    4. Выполним проблемную операцию: Проведите документ или сформируйте отчет, который вызывает зависания.
    5. Проанализируем результаты замера: После выполнения операции остановите замер производительности и внимательно изучите отчет. Мы будем искать строки кода, на которых затрачивается наибольшее количество времени (процент от общего времени выполнения).

    Наш замер показал, что наибольший процент времени выполнения приходится на строку кода РезультатыЗапроса = Запрос.ВыполнитьПакет; в функции ДанныеДляПроверкиИзБазыДанных общего модуля ДатыЗапретаИзмененияСлужебный. Это дает нам конкретное направление для дальнейшего анализа.

  3. Проанализируем код в общем модуле ДатыЗапретаИзмененияСлужебный.

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

    1. Неоптимизированных запросов: Запросы могут быть избыточными, выбирать слишком много данных, использовать неэффективные условия или соединения.
    2. Работы с большими объемами данных: Даже эффективный запрос может выполняться долго, если он обрабатывает миллионы записей.
    3. Блокировок: Запрос может ждать освобождения ресурсов, заблокированных другими операциями.

    Нам следует провести рефакторинг этого запроса, если это возможно, либо рассмотреть альтернативные способы получения необходимых данных.

  4. Проверим сетевую инфраструктуру и клиент-серверную архитектуру.

    Важный аспект, который мы выявили: база данных находится на одном сервере, а пользователи работают с ней с другого сервера (вероятно, через терминальный доступ или тонкий клиент). В этом случае критически важна стабильность и скорость сети между сервером 1С и клиентскими машинами, а также между сервером 1С и сервером СУБД (если они разные). Даже при высокой пропускной способности сети, большая задержка (латентность) может существенно влиять на производительность. Используйте команду ping с большими пакетами данных, чтобы оценить стабильность и время отклика.

  5. Оценим объем данных в документах.

    Мы выяснили, что в проблемных документах всего от 3 до 10 строк. Это исключает проблему с обработкой огромного количества позиций в рамках одного документа, что часто бывает причиной замедлений.

  6. Проанализируем размер базы данных и его изменение.

    Изначально база занимала 55 ГБ, а после выгрузки в .dt и загрузки в новую базу на SQL её размер увеличился до 70 ГБ. Такое увеличение может быть связано с фрагментацией данных, различными настройками коэффициента заполнения (fill factor) индексов или другими особенностями внутренней организации данных в SQL Server при создании или перестроении индексов.

Оптимизация на уровне SQL Server

Если 1С работает на клиент-серверной архитектуре, SQL Server является сердцем системы. Его некорректная настройка или отсутствие регулярного обслуживания — одна из самых частых причин замедлений.

  1. Обновим статистику и перестроим индексы.

    SQL Server использует статистику для построения оптимальных планов запросов. Если статистика устарела (например, из-за частых изменений данных), SQL Server может выбрать неэффективный план, что приведет к замедлениям. Перестроение индексов помогает уменьшить фрагментацию данных, что также повышает скорость доступа к ним.

    Нам необходимо настроить регулярный план обслуживания базы данных в SQL Server Management Studio (SSMS), который должен включать:

    • Проверку целостности базы данных.
    • Перестроение (Rebuild) или реорганизацию (Reorganize) индексов.
    • Обновление статистики (Update Statistics) с полной проверкой (WITH FULLSCAN).

    Для однократного обновления статистики по всем таблицам можно использовать следующий запрос:

    EXEC sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN';

    Этот запрос обновит статистику для всех таблиц в текущей базе данных. Если мы столкнемся с ошибкой при выполнении, нам нужно будет уточнить её текст, возможно, дело в правах доступа или специфике версии SQL Server.

    Хотя в свойствах базы может стоять галочка на автоматическое обновление статистики, ручное обновление с FULLSCAN или настроенный план обслуживания гарантирует более полное и своевременное обновление, особенно для больших и активно меняющихся баз.

  2. Настроим Max Degree of Parallelism (MAXDOP).

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

  3. Выделим память для SQL Server.

    Очень важно корректно ограничить максимальный объем оперативной памяти, используемой SQL Server (параметр max server memory). Если на том же сервере работают другие ресурсоемкие приложения (например, сервер 1С:Предприятия), необходимо оставить достаточно памяти для операционной системы и этих приложений. Общая рекомендация: оставить для ОС минимум 4 ГБ, плюс дополнительно 1 ГБ на каждые 16 ГБ ОЗУ, а также учесть объем памяти, занимаемый процессами rphost в пиковые нагрузки.

  4. Настроим TempDB и журнал транзакций.

    TempDB — это системная база данных, которая активно используется SQL Server для временных объектов, сортировок, хеш-таблиц и других операций. Рекомендуется:

    • Размещать TempDB на отдельном, быстром диске (лучше SSD).
    • Создать несколько файлов данных для TempDB (до 8 файлов, по одному на каждое логическое ядро процессора), чтобы равномерно распределить нагрузку и избежать конфликтов.

    Журнал транзакций (Transaction Log) также является узким местом при интенсивной записи. Его рекомендуется разместить на отдельном диске от файлов данных базы.

  5. Включим протокол Shared Memory.

    Если сервер 1С:Предприятия и SQL Server расположены на одной физической машине, крайне важно включить протокол Shared Memory (общая память). Этот протокол позволяет процессам общаться напрямую через оперативную память, минуя сетевой стек TCP/IP, что значительно ускоряет взаимодействие между ними.

  6. Осуществим мониторинг SQL Server.

    Для глубокого анализа производительности SQL Server мы можем использовать:

    • SQL Server Extended Events: Это современный и эффективный инструмент для сбора данных о действиях ядра СУБД, диагностики проблем, выявления длительных запросов и взаимоблокировок с минимальным влиянием на производительность сервера.
    • Стандартные отчеты в SSMS: В SQL Server Management Studio есть встроенные отчеты, например, "Самые продолжительные транзакции", которые могут помочь выявить проблемные запросы.
    • Системные динамические представления (DMV): Мы можем писать SQL-запросы к sys.dm_exec_requests, sys.dm_exec_query_stats и другим DMV для получения информации о текущих и выполненных запросах, их планах и времени выполнения.

Оптимизация кода конфигурации и доработок

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

  1. Отключим и поочередно проверим расширения.

    Если в базе есть расширения, даже "незначительные и минимальные", они могут быть причиной проблем. Мы рекомендуем полностью отключить все расширения и проверить производительность. Если проблема исчезнет, включайте расширения по одному и тестируйте после каждого включения, чтобы найти то, которое вызывает замедление. Это позволит точно определить виновника.

  2. Проведем рефакторинг кода и анализ запросов.

    Мы выяснили, что проблема связана с запросом в общем модуле ДатыЗапретаИзмененияСлужебный. Нам необходимо:

    • Оптимизировать сам запрос: Убедитесь, что запрос выбирает только необходимые поля, использует правильные индексы, не содержит избыточных соединений или подзапросов. Используйте конструктор запросов 1С и SQL Server Management Studio для анализа плана выполнения запроса.
    • Кэширование данных: Если данные, получаемые этим запросом, не меняются часто, возможно, имеет смысл их кэшировать на стороне 1С, чтобы избежать повторных обращений к базе данных.
    • Минимизировать количество обращений: Убедитесь, что функция вызывается только тогда, когда это действительно необходимо, а не избыточно.
  3. Разберемся с блокировками.

    Доработки, особенно в отраслевых решениях, могут вызывать проблемы с блокировками. Это происходит, когда один процесс удерживает ресурс, необходимый другому. Типичные причины:

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

    Мы должны анализировать технологический журнал 1С и логи SQL Server на предмет взаимоблокировок (deadlocks) и длительных блокировок. Используйте Центр Управления Производительностью (ЦУП) для комплексного анализа.

  4. Используем технологический журнал 1С.

    Технологический журнал 1С является мощным инструментом для выявления длительных операций и "тяжелых" запросов на стороне платформы. Нам необходимо настроить сбор данных журнала, включив события, связанные с запросами к базе данных (DBMSSQL, DBPOSTGRS) и транзакциями (TLOCK, TDEADLOCK). Анализ собранных логов поможет нам точечно оптимизировать конфигурацию.

Сетевая инфраструктура и окружение

Помимо SQL Server и кода, окружение, в котором работает 1С, также играет важную роль.

  1. Проверим сетевую задержку (латентность).

    Если пользователи работают с базой с другого сервера, сетевая задержка может быть значительным фактором. Даже при наличии гигабитной сети, высокий пинг между клиентскими машинами и сервером 1С, или между сервером 1С и сервером SQL, может привести к замедлениям. Мы должны измерить время отклика сети с помощью утилиты ping, а также проверить наличие потерь пакетов.

    Для максимальной производительности все компоненты 1С (сервер базы данных, сервер 1С:Предприятия, терминальный сервер) должны быть расположены максимально близко друг к другу, в идеале — на одной физической машине (если ресурсов хватает) или в одном ЦОДе с минимальной задержкой между ними.

  2. Очистим кэш 1С.

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

  3. Проверим использование виртуальных машин.

    Мы должны выяснить, используются ли виртуальные машины для сервера 1С и SQL Server. Виртуализация может влиять на производительность, если не настроена оптимально. Мы должны убедиться, что VM имеют достаточно ресурсов (процессорных ядер, оперативной памяти, дисковых операций ввода/вывода) и что нет "соревнований" за ресурсы с другими VM на том же физическом хосте.

  4. Выделим память для базы.

    Нам необходимо проверить, сколько оперативной памяти выделено для процессов сервера 1С (rphost) и для SQL Server. Если памяти недостаточно, система будет активно использовать файл подкачки, что критически снижает производительность. Мы должны убедиться, что общий объем выделенной памяти соответствует физической памяти сервера и остается запас для операционной системы и других процессов.

Общие рекомендации и профилактика

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

  1. Всегда работаем на копии.

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

  2. Применяем комплексный подход.

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

  3. Регулярное обслуживание базы данных.

    Нам необходимо настроить регулярное автоматическое обслуживание базы данных SQL Server, включающее перестроение индексов и обновление статистики. Это является ключом к поддержанию высокой производительности в долгосрочной перспективе.

  4. Свертка базы данных.

    Для очень больших баз данных, особенно если в них накопилось много устаревших или неактуальных данных, проведение свертки базы может значительно уменьшить ее объем. Меньший объем базы данных обычно означает более быструю работу запросов и меньшую нагрузку на дисковую подсистему.

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

← На главную