Как правильно найти контрагента по ИНН и КПП программным способом в 1С?

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

При автоматизации загрузки данных, например, при импорте списка контрагентов из файлов формата Excel, одной из частых задач является проверка наличия записи в базе данных перед созданием новой. Часто разработчики сталкиваются с ошибками при работе с объектами РезультатЗапроса. Давайте разберем, почему возникают ошибки и как грамотно организовать процесс поиска.

Основные причины ошибок при работе с запросами

Чаще всего при попытке получить данные из запроса новички совершают две ошибки:

  1. Попытка обращения к данным без вызова метода Следующий(). Метод Выполнить().Выбрать() лишь подготавливает выборку, но не позиционирует курсор на первой записи.
  2. Отсутствие нужных полей в тексте запроса. Если вы планируете получать ссылку на объект справочника, поле Ссылка должно быть явно указано в блоке ВЫБРАТЬ.

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


// Ошибочный подход
Запрос = Новый Запрос("ВЫБРАТЬ ИНН, КПП ИЗ Справочник.Контрагенты ГДЕ ИНН = &ИНН");
// ... установка параметров ...
Выборка = Запрос.Выполнить().Выбрать();
Возврат Выборка.Ссылка; // Ошибка: поле Ссылка не найдено, позиционирование не выполнено

Как правильно организовать поиск через запрос

Чтобы корректно получить данные, необходимо убедиться, что запрос возвращает поле Ссылка, и обязательно вызвать метод Следующий(). Давайте проанализируем правильный алгоритм:

Для поиска одного контрагента используем следующую конструкцию:


Функция НайтиКонтрагента(ИНН, КПП)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Контрагенты.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |	Контрагенты.ИНН = &ИНН
        |	И Контрагенты.КПП = &КПП";
    
    Запрос.Параметры.Вставить("ИНН", ИНН);
    Запрос.Параметры.Вставить("КПП", КПП);
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Ссылка;
    КонецЕсли;
    
    Возврат Справочники.Контрагенты.ПустаяСсылка();
КонецФункции

Оптимизация: избегаем проблемы «N+1»

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

Разберем этапы оптимизированного подхода:

  1. Передайте всю таблицу значений из Excel в запрос как параметр.
  2. Используйте инструкцию ПОМЕСТИТЬ, чтобы создать временную таблицу внутри запроса.
  3. Выполните левое соединение вашей временной таблицы со справочником Контрагенты.
  4. Получите результат одним пакетом, где для каждой строки будет сразу понятно, найден контрагент или нет.

Важные нюансы при работе с контрагентами

При поиске контрагентов по ИНН и КПП не забывайте про специфику учета:

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

← На главную