Как в 1С:УНФ автоматически подставлять ответственного менеджера из карточки контрагента в Заказ покупателя?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

В практической работе со схемами мотивации менеджеров по продажам в программе 1С:Управление нашей фирмой (УНФ) руководители часто сталкиваются с одной и той же проблемой. По умолчанию при создании документа ЗаказПокупателя система заполняет реквизит Ответственный текущим пользователем системы — то есть автором документа. Однако на практике заказы в базу могут вносить операторы колл-центра, помощники менеджеров, логисты или дежурные администраторы. В результате в поле Ответственный записывается имя технического исполнителя, а не того менеджера, который реально ведет клиента и закреплен за ним в справочнике Контрагенты.

Поскольку типовой механизм расчета управленческой зарплаты в 1С:УНФ опирается на показатель СуммаПродажПоОтветственному, неверное заполнение этого реквизита приводит к искажению аналитики и ошибкам в начислении бонусов. Операторам приходится вручную перевыбирать ответственного в каждом заказе, что порождает ошибки из-за пресловутого «человеческого фактора». Для дополнительного контроля корректности реквизитов можно использовать расширение для проверки заполнения заказов и первичных документов.

В этой статье мы подробно разберем, как автоматизировать этот процесс, исключить ошибки пользователей и сделать так, чтобы при выборе покупателя программа автоматически подставляла его персонального менеджера в поле Ответственный документа ЗаказПокупателя.

Почему стандартный совет с форума («Подписка на событие») сегодня требует доработки?

На форумах часто советуют просто создать подписку на событие напрямую в конфигурации 1С. Действительно, этот механизм отлично работает, но внесение изменений непосредственно в конфигурацию поставщика имеет ряд серьезных минусов:

  1. Сложности с обновлениями: Любые ручные изменения «в лоб» снимают конфигурацию с поддержки. При каждом выходе нового релиза 1С:УНФ вам придется тратить время на ручное сравнение и объединение кода.
  2. Проблемы в облачных сервисах: Если ваша информационная база работает в облаке (например, в «1С:Предприятие через интернет» — 1С:Fresh), вносить изменения в основную конфигурацию технически запрещено. Разрешены только расширения, прошедшие аудит.
  3. Базовые версии: В базовых версиях программных продуктов 1С изменения конфигурации и расширения не поддерживаются в принципе. Если у вас базовая версия, придется использовать альтернативные безкодовые методы, которые мы также рассмотрим ниже.

Для версий ПРОФ, КОРП и облачных решений наиболее правильным, современным и безопасным подходом является использование расширений конфигурации (Extensions). Давайте детально разберем два основных программных сценария автоматизации через расширение, а также классический метод подписок и альтернативный ручной вариант.

Рассмотрим по шагам каждый из этих способов.

Вариант А. Интерактивное автозаполнение на форме (Рекомендуемый UX/UI способ)

Этот вариант наиболее удобен для конечных пользователей. Как только оператор выбирает или меняет значение в поле Покупатель (в некоторых версиях — Контрагент) на форме заказа, программа мгновенно считывает ответственного менеджера из карточки этого клиента и подставляет его в поле Ответственный прямо на экране.

Проанализируем преимущества этого подхода: оператор сразу видит, кто назначен ответственным, и, если этот менеджер находится в отпуске или на больничном, может при необходимости скорректировать поле вручную.

Для реализации этого варианта выполним следующие действия:

  1. Создадим новое расширение конфигурации (или откроем существующее) и снимем галочку «Безопасный режим», чтобы иметь возможность работать с данными.
  2. Найдем в дереве объектов конфигурации документ ЗаказПокупателя, перейдем в его формы и добавим основную форму документа в наше расширение.
  3. На форме документа найдем элемент (поле ввода) Покупатель. Нажмем по нему правой кнопкой мыши и выберем «Создать обработчик событий» -> ПриИзменении. Выберем создание обработчика в модуле формы расширения с аннотацией &После.

Напишем программный код, который будет выполняться сразу после выбора контрагента клиентом:


