Как реализовать автоматическое заполнение договора в документе «Реализация товаров и услуг» при выборе клиента?

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

При разработке расширений для типовых конфигураций, таких как «Управление торговлей 11», программисты часто сталкиваются с задачей автоматизации рутинных операций. Одной из самых востребованных задач является автоматическое заполнение реквизита Договор при выборе Партнера или Контрагента в документах продажи. Рассмотрим подробно, с какими трудностями можно столкнуться и как правильно реализовать этот механизм, не нарушая логику типового решения.

Проблема: Метод является обработчиком нескольких событий

При попытке добавить обработчик события ПриИзменении для поля Партнер непосредственно в расширение формы документа, платформа часто выдает предупреждение: «Метод является обработчиком нескольких событий и / или команд, добавление расширения обработчика невозможно». Выясним причину этой ошибки.

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

Проанализируем способы обхода этой ситуации. Если нам все же необходимо вмешаться именно в работу формы, мы можем вручную прописать заголовок процедуры в модуле расширения, используя аннотацию &НаКлиенте и указав связь через &После("ИмяПроцедуры"). Однако, как показывает практика, для заполнения договора в УТ 11 существует более элегантный и «правильный» с точки зрения архитектуры способ.

Решение через общий модуль: Использование функции ПолучитьДоговорПоУмолчанию

В конфигурации «Управление торговлей» версии 11 (а также в ERP и КА) за логику подбора договора отвечает не столько форма документа, сколько специализированные серверные механизмы. Разберем по шагам, как использовать типовой функционал для нашей задачи.

Основная логика поиска подходящего договора сосредоточена в общем модуле ПродажиСервер в функции ПолучитьДоговорПоУмолчанию. Эта функция вызывается при создании документов и при изменении ключевых реквизитов (организация, партнер). Типовой алгоритм работает следующим образом: если у клиента найден ровно один действующий договор, он возвращается и подставляется в документ автоматически. Если договоров несколько — функция возвращает пустую ссылку, предоставляя выбор пользователю.

Для того чтобы внедрить свою логику (например, выбирать «основной» договор по какому-то признаку), нам не нужно менять форму. Достаточно расширить этот общий модуль. Рассмотрим пример кода, который можно разместить в расширении:


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

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

Почему договор очищается после заполнения?

Часто возникает ситуация: отладчик показывает, что договор успешно найден и присвоен реквизиту, но на форме поле остается пустым. Проанализируем ситуацию. Это происходит из-за механизма «Связи параметров выбора».

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

Также в УТ 11 важную роль играет Соглашение. Если в документе выбрано соглашение, которое требует ведения договоров, но ваш подставленный договор не «входит» в это соглашение, система его сбросит. Поэтому при автоматизации всегда проверяйте цепочку: Организация + Партнер + Контрагент + Соглашение = Договор.

Особенности настройки расширения

Для того чтобы ваш код в расширении работал корректно и отладчик «заходил» в процедуры, необходимо выполнить несколько условий:

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

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

← На главную