При разработке внешних обработок в экосистеме 1С:Предприятие 8 часто возникает необходимость автоматизировать создание элементов справочников. Одной из самых востребованных функций является автоматическое заполнение реквизитов контрагента (наименование, КПП, адрес, руководитель) по его ИНН. В типовых конфигурациях, таких как Управление торговлей 11, ERP 2.4/2.5 или Бухгалтерия предприятия 3.0, на форме справочника Контрагенты уже есть заветная кнопка "Заполнить по ИНН".
Однако попытка просто «нажать» на эту кнопку программно из другой обработки сталкивается с архитектурными особенностями управляемого приложения. Давайте подробно разберем, почему не стоит имитировать нажатие и как правильно реализовать этот функционал, используя программные интерфейсы конфигурации.
Проанализируем ситуацию: кнопка на форме — это лишь визуальный элемент, связанный с Командой формы. Процедура команды обычно располагается в модуле формы с директивой &НаКлиенте. Чтобы «нажать» её извне, нам потребовалось бы:
Такой подход крайне нестабилен. Рассмотрим более надежные и архитектурно верные способы решения задачи.
Выясним причину, по которой код заполнения вообще работает. В современных конфигурациях вся сложная логика получения данных из веб-сервиса «1С:Контрагент» вынесена в общие модули. Это сделано специально для того, чтобы разработчики могли использовать функционал без привязки к конкретному интерфейсу.
Как правило, за это отвечает функционал Библиотеки стандартных подсистем (БСП). Разберем по шагам, как найти нужный метод. В конфигурациях на базе УТ 11 или ERP за получение данных отвечает серверный вызов. Рассмотрим пример кода, который можно использовать в вашей обработке:
// В модуле вашей обработки (на сервере)
Процедура ЗаполнитьКонтрагентаПоИНН(ОбъектКонтрагент, Знач ИНН)
// Проверим, заполнен ли ИНН
Если ПустаяСтрока(ИНН) Тогда
Возврат;
КонецЕсли;
// В типовых решениях часто используется модуль ЗаполнениеРеквизитовОбъектов
// Для УТ 11/ERP актуален следующий подход:
ДанныеКонтрагента = ДанныеКонтрагентаПоИНН(ИНН);
Если ДанныеКонтрагента <> Неопределено Тогда
// Заполняем реквизиты объекта данными из структуры
ОбъектКонтрагент.Наименование = ДанныеКонтрагента.НаименованиеПолное;
ОбъектКонтрагент.НаименованиеПолное = ДанныеКонтрагента.НаименованиеПолное;
ОбъектКонтрагент.КПП = ДанныеКонтрагента.КПП;
// ... заполнение остальных полей
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию с поиском функции в конфигурации. Вам необходимо найти общий модуль, содержащий ключевое слово Контрагент и ИНН. В последних версиях ERP это может быть ПартнерыИКонтрагентыВызовСервера.ДанныеКонтрагентаПоИНН. Обратите внимание, что сервис возвращает структуру, которую нужно правильно разобрать и сопоставить с реквизитами справочника.
Если ваша задача — не просто создать объект в фоне, а открыть пользователю форму нового контрагента, которая уже будет заполнена по ИНН, мы можем воспользоваться механизмом ОбработкаЗаполнения.
Рассмотрим пример вызова формы из вашей обработки:
// На клиенте
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ИНН", "7701234567");
// Можно передать признак, что нужно сразу запустить заполнение
ПараметрыЗаполнения.Вставить("ЗаполнитьПоИНН", Истина);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
В этом случае система при создании формы вызовет событие ОбработкаЗаполнения в модуле менеджера или модуле объекта справочника. Типовой код 1С увидит переданный ИНН и автоматически инициирует процедуру получения данных из сервиса. Это самый «чистый» способ с точки зрения пользователя, так как он увидит привычный процесс заполнения.
Если вы все же настаиваете на «нажатии» кнопки на уже открытой форме, разберем, как это реализовать технически. Для этого процедура, обслуживающая кнопку на форме справочника, должна быть объявлена с ключевым словом Экспорт.
Предположим, в форме контрагента есть метод:
&НаКлиенте
Процедура Подключаемый_ВыполнитьЗаполнениеПоИНН() Экспорт
// Логика типовой кнопки
КонецПроцедуры
Тогда из вашей обработки, имея ссылку на форму (например, полученную при открытии), вы можете сделать так:
// Получаем форму (если она уже открыта или мы ее открываем)
ФормаКонтрагента = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", Новый Структура("Ключ", СсылкаНаКонтрагента));
// Вызываем экспортный метод
ФормаКонтрагента.Подключаемый_ВыполнитьЗаполнениеПоИНН();
Важно: Этот метод сработает только в том случае, если разработчики типовой конфигурации пометили процедуру как Экспорт. В 90% случаев это не так, поэтому данный способ требует внесения изменений в расширение или саму конфигурацию, что не всегда желательно.
Выясним важную техническую деталь: заполнение по ИНН — это сетевой запрос к серверам 1С. В управляемом интерфейсе такие запросы часто выполняются через фоновые задания, чтобы интерфейс пользователя не «зависал».
Если вы вызываете серверный метод напрямую в своей обработке, будьте готовы к тому, что он может вернуть не результат, а ИдентификаторЗадания. В этом случае вам придется использовать механизмы общего модуля ДлительныеОперации:
ПодключитьОбработчикОжидания.Подведем итог нашему анализу. Если вам нужно просто создать заполненного контрагента из кода вашей обработки, не пытайтесь «нажимать» кнопки. Правильный алгоритм действий следующий:
Контрагенты, чтобы понять, какой именно серверный метод вызывается при нажатии кнопки.ЗаполнениеРеквизитовОбъектов), передавая туда ИНН.СправочникОбъект программно на стороне сервера.Использование прямого обращения к данным вместо имитации интерфейсных действий делает ваш код более надежным, быстрым и независимым от будущих обновлений интерфейса типовой конфигурации.