Когда 1С тормозит, первая мысль — купить сервер помощнее или «почистить базу». Нередко деньги уходят мимо причины: виноваты бывают сеть до файловой базы, антивирус, фоновое задание, блокировка между пользователями или неудачный запрос в доработке. Бывает и так, что 1С зависает на минуту-другую, а потом «отпускает».
Первая часть статьи — для владельца бизнеса и бухгалтера: что проверить самому без риска для данных. Вторая — для программиста: как измерить, где теряется время.
Специалисту важнее всего точное описание симптома: что медленно (вся программа, запуск, документ или отчёт), у кого, когда (постоянно, в определённые часы, после обновления) и насколько (засеките секунды).
| Симптом | Что это обычно значит | С чего начать |
|---|---|---|
| Медленно всё и у всех | Перегружен сервер, сеть, диск или идёт тяжёлое фоновое задание | Нагрузка на сервер, свободное место, активные задания |
| Медленно у одного пользователя | Его компьютер, сеть до него, кэш, антивирус, права | Перезапуск, очистка кэша, та же операция на другом ПК |
| Долго проводится один документ или строится один отчёт | Код или запрос, выросший объём данных | Замер производительности |
| «Замирает» время от времени или в одни и те же часы | Ожидание блокировки, фоновое задание, обмен, резервное копирование | Расписание заданий, технологический журнал |
Строка соединения с базой видна в «Справка → О программе» (в «Такси» — меню с тремя полосками) и в окне выбора баз под списком.
File="..." — файловая: все данные в одном файле 1Cv8.1CD на компьютере или сетевом диске.Srvr="..."; Ref="..." — клиент-серверная: сервер 1С и отдельная СУБД (MS SQL Server, PostgreSQL).ws="http://..." — подключение через веб-сервер; какая база за ним, уточните у администратора.Файловая база хорошо работает, пока пользователей немного и они в одной локальной сети. В файловом режиме каждый компьютер сам читает файл базы по сети, поэтому на медленном канале 1С тормозит по сети тем сильнее, чем больше людей работают одновременно; Wi-Fi и VPN — частый источник жалоб.
Проверки ниже данные не меняют. Если пойдёте дальше, сначала сохраните копию базы; «Тестирование и исправление» в конфигураторе без копии не запускайте.
/ClearCache (в окне выбора баз: «Изменить» → дополнительные параметры запуска), потом параметр уберите. Данные базы это не затрагивает.Надпись «Не отвечает» в заголовке значит лишь, что окно 1С несколько секунд не обрабатывает сообщения Windows. Обычно программа висит не намертво: внутри идёт проведение, закрытие месяца или большой отчёт, и лучше подождать.
Ctrl+Break срабатывает, только если операция сама проверяет прерывание, — так бывает в обработках с долгими циклами. Проведение, закрытие месяца или отчёт на сервере так не остановить.Задача — не гадать, а измерить: замер конкретной операции, технологический журнал по всей базе, тест Гилёва для инфраструктуры.
Жалоба на одну операцию — начните с отладчика: в режиме отладки включите «Отладка → Замер производительности», выполните операцию и остановите замер. Серверный код клиент-серверной базы попадёт в замер, только если на сервере 1С разрешена отладка. Платформа покажет строки модулей с долей времени; обычно всё съедают две-три: запрос в цикле, реквизиты «через точку» в цикле, лишние серверные вызовы. Замеряйте на копии с реальным объёмом данных: пустая база покажет, что «всё летает». Подробно по шагам — в статье про замер производительности.
Если непонятно, что тормозит, или проблема плавающая, включайте технологический журнал. Его настраивает файл logcfg.xml в каталоге conf платформы там, где выполняется серверный код: на сервере 1С, а для файловой базы — на компьютере пользователя или на веб-сервере публикации. Пример собирает все события дольше 5 секунд и отдельно — таймауты и взаимоблокировки управляемых блокировок.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<!-- Все события дольше 5 секунд -->
<log location="D:\techlog\long" history="24">
<event>
<ne property="Name" value=""/>
<ge property="Durationus" value="5000000"/>
</event>
<property name="all"/>
</log>
<!-- Таймауты и взаимоблокировки управляемых блокировок -->
<log location="D:\techlog\locks" history="24">
<event>
<eq property="Name" value="TTIMEOUT"/>
</event>
<event>
<eq property="Name" value="TDEADLOCK"/>
</event>
<property name="all"/>
</log>
</config>
Durationus задаётся в микросекундах (5000000 — 5 секунд), history — в часах хранения. <property name="all"/> пишет все свойства события, включая контекст — строку модуля, откуда пришёл вызов; TTIMEOUT и TDEADLOCK показывают, кто кого ждал.
Журнал растёт быстро: пишите его на диск со свободным местом и отключайте, когда данные собраны. Службе сервера 1С нужно право записи в папку логов, иначе журнал не появится. Другие события и разбор файлов — в статье о настройке технологического журнала.
Тест Гилёва — бесплатная конфигурация стороннего автора: её разворачивают отдельной базой на том же сервере и СУБД, что и рабочая, и она прогоняет синтетическую нагрузку с оценкой в условных единицах.
Что показывает: как связка «процессор — память — диск — СУБД — сервер 1С — сеть» справляется с типовой нагрузкой. Удобно сравнить два сервера или замеры до и после смены настроек и заметить провал, например из-за режима энергосбережения процессора.
Чего не показывает: неоптимальные запросы и код вашей конфигурации, ожидания на блокировках между вашими пользователями. Высокий балл не гарантирует быстрого проведения, а низкий не доказывает вину сервера. Как установить, запустить и читать результат — в статье про тест Гилёва.
Для первого впечатления удобна маленькая внешняя обработка: замер пустого вызова сервера, цикла вычислений и коротких запросов плюс список сеансов и активных фоновых заданий. Ценны не абсолютные цифры, а сравнение рабочих мест, утра и вечера, «до» и «после».
Код обходится без СтрШаблон, СтрНайти и СтрСоединить: обработка компилируется в режиме совместимости конфигурации, а ниже 8.3.6 (УТ 10.3, УПП) эти функции дают ошибку «Процедура или функция с указанным именем не определена». Форма управляемая, и в обычном приложении такой конфигурации она может не открыться. Тогда запустите базу в режиме управляемого приложения: тонким клиентом или толстым с параметром /RunModeManagedApplication (там же, где /ClearCache), а после проверки параметр уберите. Если старая конфигурация в этом режиме не стартует, обойдитесь замером и техжурналом.
Создайте внешнюю обработку с управляемой основной формой, вставьте код в модуль формы, добавьте команду ВыполнитьДиагностику с действием — одноимённой процедурой — и перетащите её в командную панель. Открывайте через «Файл → Открыть» под администратором: без права на интерактивное открытие внешних обработок её не открыть, а без административных прав видны не все сведения.
// Внешняя обработка «Быстрая диагностика»: модуль управляемой формы.
// На форме одна команда ВыполнитьДиагностику с действием — одноимённой процедурой.
// Платформа 8.3. Строковые функции 8.3.6 не используются, поэтому код подходит
// и для конфигураций в режиме совместимости 8.2. Запускайте под администратором;
// конфигурацию на обычных формах откройте в режиме управляемого приложения.
&НаКлиенте
Процедура ВыполнитьДиагностику(Команда)
Результат = Новый ТекстовыйДокумент;
// 1. Пустой вызов сервера: задержка между клиентом и сервером 1С
КоличествоВызовов = 20;
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Номер = 1 По КоличествоВызовов Цикл
ПустойВызовСервера();
КонецЦикла;
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Результат.ДобавитьСтроку("Пустой вызов сервера: "
+ Формат(Длительность / КоличествоВызовов, "ЧДЦ=1; ЧН=0")
+ " мс в среднем (вызовов: " + Формат(КоличествоВызовов, "ЧГ=0") + ")");
// 2. Замеры и сведения, которые собираются на сервере
Для Каждого ТекстСтроки Из ДиагностикаНаСервере() Цикл
Результат.ДобавитьСтроку(ТекстСтроки);
КонецЦикла;
Результат.Показать("Быстрая диагностика 1С");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПустойВызовСервера()
// Намеренно пусто: измеряем только накладные расходы на вызов
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДиагностикаНаСервере()
Строки = Новый Массив;
// Режим работы базы и компьютер, на котором выполняется серверный код
ФайловаяБаза = (Найти(ВРег(СтрокаСоединенияИнформационнойБазы()), "FILE=") = 1);
Если ФайловаяБаза Тогда
Строки.Добавить("Файловая база, серверный код выполняется на компьютере " + ИмяКомпьютера());
Иначе
Строки.Добавить("Клиент-серверная база, сервер 1С: " + ИмяКомпьютера());
КонецЕсли;
// Вычисления без обращения к базе: скорость одного потока процессора
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сумма = 0;
Для Номер = 1 По 1000000 Цикл
Сумма = Сумма + Номер % 7;
КонецЦикла;
Строки.Добавить("Цикл из 1 000 000 операций: "
+ Формат(ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало, "ЧГ=0; ЧН=0") + " мс");
// Серия коротких запросов: задержка до СУБД или до файла базы
ИмяСправочника = "";
Для Каждого ОбъектМетаданных Из Метаданные.Справочники Цикл
ИмяСправочника = ОбъектМетаданных.Имя;
Прервать;
КонецЦикла;
Если ЗначениеЗаполнено(ИмяСправочника) Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка КАК Ссылка ИЗ Справочник." + ИмяСправочника + " КАК Т";
КоличествоЗапросов = 100;
Попытка
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для Номер = 1 По КоличествоЗапросов Цикл
Запрос.Выполнить();
КонецЦикла;
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Строки.Добавить("Короткий запрос к базе: "
+ Формат(Длительность / КоличествоЗапросов, "ЧДЦ=2; ЧН=0")
+ " мс в среднем (запросов: " + Формат(КоличествоЗапросов, "ЧГ=0") + ")");
Исключение
Строки.Добавить("Запрос к справочнику не выполнен: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
// Сеансы: кто сейчас в базе и с какого времени
Попытка
Сеансы = ПолучитьСеансыИнформационнойБазы();
Строки.Добавить("Сеансов в базе: " + Формат(Сеансы.Количество(), "ЧГ=0; ЧН=0"));
Для Каждого Сеанс Из Сеансы Цикл
ИмяПользователя = "";
Если Сеанс.Пользователь <> Неопределено Тогда
ИмяПользователя = Сеанс.Пользователь.Имя;
КонецЕсли;
Строки.Добавить(" №" + Формат(Сеанс.НомерСеанса, "ЧГ=0")
+ " | " + ПредставлениеПриложения(Сеанс.ИмяПриложения)
+ " | " + ИмяПользователя
+ " | " + Сеанс.ИмяКомпьютера
+ " | с " + Формат(Сеанс.НачалоСеанса, "ДЛФ=DT"));
КонецЦикла;
Исключение
Строки.Добавить("Список сеансов недоступен: " + ОписаниеОшибки());
КонецПопытки;
// Активные фоновые задания: что сейчас выполняется «за кадром»
Попытка
Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
АктивныеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Строки.Добавить("Активных фоновых заданий: " + Формат(АктивныеЗадания.Количество(), "ЧГ=0; ЧН=0"));
Если ФайловаяБаза Тогда
Строки.Добавить(" (файловая база: видны только задания, запущенные в этом процессе)");
КонецЕсли;
Для Каждого Задание Из АктивныеЗадания Цикл
Строки.Добавить(" " + Задание.Наименование
+ " | " + Задание.ИмяМетода
+ " | запущено " + Формат(Задание.Начало, "ДЛФ=DT"));
КонецЦикла;
Исключение
Строки.Добавить("Список фоновых заданий недоступен: " + ОписаниеОшибки());
КонецПопытки;
Возврат Строки;
КонецФункции
ПустойВызовСервера() ничего не делает: время уходит только на передачу вызова, и в удалённом офисе оно заметно больше, чем в локальной сети.ВЫБРАТЬ ПЕРВЫЕ 1 повторяется с данными уже в кэше: в клиент-серверной базе это в основном задержка между сервером 1С и СУБД, в файловой — скорость доступа к файлу базы (для сетевой папки вместе с сетью).Разбор первой ошибки — как найти, кто кого ждёт, и переписать код — в статье про конфликт блокировок в 1С.
Обычно дело в рабочем месте: память, диск, антивирус, сеть до сервера, кэш. Проверьте ту же операцию на другом компьютере и под другим пользователем, как в шаге 3.
Если упираетесь в сеть и число одновременных пользователей — как правило, да; альтернативы — веб-публикация или удалённый рабочий стол. Но выбирайте после диагностики: если медленный отчёт из-за неудачного запроса, переезд проблему не решит.
Частично: сбросьте кэш, добавьте папку базы в исключения антивируса, перенесите резервное копирование на нерабочее время и не работайте с файловой базой через Wi-Fi и VPN. Если медленно проводится конкретный документ или строится отчёт, дело в коде, и это работа программиста.
Зависит от базы и симптома: для жалобы на один отчёт хватает замера, плавающие тормоза требуют техжурнала за несколько рабочих дней. Ориентиры — на странице стоимости доработки.
Если простые проверки не помогли, опишите симптом по шагу 1 и передайте задачу программисту: диагностика и оптимизация есть в услугах по ускорению 1С. Разместите задачу — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.