При автоматизации загрузки данных, например, при импорте списка контрагентов из файлов формата Excel, одной из частых задач является проверка наличия записи в базе данных перед созданием новой. Часто разработчики сталкиваются с ошибками при работе с объектами РезультатЗапроса. Давайте разберем, почему возникают ошибки и как грамотно организовать процесс поиска.
Чаще всего при попытке получить данные из запроса новички совершают две ошибки:
Следующий(). Метод Выполнить().Выбрать() лишь подготавливает выборку, но не позиционирует курсор на первой записи.Ссылка должно быть явно указано в блоке ВЫБРАТЬ.Рассмотрим пример кода, который вызывает ошибку:
// Ошибочный подход
Запрос = Новый Запрос("ВЫБРАТЬ ИНН, КПП ИЗ Справочник.Контрагенты ГДЕ ИНН = &ИНН");
// ... установка параметров ...
Выборка = Запрос.Выполнить().Выбрать();
Возврат Выборка.Ссылка; // Ошибка: поле Ссылка не найдено, позиционирование не выполнено
Чтобы корректно получить данные, необходимо убедиться, что запрос возвращает поле Ссылка, и обязательно вызвать метод Следующий(). Давайте проанализируем правильный алгоритм:
Для поиска одного контрагента используем следующую конструкцию:
Функция НайтиКонтрагента(ИНН, КПП)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.КПП = &КПП";
Запрос.Параметры.Вставить("ИНН", ИНН);
Запрос.Параметры.Вставить("КПП", КПП);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Справочники.Контрагенты.ПустаяСсылка();
КонецФункции
Если вам нужно обработать таблицу значений с сотнями строк, выполнение запроса внутри цикла является крайне неэффективным решением. Это создает высокую нагрузку на сервер базы данных. Мы рекомендуем использовать механизм временных таблиц.
Разберем этапы оптимизированного подхода:
ПОМЕСТИТЬ, чтобы создать временную таблицу внутри запроса.Контрагенты.При поиске контрагентов по ИНН и КПП не забывайте про специфику учета:
СтрЗаменить() или СокрЛП() для удаления непечатных символов и лишних пробелов, которые часто попадают в базу.НайтиПоРеквизиту, убедитесь, что в конфигураторе для реквизитов ИНН и КПП установлена опция Индексировать. Это существенно ускорит поиск.Соблюдая данные рекомендации, вы сможете создать надежный и производительный механизм обмена данными, который будет стабильно работать даже при больших объемах информации.