При работе в высоконагруженных системах (250–300 одновременных пользователей) на базе конфигурации «1С:Управление производственным предприятием 1.2» проведение ключевых документов, таких как Заказ покупателя, может занимать неразумно много времени — 8 секунд и более. Замеры производительности встроенными средствами платформы 1С часто не показывают единого «тяжелого» узкого места: суммарная задержка складывается из сотен мелких вызовов, цикличных запросов и блокировок СУБД.
Рассмотрим комплексный подход к решению этой проблемы: от оптимизации исходного кода 1С до настройки параметров MS SQL Server и управления транзакционными блокировками.
В сильно доработанных (переписанных) конфигурациях основной причиной медленного проведения является накопленный неоптимальный код. Проанализируем алгоритмы модуля проведения документа и общих модулей:
Движения.ИмяРегистра.Записать() не должны выполняться пошагово в нескольких местах процедуры проведения. Формируем все движения в памяти и записываем их один раз при завершении транзакции.ПередЗаписью, ПриЗаписи и ОбработкаПроведения (логирование изменений, аудит, интеграционные шины). Они выполняются последовательно в той же транзакции, создавая значительный суммарный оверхед. Неприоритетные задачи следует выносить в фоновые задания.При большом числе пользователей одновременное проведение документов с оперативным списанием партий создает сильнейшую нагрузку на регистры накопления. Разберем по шагам, как проверить влияние партионного учета на скорость работы:
Заказ покупателя и других торговых документов в течение рабочего дня.Если замеры показали ощутимый прирост скорости, переведем систему на постоянное оффлайн-списание партий (допроведение регламентным заданием в ночное время или через специализированные планы обмена).
Конфигурация 1С:УПП 1.2 создавалась под платформу 8.1 и по умолчанию использует автоматический режим блокировок. При автоматических блокировках СУБД блокирует целые таблицы регистров с помощью HOLDLOCK / XLOCK, что приводит к долгому ожиданию освобождения ресурсов другими пользователями.
Для устранения этой проблемы переведем режим управления блокировкой данных в конфигурации на Управляемый и автоматический и пропишем явные управляемые блокировки в коде проведения перед выполнением чтений и записей к регистрам.
Пример явной установки управляемой блокировки в коде 1С:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ТаблицаТоваров;
ЭлементБлокировки.ИспользоватьИзДокумента("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
После перевода тяжелых участков на управляемые блокировки включим на MS SQL Server режим версиирования строк Read Committed Snapshot Isolation (RCSI). Это позволит читающим запросам (например, отчетам или проверкам остатков) не блокировать пишущие транзакции и не ждать их завершения.
На стороне СУБД выполним следующие критически важные настройки для платформы 1С:
MAXDOP = 1. Это запрещает СУБД распараллеливать одиночные запросы, предотвращая задержки синхронизации потоков (ожидания CXPACKET), которые особенно ощутимы при большом количестве мелких вызовов.TempDB (по числу логических ядер процессора, но не более 8) одинакового начального размера. Это устраняет узкое место на служебных страницах (ожидания PAGELATCH).Применяя данный комплекс мер — оптимизацию кода 1С, перевод на оффлайн-партионный учет, перенастройку блокировок и СУБД — удается снизить время проведения документа Заказ покупателя с 8 секунд до 0.5–1 секунды при высокой активности пользователей.