Довольно часто разработчики и администраторы сталкиваются с загадочной ситуацией: программный поиск через НайтиПоКоду() или запрос к базе данных уверенно возвращает ссылку на объект, но при попытке найти этот же элемент в форме списка «1С:Предприятия» — по коду, наименованию или ИНН — система ничего не выдает. Элемент как будто превращается в «невидимку».
Особенно остро эта проблема проявляется в современных конфигурациях на базе 1С:ERP, УТ 11 и КА 2. Давайте разберем по шагам, почему так происходит, и как вернуть «потерянные» данные в поле зрения пользователя.
В современных конфигурациях списки справочников (особенно таких крупных, как Партнеры) — это не просто прямое отображение таблицы справочника. Это сложные SQL-запросы, которые строятся на лету. В УТ 11 для ускорения работы и поддержки сложной иерархии используются специальные вспомогательные регистры сведений.
Разберем ситуацию на примере регистра ИерархияПартнеров. Когда вы открываете справочник «Партнеры», система выполняет соединение (JOIN) основной таблицы справочника с этим регистром. Если данные в регистре повреждены, отсутствуют или были очищены вручную (например, в ходе некорректной «чистки» базы), динамический список просто не сможет вывести элемент. Программно через Справочники.Партнеры.НайтиПоКоду() ссылка будет находиться, так как этот метод обращается напрямую к основной таблице, но в интерфейсе элемент пропадет.
Как проверить эту гипотезу? Проанализируем запрос динамического списка в конфигураторе или через инструменты отладки. Если в запросе присутствует связь с регистрами сведений, необходимо проверить наличие записей по «пропавшему» элементу в этих регистрах.
Многие пользователи ищут отборы в стандартном окне «Настроить список», но не находят там ничего подозрительного. Однако в 1С существуют так называемые Фиксированные настройки динамического списка. Рассмотрим, где они могут прятаться:
ПриСозданииНаСервере формы списка разработчики часто прописывают жесткие фильтры. Например, если справочник открывается из раздела «Продажи», система может автоматически добавить скрытый отбор Клиент = Истина.Чтобы убедиться в наличии таких отборов, попробуем использовать инструмент ИР (Инструменты разработчика) или консоль динамических списков. Там можно увидеть реальный текст запроса, который исполняется на сервере СУБД со всеми наложенными условиями.
Если поиск в интерфейсе выполняется через строку «быстрого поиска» (в верхней части формы), 1С задействует механизм полнотекстового поиска (ПП). Этот механизм работает не с самой базой данных напрямую, а с предварительно построенным индексом.
Проанализируем ситуацию: если индекс не обновлен или был поврежден, поиск по строке не даст результатов. Программный же код НайтиПоКоду() работает с индексами SQL, которые всегда актуальны. Чтобы исправить это, выполним следующие действия:
Даже если пользователь обладает правами администратора, в некоторых конфигурациях механизмы RLS могут скрывать данные. Если элемент не попадает в разрешенную группу доступа (например, по группе доступа партнеров), он будет исключен из выборки динамического списка.
Важно помнить, что программный поиск в модулях может выполняться в привилегированном режиме (без учета RLS), в то время как форма списка всегда учитывает права текущего пользователя. Выясним это, попробовав найти элемент под пользователем с полными правами без ограничений.
Иногда элемент перестает отображаться из-за логических ошибок в данных. Рассмотрим пример: у элемента справочника заполнено поле Родитель, но сам родитель был удален непосредственно из базы (нарушена ссылочная целостность) или помечен на удаление. Если в списке включен режим «Иерархический просмотр», такой «сирота» может не попасть ни в одну из папок и просто исчезнуть из видимости.
Посмотрим, как можно программно проверить состояние такого объекта, используя следующий фрагмент кода:
ПартнерДляЗамены = Справочники.Партнеры.НайтиПоКоду(ОбрабатываемыйКодПартнера);
Если Не ПартнерДляЗамены.Пустая() Тогда
Сообщить("Элемент найден: " + ПартнерДляЗамены.Наименование);
Сообщить("Пометка удаления: " + ПартнерДляЗамены.ПометкаУдаления);
Сообщить("Родитель: " + ПартнерДляЗамены.Родитель);
Иначе
Сообщить("Элемент не найден в базе данных");
КонецЕсли;
Если стандартный поиск в интерфейсе бессилен, воспользуемся проверенными методами профессиональной отладки:
ВЫБРАТЬ
Партнеры.Ссылка,
Партнеры.Наименование,
Партнеры.ПометкаУдаления
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Код = &Код
Перейти по ссылке (сочетание клавиш Shift + F11). Вставив внутренний адрес объекта, мы откроем его форму напрямую, минуя все фильтры списка.Партнеры и добавим отбор по коду. Если обработка найдет элемент, значит, проблема исключительно в настройках отображения формы списка.Если выяснилось, что проблема в поврежденных служебных регистрах (как это часто бывает в УТ 11 после массовых загрузок или чисток данных), необходимо восстановить эти записи. Для справочника Партнеры часто помогает перепривязка элемента или запуск специализированных регламентных заданий по обновлению иерархии и аналитики.
Проанализируем также состояние функциональных опций. Если элемент помечен как «Поставщик», а в программе выключена опция «Закупки», вы никогда не увидите его в общих списках, пока не включите соответствующий функционал или не измените тип партнера на «Прочее».
Подведем итог: Невидимость элемента — это не магия, а результат работы фильтров, механизмов оптимизации (вспомогательные регистры) или системы прав доступа. Последовательная проверка этих уровней всегда позволяет найти причину и вернуть данные в интерфейс.