В практической работе со схемами мотивации менеджеров по продажам в программе 1С:Управление нашей фирмой (УНФ) руководители часто сталкиваются с одной и той же проблемой. По умолчанию при создании документа ЗаказПокупателя система заполняет реквизит Ответственный текущим пользователем системы — то есть автором документа. Однако на практике заказы в базу могут вносить операторы колл-центра, помощники менеджеров, логисты или дежурные администраторы. В результате в поле Ответственный записывается имя технического исполнителя, а не того менеджера, который реально ведет клиента и закреплен за ним в справочнике Контрагенты.
Поскольку типовой механизм расчета управленческой зарплаты в 1С:УНФ опирается на показатель СуммаПродажПоОтветственному, неверное заполнение этого реквизита приводит к искажению аналитики и ошибкам в начислении бонусов. Операторам приходится вручную перевыбирать ответственного в каждом заказе, что порождает ошибки из-за пресловутого «человеческого фактора». Для дополнительного контроля корректности реквизитов можно использовать расширение для проверки заполнения заказов и первичных документов.
В этой статье мы подробно разберем, как автоматизировать этот процесс, исключить ошибки пользователей и сделать так, чтобы при выборе покупателя программа автоматически подставляла его персонального менеджера в поле Ответственный документа ЗаказПокупателя.
На форумах часто советуют просто создать подписку на событие напрямую в конфигурации 1С. Действительно, этот механизм отлично работает, но внесение изменений непосредственно в конфигурацию поставщика имеет ряд серьезных минусов:
Для версий ПРОФ, КОРП и облачных решений наиболее правильным, современным и безопасным подходом является использование расширений конфигурации (Extensions). Давайте детально разберем два основных программных сценария автоматизации через расширение, а также классический метод подписок и альтернативный ручной вариант.
Рассмотрим по шагам каждый из этих способов.
Этот вариант наиболее удобен для конечных пользователей. Как только оператор выбирает или меняет значение в поле Покупатель (в некоторых версиях — Контрагент) на форме заказа, программа мгновенно считывает ответственного менеджера из карточки этого клиента и подставляет его в поле Ответственный прямо на экране.
Проанализируем преимущества этого подхода: оператор сразу видит, кто назначен ответственным, и, если этот менеджер находится в отпуске или на больничном, может при необходимости скорректировать поле вручную.
Для реализации этого варианта выполним следующие действия:
ЗаказПокупателя, перейдем в его формы и добавим основную форму документа в наше расширение.Покупатель. Нажмем по нему правой кнопкой мыши и выберем «Создать обработчик событий» -> ПриИзменении. Выберем создание обработчика в модуле формы расширения с аннотацией &После.Напишем программный код, который будет выполняться сразу после выбора контрагента клиентом:
&НаКлиенте
Процедура Расш_ПокупательПриИзмененииПосле(Элемент)
// Вызываем серверную процедуру для работы с базой данных
Расш_ЗаполнитьОтветственногоМенеджераНаСервере();
КонецПроцедуры
&НаСервере
Процедура Расш_ЗаполнитьОтветственногоМенеджераНаСервере()
// Проверяем, заполнен ли покупатель в документе
Если ЗначениеЗаполнено(Объект.Покупатель) Тогда
// Получаем значение ответственного менеджера непосредственно из карточки контрагента
// Используем безопасное чтение реквизита через стандартную функцию общего модуля
МенеджерИзКарточки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Покупатель, "Ответственный");
// Если у контрагента закреплен ответственный менеджер, переносим его в документ
Если ЗначениеЗаполнено(МенеджерИзКарточки) Тогда
Объект.Ответственный = МенеджерИзКарточки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот код работает быстро, прозрачно для пользователя и не требует перезаписи самого документа в базу данных в фоновом режиме.
Этот способ работает скрыто от глаз пользователя. Независимо от того, что отображается на экране во время редактирования, в момент нажатия кнопки «Записать» или «Провести и закрыть» программа автоматически обратится к карточке контрагента, возьмет оттуда ответственного менеджера и запишет его в документ.
Важное предупреждение: На форуме в сообщении 2 предлагали использовать событие ПриЗаписи. Это грубая методологическая ошибка! Если вы начнете изменять реквизиты объекта внутри события ПриЗаписи, вам придется повторно вызывать метод Записать(), что приведет к бесконечной рекурсии (зацикливанию программы) или потребует написания сложных программных костылей с отключением обмена данными. Все изменения реквизитов должны происходить строго в событии ПередЗаписью, когда объект еще находится в оперативной памяти и готовится к отправке в базу данных.
Давайте разберем, как реализовать этот алгоритм в модуле объекта через расширение:
ЗаказПокупателя в наше расширение.ПередЗаписью с аннотацией &Перед или &После.Реализуем логику автозаполнения на языке 1С:
&Перед("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Если происходит загрузка данных (например, через обмен или интеграцию с сайтом),
// стандартно рекомендуется пропускать выполнение тяжелых алгоритмов заполнения
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем заполненность контрагента
Если ЗначениеЗаполнено(ЭтотОбъект.Покупатель) Тогда
// Считываем закрепленного менеджера из справочника Контрагенты
МенеджерИзКарточки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотОбъект.Покупатель, "Ответственный");
// Если менеджер в карточке указан и он отличается от текущего ответственного в документе
Если ЗначениеЗаполнено(МенеджерИзКарточки) И ЭтотОбъект.Ответственный <> МенеджерИзКарточки Тогда
ЭтотОбъект.Ответственный = МенеджерИзКарточки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод гарантирует 100% заполняемость реквизита, даже если заказы создаются программно (например, загружаются с сайта интернет-магазина, через мобильное приложение или по API). Например, автоматическое заполнение поля ответственного менеджера необходимо настроить при внедрении модуля обмена 1С:УНФ с Wildberries, Ozon и Яндекс.Маркетом, чтобы поступающие по API заказы сразу закреплялись за нужными сотрудниками.
Если вы по какой-то причине предпочитаете работать в основной конфигурации или хотите создать универсальную подписку сразу для нескольких видов документов (например, для ЗаказПокупателя, РасходнаяНакладная, СчетНаОплату), то механизм подписок на события подойдет идеально.
Выясним по шагам, как настроить такую подписку в конфигураторе:
Расш_ЗаполнениеДокументовСобытия). В свойствах модуля обязательно установим галочки Сервер, Вызов сервера и отключим Глобальный.Расш_ЗаполнитьОтветственногоПередЗаписьюДокумента.ДокументОбъект.ЗаказПокупателя (при необходимости можно отметить галочками и другие типы документов).ПередЗаписью.Внутри общего модуля напишем следующий код:
Процедура Расш_ЗаполнитьОтветственногоПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Исключаем работу алгоритма при пакетном обмене данными
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем наличие реквизита "Покупатель" у переданного источника
// Это делает процедуру универсальной для разных видов документов
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Источник, "Покупатель") Тогда
Если ЗначениеЗаполнено(Источник.Покупатель) Тогда
// Получаем менеджера из карточки контрагента
МенеджерИзКарточки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Покупатель, "Ответственный");
// Если менеджер задан, перезаписываем поле в документе
Если ЗначениеЗаполнено(МенеджерИзКарточки) И Источник.Ответственный <> МенеджерИзКарточки Тогда
Источник.Ответственный = МенеджерИзКарточки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Что делать, если у вас базовая версия 1С:УНФ, где заблокирована возможность использования расширений и изменения кода, а рассчитывать зарплату менеджерам корректно все-таки нужно? Выход есть, и даже два.
Научите ваших операторов вводить документы не из общего списка заказов, а непосредственно из карточки контрагента. Для этого нужно открыть карточку клиента в справочнике Контрагенты, нажать на верхней панели кнопку Создать на основании (или воспользоваться кнопкой ввода связанных документов) и выбрать Заказ покупателя. В зависимости от релиза и настроек CRM-системы, встроенные механизмы инициализации 1С автоматически подтянут в создаваемый документ все реквизиты, включая основного менеджера, закрепленного за этим клиентом.
Это отличный способ наведения порядка в базе перед непосредственным расчетом заработной платы (например, раз в месяц или раз в неделю). Администратор или бухгалтер по расчету зарплаты может массово исправить неверно заполненные поля Ответственный.
Разберем этот процесс по шагам:
Групповое изменение реквизитов).Документ "Заказ покупателя".Дата в интервале текущего месяца и Проведен равно Да.Ответственный.[Покупатель].[Ответственный].Ответственный на правильных менеджеров из карточек соответствующих клиентов.Изучив эти методы, вы сможете выбрать наиболее подходящий вариант автоматизации для вашей компании. Использование расширения конфигурации позволит навсегда забыть о ручном труде и гарантирует абсолютную точность при расчете зарплаты по показателю СуммаПродажПоОтветственному.