Как в 1С:ERP 2 получить список заказов, которые не отгружены или отгружены частично

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

В системе 1С:ERP Управление предприятием 2 (а также в 1С:Комплексная автоматизация 2) задача получения списка недопоставленных товаров требует понимания внутренней архитектуры регистров. В отличие от простых учетных систем, здесь разделены финансовый учет (оформление накладных) и складской учет (фактическая отгрузка). Проанализируем ситуацию и разберем, как правильно построить запрос для получения актуальных данных по заказам.

Различие между финансовым и складским учетом

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

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

Рассмотрим подробнее работу с регистром ЗаказыКлиентов, так как он является базовым для анализа исполнения обязательств перед покупателем.

Использование регистра накопления ЗаказыКлиентов

Основной ресурс, который нас интересует в этом регистре — КОформлению. Рассмотрим логику: когда заказ только создан, ресурс Заказано и ресурс КОформлению содержат полное количество товара. По мере проведения документов реализации ресурс КОформлению уменьшается. Если значение больше нуля — заказ отгружен не полностью.

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


ВЫБРАТЬ
    ЗаказыКлиентовОстатки.ЗаказКлиента КАК Заказ,
    ЗаказыКлиентовОстатки.Номенклатура КАК Номенклатура,
    ЗаказыКлиентовОстатки.Характеристика КАК Характеристика,
    ЗаказыКлиентовОстатки.КОформлениюОстаток КАК ОстатокКОформлению
ИЗ
    РегистрНакопления.ЗаказыКлиентов.Остатки(&Период, ) КАК ЗаказыКлиентовОстатки
ГДЕ
    ЗаказыКлиентовОстатки.КОформлениюОстаток > 0

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

Учет отмененных строк в заказе

Проанализируем важный нюанс: в 1С:ERP строки заказа могут быть отменены (флаг Отменено в табличной части Товары). При установке этого флага система делает корректирующие движения в регистре ЗаказыКлиентов, закрывая остатки. С точки зрения регистра заказ может выглядеть «полностью выполненным», хотя фактически товар не отгружался.

Чтобы получить корректную картину «план-факт», мы должны соединять данные регистра с табличной частью документа. Рассмотрим, как это реализовать:


ВЫБРАТЬ
    ЗаказТовары.Ссылка КАК Заказ,
    ЗаказТовары.Номенклатура КАК Номенклатура,
    ЗаказТовары.Количество КАК ЗаказаноПоДокументу,
    ЕСТЬNULL(ЗаказыКлиентовОстатки.КОформлениюОстаток, 0) КАК ОсталосьОтгрузить
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказТовары
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыКлиентов.Остатки(&Период, ) КАК ЗаказыКлиентовОстатки
    ПО ЗаказТовары.Ссылка = ЗаказыКлиентовОстатки.ЗаказКлиента
    И ЗаказТовары.Номенклатура = ЗаказыКлиентовОстатки.Номенклатура
ГДЕ
    НЕ ЗаказТовары.Отменено
    И ЗаказТовары.Ссылка.Проведен
    И ЗаказТовары.Ссылка.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт)

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

Анализ состояний через регистры сведений

Для оперативного получения информации о состоянии заказа в системе существует регистр сведений СостоянияЗаказовКлиентов. Он содержит агрегированные данные, которые система рассчитывает автоматически. Там можно найти текущий процент отгрузки и оплаты, что удобно для вывода в списки без сложных расчетов по регистрам накопления.

Выясним, как использовать эти данные. Посмотрим на структуру обращения к регистру:


ВЫБРАТЬ
    Состояния.Заказ КАК Заказ,
    Состояния.Состояние КАК ТекущееСостояние,
    Состояния.ПроцентОтгрузки КАК ПроцентОтгрузки
ИЗ
    РегистрСведений.СостоянияЗаказовКлиентов КАК Состояния
ГДЕ
    Состояния.ПроцентОтгрузки < 100
    И Состояния.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.ГотовКЗакрытию)

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

Регистр «Распределение запасов»

В последних версиях 1С:ERP (начиная с 2.4/2.5) внедрен мощный механизм распределения запасов. Регистр сведений РаспределениеЗапасов является наиболее современным способом понять, что происходит с заказом. Он объединяет информацию об остатках на складах, ожидаемых поступлениях и резервах.

Разберем, какие ресурсы этого регистра помогут нам решить задачу:

Программные методы получения данных

Если вам требуется получить эти данные в коде модуля, не обязательно писать запрос с нуля. В 1С:ERP предусмотрены типовые механизмы. Например, в общем модуле ЗаказыКлиентовЛогикаСервер существуют процедуры, вычисляющие состояние обеспечения и отгрузки. Также стоит обратить внимание на функцию СкладыСервер.ВычислитьТоварыДляОформленияРасходныхОрдеров, если ваша задача связана именно со складским (ордерным) этапом.

Подводя итог, для получения списка не отгруженных заказов мы рекомендуем использовать комбинацию фильтров по статусам заказа (Статус <> Закрыт) и анализ остатков по регистру ЗаказыКлиентов. Это гарантирует получение точных данных с учетом всех особенностей бизнес-процесса предприятия.

← На главную