Как ускорить проведение документа «Табель учета рабочего времени» в 1С?

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

Проблема медленного проведения документа Табель учета рабочего времени — одна из самых «болезненных» для крупных организаций, работающих в конфигурациях «1С:Зарплата и управление персоналом» или «1С:ERP». Ситуация, когда документ проводится 50 секунд и более, вызывает справедливое недовольство пользователей и снижает общую эффективность работы системы. В этой статье мы детально разберем, как локализовать проблему, проанализируем причины задержек и рассмотрим методы оптимизации, позволяющие сократить время выполнения операции в разы.

Шаг 1. Локализация проблемы с помощью инструментов диагностики

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

Рассмотрим основные инструменты, которые мы будем использовать для анализа:

  1. Замер производительности (Отладчик): Это первый и самый простой шаг. Включим замер производительности, проведем документ и проанализируем дерево вызовов. В обсуждаемом случае выяснилось, что процедура УдалитьЗаписиЗаПериодДокумента() занимает львиную долю времени — 30 секунд.
  2. Технологический журнал (ТЖ): Если замер производительности показывает, что время уходит на выполнение серверных методов работы с БД, нам поможет ТЖ. Настроим сбор событий DBMSSQL (или DBPOSTGRS) и SDBL. Это позволит увидеть конкретные SQL-запросы, которые выполняются при вызове метода Записать().
  3. Монитор производительности Windows: Поможет определить, не упирается ли сервер в производительность дисковой подсистемы или нехватку оперативной памяти при формировании наборов записей.

Шаг 2. Анализ кода и процедуры удаления записей

Проанализируем ситуацию, описанную в теме: основная задержка происходит в процедуре УдалитьЗаписиЗаПериодДокумента() при вызове метода НаборЗаписей.Записать(). Рассмотрим примерный код, который может вызывать такую задержку:


Процедура УдалитьЗаписиЗаПериодДокумента()
    // Создаем набор записей регистра расчета или накопления
    НаборЗаписей = РегистрыРасчета.ОсновныеНачисления.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
    
    // Попытка очистки старых движений перед новой записью
    // Именно этот метод часто становится "узким местом"
    НаборЗаписей.Записать(); 
КонецПроцедуры

Почему НаборЗаписей.Записать() может работать медленно? Выясним основные причины:

Шаг 3. Методологическая оптимизация: переход на «Метод отклонений»

Разберем фундаментальный способ ускорения работы, который часто игнорируют программисты, пытаясь «подкрутить» код. В 1С:ЗУП 3.1 документ Табель является избыточным в 90% случаев. Система способна рассчитывать зарплату на основании графиков работы и документов-отклонений (больничные, отпуска, прогулы).

Если мы откажемся от массового ввода табелей на всех сотрудников, нагрузка на регистры снизится колоссально. Рекомендуем использовать Табель только для регистрации тех случаев, которые невозможно зафиксировать иными документами. Переход на расчет по графикам — это самый эффективный способ «ускорения», так как документ просто перестает существовать.

Шаг 4. Настройка индексов и статистики SQL

Если методологический отказ от табеля невозможен, проанализируем ситуацию на уровне СУБД. Время в 30 секунд на запись часто свидетельствует о том, что SQL-сервер выбирает неверный план выполнения запроса. Выполним следующие действия:

  1. Обновление статистики: Устаревшая статистика заставляет SQL-сервер выполнять Index Scan вместо Index Seek. Выполним регламентную операцию UPDATE STATISTICS для таблиц регистров расчета.
  2. Реорганизация индексов: При интенсивной записи табелей индексы быстро фрагментируются. Настроим еженедельную (или даже ежедневную в период закрытия месяца) дефрагментацию индексов.
  3. Проверка аппаратных ресурсов: Убедимся, что файлы базы данных и логов транзакций расположены на быстрых SSD-дисках. Медленная запись лога транзакций (LDF) — классическая причина тормозов метода Записать().

Шаг 5. Технические приемы в коде 1С

Рассмотрим, что мы можем изменить непосредственно в конфигурации для ускорения процесса:

1. Использование привилегированного режима. Если задержка вызвана RLS, мы можем обернуть запись набора записей в привилегированный модуль. Рассмотрим пример:


УстановитьПривилегированныйРежим(Истина);
НаборЗаписей.Записать();
УстановитьПривилегированныйРежим(Ложь);

Это позволит системе игнорировать проверку прав доступа в момент записи в таблицы БД, что может ускорить процесс в несколько раз.

2. Дробление документов. Если в одном табеле 1000 сотрудников, время его проведения будет расти нелинейно. Порекомендуем пользователям разбивать табели по подразделениям. Документ на 50-100 строк проводится мгновенно, а суммарное время проведения десяти маленьких документов часто меньше, чем одного огромного, из-за особенностей работы с памятью и блокировками.

3. Отключение автоматических пересчетов. При записи табеля система часто пытается зарегистрировать необходимость пересчета зарплаты в регистре сведений ПересчетыЗарплаты. Проанализируем, насколько критично выполнять это немедленно. В ряде случаев регистрацию пересчетов можно вынести в фоновое задание, чтобы основной поток пользователя не простаивал.

Резюме

Для ускорения проведения табеля мы рекомендуем действовать комплексно:

  1. Выявить конкретную команду, вызывающую задержку (обычно это НаборЗаписей.Записать()).
  2. Проверить актуальность итогов регистров и статистику SQL-сервера.
  3. Рассмотреть возможность отказа от документа в пользу «метода отклонений».
  4. Если документ необходим — использовать привилегированный режим для записи и дробить крупные документы на мелкие.

Следуя этим шагам, можно добиться сокращения времени проведения документа с 50 секунд до приемлемых 2–5 секунд даже на больших объемах данных.

← На главную