Как автоматизировать перевод заказов в статус «К отгрузке» и ускорить создание расходных ордеров в УТ 11.5?

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

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

Автоматизация действия «Отгрузить» и управление статусами обеспечения

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

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

Разберем алгоритм автоматизации:

  1. Использование механизма «Назначений» (обособленное обеспечение). Если при заказе товара поставщику вы указываете конкретный заказ клиента, товар приходуется сразу «под него».
  2. Внедрение подписки на событие при проведении прихода. Программа должна анализировать остатки по регистру ЗапасыИПотребности и, если свободный остаток покрывает потребность по конкретному ЗаказуКлиента, программно менять ВариантОбеспечения на Отгрузить.

Важно помнить, что статус «Отгрузить» — это лишь команда для склада. Чтобы склад увидел распоряжение, должны быть созданы складские документы.

Почему создание расходных ордеров занимает 7 секунд и более?

Ситуация, когда один ордер создается 7–10 секунд, недопустима при потоке в 500+ клиентов. Проанализируем основные причины такой медлительности 1С:

Во-первых, транзакционные блокировки. При создании ордера система выполняет множество проверок: контроль остатков, проверку статусов, соответствие распоряжению. Если вы запускаете процесс пакетно, 1С пытается провести документы последовательно. Каждый следующий документ ждет, пока завершится запись движений по регистрам предыдущего.

Во-вторых, неоптимальный код поиска данных. Как часто бывает, «штатные кодеры» пишут запросы, которые ищут данные в табличных частях документов (ЗаказКлиента.Товары), вместо того чтобы обращаться к индексированным регистрам накопления. Поиск по строкам документов — это прямой путь к деградации производительности.

Рассмотрим пример того, как НЕ НУЖНО делать (поиск по ТЧ):


// Плохой пример: медленный поиск
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.ЗаказКлиента.Товары ГДЕ Номенклатура = &Номенклатура"; 

Вместо этого необходимо использовать остатки из регистров:


// Правильный пример: использование регистров с индексами
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Остатки.ЗаказКлиента ИЗ РегистрНакопления.ЗапасыИПотребности.Остатки(&МоментВремени, ) КАК Остатки";

Метод ускорения №1: Многопоточность (Фоновые задания)

Чтобы сократить время ожидания с 2 часов до 15 минут, мы должны заставить сервер работать параллельно. Разберем, как это реализовать. Вместо одного процесса, создающего все 500 ордеров, создадим диспетчер, который разделит список заказов на «пачки» (например, по 50 штук) и запустит их обработку в разных фоновых заданиях.

Посмотрим на пример логики запуска фоновых потоков:


ПараметрыЗадания = Новый Структура("СписокЗаказов", ТекущаяПачка);
ФоновыеЗадания.Выполнить("МойМодульСервер.СоздатьОрдераПоСписку", ПараметрыЗадания);

При таком подходе нагрузка распределяется по ядрам процессора сервера, и транзакционные ожидания минимизируются, так как потоки работают с разными группами данных.

Метод ускорения №2: Отложенное проведение и работа по факту

Проанализируем ситуацию на складе: кладовщики ждут, пока распечатаются бумажки или появятся ордера в ТСД. Мы можем изменить бизнес-процесс:

  1. Программа создает расходные ордера в статусе «Подготовлено» без проведения (запись объекта без проведения происходит почти мгновенно).
  2. Кладовщик на ТСД видит список товаров к сборке, основываясь на заказах со статусом «К отгрузке», а не на ордерах.
  3. Ордер проводится автоматически «под капотом» только в момент, когда кладовщик отсканировал последнюю позицию.

Это концепция WMS (Warehouse Management System). В УТ 11.5 можно реализовать её элементы, не покупая отдельную систему, если правильно настроить рабочие места кладовщиков.

Технические «хитрости» для программиста

Рассмотрим еще несколько важных моментов, которые замедляют систему:

1. RLS (Record Level Security). Если у пользователя склада настроены ограничения прав на уровне записей (например, «видеть только свои заказы»), 1С будет добавлять сложные условия в каждый запрос при создании документа. Это может замедлить процесс в 2–3 раза. Решение: выполняйте процедуру создания ордеров в привилегированном модуле на стороне сервера.

2. Избыточные подписки на события. Проверьте, сколько расширений «цепляется» за проведение ордера. Часто там сидят механизмы отправки SMS, уведомлений в Telegram или пересчета каких-то аналитик. Все эти действия нужно выносить в очередь заданий, чтобы они не тормозили запись основного документа.

3. Индексация уникальных ID. Если вы используете ID строки поставщика для связи, убедитесь, что этот ID хранится в индексируемом дополнительном реквизите или измерении регистра. Без индекса поиск соответствия между «приходом» и «заказом» будет заставлять сервер перебирать миллионы строк (Full Scan), что и дает те самые 7 секунд на документ.

Подведем итоги

Для решения проблемы медленной отгрузки мы рекомендуем:

Выяснив истинную причину задержек — будь то блокировки базы данных или неоптимальный код — вы сможете обеспечить бесперебойную работу склада даже при кратном росте заказов.

← На главную