Как реализовать алгоритмы адресного хранения на складе в 1С?

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

Адресное хранение (WMS — Warehouse Management System) — это одна из наиболее интересных и комплексных задач в сфере автоматизации складской логистики. Часто подобные задачи встречаются не только в реальной практике при внедрении учетных систем на крупных предприятиях, но и на экзаменах по платформе «1С:Специалист». Разработчику необходимо не просто создать структуру таблиц, но и заложить эффективные математические алгоритмы для быстрого размещения, отбора и перемещения товаров.

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

1. Проектирование структуры метаданных

Прежде чем приступать к написанию кода, проанализируем требования к структуре хранения данных. Нам необходимо фиксировать физическое расположение каждого товара на складе. Склад состоит из стеллажей, которые делятся на ряды (секции), вертикальные стойки (позиции по горизонтали) и ярусы (уровни по вертикали). Такое деление позволяет однозначно идентифицировать каждую ячейку координатами типа SS-NN-LL (Ряд-Стойка-Ярус).

Для реализации этой топологии создадим следующую структуру объектов конфигурации:

  1. Справочник «Номенклатура». В нем обязательно должен быть числовой реквизит КоэффициентПалетирования. Этот показатель определяет, какое количество единиц конкретного товара полностью заполняет одну стандартную паллету (место хранения).
  2. Справочник «ЯчейкиСклада» (или «ТопологияСклада»). Каждый элемент этого справочника представляет собой конкретное физическое место хранения.
    • Реквизиты: Ряд (Число), Стойка (Число), Ярус (Число). Раздельное хранение координат в виде чисел критически важно для выполнения выборочной инвентаризации по определенному ярусу или ряду.
    • Реквизит: ПорядокОбхода (Число). Этот реквизит задает физическую последовательность обхода ячеек кладовщиком при отборе товара, что позволяет строить оптимальный маршрут движения по складу.
  3. Регистр накопления «ПозицииТовара» (Вид регистра: Остатки). Это основной регистр, в котором хранится информация о текущем заполнении склада.
    • Измерение: Ячейка (Тип: СправочникСсылка.ЯчейкиСклада).
    • Измерение: Номенклатура (Тип: СправочникСсылка.Номенклатура).
    • Ресурс: Количество (Тип: Число).

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

2. Алгоритм размещения товара при приемке

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

Рассмотрим пошагово оптимальный алгоритм размещения при проведении документа «Прием товара»:

  1. Поиск частично заполненных ячеек с аналогичным товаром. Первым делом мы должны найти ячейки, где уже лежит принимаемый товар, но его количество меньше, чем вместимость паллеты (Количество < КоэффициентПалетирования).
  2. Дозаполнение полупустых ячеек. Мы распределяем пришедший объем товара по найденным неполным ячейкам, увеличивая их остаток ровно до величины КоэффициентПалетирования.
  3. Размещение остатка по пустым ячейкам. Если после дозаполнения товар еще остался, мы ищем абсолютно свободные ячейки на складе (где остаток по регистру ПозицииТовара равен нулю). Мы делим оставшийся объем товара на величину КоэффициентПалетирования. Полные паллеты размещаем в пустые ячейки. Дробный остаток (если он есть) кладем в еще одну свободную ячейку.

Проанализируем пример программной реализации этого алгоритма в модуле проведения документа «Прием товара»:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Запрос для получения текущих неполных ячеек с таким же товаром
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ПозицииТовараОстатки.Ячейка КАК Ячейка,
        |   ПозицииТовараОстатки.Номенклатура КАК Номенклатура,
        |   ПозицииТовараОстатки.КоличествоОстаток КАК КоличествоОстаток,
        |   ПозицииТовараОстатки.Номенклатура.КоэффициентПалетирования КАК КП
        |ИЗ
        |   РегистрНакопления.ПозицииТовара.Остатки(&МоментВремени, Номенклатура В (&СписокТоваров)) КАК ПозицииТовараОстатки
        |ГДЕ
        |   ПозицииТовараОстатки.КоличествоОстаток < ПозицииТовараОстатки.Номенклатура.КоэффициентПалетирования
        |УПОРЯДОЧИТЬ ПО
        |   КоличествоОстаток УБЫВАЮЩИЙ"; // Сначала заполняем самые полные
        
    // Нам также понадобится список полностью свободных ячеек
    ЗапросСвободных = Новый Запрос;
    ЗапросСвободных.Текст = 
        "ВЫБРАТЬ
        |   Ячейки.Ссылка КАК Ячейка
        |ИЗ
        |   Справочник.ЯчейкиСклада КАК Ячейки
        |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПозицииТовара.Остатки(&МоментВремени, ) КАК Остатки
        |   ПО Ячейки.Ссылка = Остатки.Ячейка
        |ГДЕ
        |   Остатки.Ячейка ЕСТЬ NULL";
        
