В крупных торговых и производственных компаниях, использующих многозоновую складскую структуру, распределение запасов — одна из ключевых ежедневных задач. Часто возникает ситуация: у компании есть несколько складов снабжения (например, Склад 1 и Склад 2), а также центральный склад или розничные точки, на которые необходимо перемещать товары по мере возникновения дефицита. Логисты сталкиваются с проблемой: как сделать так, чтобы система 1С:ERP или 1С:Управление торговлей 11 сама определяла, на каком именно складе сейчас есть свободный остаток нужной номенклатуры, и автоматически подставляла его в качестве источника (отправителя) при формировании заказов на перемещение.
В этой статье мы подробно проанализируем, почему возникает эта проблема, рассмотрим типовые механизмы программы, разберем их ограничения и настроим обходные пути решения этой задачи без привлечения программистов, а также заглянем в сторону кастомизации алгоритмов обеспечения.
Допустим, у нас в системе настроена единая Схема обеспечения для розничной сети или удаленного склада-получателя. Схема подразумевает тип обеспечения Перемещение. В нашей компании числятся два склада-поставщика (Склад 1 и Склад 2). Возникает потребность в двух позициях:
Когда менеджер запускает стандартный помощник Формирование заказов по потребностям, система видит общую потребность в товарах, но при использовании единого общего способа перемещения для «работы с несколькими складами» программа не может «на лету» распределить строки по складам-отправителям на основании текущих свободных остатков. Логисту приходится вручную заходить в каждую строчку и указывать склад-отправитель. Если позиций в заказе сотни, процесс превращается в рутину с высоким риском ошибок.
Выясним, какие варианты настройки предлагает нам типовой функционал 1С:ERP и 1С:УТ 11 для автоматизации или упрощения этого процесса.
---
Если в вашей компании ассортимент жестко закреплен за конкретными складами-источниками (например, Товар 1 всегда хранится и отгружается только со Склада 1, а Товар 2 — только со Склада 2), то самым надежным и простым решением будет разделение способов обеспечения.
Рассмотрим по шагам, как настроить эту схему:
При таком подходе во время работы помощника Формирование заказов по потребностям программа четко определит источник для каждой номенклатуры, основываясь на ее индивидуальных настройках обеспечения. Менеджеру не придется ничего выбирать вручную.
Минус этого подхода: Он абсолютно нединамичен. Если завтра Товар 1 закончится на Складе 1, но появится на Складе 2, система все равно будет упорно пытаться заказать его со Склада 1, выдавая ошибку об отсутствии остатков, либо сформирует заказ «в пустоту».
---
Это более гибкий метод, который позволяет задействовать встроенные алгоритмы распределения запасов внутри логистической группы. Посмотрим, как это работает на практике.
Для реализации этого сценария нам необходимо объединить наши склады-отправители в единую структуру:
Теперь проанализируем логику работы документов при такой структуре. В Заказе клиента или в Заказе на перемещение в качестве склада-отправителя (или склада обеспечения) мы указываем не конкретный Склад 1 или Склад 2, а нашу созданную Группу складов-отправителей.
При заполнении табличной части заказа мы можем воспользоваться стандартным механизмом распределения остатков:
ТоварыНаСкладах за вычетом резервов ТоварыКПередачеОтправителю) по всем складам, входящим в эту группу.Важный нюанс: Этот способ отлично работает, если у вас есть исходное распоряжение (например, Заказ клиента, под который нужно привезти товар перемещением), и вы проводите резервирование. Если же вы хотите, чтобы заказы на перемещение создавались регламентно в фоновом режиме по «минимуму-максимуму» запасов без участия пользователя, этот метод может потребовать ручного контроля статусов обеспечения.
---
Если перемещение товаров со складов-источников выполняется под конкретные заказы клиентов (то есть используется обособленное обеспечение), в последних версиях платформ 1С:ERP и 1С:УТ реализован продвинутый алгоритм.
Программа умеет анализировать доступность обособленных запасов на всех складах-отправителях, зарегистрированных в системе. При формировании потребностей логист может открыть специализированное рабочее место График перемещения товаров. В этом интерфейсе наглядно отображаются остатки по всем складам-отправителям, и система сама предлагает оптимальный склад-источник, исходя из сроков доставки и наличия свободных остатков.
---
Если ни один из вариантов стандартной настройки вас не устраивает, поскольку вам требуется строго автоматическое создание документов Заказ на перемещение в фоновом режиме с динамическим распределением по складам-источникам (где в данный момент больше свободного остатка), придется прибегнуть к доработке системы.
Для программистов 1С рассмотрим логику работы расширения, которое может автоматизировать данный процесс. Нам необходимо перехватить алгоритм заполнения склада-отправителя при программном создании документов ЗаказНаПеремещение.
Алгоритм работы кастомного фонового задания или расширения выглядит следующим образом:
Заказ на перемещение, в которых строки автоматически разделяются по реальным складам-отправителям.Посмотрим на пример кода запроса, который позволяет получить свободный остаток номенклатуры в разрезе складов, входящих в определенную группу:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад КАК СкладИсточник,
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.ВНаличииОстаток - ЕСТЬNULL(ТоварыВРезервеОстатки.ВРезервеОстаток, 0) КАК СвободныйОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад В ИЕРАРХИИ(&ГруппаСкладов)) КАК ТоварыНаСкладахОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыКОформлениюПередачи.Остатки(&Период, Склад В ИЕРАРХИИ(&ГруппаСкладов)) КАК ТоварыВРезервеОстатки
| ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеОстатки.Номенклатура
| И ТоварыНаСкладахОстатки.Склад = ТоварыВРезервеОстатки.Склад
|ГДЕ
| ТоварыНаСкладахОстатки.ВНаличииОстаток - ЕСТЬNULL(ТоварыВРезервеОстатки.ВРезервеОстаток, 0) > 0
|УПОРЯДОЧИТЬ ПО
| СвободныйОстаток УБЫВ";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("ГруппаСкладов", СсылкаНаГруппуСкладов);
РезультатЗапроса = Запрос.Выполнить();
Используя этот запрос в обработке автозаказа, вы сможете гарантировать, что система всегда будет выбирать склад-источник с наибольшим свободным остатком товара, минимизируя ручную работу логистов компании.
Для решения задачи автоматического выбора склада-отправителя без доработки конфигурации рекомендуется использовать механизм Групп складов с разрешением их использования в заказах. Если логика распределения жестко привязана к видам товаров — настройте несколько способов обеспечения и распределите их в единой Схеме обеспечения по категориям номенклатуры. Для полностью автоматического бесшовного распределения «на лету» оптимальным решением станет использование небольшого расширения конфигурации или внешних обработок автозаказа.