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