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

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

Мы рассмотрим, как настроить автоматическое заполнение поля "Менеджер" в документе "Реализация товаров и услуг" на основании "Заказа клиента" в конфигурации 1С:Управление торговлей (УТ), особенно для версий 11.4 и 11.5. Эта задача часто возникает при необходимости сохранения ответственного менеджера, который работал с клиентом на этапе заказа, во всех последующих документах отгрузки, а также при создании и печати полного комплекта документов по заказу клиента. Мы разберем различные подходы, включая стандартные механизмы и доработки с использованием расширений, а также рассмотрим важные нюансы, такие как безопасный режим расширений и особенности структуры данных в разных версиях конфигурации.

Стандартные механизмы заполнения менеджера

Автоматизация цепочек документов, таких как создание документа "Заказ клиента" на основании документа "Заказ поставщику", является важной частью оптимизации бизнес-процессов.

Прежде чем приступать к доработкам, важно понимать, как типовая конфигурация 1С:УТ по умолчанию заполняет поле "Менеджер" в документах. В 1С:Управление торговлей 11.5 (и аналогично в более ранних версиях) менеджер может быть определен по следующей иерархии:

  1. Из договора с контрагентом: Если в карточке договора указан ответственный менеджер, система в первую очередь попытается взять его оттуда. Это самый приоритетный источник.
  2. Из соглашения с клиентом: Если менеджер не указан в договоре, система обращается к условиям, заданным в соглашении с клиентом (например, типовом или индивидуальном).
  3. Из карточки клиента (партнера): Если информация о менеджере отсутствует и в договоре, и в соглашении, тогда система ищет "Основного менеджера" в карточке самого клиента (партнера). Это важно для корректного учета, например, когда выполняется создание отчетов комиссионера в 1С: УТ 11.5 по основным менеджерам партнера.
  4. Из пользователя, создавшего документ: В случае, если ни один из вышеперечисленных источников не предоставил данные о менеджере, поле может быть автоматически заполнено пользователем, который создает документ "Реализация товаров и услуг". Это поведение часто можно наблюдать в процедуре ИнициализироватьДокумент модуля объекта документа, где может быть строка типа Менеджер = Пользователи.ТекущийПользователь;.

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

Решение с использованием расширений конфигурации

Наиболее предпочтительным и современным способом внесения изменений в функциональность 1С без модификации типовой конфигурации является использование расширений. Этот подход значительно упрощает процесс обновления конфигурации и позволяет избежать потенциальных проблем при переходе на новые версии платформы или при получении обновлений от разработчика.

Метод 1: Доработка модуля объекта документа "Реализация товаров и услуг" с помощью обработчика &После("ОбработкаЗаполнения")

Этот метод предполагает добавление кода в расширение, который будет выполняться после стандартной процедуры заполнения документа. Мы будем использовать обработчик &После("ОбработкаЗаполнения") в модуле объекта документа "Реализация товаров и услуг".

  1. Создайте расширение: Откройте конфигуратор, перейдите в меню "Конфигурация" -> "Расширения конфигурации" -> "Добавить". Присвойте расширению осмысленное имя.
  2. Добавьте объект расширения: В новом расширении добавьте в список расширяемых объектов документ "Реализация товаров и услуг".
  3. Создайте обработчик в модуле объекта: Откройте модуль объекта документа "Реализация товаров и услуг" в расширении. Добавьте в него процедуру с аннотацией &После.

    Мы проанализируем параметр ДанныеЗаполнения, который может быть либо структурой, содержащей документ-основание, либо непосредственно ссылкой на документ-основание (в нашем случае - "Заказ клиента").

    
    &После("ОбработкаЗаполнения")
    Процедура од_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        Перем ТипДанныхЗаполнения;
        ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
            
        // Проверяем, если ДанныеЗаполнения — это структура
        Если ТипДанныхЗаполнения = Тип("Структура") Тогда
            // Проверяем, содержит ли структура свойство "ДокументОснование"
            Если ДанныеЗаполнения.Свойство("ДокументОснование") Тогда
                // В некоторых версиях УТ 11.5 "ДокументОснование" может быть массивом.
                // Поэтому проверяем тип первого элемента массива, если это массив.
                Если ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("Массив") Тогда
                    Если ДанныеЗаполнения.ДокументОснование.Количество() > 0 
                       И ТипЗнч(ДанныеЗаполнения.ДокументОснование[0]) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
                        ЭтотОбъект.Менеджер = ДанныеЗаполнения.ДокументОснование[0].Менеджер;
                    КонецЕсли;
                // Если "ДокументОснование" — это не массив, а просто ссылка
                ИначеЕсли ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
                    ЭтотОбъект.Менеджер = ДанныеЗаполнения.ДокументОснование.Менеджер;
                КонецЕсли;
            КонецЕсли;
        // Проверяем, если ДанныеЗаполнения — это непосредственно ссылка на "Заказ клиента"
        ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Тогда
            ЭтотОбъект.Менеджер = ДанныеЗаполнения.Менеджер;
        КонецЕсли;
    КонецПроцедуры
    

    Обратите внимание на использование ЭтотОбъект.Менеджер для прямого обращения к реквизиту объекта документа, который мы заполняем. Также учтите проверку ДокументОснование[0], которая стала актуальной для некоторых версий УТ 11.5, где основание может передаваться как массив ссылок.

  4. Очистка стандартного значения: Иногда стандартная процедура ИнициализироватьДокумент или другие части кода могут устанавливать менеджера по умолчанию (например, текущего пользователя). Чтобы наша логика сработала корректно, нам нужно убедиться, что стандартное значение менеджера не перетирает то, что мы установили из заказа, или что оно будет установлено после нашего. В данном случае, так как мы используем &После, наша установка будет выполняться после типовой, и должна переопределить стандартное значение. Однако, если вы столкнетесь с тем, что менеджер все равно заполняется неправильно, возможно, придется рассмотреть вариант с &Вместо или детально проанализировать типовой код. В большинстве случаев подход с &После и прямым присваиванием ЭтотОбъект.Менеджер оказывается достаточным.

