Почему не работает автозаполнение по ИНН для загруженных контрагентов в 1С:УПП 1.3 и как это исправить

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

Приветствуем вас! Довольно часто при интеграции или программном переносе данных из других систем (например, из файлов Excel, XML или сторонних баз данных) разработчики сталкиваются со следующей проблемой. Контрагенты успешно загружаются в базу «1С:Управление производственным предприятием 1.3» (УПП), у них корректно заполнен ИНН, однако при попытке воспользоваться стандартным механизмом автозаполнения реквизитов (сервисом «1С:Контрагент») по кнопке «Заполнить по ИНН» программа выдает досадную ошибку: «Не удалось найти данные для заполнения реквизитов по ИНН».

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

Выясняем причины проблемы: почему ручной ввод работает, а загрузка — нет

Давайте проанализируем, как ведет себя конфигурация УПП 1.3 в обоих случаях. Когда мы создаем контрагента интерактивно (вручную через интерфейс), платформа автоматически выполняет множество фоновых процессов: отработки подписок на события, инициализацию значений по умолчанию при открытии формы и автозаполнение скрытых реквизитов, необходимых для корректной работы бизнес-логики. Программная же загрузка зачастую записывает объект напрямую в базу данных, заполняя только те поля, которые разработчик явно указал в коде обработки. Из-за этого «за кадром» остаются критически важные реквизиты.

Рассмотрим основные технические причины сбоя автозаполнения:

  1. Не заполнен реквизит ЮрФизЛицо. Это наиболее частая причина сбоя. В конфигурации УПП 1.3 алгоритм работы кнопки «Заполнить по ИНН» жестко завязан на данный реквизит, принимающий значения из перечисления ЮрФизЛицо (возможные варианты: ЮрЛицо, ФизЛицо или ИП). При нажатии на кнопку система проверяет тип контрагента. Если реквизит пустой, алгоритм может по умолчанию направить запрос к реестру индивидуальных предпринимателей (ЕГРИП) вместо реестра юридических лиц (ЕГРЮЛ), пытаясь найти 10-значный ИНН там, где должны быть только 12-значные коды, либо вовсе аварийно прервать выполнение запроса. При ручном создании карточки реквизит ЮрФизЛицо инициализируется значением по умолчанию (обычно ЮрЛицо), а при программной загрузке он часто остается пустым.
  2. Присутствие невидимых спецсимволов и пробелов в строке ИНН. При импорте данных из внешних источников (особенно из таблиц Excel) строка ИНН нередко импортируется со скрытыми дефектами. Это могут быть лидирующие или замыкающие пробелы, а также неразрывные пробелы (символ с кодом 160, обозначаемый в 1С как Символы.НПП), которые визуально не отличить от обычных. При ручном вводе маска текстового поля автоматически очищает значение от лишних символов. При программной записи без очистки веб-сервис «1С:Контрагент» получает искаженную строку (например, " 7701234567" вместо "7701234567") и возвращает пустой ответ, что и приводит к ошибке.
  3. Отсутствие страны регистрации контрагента. Веб-сервис «1С:Контрагент» работает только с резидентами Российской Федерации. За это отвечает реквизит СтранаРегистрации (ссылка на справочник КлассификаторСтранМира). Если при программном создании это поле не заполняется, система считает, что контрагент зарегистрирован за пределами РФ, и блокирует отправку запроса. При ручном же вводе значение «Россия» подставляется автоматически.
  4. Некорректный КПП. Если обработка загрузки перенесла неверный или устаревший КПП (например, содержащий случайные пробелы или спецсимволы), сервис автозаполнения может выдать ошибку сопоставления данных. При создании вручную это поле изначально пустое, поэтому сервис без проблем перезаписывает его актуальными данными из реестра.

Пошаговая диагностика: как локализовать ошибку

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

Шаг 1. Сравнение реквизитов через консоль запросов

Для начала сравним значения реквизитов у двух контрагентов: одного, созданного обработкой (нерабочего), и второго, созданного вручную (рабочего). Для этого воспользуемся консолью запросов или напишем простой код. Нам нужно проанализировать поля ЮрФизЛицо, СтранаРегистрации, а также проверить точную длину ИНН.

Запустим консоль запросов и выполним следующий запрос:


ВЫБРАТЬ
    Ссылка,
    ИНН,
    ДЛИНАСТРОКИ(ИНН) КАК ДлинаИНН,
    ЮрФизЛицо,
    СтранаРегистрации,
    КПП
ИЗ
    Справочник.Контрагенты
ГДЕ
    Ссылка В (&МассивКонтрагентов)

В параметры запроса передадим ссылку на проблемного контрагента и на тестового, созданного вручную. В результате мы наглядно увидим разницу. Обратите внимание на колонку ДлинаИНН: если ИНН организации (юридического лица) имеет длину более 10 символов, значит, в строке присутствуют скрытые пробелы.

