Длительное проведение документов перемещения и списания товаров — одна из наиболее распространенных проблем в конфигурациях «1С:Управление производственным предприятием» (особенно редакции 1.2) при длительной эксплуатации базы данных. Документы могут выполняться по несколько сотен секунд или вызывать полную блокировку работы пользователей. Разберем по шагам, почему возникает эта проблема и какие методы позволяют вернуть системе нормальное быстродействие.
Прежде чем вносить изменения в конфигурацию или настройки сервера, выясним точное место в программном коде, на котором выполнение транзакции останавливается. Для этого выполним профилирование:
ПеремещениеТоваров.В абсолютном большинстве случаев наибольший процент времени занимают запросы к таблицам остатков регистров ТоварыНаСкладах, ПартииТоваровНаСкладах или модули проведения по партиям.
В конфигурациях УПП 1.2 при включенном режиме списания партий в момент проведения документа выполняется сложный расчет себестоимости и подбор конкретных партий в онлайн-режиме. Это приводит к длительным транзакциям и блокировкам таблиц. Рассмотрим, как оптимизировать этот процесс:
ПроведениеПоПартиям.При таком подходе документ ПеремещениеТоваров фиксирует только количественные движения и проводится за доли секунды, не блокируя параллельную работу других пользователей.
Если в базе данных длительное время не производился сдвиг границы рассчитанных итогов, платформа 1С при получении остатков вынуждена рассчитывать их не по предварительно агрегированным таблицам итогов, а путем сканирования всех физических записей движений за много лет. Разберем, как восстановить актуальность итогов:
ТоварыНаСкладах, ТоварыОрганизаций, ПартииТоваровНаСкладах).Временное ускорение проведения после перезагрузки сервера указывает на проблему с кэшем планов выполнения (Plan Cache) и неактуальной статистикой распределения данных. Настроим регламентное обслуживание СУБД:
EXEC sp_updatestats;
Или для конкретных тяжелых таблиц движений:
UPDATE STATISTICS _AccumRgTxxxx WITH FULLSCAN;
REORGANIZE) или перестроение индексов (REBUILD), чтобы исключить разрастание индексных страниц.Max Degree of Parallelism = 1 (или по числу ядер на одном NUMA-узле) и увеличим Cost Threshold for Parallelism до 50, чтобы сложные запросы не вызывали взаимных ожиданий потоков CXPACKET.По умолчанию конфигурация УПП 1.2 работает в автоматическом режиме блокировок (уровень изоляции Serializable в MS SQL). Это вызывает эскалацию блокировок до уровня целых таблиц регистров. Проанализируем архитектурные доработки для устранения блокировок:
ОбработкаПроведения модуля документа добавим явную установку управляемой блокировки только по тем складам и позициям номенклатуры, которые присутствуют в табличной части:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ТабличнаяЧастьТовары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "СкладПолучатель");
Блокировка.Заблокировать();
Если база данных накопила десятилетнюю историю с большим числом незакрытых партий и остатков с отрицательными значениями, оптимизация старых запросов с подзапросами в УПП 1.2 может потребовать несоразмерных затрат времени. В этом случае наиболее эффективным решением является переход на редакцию 1.3 с использованием режима РАУЗ (Расширенная аналитика учета затрат), где онлайн-расчет партий полностью исключен из документов движения, либо перенос актуальных остатков в новую чистую информационную базу.