Как в 1С сопоставить товары со статусами по остаточному сроку годности?

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

В складской логистике и торговле часто возникает задача автоматического присвоения статуса товару в зависимости от того, сколько дней осталось до истечения его срока годности. Например, если осталось 10 дней — товар годен, если 2 дня — требуется уценка, если 0 — списание. В этой статье мы рассмотрим подробнее, как реализовать механизм подбора наиболее подходящего статуса, используя средства языка запросов 1С.

Анализ задачи и логики сопоставления

Представим, что у нас есть две таблицы. В первой хранятся товары с их текущим остатком срока в днях. Во второй — шкала статусов, где для каждого статуса указан порог в днях. Основная сложность заключается в том, чтобы подобрать статус по принципу "минимум из тех, что больше". Это означает, что если у товара осталось 10 дней, а в шкале есть статусы на 12 и 16 дней, система должна выбрать 12, так как это ближайший подходящий порог.

Проанализируем ситуацию на примере:

  1. Товар №1 (10 дней) -> Статус №1 (порог 12 дней). Подходит, так как 10 <= 12.
  2. Товар №2 (15 дней) -> Статус №2 (порог 16 дней). Статус №1 (12 дней) уже не подходит, так как товар "старше" этого порога.
  3. Товар №3 (20 дней) -> Статусов не найдено, так как все пороги меньше 20.

Решение задачи с помощью запроса 1С

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

Шаг 1. Подготовка данных. Сначала мы помещаем наши исходные данные (Таблицу №1 и Таблицу №2) во временные таблицы ВТ_Товары и ВТ_Статусы.

Шаг 2. Поиск минимальных подходящих порогов. Нам нужно соединить таблицу товаров с таблицей статусов по условию "ОстатокДней <= ПорогСтатуса" и сгруппировать результат, чтобы найти минимальный порог для каждого товара.


ВЫБРАТЬ
    Товары.Товар КАК Товар,
    МИНИМУМ(Статусы.СрокДней) КАК МинимальныйПорог
ПОМЕСТИТЬ ВТ_МинимальныеПороги
ИЗ
    ВТ_Товары КАК Товары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Статусы КАК Статусы
        ПО Товары.ОставшийсяСрок <= Статусы.СрокДней
СГРУППИРОВАТЬ ПО
    Товары.Товар
;

Шаг 3. Получение итоговой таблицы со статусами. Теперь, когда у нас есть минимальный порог для каждого товара, мы соединяем эту временную таблицу обратно с исходной таблицей товаров и таблицей статусов, чтобы получить наименования статусов.


ВЫБРАТЬ
    Товары.Товар,
    Товары.ОставшийсяСрок,
    ЕСТЬNULL(Статусы.Статус, "Статус не определен") КАК Статус
ИЗ
    ВТ_Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МинимальныеПороги КАК Пороги
        ПО Товары.Товар = Пороги.Товар
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Статусы КАК Статусы
        ПО Пороги.МинимальныйПорог = Статусы.СрокДней

Оптимизация и работа с большими данными

Выясним причину, почему прямой подход с двойным соединением предпочтительнее вложенных запросов в условии ГДЕ. При использовании оператора ВЫБРАТЬ ПЕРВЫЕ 1 внутри соединения производительность на больших объемах данных (например, при расчете статусов для 50 000 позиций на складе) резко падает, так как СУБД вынуждена выполнять подзапрос для каждой строки. Предложенный выше метод с использованием СГРУППИРОВАТЬ ПО и МИНИМУМ позволяет оптимизатору построить эффективный план выполнения.

Также важно учитывать граничные значения. Обратите внимание на условие Т1.срок <= Т2.срок. Если бизнес-логика подразумевает, что при остатке ровно в 12 дней товар должен переходить в статус "Критический", используйте нестрогое равенство. Если же переход должен происходить только при 11 днях — условие следует заменить на строгое.

Универсальный подход: работа в процентах (ОСГ)

Рассмотрим ситуацию, когда в вашей базе данных хранятся товары с разными сроками хранения. Для молока срок 5 дней — это отличный показатель, а для консервов — критический. В индустрии ритейла принято использовать Остаточный Срок Годности (ОСГ) в процентах. Посмотрим на формулу расчета:

ОСГ % = (ТекущаяДата - ДатаПроизводства) / (ДатаОкончания - ДатаПроизводства) * 100

В этом случае Таблица №2 (шкала статусов) будет содержать не дни, а проценты (например: 100%, 80%, 50%, 10%). Алгоритм запроса при этом останется прежним, изменится только физический смысл сравниваемых чисел. Это позволит вам использовать одну и ту же шкалу статусов для всех групп товаров в 1С:ERP или 1С:Управление торговлей.

Практические рекомендации

  1. Обработка пустых значений: Всегда добавляйте в Таблицу №2 "дефолтный" статус с очень большим значением (например, 99999), если вы хотите, чтобы каждому товару обязательно был присвоен хоть какой-то статус.
  2. Интеграция с FEFO: После того как мы определили статус товара, эти данные следует использовать в алгоритмах подбора при отгрузке. Товары со статусом "Срок подходит" должны отгружаться в первую очередь (принцип First Expired, First Out).
  3. Использование регистров: Для повышения скорости работы рекомендуется хранить шкалы сроков годности в Регистре сведений. Это позволит быстро изменять настройки статусов без переписывания программного кода.

Таким образом, мы проанализировали механизм сопоставления товаров со статусами и реализовали его через эффективный запрос 1С. Этот подход является гибким, легко масштабируемым и подходит для большинства задач складского учета.

← На главную