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