Шаг 2. Отладка модуля элемента справочника

Если сравнение реквизитов не дало быстрого ответа, обратимся к конфигуратору и запустим отладчик. Выполним следующие действия:

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

Решение проблемы: доработка загрузочной обработки

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

Ниже представлен пример качественного кода для загрузки контрагента с учетом всех возможных подводных камней:


// Функция для очистки строки ИНН от мусорных символов
Функция ОчиститьИНН(Знач ИсходныйИНН) Экспорт
    // Убираем обычные пробелы по краям
    ОчищенныйИНН = СокрЛП(ИсходныйИНН);
    
    // Удаляем неразрывные пробелы (символ с кодом 160)
    ОчищенныйИНН = СтрЗаменить(ОчищенныйИНН, Символы.НПП, "");
    
    // На всякий случай удаляем символы табуляции и перевода строк
    ОчищенныйИНН = СтрЗаменить(ОчищенныйИНН, Символы.Таб, "");
    ОчищенныйИНН = СтрЗаменить(ОчищенныйИНН, Символы.ПС, "");
    ОчищенныйИНН = СтрЗаменить(ОчищенныйИНН, Символы.ВК, "");
    
    Возврат ОчищенныйИНН;
КонецФункции

// Процедура создания контрагента из структуры данных
Процедура СоздатьКонтрагентаПрограммно(ДанныеЗагрузки)
    
    НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
    
    // Заполняем основные реквизиты
    НовыйКонтрагент.Наименование = СокрЛП(ДанныеЗагрузки.Наименование);
    НовыйКонтрагент.НаименованиеПолное = СокрЛП(ДанныеЗагрузки.НаименованиеПолное);
    
    // Очищаем и записываем ИНН
    НовыйКонтрагент.ИНН = ОчиститьИНН(ДанныеЗагрузки.ИНН);
    
    // Очищаем КПП, если он передан
    Если ДанныеЗагрузки.Свойство("КПП") Тогда
        НовыйКонтрагент.КПП = СокрЛП(ДанныеЗагрузки.КПП);
    КонецЕсли;
    
    // ОПРЕДЕЛЯЕМ И ЗАПОЛНЯЕМ ЮР/ФИЗ ЛИЦО (Критически важно!)
    ДлинаИНН = СтрДлина(НовыйКонтрагент.ИНН);
    Если ДлинаИНН = 10 Тогда
        НовыйКонтрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    ИначеЕсли ДлинаИНН = 12 Тогда
        // Если это ИП или физлицо
        НовыйКонтрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
    Иначе
        // Если длина некорректная, запишем как ЮрЛицо по умолчанию
        НовыйКонтрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    КонецЕсли;
    
    // ЗАПОЛНЯЕМ СТРАНУ РЕГИСТРАЦИИ (Критически важно!)
    СсылкаНаРоссию = Справочники.КлассификаторСтранМира.НайтиПоКоду("643");
    Если Не СсылкаНаРоссию.Пустая() Тогда
        НовыйКонтрагент.СтранаРегистрации = СсылкаНаРоссию;
    КонецЕсли;
    
    // Заполняем остальные реквизиты по вашей логике (договоры, группы)
    // ...
    
    Попытка
        НовыйКонтрагент.Записать();
        Сообщить("Контрагент " + НовыйКонтрагент.Наименование + " успешно создан!");
    Исключение
        Сообщить("Не удалось записать контрагента. Ошибка: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    КонецПопытки;
    
КонецПроцедуры

Как исправить уже загруженных контрагентов в базе данных

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

Проанализируем самый простой и быстрый способ исправления данных:

  1. Откроем обработку «Групповое изменение реквизитов» (в УПП 1.3 она обычно доступна через меню «Сервис» или может быть запущена как внешняя обработка с диска ИТС).
  2. В поле «Изменять объект» выберем справочник Контрагенты.
  3. Нажмем кнопку «Добавить условие отбора» и установим отбор: ЮрФизЛицо – Не заполнено (или Пустая ссылка).
  4. Дополнительно можно поставить отбор по длине ИНН, если у вас в базе есть как юридические, так и физические лица. Для юридических лиц добавим условие: ИНН – Содержит (и указать шаблоны) или просто отобрать тех, у кого длина ИНН равна 10 символам.
  5. В списке доступных реквизитов для изменения найдем ЮрФизЛицо и установим значение ЮрЛицо.
  6. Вторым реквизитом выберем СтранаРегистрации и укажем значение Россия (код 643).
  7. Нажмем кнопку «Изменить параметры» (или «Выполнить»). Обработка мгновенно заполнит пустые реквизиты у всех найденных контрагентов.

После выполнения этих простых шагов все ваши загруженные контрагенты получат корректно заполненные системные свойства. Кнопка «Заполнить по ИНН» в карточке контрагента начнет работать в штатном режиме, обращаясь к сервису «1С:Контрагент» без каких-либо ошибок и сбоев!

← На главную