&НаКлиенте
Процедура Расш_ПокупательПриИзмененииПосле(Элемент)
    
    // Вызываем серверную процедуру для работы с базой данных
    Расш_ЗаполнитьОтветственногоМенеджераНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура Расш_ЗаполнитьОтветственногоМенеджераНаСервере()
    
    // Проверяем, заполнен ли покупатель в документе
    Если ЗначениеЗаполнено(Объект.Покупатель) Тогда
        
        // Получаем значение ответственного менеджера непосредственно из карточки контрагента
        // Используем безопасное чтение реквизита через стандартную функцию общего модуля
        МенеджерИзКарточки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Покупатель, "Ответственный");
        
        // Если у контрагента закреплен ответственный менеджер, переносим его в документ
        Если ЗначениеЗаполнено(МенеджерИзКарточки) Тогда
            Объект.Ответственный = МенеджерИзКарточки;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Этот код работает быстро, прозрачно для пользователя и не требует перезаписи самого документа в базу данных в фоновом режиме.

Вариант Б. Фоновое заполнение объекта «Перед записью»

Этот способ работает скрыто от глаз пользователя. Независимо от того, что отображается на экране во время редактирования, в момент нажатия кнопки «Записать» или «Провести и закрыть» программа автоматически обратится к карточке контрагента, возьмет оттуда ответственного менеджера и запишет его в документ.

Важное предупреждение: На форуме в сообщении 2 предлагали использовать событие ПриЗаписи. Это грубая методологическая ошибка! Если вы начнете изменять реквизиты объекта внутри события ПриЗаписи, вам придется повторно вызывать метод Записать(), что приведет к бесконечной рекурсии (зацикливанию программы) или потребует написания сложных программных костылей с отключением обмена данными. Все изменения реквизитов должны происходить строго в событии ПередЗаписью, когда объект еще находится в оперативной памяти и готовится к отправке в базу данных.

Давайте разберем, как реализовать этот алгоритм в модуле объекта через расширение:

  1. Добавим объект Документ ЗаказПокупателя в наше расширение.
  2. Откроем модуль объекта документа в расширении.
  3. Создадим обработчик события ПередЗаписью с аннотацией &Перед или &После.

Реализуем логику автозаполнения на языке 1С:


&Перед("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Если происходит загрузка данных (например, через обмен или интеграцию с сайтом), 
    // стандартно рекомендуется пропускать выполнение тяжелых алгоритмов заполнения
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем заполненность контрагента
    Если ЗначениеЗаполнено(ЭтотОбъект.Покупатель) Тогда
        
        // Считываем закрепленного менеджера из справочника Контрагенты
        МенеджерИзКарточки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотОбъект.Покупатель, "Ответственный");
        
        // Если менеджер в карточке указан и он отличается от текущего ответственного в документе
        Если ЗначениеЗаполнено(МенеджерИзКарточки) И ЭтотОбъект.Ответственный <> МенеджерИзКарточки Тогда
            ЭтотОбъект.Ответственный = МенеджерИзКарточки;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Этот метод гарантирует 100% заполняемость реквизита, даже если заказы создаются программно (например, загружаются с сайта интернет-магазина, через мобильное приложение или по API). Например, автоматическое заполнение поля ответственного менеджера необходимо настроить при внедрении модуля обмена 1С:УНФ с Wildberries, Ozon и Яндекс.Маркетом, чтобы поступающие по API заказы сразу закреплялись за нужными сотрудниками.

Вариант В. Классическая подписка на событие (без изменения расширений форм)

Если вы по какой-то причине предпочитаете работать в основной конфигурации или хотите создать универсальную подписку сразу для нескольких видов документов (например, для ЗаказПокупателя, РасходнаяНакладная, СчетНаОплату), то механизм подписок на события подойдет идеально.

