Как в 1С реализовать списание товаров по ФИФО с ручным указанием партий?

Программист Управленческий учет Торговля и дистрибуция
← На главную

В процессе работы с партионным учетом часто возникает задача, выходящая за рамки стандартного списания по методу ФИФО (First-In, First-Out). Представим ситуацию: необходимо провести реализацию товаров, где для части позиций менеджер явно указывает, из какой партии их нужно списать, а для остальных — списание должно пройти по стандартному принципу "первым пришел — первым ушел". Такая задача требует разработки комбинированного алгоритма, который бы сочетал ручное управление и автоматический подбор. Прежде чем приступать к кодингу, полезно провести анализ позиций товаров в документе реализации, чтобы точно понимать историю движений по каждой номенклатуре.

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

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

Основная сложность заключается в правильном определении последовательности действий. Из обсуждения на форуме и общей логики бизнес-процессов вырисовывается четкий двухэтапный алгоритм, который необходимо реализовать:

  1. Списание по явно указанным партиям. На первом шаге мы должны обработать только те строки документа, в которых пользователь вручную указал партию. Система должна попытаться списать требуемое количество именно из этой партии. Если товара в указанной партии хватает — отлично. Если нет — списываем все, что есть, а "недостачу" запоминаем для следующего шага.
  2. Списание остатков по ФИФО. На втором шаге мы собираем все "потребности", которые не были удовлетворены на первом этапе. Сюда входят:
    • Строки документа, где партия изначально не была указана.
    • "Недостача" из строк, где товара в указанной партии не хватило.
    Собрав общую потребность в товаре, мы списываем ее из оставшихся на складе партий по классическому принципу ФИФО.

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

Ключевые сложности и "подводные камни"

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

1. Некорректная сортировка партий при ФИФО

Классическая ошибка, на которую часто наталкиваются начинающие разработчики. Если партии имеют строковые наименования вида "П1", "П2", ..., "П10", "П11", то простая сортировка по наименованию приведет к неверному результату. При алфавитной (строковой) сортировке "П11" будет идти раньше, чем "П2".

2. Реализация всей логики одним запросом

Для оптимизации производительности и избежания медленной обработки данных в циклах 1С, подобные задачи принято решать в одном пакетном запросе. Это позволяет минимизировать количество обращений к базе данных. Такой подход требует уверенного владения языком запросов, в частности, использования временных таблиц (ВТ) и объединений (ОБЪЕДИНИТЬ ВСЕ).

Алгоритм реализации с помощью пакетного запроса

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

Шаг 1. Подготовка исходных данных

Нам понадобятся две основные временные таблицы:

Шаг 2. Списание по явно указанным партиям

Теперь реализуем первую часть нашего алгоритма.

  1. Создаем новую временную таблицу ВТ_СписаниеУказанныхПартий.
  2. Соединяем ВТ_ТоварыКСписанию (только строки, где Партия заполнена) с ВТ_ОстаткиПартий по номенклатуре и партии.
  3. В запросе вычисляем, сколько товара можно списать. Для этого используем функцию ВЫБОР:
    • Когда Остаток >= Требуется, Тогда списываем Требуется.
    • Иначе списываем весь Остаток.

Шаг 3. Подготовка к списанию по ФИФО

На этом этапе мы формируем общую потребность для списания по ФИФО и обновляем остатки партий.

  1. Создаем временную таблицу ВТ_ПотребностьФИФО, куда попадают остатки нераспределенного товара.
  2. Создаем временную таблицу ВТ_ОстаткиДляФИФО. В нее помещаем остатки партий, вычитая те количества, которые мы списали на шаге 2.

Шаг 4. Реализация списания по ФИФО

Это самый сложный этап. Основная идея — рассчитать накопительный итог по остаткам партий и сопоставить его с потребностью. Эффективно реализовать движения товаров с резервами нарастающим итогом можно через функции СКД или сложные соединения в запросе.

  1. Создаем две пронумерованные временные таблицы для потребности и остатков.
  2. Рассчитываем накопительные итоги.
  3. Соединяем таблицы и рассчитываем конкретные количества к списанию по каждой партии (ВТ_СписаниеФИФО).

Шаг 5. Объединение результатов и формирование движений

Финальный шаг — собрать все результаты воедино.


ВЫБРАТЬ
    Номенклатура,
    Партия,
    Количество
ИЗ
    ВТ_СписаниеУказанныхПартий

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Номенклатура,
    Партия,
    Количество
ИЗ
    ВТ_СписаниеФИФО

Этот итоговый запрос вернет полный список движений.

Практическая ценность задачи

Несмотря на то, что такая задача может показаться усложненной, она имеет прямое отношение к реальным бизнес-процессам:

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

← На главную