Как оптимизировать и ускорить проведение документа «Заказ покупателя» в 1С:УПП 1.2 на платформе 8.2?

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

При работе в высоконагруженных системах (250–300 одновременных пользователей) на базе конфигурации «1С:Управление производственным предприятием 1.2» проведение ключевых документов, таких как Заказ покупателя, может занимать неразумно много времени — 8 секунд и более. Замеры производительности встроенными средствами платформы 1С часто не показывают единого «тяжелого» узкого места: суммарная задержка складывается из сотен мелких вызовов, цикличных запросов и блокировок СУБД.

Рассмотрим комплексный подход к решению этой проблемы: от оптимизации исходного кода 1С до настройки параметров MS SQL Server и управления транзакционными блокировками.

1. Ревизия модуля проведения и доработанных механизмов

В сильно доработанных (переписанных) конфигурациях основной причиной медленного проведения является накопленный неоптимальный код. Проанализируем алгоритмы модуля проведения документа и общих модулей:

  1. Исключим запросы внутри циклов. Убедимся, что проверка остатков, цен, скидок и статусов контрагентов выполняется не для каждой строки табличной части отдельно, а единым пакетным запросом по всем строкам документа.
  2. Уберем лишние записи наборов записей. Вызовы метода Движения.ИмяРегистра.Записать() не должны выполняться пошагово в нескольких местах процедуры проведения. Формируем все движения в памяти и записываем их один раз при завершении транзакции.
  3. Оптимизируем работу с характеристиками номенклатуры. В 1С:УПП присутствует особенность: если у позиции номенклатуры заведено свыше нескольких сотен или тысяч характеристик, стандартные механизмы проверок могут выполнять избыточные соединения таблиц. Если номенклатура содержит массивные списки характеристик, проверим запросы на предмет соединения строго по нужной характеристике, а не по всему справочнику.
  4. Проверим подписки на события. Часто при развитии базы добавляются подписки на события ПередЗаписью, ПриЗаписи и ОбработкаПроведения (логирование изменений, аудит, интеграционные шины). Они выполняются последовательно в той же транзакции, создавая значительный суммарный оверхед. Неприоритетные задачи следует выносить в фоновые задания.

2. Отключение оперативного партионного учета

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

  1. Установим запрет редактирования прошлых периодов.
  2. В настройках параметров учета отключим флаг оперативного проведения по партиям (выполнять операцию следует в монопольном режиме перед началом рабочего дня).
  3. Замерим скорость проведения документа Заказ покупателя и других торговых документов в течение рабочего дня.
  4. Вечером включим галку обратно и запустим регламентную обработку «Проведение по партиям» за прошедший день.

Если замеры показали ощутимый прирост скорости, переведем систему на постоянное оффлайн-списание партий (допроведение регламентным заданием в ночное время или через специализированные планы обмена).

3. Перевод на управляемые блокировки и настройка RCSI

Конфигурация 1С:УПП 1.2 создавалась под платформу 8.1 и по умолчанию использует автоматический режим блокировок. При автоматических блокировках СУБД блокирует целые таблицы регистров с помощью HOLDLOCK / XLOCK, что приводит к долгому ожиданию освобождения ресурсов другими пользователями.

Для устранения этой проблемы переведем режим управления блокировкой данных в конфигурации на Управляемый и автоматический и пропишем явные управляемые блокировки в коде проведения перед выполнением чтений и записей к регистрам.

Пример явной установки управляемой блокировки в коде 1С:


Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ТаблицаТоваров;
ЭлементБлокировки.ИспользоватьИзДокумента("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();

После перевода тяжелых участков на управляемые блокировки включим на MS SQL Server режим версиирования строк Read Committed Snapshot Isolation (RCSI). Это позволит читающим запросам (например, отчетам или проверкам остатков) не блокировать пишущие транзакции и не ждать их завершения.

4. Настройка сервера базы данных MS SQL Server

На стороне СУБД выполним следующие критически важные настройки для платформы 1С:

  1. Настройка MAXDOP (Max Degree of Parallelism): Для базы 1С установим значение MAXDOP = 1. Это запрещает СУБД распараллеливать одиночные запросы, предотвращая задержки синхронизации потоков (ожидания CXPACKET), которые особенно ощутимы при большом количестве мелких вызовов.
  2. Оптимизация TempDB: Создадим несколько файлов данных для базы TempDB (по числу логических ядер процессора, но не более 8) одинакового начального размера. Это устраняет узкое место на служебных страницах (ожидания PAGELATCH).
  3. Фиксированный шаг авторасширения (Autogrow): Зададим фиксированный размер прироста файлов базы данных и файла журнала транзакций (например, 512 МБ или 1024 МБ) вместо прироста в процентах. Это исключит замораживание транзакций проведения при выделении нового дискового пространства.

Применяя данный комплекс мер — оптимизацию кода 1С, перевод на оффлайн-партионный учет, перенастройку блокировок и СУБД — удается снизить время проведения документа Заказ покупателя с 8 секунд до 0.5–1 секунды при высокой активности пользователей.

← На главную