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