При разработке обработок в 1С часто возникает ситуация, когда прикладной поиск по реквизиту справочника не возвращает ожидаемый результат, хотя данные в системе присутствуют. Рассмотрим, почему это происходит и как правильно организовать алгоритм поиска, чтобы избежать ошибок создания документов с пустыми контрагентами.
Одной из наиболее распространенных проблем является попытка поиска по значению, которое было автоматически отформатировано платформой. В случае с ИНН, который является числовым по своей сути, система при выводе на форму или при преобразовании в строку может добавлять разделители групп разрядов (например, 1 234 567 890 вместо слитно записанного 1234567890). Поиск по такому строковому представлению в БД, где ИНН хранится как слитная строка, всегда будет возвращать ПустаяСсылка.
Чтобы решить эту проблему, необходимо принудительно отключить группировку разрядов при преобразовании числа в строку для поиска. Для этого используем функцию Формат() с параметром ЧГ=0 (числовая группировка — 0).
Рассмотрим, как правильно подготовить значение для поиска по реквизиту:
Если в вашем коде используется Формат(), убедитесь, что вы убрали разделители. Пример корректного преобразования:
// Правильный способ форматирования ИНН перед поиском
СтрокаДляПоиска = Формат(ИНН, "ЧГ=0");
Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", СтрокаДляПоиска);
Также стоит помнить о функции СокрЛП() (или современной СтрСократить()). Иногда в реквизитах справочников могут присутствовать лишние пробелы, если длина поля в конфигураторе избыточна. Приведение обоих значений (и искомого, и найденного) к «чистому» виду позволяет сделать алгоритм более устойчивым.
Второй важный аспект, обсуждаемый в теме — почему «создается» счет без контрагента. Проблема заключается в отсутствии проверки результата поиска. Если метод НайтиПоРеквизиту() или Запрос не находят объект, они возвращают пустую ссылку. Если далее по коду нет условия для прерывания работы процедуры, система продолжает выполнение и пытается записать объект, что приводит к появлению «битых» документов.
Разберем, как правильно организовать проверку в коде:
// Проверка на наличие найденного контрагента перед записью
Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Формат(ИНН, "ЧГ=0"));
Если Контрагент.Пустая() Тогда
Сообщить("Контрагент не найден! Операция прервана.");
Возврат; // Прерываем выполнение процедуры, чтобы документ не создался
КонецЕсли;
// Продолжаем работу, если контрагент найден
Счет = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
Счет.Контрагент = Контрагент;
Счет.Записать();
Подводя итог, проанализируем основные шаги для стабильной работы поиска:
ЧГ=0.ЗначениеЗаполнено() или Пустая() перед записью документа в базу данных.Строка требует точного совпадения. Если в конфигураторе длина строки 50, а вы ищете по строке длиной 10 — поиск может не сработать, если база заполнена иначе. В таких случаях лучше использовать Запрос с оператором ПОДОБНО или предварительно обрезать все пробелы через СокрЛП().Используя эти простые рекомендации, вы исключите ошибки поиска и сделаете свои обработки надежными для пользователей в управляемых формах.