Метод 2: Доработка модуля формы документа "Реализация товаров и услуг" с помощью обработчика &ПриСозданииНаСервереПосле

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

  1. Создайте расширение и добавьте объект: Как и в предыдущем случае, создайте расширение и добавьте в него документ "Реализация товаров и услуг".
  2. Расширьте форму документа: В расширении расширьте основную форму документа "Реализация товаров и услуг".
  3. Добавьте обработчик в модуль формы: В модуле формы документа в расширении добавьте процедуру с аннотацией &ПриСозданииНаСервереПосле.

    Параметры, передаваемые в этот обработчик, содержат информацию об основании. Мы можем получить ее через Параметры.Основание.

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

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

Важный нюанс: Отключение безопасного режима для расширений

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

Для корректной работы расширения, которое модифицирует логику в модуле объекта или обращается к серверным данным, вам потребуется отключить безопасный режим.

  1. В конфигураторе: Откройте конфигуратор, перейдите в меню "Конфигурация" -> "Расширения конфигурации". Выберите ваше расширение, откройте его свойства и снимите флажок "Безопасный режим".
  2. В режиме 1С:Предприятие: Если расширение уже установлено, то в разделе "НСИ и администрирование" -> "Печатные формы, отчеты и обработки" -> "Расширения" выберите ваше расширение и снимите флажок "Безопасный режим" в его свойствах. После снятия флажка может потребоваться перезапуск клиентского приложения.

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

Особенности для УТ 11.5.x

В более новых версиях 1С:Управление торговлей (начиная с 11.5 и выше, например 11.5.13.104, 11.5.16.107, 11.5.17.143, 11.5.17.179) были замечены изменения в структуре параметра ДанныеЗаполнения, передаваемого в процедуру ОбработкаЗаполнения. В частности, ДанныеЗаполнения.ДокументОснование может быть не просто ссылкой на документ, а массивом ссылок, даже если документ-основание всего один.

В таком случае, для получения ссылки на "Заказ клиента", необходимо обращаться к первому элементу этого массива, используя индекс [0]. Пример кода, адаптированного для этих версий:


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

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

Нерекомендуемые подходы: Прямое изменение типовой конфигурации

В процессе обсуждения на форуме поднимались идеи о прямом изменении типового кода конфигурации, например, в процедурах ЗаполнитьДокументНаОснованииЗаказаКлиента или ИнициализироватьДокумент модуля объекта документа "Реализация товаров и услуг". Этот подход, хотя и может решить задачу, крайне не рекомендуется по следующим причинам:

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

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

Заключение

Мы рассмотрели, как эффективно настроить автоматическое заполнение поля "Менеджер" в документе "Реализация товаров и услуг" на основе данных из "Заказа клиента" в 1С:Управление торговлей. Мы выяснили, что наиболее надежным и рекомендуемым способом является использование расширений конфигурации с обработчиками &После("ОбработкаЗаполнения") в модуле объекта или &ПриСозданииНаСервереПосле в модуле формы. Критически важным шагом для успешной работы расширений является отключение безопасного режима. Также мы проанализировали особенности работы с данными в различных версиях УТ 11.5, где структура параметра ДанныеЗаполнения.ДокументОснование может представлять собой массив. Следуя этим рекомендациям, вы сможете настроить необходимое поведение системы, минимизируя риски при последующих обновлениях.

← На главную