КонецПроцедуры

Используя результаты этих двух запросов, мы можем последовательно распределить весь объем поступившей номенклатуры в цикле, сначала заполняя имеющиеся остатки, а затем занимая пустые ячейки. Движения записываются в регистр ПозицииТовара со знаком плюс (приход).

3. Алгоритм отпуска товаров и оптимизация маршрута обхода

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

Рассмотрим пошагово, как реализовать этот алгоритм:

  1. Подбор источников списания. Мы запрашиваем остатки нужного товара по ячейкам и сортируем их по возрастанию остатка (КоличествоОстаток Возрастающий). Это позволит нам в первую очередь списывать товары из малозаполненных ячеек, тем самым полностью освобождая места хранения для будущих приемок.
  2. Списание и фиксация в движениях. Алгоритм распределяет требуемое к отпуску количество по выбранным ячейкам и формирует движения расхода по регистру ПозицииТовара.
  3. Построение маршрута обхода. Полученный список ячеек, из которых будет производиться отбор, мы соединяем со справочником ЯчейкиСклада и сортируем по полю ПорядокОбхода. Эта упорядоченная таблица выводится в печатную форму накладной.

Посмотрим на пример запроса для построения печатной формы задания на отбор:


ЗапросМаршрута = Новый Запрос;
ЗапросМаршрута.Текст = 
    "ВЫБРАТЬ
    |   ВременнаяТаблицаСписания.Номенклатура КАК Номенклатура,
    |   ВременнаяТаблицаСписания.Ячейка КАК Ячейка,
    |   ВременнаяТаблицаСписания.Количество КАК Количество,
    |   ВременнаяТаблицаСписания.Ячейка.ПорядокОбхода КАК ПорядокОбхода
    |ИЗ
    |   &ТаблицаСписания КАК ВременнаяТаблицаСписания
    |УПОРЯДОЧИТЬ ПО
    |   ПорядокОбхода ВОЗРАСТАЮЩИЙ";

Такой подход гарантирует, что сборщик склада пройдет по рядам строго по оптимальной траектории, тратя минимум времени на перемещения.

4. Алгоритм автоматического уплотнения склада

Со временем склад неизбежно фрагментируется: появляется множество ячеек, заполненных лишь частично. Процедура «Уплотнение» позволяет объединить остатки одинаковых товаров и высвободить максимальное количество мест хранения. Ее можно реализовать в виде регламентного задания или интерактивной обработки для начальника склада.

Разберем логику работы алгоритма уплотнения:

  1. Поиск кандидатов на уплотнение. Мы выбираем из регистра накопления все ячейки, где остаток товара строго меньше его КоэффициентПалетирования.
  2. Группировка и сортировка. Группируем полученные данные по номенклатуре. Внутри каждой группы сортируем ячейки по количеству товара по возрастанию.
  3. Расчет перемещений. Мы берем товар из самой пустой ячейки (источник) и перекладываем его в максимально заполненную неполную ячейку (приемник). Если в приемнике еще остается свободное место, продолжаем добавлять туда товар из следующей по списку пустой ячейки. Как только ячейка-приемник заполняется до своего КоэффициентПалетирования, мы выбираем следующую неполную ячейку в качестве приемника.
  4. Формирование документа. На основе рассчитанных перемещений автоматически создается документ «Перемещение товаров на складе» с указанием ячеек-источников и ячеек-получателей. Кладовщикам остается только выполнить физическое перемещение по готовому заданию.

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

5. Построение отчета «Загруженность склада»

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

Выясним математическую суть показателя загруженности:

Процент загруженности = (Количество занятых ячеек / Общее количество ячеек на складе) * 100%

Ячейка считается занятой, если в ней находится любое количество любого товара (остаток в регистре ПозицииТовара больше нуля). Общее количество ячеек — это общее число записей в справочнике ЯчейкиСклада.

Для реализации этого отчета в Системе компоновки данных (СКД) выполним следующие шаги:

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

В результате мы получим наглядный график, отражающий реальную динамику использования складских площадей во времени, что позволит своевременно принимать решения о расширении склада или проведении внеочередного уплотнения.

← На главную