Как программно нажать кнопку на форме или имитировать заполнение контрагента по ИНН из обработки?

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

При разработке внешних обработок в экосистеме 1С:Предприятие 8 часто возникает необходимость автоматизировать создание элементов справочников. Одной из самых востребованных функций является автоматическое заполнение реквизитов контрагента (наименование, КПП, адрес, руководитель) по его ИНН. В типовых конфигурациях, таких как Управление торговлей 11, ERP 2.4/2.5 или Бухгалтерия предприятия 3.0, на форме справочника Контрагенты уже есть заветная кнопка "Заполнить по ИНН".

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

Почему «нажать на кнопку» — это плохая идея?

Проанализируем ситуацию: кнопка на форме — это лишь визуальный элемент, связанный с Командой формы. Процедура команды обычно располагается в модуле формы с директивой &НаКлиенте. Чтобы «нажать» её извне, нам потребовалось бы:

  1. Получить форму существующего или нового объекта.
  2. Убедиться, что процедура команды является экспортной (что в типовых конфигурациях встречается крайне редко).
  3. Вызвать этот метод, предварительно заполнив контекст формы.

Такой подход крайне нестабилен. Рассмотрим более надежные и архитектурно верные способы решения задачи.

Способ №1. Вызов методов общих модулей (Рекомендуемый)

Выясним причину, по которой код заполнения вообще работает. В современных конфигурациях вся сложная логика получения данных из веб-сервиса «1С:Контрагент» вынесена в общие модули. Это сделано специально для того, чтобы разработчики могли использовать функционал без привязки к конкретному интерфейсу.

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


// В модуле вашей обработки (на сервере)
Процедура ЗаполнитьКонтрагентаПоИНН(ОбъектКонтрагент, Знач ИНН)
    
    // Проверим, заполнен ли ИНН
    Если ПустаяСтрока(ИНН) Тогда
        Возврат;
    КонецЕсли;

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

КонецПроцедуры

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

Способ №2. Использование параметров заполнения при открытии формы

Если ваша задача — не просто создать объект в фоне, а открыть пользователю форму нового контрагента, которая уже будет заполнена по ИНН, мы можем воспользоваться механизмом ОбработкаЗаполнения.

Рассмотрим пример вызова формы из вашей обработки:


// На клиенте
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ИНН", "7701234567");
// Можно передать признак, что нужно сразу запустить заполнение
ПараметрыЗаполнения.Вставить("ЗаполнитьПоИНН", Истина);

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);

ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);

В этом случае система при создании формы вызовет событие ОбработкаЗаполнения в модуле менеджера или модуле объекта справочника. Типовой код 1С увидит переданный ИНН и автоматически инициирует процедуру получения данных из сервиса. Это самый «чистый» способ с точки зрения пользователя, так как он увидит привычный процесс заполнения.

Способ №3. Программный вызов экспортного метода формы

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

Предположим, в форме контрагента есть метод:


&НаКлиенте
Процедура Подключаемый_ВыполнитьЗаполнениеПоИНН() Экспорт
    // Логика типовой кнопки
КонецПроцедуры

Тогда из вашей обработки, имея ссылку на форму (например, полученную при открытии), вы можете сделать так:


// Получаем форму (если она уже открыта или мы ее открываем)
ФормаКонтрагента = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", Новый Структура("Ключ", СсылкаНаКонтрагента));
// Вызываем экспортный метод
ФормаКонтрагента.Подключаемый_ВыполнитьЗаполнениеПоИНН();

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

Специфика работы с длительными операциями

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

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

  1. Запустить выполнение на сервере.
  2. На клиенте ожидать завершения через ПодключитьОбработчикОжидания.
  3. После завершения забрать результат из временного хранилища.

Резюме для разработчика

Подведем итог нашему анализу. Если вам нужно просто создать заполненного контрагента из кода вашей обработки, не пытайтесь «нажимать» кнопки. Правильный алгоритм действий следующий:

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

← На главную