Почему не работает поиск по реквизиту ИНН в 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Финансы и профессиональные услуги
← На главную

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

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

Одной из наиболее распространенных проблем является попытка поиска по значению, которое было автоматически отформатировано платформой. В случае с ИНН, который является числовым по своей сути, система при выводе на форму или при преобразовании в строку может добавлять разделители групп разрядов (например, 1 234 567 890 вместо слитно записанного 1234567890). Поиск по такому строковому представлению в БД, где ИНН хранится как слитная строка, всегда будет возвращать ПустаяСсылка.

Чтобы решить эту проблему, необходимо принудительно отключить группировку разрядов при преобразовании числа в строку для поиска. Для этого используем функцию Формат() с параметром ЧГ=0 (числовая группировка — 0).

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

Рассмотрим, как правильно подготовить значение для поиска по реквизиту:

Если в вашем коде используется Формат(), убедитесь, что вы убрали разделители. Пример корректного преобразования:


// Правильный способ форматирования ИНН перед поиском
СтрокаДляПоиска = Формат(ИНН, "ЧГ=0");
Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", СтрокаДляПоиска);

Также стоит помнить о функции СокрЛП() (или современной СтрСократить()). Иногда в реквизитах справочников могут присутствовать лишние пробелы, если длина поля в конфигураторе избыточна. Приведение обоих значений (и искомого, и найденного) к «чистому» виду позволяет сделать алгоритм более устойчивым.

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

Второй важный аспект, обсуждаемый в теме — почему «создается» счет без контрагента. Проблема заключается в отсутствии проверки результата поиска. Если метод НайтиПоРеквизиту() или Запрос не находят объект, они возвращают пустую ссылку. Если далее по коду нет условия для прерывания работы процедуры, система продолжает выполнение и пытается записать объект, что приводит к появлению «битых» документов.

Разберем, как правильно организовать проверку в коде:


// Проверка на наличие найденного контрагента перед записью
Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Формат(ИНН, "ЧГ=0"));

Если Контрагент.Пустая() Тогда
    Сообщить("Контрагент не найден! Операция прервана.");
    Возврат; // Прерываем выполнение процедуры, чтобы документ не создался
КонецЕсли;

// Продолжаем работу, если контрагент найден
Счет = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
Счет.Контрагент = Контрагент;
Счет.Записать();

Итоги и рекомендации

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

  1. Всегда проверяйте формат данных: Если ищете по строковому реквизиту, убедитесь, что искомая строка не содержит разделителей (пробелов) в разрядах чисел. Используйте ЧГ=0.
  2. Используйте отладчик: Перед выполнением запроса или метода поиска всегда смотрите, какое именно значение передается в параметр, используя замер в отладчике.
  3. Обеспечьте контроль заполнения: Никогда не полагайтесь на то, что поиск всегда будет успешным. Всегда добавляйте проверку через ЗначениеЗаполнено() или Пустая() перед записью документа в базу данных.
  4. Учитывайте тип данных: Помните, что поиск по реквизиту Строка требует точного совпадения. Если в конфигураторе длина строки 50, а вы ищете по строке длиной 10 — поиск может не сработать, если база заполнена иначе. В таких случаях лучше использовать Запрос с оператором ПОДОБНО или предварительно обрезать все пробелы через СокрЛП().

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

← На главную