Выясним по шагам, как настроить такую подписку в конфигураторе:

  1. Создадим новый общий модуль (например, с именем Расш_ЗаполнениеДокументовСобытия). В свойствах модуля обязательно установим галочки Сервер, Вызов сервера и отключим Глобальный.
  2. В ветке конфигурации «Общие» найдем подраздел «Подписки на события» и добавим новую подписку. Назовем ее, к примеру, Расш_ЗаполнитьОтветственногоПередЗаписьюДокумента.
  3. В поле Источник выберем объект нужного документа: ДокументОбъект.ЗаказПокупателя (при необходимости можно отметить галочками и другие типы документов).
  4. В поле Событие выберем значение ПередЗаписью.
  5. В поле Обработчик укажем нашу процедуру из созданного ранее общего модуля.

Внутри общего модуля напишем следующий код:


Процедура Расш_ЗаполнитьОтветственногоПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    // Исключаем работу алгоритма при пакетном обмене данными
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем наличие реквизита "Покупатель" у переданного источника
    // Это делает процедуру универсальной для разных видов документов
    Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Источник, "Покупатель") Тогда
        
        Если ЗначениеЗаполнено(Источник.Покупатель) Тогда
            
            // Получаем менеджера из карточки контрагента
            МенеджерИзКарточки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Покупатель, "Ответственный");
            
            // Если менеджер задан, перезаписываем поле в документе
            Если ЗначениеЗаполнено(МенеджерИзКарточки) И Источник.Ответственный <> МенеджерИзКарточки Тогда
                Источник.Ответственный = МенеджерИзКарточки;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Альтернативный обходной путь (Без программирования и доработок)

Что делать, если у вас базовая версия 1С:УНФ, где заблокирована возможность использования расширений и изменения кода, а рассчитывать зарплату менеджерам корректно все-таки нужно? Выход есть, и даже два.

Способ 1. Изменение бизнес-процесса ввода документов

Научите ваших операторов вводить документы не из общего списка заказов, а непосредственно из карточки контрагента. Для этого нужно открыть карточку клиента в справочнике Контрагенты, нажать на верхней панели кнопку Создать на основании (или воспользоваться кнопкой ввода связанных документов) и выбрать Заказ покупателя. В зависимости от релиза и настроек CRM-системы, встроенные механизмы инициализации 1С автоматически подтянут в создаваемый документ все реквизиты, включая основного менеджера, закрепленного за этим клиентом.

Способ 2. Регулярное использование обработки «Групповое изменение реквизитов»

Это отличный способ наведения порядка в базе перед непосредственным расчетом заработной платы (например, раз в месяц или раз в неделю). Администратор или бухгалтер по расчету зарплаты может массово исправить неверно заполненные поля Ответственный.

Разберем этот процесс по шагам:

  1. Перейдем в раздел Компания -> Администрирование -> Обслуживание -> Корректировка данных (либо откроем через функции технического специалиста обработку Групповое изменение реквизитов).
  2. В поле «Изменять» выберем объект: Документ "Заказ покупателя".
  3. Нажмем ссылку «Все элементы» для настройки отбора. Добавим критерии отбора, например: Дата в интервале текущего месяца и Проведен равно Да.
  4. В табличной части со списком реквизитов найдем строку Ответственный.
  5. В колонке «Новое значение» нажмем кнопку выбора, но вместо выбора конкретного сотрудника нажмем на кнопку с шестеренкой или выберем режим составного типа/вычисляемого поля (в зависимости от версии платформы). Нам нужно настроить заполнение по формуле или по значению другого реквизита.
  6. Пропишем путь к реквизиту-источнику: [Покупатель].[Ответственный].
  7. Нажмем кнопку «Изменить реквизиты». Программа проанализирует все выбранные заказы и за несколько секунд автоматически заменит текущих авторов-операторов в поле Ответственный на правильных менеджеров из карточек соответствующих клиентов.

Изучив эти методы, вы сможете выбрать наиболее подходящий вариант автоматизации для вашей компании. Использование расширения конфигурации позволит навсегда забыть о ручном труде и гарантирует абсолютную точность при расчете зарплаты по показателю СуммаПродажПоОтветственному.

← На главную