Почему 1С тормозит и что с этим делать: от замера до правки кода
Содержание
Ускорить работу 1С можно только одним способом: сначала найти, где именно теряется время, и чинить это место. Если тормозит одна операция (проведение реализации, отчёт), включите Отладка → Замер производительности в Конфигураторе и посмотрите, какая строка кода съедает время. Если медленно всё и у всех — проверяйте диск, память сервера, обслуживание СУБД и блокировки.
Оптимизация программы 1С обычно идёт в таком порядке: диагностика → база данных и индексы → сервер 1С и кластер → рабочие места пользователей → регламентное обслуживание → код конфигурации. Каждый следующий шаг дороже предыдущего. Покупать новый сервер до диагностики — частая и дорогая ошибка.
Сначала замер: как понять, что именно тормозит в 1С
Жалоба «1С тормозит» ничего не говорит. Перед любыми настройками ответьте на три вопроса.
- 🕐 Когда. Всегда, в определённые часы (закрытие месяца , утро понедельника) или после обновления?
- 👥 У кого. У всех пользователей, у одного отдела, на одном компьютере?
- 📄 Что именно. Открытие базы, проведение документа, формирование отчёта, запись справочника?
Ответы сразу сужают поиск. Медленно у одного человека — смотрите его компьютер и сеть. Медленно у всех в 10 утра — блокировки или фоновые задания. Медленно только одно действие — код или запрос.
Инструменты платформы для диагностики
| Инструмент | Что показывает | Когда применять |
|---|---|---|
| Замер производительности (Конфигуратор) | Время и число вызовов по строкам кода | Тормозит конкретная операция |
| Технологический журнал | Долгие запросы к СУБД, ожидания на блокировках, взаимоблокировки | Медленно у многих, есть подозрение на блокировки |
| Консоль кластера | Сеансы, рабочие процессы, занятая память | Сервер «задыхается», процесс rphost растёт |
| Монитор ресурсов Windows | Загрузка диска, процессора, памяти и сети | Первая проверка железа |
| Журнал регистрации | Ошибки и длительные транзакции по времени | Разбор ситуаций задним числом |
Замер в Конфигураторе: запустите отладку (F5), в Конфигураторе выберите Отладка → Замер производительности, выполните медленное действие в пользовательском режиме и остановите замер. Отсортируйте по колонке процента времени. Обычно 1–3 строки дают 80% задержки.
Технологический журнал: настройка за пять минут
Журнал включается файлом logcfg.xml в каталоге conf платформы, например C:\Program Files\1cv8\conf\. Пример, который ловит запросы дольше секунды и все проблемы с блокировками:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\techlog" history="24">
<event>
<eq property="name" value="DBMSSQL"/>
<ge property="duration" value="1000000"/>
</event>
<event>
<eq property="name" value="TTIMEOUT"/>
</event>
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<property name="all"/>
</log>
</config>
Для PostgreSQL замените DBMSSQL на DBPOSTGRS. В актуальных версиях платформы длительность пишется в микросекундах, поэтому 1000000 — это одна секунда.
Журнал растёт очень быстро. Выносите его на отдельный диск, ставьте history на сутки-двое и удаляйте logcfg.xml после сбора данных. Забытый техжурнал сам становится причиной тормозов.
Ускорение 1С на уровне СУБД: индексы, статистика, память
В клиент-серверном варианте большую часть времени работы 1С съедает СУБД. Запущенная база без обслуживания со временем замедляется в разы, хотя код не менялся.
MS SQL Server
- Ограничьте память. В свойствах сервера задайте
max server memory. Если 1С и SQL на одной машине, оставьте операционной системе и рабочим процессам 1С не меньше трети памяти. - Настройте план обслуживания. Ежедневно — обновление статистики, еженедельно — перестроение или реорганизация индексов. Запускайте ночью, когда в базе нет пользователей.
- Вынесите tempdb на быстрый диск. 1С активно пишет временные таблицы. Несколько файлов tempdb одинакового размера снимают конкуренцию за них.
- Разнесите данные и журнал транзакций по разным дискам, если это возможно.
Быстрое обновление статистики по всей базе вручную:
USE [имя_базы];
EXEC sp_updatestats;
PostgreSQL
- 🧠
shared_buffers— обычно около 25% оперативной памяти сервера. - 📊
effective_cache_size— около 50–75% памяти: подсказка планировщику, сколько данных лежит в кэше ОС. - 🔧
work_mem— память на сортировку для одной операции. Большое значение при многих пользователях быстро съедает RAM, поднимайте осторожно. - 🧹 Autovacuum не отключайте. Раз в неделю полезен ручной проход:
VACUUM ANALYZE;
Используйте сборку PostgreSQL, рекомендованную для 1С: в ней есть доработки под запросы платформы.
Файловая база
У файловой базы нет СУБД, которую можно настроить. Здесь работают три вещи: быстрый SSD, отсутствие антивирусной проверки файла 1Cv8.1CD и периодическое тестирование с реиндексацией (о нём ниже). Если пользователей больше 5–7 или база перевалила за несколько гигабайт, честный ответ — переходить на клиент-серверный вариант.
Настройка сервера 1С и кластера для быстрой работы
Сервер приложений редко бывает главной причиной тормозов, но неудачные настройки дают заметные провалы.
Что проверить в первую очередь
- Схема электропитания Windows — «Высокая производительность». В режиме «Сбалансированный» процессор сбрасывает частоту, и короткие запросы 1С выполняются медленнее.
- Исключения антивируса — каталог данных кластера (
srvinfo), каталог с базами, временные файлы. Сканирование каждого обращения к файлам кластера заметно замедляет работу. - Диск под
srvinfo— SSD. Там лежат журналы регистрации и сеансовые данные. - Сеть между сервером 1С и СУБД — минимальная задержка. Лучше всего оба на одной машине или в одной стойке.
Параметры рабочего сервера
Они задаются в консоли кластера, в свойствах рабочего сервера:
- Количество ИБ на процесс и Количество соединений на процесс — регулируют, сколько баз и пользователей обслуживает один rphost. При большом числе пользователей значение 0 (без ограничения) лучше заменить конкретным числом, чтобы нагрузка распределялась по процессам.
- Безопасный расход памяти за один вызов — защищает сервер от одного тяжёлого отчёта, который съест всю RAM.
- Диапазон портов рабочих процессов — проверьте, что он открыт в брандмауэре, иначе соединения будут подвисать.
Клиент сначала обращается к агенту сервера (порт 1540), затем к менеджеру кластера (1541) и рабочим процессам. Если открыт только 1540, вход в базу будет долгим или оборвётся.
Перезапуск службы «Агент сервера 1С:Предприятия» или принудительное завершение рабочего процесса обрывает сеансы всех пользователей без сохранения данных. Делайте это вне рабочего времени и предупреждайте людей заранее.
Режим блокировок
Если в техжурнале много событий TTIMEOUT, пользователи ждут друг друга. В конфигурации свойство «Режим управления блокировкой данных» должно стоять «Управляемый». Типовые конфигурации на 8.3 уже работают в управляемом режиме. Автоматический режим встречается в старых или сильно доработанных базах и при 20+ пользователях становится узким местом.
Рабочие места: почему 1С тормозит у одного пользователя
Если медленно на одном компьютере, а у коллег всё нормально, проблема почти всегда локальная.
- 🧽 Кэш платформы. Добавьте параметр
/ClearCacheв дополнительные параметры запуска базы (окно выбора базы →Изменить→ последняя страница) или удалите папки с длинными именами из%APPDATA%\1C\1cv8и%LOCALAPPDATA%\1C\1cv8при закрытой 1С. - 💻 Тип клиента. Тонкий клиент передаёт по сети меньше данных, чем толстый. Для удалённых офисов подходит веб-клиент или тонкий клиент через публикацию на веб-сервере.
- 📶 Сеть. Файловая база через Wi-Fi или VPN работает на порядок медленнее, чем по кабелю. Для удалённой работы используют терминальный сервер или публикацию базы.
- 🛡 Антивирус на клиенте. Исключите каталог кэша 1С и каталог базы, если она файловая.
- 🧩 Версия платформы. На клиенте должна стоять та же версия, что и на сервере. Иначе при каждом входе возможны долгие проверки и обновление клиента.
Тяжёлые настройки пользователя
Иногда тормозит только одна форма у одного человека. Причина — сохранённые настройки: отбор без индекса, отключённый период, десяток лишних колонок. В БП 3.0 и ЗУП 3.1 настройки пользователя сбрасывают в разделе Администрирование → Настройки пользователей и прав → Персональные настройки пользователей, там же можно скопировать их у коллеги, у которого всё работает быстро.
Регламентное обслуживание базы, которое реально ускоряет 1С
Большая часть замедлений накапливается постепенно. Регулярное обслуживание держит базу в форме.
Тестирование и исправление
Путь: Конфигуратор → Администрирование → Тестирование и исправление. Для ускорения полезны флажки «Реиндексация таблиц информационной базы» и «Сжатие таблиц информационной базы». Для файловой базы это главный способ вернуть скорость.
Перед тестированием и исправлением сделайте резервную копию базы — режим меняет данные, и прерванная операция может её повредить. Нужен монопольный доступ: пользователи должны выйти.
Итоги регистров
Если отчёты и проведение замедлились без видимых причин, проверьте итоги. В пользовательском режиме откройте Главное меню → Функции для технического специалиста → Стандартные → Управление итогами (пункт включается в параметрах программы). Там можно установить период
рассчитанных итогов на начало текущего месяца и пересчитать итоги
.
Чистка и фоновые задания
- 🗑 Удаление помеченных объектов — в разделе
Администрирование → Обслуживание. Тысячи помеченных документов увеличивают таблицы и мешают запросам. - 📜 Журнал регистрации. В Конфигураторе:
Администрирование → Настройка журнала регистрации. Уровень «Ошибки» вместо «Все события» и разбиение журнала по периодам снижают нагрузку на диск. - ⏱ Регламентные задания —
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Проверьте, не запускаются ли тяжёлые задачи (полнотекстовый индекс, загрузка курсов, обмены) в рабочие часы каждые несколько минут. - 🔍 Полнотекстовый поиск. Если он не нужен, отключите. Если нужен — переведите обновление индекса на ночь.
- 📦 Свёртка базы — для баз за много лет. Это серьёзная операция: делайте её на копии, проверяйте отчётность и только потом переносите результат.
Распределённая база (РИБ) и обмены
В РИБ и при обмене через планы обмена тормоза часто вызывает разросшаяся регистрация изменений. Если узел давно не синхронизировался, по нему копятся сотни тысяч записей. Что помогает:
- Синхронизировать узлы регулярно, не реже раза в день.
- Удалить из плана обмена узлы, которые больше не используются: регистрация по ним продолжает копиться.
- Не ставить обмены каждые 1–2 минуты в рабочее время без необходимости.
- Для больших объёмов увеличить интервал и обменивать данные пакетами ночью.
Код и запросы: что замедляет доработанную конфигурацию
Если база доработана, а замер показывает, что время уходит в код, ищите типовые антипаттерны. Ниже — то, что встречается в доработках постоянно.
Запрос в цикле
Самая частая причина. Для каждой строки табличной части выполняется отдельный запрос к базе. При 500 строках это 500 обращений к СУБД вместо одного. Правильно — собрать все ссылки в массив или временную таблицу и получить данные одним запросом.
// Медленно: обращение к базе на каждой итерации
Для Каждого Строка Из Товары Цикл
Вес = Строка.Номенклатура.Вес;
КонецЦикла;
// Быстро: один запрос по всем товарам
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Вес ИЗ Справочник.Номенклатура ГДЕ Ссылка В (&Список)";
Запрос.УстановитьПараметр("Список", Товары.ВыгрузитьКолонку("Номенклатура"));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Используем Выборка.Ссылка и Выборка.Вес
КонецЦикла;
Другие частые ошибки в запросах
| Проблема | Почему медленно | Как исправить |
|---|---|---|
Отбор виртуальной таблицы в ГДЕ | Сначала собираются все остатки, потом фильтруются | Условие — в параметры виртуальной таблицы |
| Обращение через точку у составного типа | Платформа соединяет все возможные таблицы | ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты) |
ИЛИ в условиях соединения | СУБД не может использовать индекс | Разбить на два запроса с ОБЪЕДИНИТЬ ВСЕ |
ОБЪЕДИНИТЬ без нужды | Лишняя сортировка для удаления дублей | ОБЪЕДИНИТЬ ВСЕ, если дублей быть не может |
| Соединение с подзапросом | Планировщик ошибается с оценкой строк | Временная таблица с индексом |
| Отбор по реквизиту без индекса | Полный просмотр таблицы | Свойство реквизита «Индексировать» |
Ошибки клиент-серверного взаимодействия
- 🔁 Много серверных вызовов из формы. Каждый вызов процедуры с директивой
&НаСервере— это обмен по сети. Пять вызовов подряд при открытии формы заметны пользователю. Собирайте их в один. - 📤 Передача формы целиком.
&НаСервереБезКонтекстане передаёт данные формы на сервер, и вызов становится лёгким. Используйте его везде, где данные формы не нужны. - 🔒 Длинные транзакции. Запрос к внешнему сервису или долгий расчёт внутри транзакции держат блокировку и заставляют ждать других. Выполняйте внешние действия до начала транзакции или после её завершения.
Не правьте типовую конфигурацию напрямую ради ускорения. Доработки выносите в расширение: так обновления пройдут без ручного сравнения и объединения.
Железо: когда оптимизация уже не поможет
Если обслуживание сделано, код чистый, а в мониторе ресурсов постоянно высокая очередь к диску или свободной памяти почти нет, упираетесь в железо. Порядок вложений по отдаче:
- SSD под базу данных и tempdb — самый заметный эффект.
- Оперативная память — чтобы рабочая часть базы помещалась в кэш СУБД.
- Процессор с высокой частотой на ядро. Платформа выполняет один вызов в одном потоке, поэтому частота важнее числа ядер.
Ориентир для клиент-серверной базы на 20–30 пользователей — 8 ядер, 32 ГБ памяти и NVMe-диски. Это стартовая точка для планирования, а не норматив: реальную потребность покажут замеры.