Как в 1С:УТ 11 сопоставить Расходный ордер на товары с Заказом клиента и получить стоимость отгрузки?

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

При использовании ордерной схемы документооборота в конфигурации «1С:Управление торговлей 11» разработчики часто сталкиваются с разделением складского и финансового контуров. Документ РасходныйОрдерНаТовары предназначен исключительно для отражения физического перемещения материальных ценностей на складе: в нем присутствуют количество, номенклатура, характеристики и серии, но полностью отсутствуют цены, суммы, ставки НДС и скидки.

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

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

Разберем, почему нельзя просто «подтянуть» цену из исходного заказа по коду номенклатуры:

  1. Неоднородность цен и скидок внутри одного заказа. В табличной части заказа одна и та же позиция номенклатуры может присутствовать несколькими строками с разными ценами (например, разные партии, акции, ручные или автоматические скидки). На складе товар обезличен. Если склад отгружает только часть общего количества, ордер не знает, какая именно строка заказа была фактически отобрана.
  2. Один ордер на несколько заказов. Если в настройках системы включено формирование одного расходного ордера по нескольким распоряжениям, товарные строки в ордере могут агрегировать потребности сразу нескольких клиентов.
  3. Отсутствие номера строки в регистрах. Движения ордера отражаются в регистре накопления ТоварыКОтгрузке. Измерение ДокументОтгрузки хранит ссылку на заказ, но связь на уровне номеров строк заказа в регистре отсутствует.

Типовой механизм конфигурации при формировании накладных по фактически собранным ордерам выполняет распределение по принципу FIFO: фактически отгруженное количество последовательно закрывает строки исходного заказа сверху вниз (по возрастанию номера строки). Рассмотрим практические способы воспроизведения этой логики.

Способ 1. Программное создание Реализации товаров и услуг в оперативной памяти

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

Рассмотрим пример программного заполнения объекта в оперативной памяти:


// Создаем экземпляр объекта накладной без записи в базу данных
НакладнаяОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

// Заполняем реквизиты шапки из исходного распоряжения (Заказа клиента)
НакладнаяОбъект.ЗаказКлиента = СсылкаНаЗаказ;
НакладнаяОбъект.Заполнить(СсылкаНаЗаказ);

// Вызываем штатное заполнение по фактически собранным ордерам
// Параметры зависят от версии конфигурации и используемой процедуры модуля менеджера
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("РасходныйОрдер", СсылкаНаОрдер);

// Инициализируем пересчет табличной части "Товары"
// После штатного заполнения табличная часть содержит итоговые суммы со всеми скидками
СуммаСтраховки = 0;
Для Каждого СтрТовары Из НакладнаяОбъект.Товары Цикл
    СуммаСтраховки = СуммаСтраховки + СтрТовары.СуммаСНДС;
КонецЦикла;

// Объект НакладнаяОбъект не записывается, сборщик мусора очистит память

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

Способ 2. Получение данных через регистр «Товары к отгрузке» и алгоритм FIFO

Если программная инициализация целого документа представляется слишком тяжелой для производительности (например, при массовой обработке заказов на ТСД), проанализируем расчет через запрос к учетным регистрам.

Связь конкретного документа РасходныйОрдерНаТовары с его распоряжением хранится в движениях регистра накопления ТоварыКОтгрузке, где ордер выступает регистратором, а в поле ДокументОтгрузки записан ЗаказКлиента.

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

  1. Выбираем движения регистра ТоварыКОтгрузке с отбором по нашему расходному ордеру, группируя количество по номенклатуре и характеристикам.
  2. Соединяем результат с табличной частью Товары исходного заказа клиента.
  3. Упорядочиваем строки заказа по номеру строки (НомерСтроки).
  4. Применяем алгоритм нарастающего итога: количество из ордера списывает остатки количества по строкам заказа по принципу FIFO. Если количество ордера перекрывает первую строку заказа, остаток распределяется на следующую строку с ее индивидуальной ценой и скидкой.

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

Способ 3. Использование аналитики «Назначение» при обособленном обеспечении

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

Элемент справочника Назначения содержит прямую ссылку на конкретный ЗаказКлиента. Это исключает путаницу при оформлении одного сводного ордера на несколько заказов: программа всегда точно определяет, под какой именно финансовый документ был зарезервирован и отобран физический товар.

Альтернатива: использование оценочной стоимости и подсистемы доставки

Если точная копейка в копейку привязка к заказу не требуется (например, транспортная компания рассчитывает тариф на основе ориентировочной объявленной стоимости):

  1. Расчет по виду цены: в карточке склада или в настройках логистики задается фиксированный вид цен (например, «Учетная цена», «Плановая себестоимость» или «Розничная»). Сумма ордера получается простым перемножением фактически отобранного количества на актуальный срез цен на дату документа.
  2. Использование документа «Задание на перевозку»: типовая подсистема 1С «Управление доставкой» содержит документ ЗаданиеНаПеревозка, который штатно привязывается как к финансовым накладным, так и к складским расходным ордерам. Расчет весогабаритных и оценочных характеристик груза рекомендуется производить именно в контуре доставки, не перегружая избыточной финансовой логикой чисто складские документы.
← На главную