При использовании ордерной схемы документооборота в конфигурации «1С:Управление торговлей 11» разработчики часто сталкиваются с разделением складского и финансового контуров. Документ РасходныйОрдерНаТовары предназначен исключительно для отражения физического перемещения материальных ценностей на складе: в нем присутствуют количество, номенклатура, характеристики и серии, но полностью отсутствуют цены, суммы, ставки НДС и скидки.
Однако при взаимодействии с транспортными компаниями и службами доставки возникает требование передать объявленную стоимость груза или рассчитать сумму страхования непосредственно в момент погрузки — когда финансовый документ РеализацияТоваровУслуг еще не сформирован. Проанализируем архитектурные ограничения системы и рассмотрим надежные технические способы решения этой задачи.
Разберем, почему нельзя просто «подтянуть» цену из исходного заказа по коду номенклатуры:
ТоварыКОтгрузке. Измерение ДокументОтгрузки хранит ссылку на заказ, но связь на уровне номеров строк заказа в регистре отсутствует.Типовой механизм конфигурации при формировании накладных по фактически собранным ордерам выполняет распределение по принципу FIFO: фактически отгруженное количество последовательно закрывает строки исходного заказа сверху вниз (по возрастанию номера строки). Рассмотрим практические способы воспроизведения этой логики.
Чтобы не воспроизводить вручную сложные механизмы распределения скидок, расчета автоматических начислений и округлений, наиболее надежным путем является программная инициализация объекта РеализацияТоваровУслуг без записи в базу данных. В этом случае типовые алгоритмы 1С сами рассчитают стоимость отгруженного количества ровно так, как это произойдет при выписке окончательных документов.
Рассмотрим пример программного заполнения объекта в оперативной памяти:
// Создаем экземпляр объекта накладной без записи в базу данных
НакладнаяОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Заполняем реквизиты шапки из исходного распоряжения (Заказа клиента)
НакладнаяОбъект.ЗаказКлиента = СсылкаНаЗаказ;
НакладнаяОбъект.Заполнить(СсылкаНаЗаказ);
// Вызываем штатное заполнение по фактически собранным ордерам
// Параметры зависят от версии конфигурации и используемой процедуры модуля менеджера
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("РасходныйОрдер", СсылкаНаОрдер);
// Инициализируем пересчет табличной части "Товары"
// После штатного заполнения табличная часть содержит итоговые суммы со всеми скидками
СуммаСтраховки = 0;
Для Каждого СтрТовары Из НакладнаяОбъект.Товары Цикл
СуммаСтраховки = СуммаСтраховки + СтрТовары.СуммаСНДС;
КонецЦикла;
// Объект НакладнаяОбъект не записывается, сборщик мусора очистит память
Данный подход гарантирует стопроцентную сходимость рассчитанной стоимости с будущей реальной реализацией, исключая расхождения из-за округления скидок или сложных условий ценообразования.
Если программная инициализация целого документа представляется слишком тяжелой для производительности (например, при массовой обработке заказов на ТСД), проанализируем расчет через запрос к учетным регистрам.
Связь конкретного документа РасходныйОрдерНаТовары с его распоряжением хранится в движениях регистра накопления ТоварыКОтгрузке, где ордер выступает регистратором, а в поле ДокументОтгрузки записан ЗаказКлиента.
Разберем логику построения собственного запроса:
ТоварыКОтгрузке с отбором по нашему расходному ордеру, группируя количество по номенклатуре и характеристикам.Товары исходного заказа клиента.НомерСтроки).Этот способ работает быстрее создания документа в памяти, однако требует аккуратного учета ручных скидок и пропорционального распределения автоматических скидок, назначенных на весь чек или документ в целом.
Если на предприятии используется обособленное обеспечение заказов, задача сопоставления существенно упрощается. В этом случае в строках табличной части расходного ордера и в складских регистрах всегда заполнено измерение Назначение.
Элемент справочника Назначения содержит прямую ссылку на конкретный ЗаказКлиента. Это исключает путаницу при оформлении одного сводного ордера на несколько заказов: программа всегда точно определяет, под какой именно финансовый документ был зарезервирован и отобран физический товар.
Если точная копейка в копейку привязка к заказу не требуется (например, транспортная компания рассчитывает тариф на основе ориентировочной объявленной стоимости):
ЗаданиеНаПеревозка, который штатно привязывается как к финансовым накладным, так и к складским расходным ордерам. Расчет весогабаритных и оценочных характеристик груза рекомендуется производить именно в контуре доставки, не перегружая избыточной финансовой логикой чисто складские документы.