При работе в программе 1С:Управление торговлей (редакция 11), а также в аналогичных решениях 1С:ERP и 1С:Комплексная автоматизация, пользователи часто сталкиваются с неочевидным поведением системы при оформлении доставки товаров. Типичная ситуация: в заказе клиента выбрано несколько позиций, при этом часть из них уже присутствует на складе (установлено действие "Отгрузить"), а часть — только ожидается к поступлению (установлено действие "К обеспечению"). При этом в самом заказе активирован флаг "Отгружать одной датой".
Логика пользователя подсказывает, что раз стоит признак отгрузки единой партией, заказ не должен фигурировать в качестве распоряжения на доставку до тех пор, пока абсолютно весь товар не поступит на склад. Однако на практике этот недообеспеченный заказ все равно отображается в рабочем месте (АРМ) "Доставка". Выясним, почему так происходит, и разберем эффективные методы исправления этой ситуации как методологическими, так и программными средствами.
Для понимания сути проблемы нам необходимо проанализировать, за что именно отвечает флаг Отгружать одной датой. В типовой методологии решений 1С этот реквизит предназначен исключительно для планирования дат поступления и автоматического расчета общей даты отгрузки по заказу.
Когда этот флаг включен, система анализирует сроки поставки всех позиций, имеющих статус К обеспечению, находит самый поздний срок и автоматически устанавливает его в качестве единой даты отгрузки для всего заказа. Это позволяет менеджеру сориентировать клиента по срокам получения всей партии товара.
Однако этот флаг не накладывает жесткий административный запрет на физическое проведение частичной отгрузки. Логика подсистемы доставки 1С устроена следующим образом:
Отгрузить, система считает, что по этой строке резерв уже собран и готов к выдаче.СостоянияДоставки или СостоянияЗаказовКлиентов).Отгрузить хотя бы на одной позиции — это прямой сигнал к началу планирования рейса.Таким образом, комбинируя в одном документе действие Отгрузить для одной позиции и К обеспечению для другой при включенном флаге Отгружать одной датой, пользователь создает логическое противоречие. Система "прощает" эту ошибку менеджеру и отдает приоритет действию Отгрузить, отправляя доступную часть заказа логисту.
---
Прежде чем прибегать к программированию и изменению конфигурации, рассмотрим, как можно скорректировать бизнес-процесс работы менеджеров по продажам, чтобы исключить преждевременное попадание заказов в доставку.
Шаг 1. Отказ от ручного переключения действий в табличной части
Менеджерам не следует вручную устанавливать статус Отгрузить для отдельных позиций на этапе оформления заказа, если товар пришел не полностью. Правильный регламент работы выглядит так:
К обеспечению или Резервировать к дате. В этом состоянии заказ гарантированно не попадет на глаза логисту.Шаг 2. Использование обработки "Состояние обеспечения"
Когда на склад поступает ожидаемый товар, менеджер (или руководитель склада) открывает обработку обеспечения. В ней можно одной кнопкой перевести все строки заказа в статус Отгрузить только тогда, когда весь заказ будет полностью обеспечен физическим товаром на складе. Только в этот момент заказ автоматически зафиксируется как готовое распоряжение на доставку.
Шаг 3. Использование статусов заказов
Если в вашей информационной базе включена опция использования статусов заказов, вы можете настроить фильтры в АРМ "Доставка" таким образом, чтобы логист видел только те документы, которые находятся в статусе "Готов к отгрузке". Менеджер физически не должен переводить заказ в этот статус, пока склад не подтвердит полную комплектацию заказа.
---
Если административные меры не дают стабильного результата и человеческий фактор по-прежнему приводит к ошибкам, нам потребуется автоматизировать этот контроль. Рассмотрим три наиболее изящных способа доработки системы с помощью механизма расширений конфигурации (чтобы сохранить конфигурацию на поддержке).
Мы можем создать подписку на событие или перехватить процедуру ПередЗаписью документа ЗаказКлиента. Если программа обнаружит, что у заказа стоит флаг отгрузки одной датой, но при этом строки ТЧ имеют разные статусы обеспечения (смесь "Отгрузить" и "К обеспечению"), система выдаст предупреждение и отменит проведение.
Рассмотрим пример реализации этого алгоритма в модуле расширения:
&После("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, что документ проводится
Если Не РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Возврат;
КонецЕсли;
// Проверяем признак отгрузки единой датой
Если ЭтотОбъект.ОтгружатьОднойДатой Тогда
ЕстьСтрокиОтгрузить = Ложь;
ЕстьСтрокиОбеспечения = Ложь;
Для Каждого СтрокаТовары Из ЭтотОбъект.Товары Цикл
ВариантОбеспечения = СтрокаТовары.ВариантОбеспечения;
Если ВариантОбеспечения = ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.Отгрузить") Тогда
ЕстьСтрокиОтгрузить = Истина;
ИначеЕсли ВариантОбеспечения = ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.КОбеспечению")
Или ВариантОбеспечения = ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.РезервироватьКДате") Тогда
ЕстьСтрокиОбеспечения = Истина;
КонецЕсли;
КонецЦикла;
// Если обнаружено смешение статусов при включенной галке "Одной датой"
Если ЕстьСтрокиОтгрузить И ЕстьСтрокиОбеспечения Тогда
Отказ = Истина;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Невозможно провести заказ! Установлен флаг 'Отгружать одной датой', " +
"однако часть товаров подготовлена к отгрузке, а часть еще не обеспечена. " +
"Приведите все строки к единому состоянию обеспечения.");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот способ является наиболее жестким, так как он физически не позволяет менеджеру допустить методологическую ошибку на этапе работы с заказом.
Если мы хотим разрешить менеджерам проводить такие заказы, но при этом скрыть их от логистов, нам нужно скорректировать логику формирования движений в регистрах доставки. Вся ключевая логика регистрации распоряжений сосредоточена в общем модуле ДоставкаТоваров.
Мы можем вклиниться в процедуру ОтразитьСостояниеДоставки этого модуля с помощью аннотации &Вместо или &Перед в расширении. Наша задача — проверить заказ и, если он обеспечен не полностью, прервать выполнение процедуры, не записывая данные в регистры доставки.
Рассмотрим пример кода для общего модуля в расширении:
&Вместо("ОтразитьСостояниеДоставки")
Процедура Расш_ОтразитьСостояниеДоставки(ДокументСсылка, Отказ, Замещение = Ложь)
// Проверяем, что обрабатывается именно Заказ клиента
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
// Анализируем свойства заказа
Если ДокументСсылка.ОтгружатьОднойДатой Тогда
НеОбеспечено = Ложь;
Для Каждого СтрокаТовары Из ДокументСсылка.Товары Цикл
// Если есть позиции, которые еще не готовы к отгрузке
Если СтрокаТовары.ВариантОбеспечения <> ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.Отгрузить") Тогда
НеОбеспечено = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// Если заказ собран не полностью, то не отправляем его в доставку
Если НеОбеспечено Тогда
Возврат; // Выходим из процедуры до записи движений
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Вызов оригинального обработчика для стандартного проведения
ПродолжитьВызов(ДокументСсылка, Отказ, Замещение);
КонецПроцедуры
Этот метод изящен тем, что он абсолютно прозрачен для менеджера по продажам, но при этом надежно защищает АРМ логиста от "полупустых" заказов, которые невозможно доставить клиенту в полном объеме.
Еще один гибкий вариант — не вмешиваться в проведение документов и запись регистров, а скорректировать динамический запрос, который выводит список распоряжений на доставку в левой части рабочего места логиста.
Для этого в расширении необходимо найти форму АРМ "Доставка" (например, ФормаРабочегоМеста или форму списка распоряжений) и доработать текст запроса динамического списка. В секцию условий запроса (после слова ГДЕ) мы добавляем проверку:
// Пример фрагмента условия для запроса динамического списка
ГДЕ НЕ (
Распоряжение ССЫЛКА Документ.ЗаказКлиента
И ВЫРАЗИТЬ(Распоряжение КАК Документ.ЗаказКлиента).ОтгружатьОднойДатой = ИСТИНА
И Распоряжение В (
ВЫБРАТЬ РАЗЛИЧНЫЕ ТЧ.Ссылка
ИЗ Документ.ЗаказКлиента.Товары КАК ТЧ
ГДЕ ТЧ.ВариантОбеспечения <> ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.Отгрузить)
)
)
Данный подход хорош тем, что данные в базе остаются нетронутыми, а фильтрация происходит исключительно в интерфейсе логиста на лету. Как только менеджер дообеспечит последнюю позицию в заказе, он тут же отобразится в списке доступных к отправке.
Мы выяснили, что попадание частично обеспеченного заказа с флагом Отгружать одной датой в АРМ "Доставка" — это не баг программы, а заложенная разработчиками методология приоритета действия Отгрузить. Для решения этой проблемы выберите наиболее подходящий вашей компании путь: перестройте бизнес-процесс работы менеджеров через автоматическое заполнение обеспечения или внедрите один из предложенных вариантов расширения для автоматического контроля состояния заказов.