Почему тормозит 1С:Управление торговлей 11 и как устранить конфликты блокировок?

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

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

Анализируем причину конфликта блокировок

Для начала разберем ситуацию, когда при проведении документа РеализацияТоваровУслуг или ПриобретениеТоваровУслуг возникает ошибка блокировки. Проанализируем стек вызова, который обычно выдает система. Чаще всего проблема локализуется в следующих объектах:

  1. Регистр сведений ГрафикПлатежей.
  2. Регистр накопления РасчетыСКлиентами.
  3. Регистр сведений АналитикаУчетаПоПартнерам.
  4. Механизмы распределения видов запасов (модуль ЗапасыСервер).

Когда мы видим в тексте ошибки обращение к РегистрСведений.ГрафикПлатежей.МодульМенеджера и метод Блокировка.Заблокировать(), это сигнализирует о том, что система пытается рассчитать график оплат в реальном времени. Если в транзакции участвует несколько пользователей, пытающихся провести документы по одному и тому же партнеру или заказу, возникает очередь, перерастающая в таймаут.

Решение 1: Сброс настроек механизма взаиморасчетов

Одним из самых эффективных и быстрых способов решения «зависших» блокировок в УТ 11 является манипуляция с настройками казначейства. Выясним причину: при использовании режима «Онлайн» система создает множество фоновых заданий и записей во внутренних таблицах для актуализации расчетов.

Рассмотрим алгоритм действий по «сбросу» этого механизма:

  1. Перейдем в раздел НСИ и администрирование — Настройка НСИ и разделов.
  2. Выберем пункт Казначейство и взаиморасчеты.
  3. Найдем раздел Взаиморасчеты и временно переключим режим с «Онлайн» на «Оффлайн (распределяется при закрытии месяца или фоновым заданием)».
  4. Сохраним настройки и подождем несколько минут, пока система завершит текущие процессы.
  5. Вернем настройку обратно в режим «Онлайн».

Этот простой метод часто помогает очистить «очередь» расчетов, которая могла накопиться из-за некорректно завершенных транзакций или программных сбоев.

Решение 2: Оптимизация работы с видами запасов

Проанализируем ситуацию, описанную в технологическом журнале (ТЖ). Ошибка часто возникает в методе ЗапасыСервер.ЗаполнитьВидыЗапасовПоТоварамОрганизаций. В УТ 11 механизм видов запасов отвечает за подбор конкретных партий (ГТД, поставщиков) при отгрузке. Если складские остатки «раздуты» или имеют отрицательные значения в разрезе ключей аналитики, запрос на подбор видов запасов начинает работать крайне медленно.

Что мы можем сделать:

  1. Проверить наличие «битых» записей в регистре сведений АналитикаУчетаНоменклатуры.
  2. Выполнить регламентную операцию «Исправление отрицательных остатков товаров организаций».
  3. В настройках системы рассмотреть возможность включения опции «Заполнять виды запасов при закрытии месяца». Это позволит перенести тяжелые вычисления с момента проведения первичного документа на этап регламентных процедур в конце периода.

Решение 3: Проверка технологического журнала и Журнала регистрации

Для глубокой диагностики нам необходимо понимать, кто именно является «виновником» блокировки. Рассмотрим пример записи из технологического журнала, предоставленный автором темы:


Context='Форма.Записать : Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента
...
ОбщийМодуль.ЗапасыСервер.Модуль : 5514 : Блокировка.Заблокировать();'

Если в журнале регистрации (ЖР) мы видим серые записи (незавершенные транзакции) других пользователей, проанализируем их действия. Часто бывает, что один пользователь открыл форму документа, система начала проведение, но из-за модального окна или долгого ожидания на сервере транзакция «повисла».

Рекомендуем обратить внимание на:

Решение 4: Настройка SQL-сервера и регламенты БД

Если база данных работает на MS SQL Server, проблема может крыться в настройках параллелизма. Проанализируем параметры MAXDOP (Max Degree of Parallelism). Для баз 1С рекомендуется устанавливать это значение в 1. Если SQL-сервер пытается распараллелить выполнение запроса к маленькой таблице (например, к ГрафикПлатежей), это может привести к блокировке всей таблицы целиком вместо конкретных строк.

Также важно регулярно выполнять обслуживание базы данных. Разберем основные шаги:

  1. Обновление статистики: Если статистика устарела, SQL выбирает неверный план запроса, что увеличивает время транзакции.
  2. Реиндексация и дефрагментация: Помогает ускорить чтение данных, особенно в тяжелых регистрах накопления.
  3. Очистка итогов: Проверим актуальность рассчитанных итогов. Если итоги рассчитаны на очень старую дату, система при каждом запросе будет пересчитывать данные «на лету» с начала времен.

Решение 5: Очистка регистра «График платежей»

Разберем конкретный пример кода, который часто вызывает проблемы. В модуле менеджера регистра ГрафикПлатежей вызывается установка блокировок. Если в таблице ТаблицаОбъектовОплаты передается пустой или слишком широкий набор данных, блокировка накладывается на избыточный диапазон.

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


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

Важно убедиться, что ТаблицаОбъектовОплаты содержит только необходимые ссылки. Если туда попадает Неопределено или пустая ссылка, система может заблокировать гораздо больше данных, чем требуется.

Резюме

Тормоза УТ 11 — это всегда комплексная проблема. Начните с переключения режима взаиморасчетов (это помогает в 80% случаев), затем проверьте настройки параллелизма на SQL и убедитесь, что в системе не висят незавершенные транзакции. Помните, что использование SSD не отменяет необходимости грамотной настройки индексов и регулярного обслуживания базы данных.

← На главную