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

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

При активном документообороте, большом количестве пользователей (от 50–80 сеансов), наличии импортных поставок и распределении дополнительных расходов процедура закрытия месяца и расчета себестоимости может вызывать серьезные блокировки и зависания информационной базы. Разберем, как распределить нагрузку, ускорить вычисления и настроить автоматическое последовательное закрытие прошлых периодов с оповещением об ошибках.

Причины высокой нагрузки и блокировок при расчете себестоимости

Проанализируем механику расчета себестоимости по средней цене за месяц. В конфигурациях линейки «1С:Управление торговлей 11» расчет средней стоимости формирует систему линейных уравнений (СЛАУ). На длительность и ресурсоемкость процесса напрямую влияют следующие факторы:

  1. Накопление необработанных движений к концу месяца: если отложенные расчеты по взаиморасчетам и движениям партий не выполняются регулярно, процедура закрытия месяца вынуждена обрабатывать весь массив данных за 30 дней единовременно.
  2. Кольцевые перемещения и циклические затраты: перемещения между складами по кругу или перекрестное распределение дополнительных расходов приводят к сотням итераций математического решателя для достижения сходимости.
  3. Отрицательные остатки на складах: разрывы в остатках нарушают математическую модель, вынуждая алгоритм применять дополнительные корректирующие проводки и пересчеты.
  4. Блокировки таблиц СУБД: процедура расчета накладывает монопольные блокировки на регистры учета себестоимости и партий, что в многопользовательском режиме приводит к таймаутам и зависаниям клиентских сеансов.

Шаг 1. Разделение предварительного и окончательного расчета

Рассмотрим, как обеспечить пользователей актуальными данными в течение рабочего дня без блокировки базы. Для оперативной управленческой отчетности не требуется ежеминутный полный расчет средневзвешенной себестоимости со сложным решением СЛАУ.

  1. Предварительный расчет себестоимости: настроим регулярное выполнение регламентного задания Предварительный расчет себестоимости с интервалом в 1–2 часа или во время обеденного перерыва. Оно использует алгоритм скользящей оценки, не строит матрицу уравнений и практически не создает транзакционных блокировок для менеджеров.
  2. Фактический расчет себестоимости: выполнение процедуры Закрытие месяца и полного фактического расчета переносим строго на нерабочее (ночное) время.

Шаг 2. Настройка ежедневных регламентных заданий

Выясним причину долгого ночного закрытия: если запускать расчет раз в месяц, объем данных оказывается колоссальным. Чтобы сократить время ночного закрытия с нескольких часов до десятков минут, распределим нагрузку по дням:

  1. Включим и настроим ежедневное ночное расписание для регламентных заданий Выполнение отложенных движений по расчетам с клиентами и Выполнение отложенных движений по расчетам с поставщиками.
  2. Если используется партионный учет (или учет по ФИФО), настроим регламентное задание Формирование движений по партиям товаров на выполнение каждую ночь.
  3. При регулярном вводе документов задним числом ежедневный запуск отложенных движений позволяет пересчитывать только дельту измененных данных, а не перелопачивать весь массив за месяц.

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

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

Так как штатная обработка закрытия месяца рассчитана на интерактивный запуск одного периода, создадим собственное регламентное задание или внешнюю обработку. Логика работы алгоритма строится на вызове методов менеджера закрытия месяца в цикле по незакрытым периодам.

Посмотрим на пример структуры модуля для регламентного закрытия цепочки месяцев:


Процедура ВыполнитьАвтоматическоеЗакрытиеПериодов() Экспорт
    
    МассивОшибок = Новый Массив;
    ДатаНачала = ПолучитьДатуПервогоНезакрытогоМесяца();
    ДатаОкончания = НачалоМесяца(ТекущаяДата());
    
    ТекущийПериод = ДатаНачала;
    Пока ТекущийПериод < ДатаОкончания Цикл
        
        Попытка
            // Формирование и выполнение этапов закрытия месяца
            ПараметрыЗакрытия = Обработки.ЗакрытиеМесяца.Создать();
            ПараметрыЗакрытия.Период = ТекущийПериод;
            ПараметрыЗакрытия.ВыполнитьЗакрытиеМесяца();
            
            // Проверяем наличие ошибок в журнале или регистре сведений
            Если ПараметрыЗакрытия.ЕстьОшибкиВыполнения() Тогда
                МассивОшибок.Добавить("Ошибка при закрытии периода: " + Формат(ТекущийПериод, "ДФ=MM.yyyy"));
                Прервать; // Прерываем цепочку, если предыдущий месяц не закрылся
            КонецЕсли;
        Исключение
            ИнформацияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
            МассивОшибок.Добавить("Критический сбой за период " + Формат(ТекущийПериод, "ДФ=MM.yyyy") + ": " + ИнформацияОбОшибке);
            Прервать;
        КонецПопытки;
        
        ТекущийПериод = ДобавитьМесяц(ТекущийПериод, 1);
    КонецЦикла;
    
    Если МассивОшибок.Количество() > 0 Тогда
        ОтправитьУведомлениеОбОшибках(МассивОшибок);
    КонецЕсли;

КонецПроцедуры

Шаг 4. Настройка уведомлений по почте и SMS

Проанализируем отправку сообщений об ошибках при автоматическом ночном расчете:

  1. Электронная почта: используем встроенный механизм работы с системной учетной записью электронной почты через объект ИнтернетПочта или вызов процедур общего модуля УправлениеЭлектроннойПочтой. Формируем письмо с текстом возникших ошибок и списком проблемных документов.
  2. SMS-уведомления: для отправки SMS используем интеграцию со сторонним SMS-шлюзом через объект HTTPСоединение. Запрос отправляется при возникновении критических исключений во время выполнения регламентного задания.

Шаг 5. Оптимизация инфраструктуры и СУБД

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

  1. Настройка базы tempdb в MS SQL Server: расчет средневзвешенной стоимости генерирует интенсивную нагрузку на временные таблицы. Файлы tempdb должны быть вынесены на быстрые накопители (NVMe), а количество файлов данных tempdb должно быть разделено по числу физических ядер (обычно от 4 до 8 файлов равного фиксированного размера).
  2. Обслуживание индексов и статистики: регламентные процедуры дефрагментации/реиндексации и обязательного обновления статистик (с параметром FULLSCAN) необходимо запускать непосредственно перед началом ночного закрытия месяца.
  3. Контроль отрицательных остатков: перед расчетом себестоимости необходимо регулярно формировать отчеты по остаткам и доступности товаров, устраняя пересортицу и списания «в минус», которые кратно увеличивают время решения уравнений себестоимости.
← На главную