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