Часто в практике разработчика и пользователя 1С возникает парадоксальная ситуация: программный код успешно создает новый элемент в справочнике, система подтверждает запись, и даже повторные проверки показывают, что данные в базе есть. Однако при открытии формы списка или попытке найти элемент по инвентарному номеру вручную — результат оказывается нулевым. Давайте разберем эту проблему на примере реального кейса и выясним, где могут «прятаться» ваши данные.
Рассмотрим сценарий: выполняется загрузка данных из внешнего источника. Логика программы предполагает проверку по реквизиту Инвен_N. Если номер уже существует, строка пропускается. Если нет — создается новый элемент справочника ЗаводскоеОборудование. Посмотрим на фрагмент кода, который отвечает за поиск существующего оборудования:
ИнвентарныйНомер = СокрЛП(Выборка.Инвентарный);
// Проверяю, записано ли данное значение
НайденоеЗначение = Справочники.ЗаводскоеОборудование.НайтиПоРеквизиту("Инвен_N", ИнвентарныйНомер);
Если НайденоеЗначение.Пустая() Тогда
// Код добавления нового оборудования
КонецЕсли;
Проблема заключается в том, что после выполнения СтрокаСправочника.Записать() пользователь открывает справочник, вводит в строке поиска тот же инвентарный номер, но система ничего не выводит. При этом программный поиск (код выше) при следующем запуске успешно «видит» элемент и не дублирует его. Это прямое доказательство того, что запись в базе данных физически существует.
Как показывает практика, в 90% случаев проблема кроется не в коде, а в настройках интерфейса. Форма списка в 1С — это динамический список, который может иметь наложенные фильтры, незаметные на первый взгляд. Проанализируем, как проверить эту гипотезу:
Именно так решилась проблема в рассматриваемом нами случае: в настройках был установлен скрытый отбор, который не пропускал новые элементы в визуальную часть списка. После снятия галочки в настройках все «пропавшее» оборудование мгновенно отобразилось.
Если же отборов в списке нет, но НайтиПоРеквизиту или ручной поиск все равно работают нестабильно, нам нужно проверить технические параметры реквизита. Выясним основные причины:
Фиксированная длина строки. Если в конфигураторе у реквизита Инвен_N установлена фиксированная длина (например, 20 символов), 1С дополняет строку пробелами справа. Когда вы ищете строку "123", а в базе хранится "123 ", поиск может вернуть пустую ссылку. Использование функции СокрЛП при поиске помогает, но важно, чтобы данные записывались единообразно.
Невидимые символы. При загрузке из внешних источников в строку могут попадать неразрывные пробелы (символ с кодом 160) или знаки переноса. Визуально номера "001" и "001" (с неразрывным пробелом) идентичны, но для системы это разные значения. Проверим это, проанализировав код записи:
СтрокаСправочника = Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
СтрокаСправочника.Наименование = ДанныеНовогоОборудования.Наименование;
СтрокаСправочника.Инвен_N = СокрЛП(ДанныеНовогоОборудования.Инвентарный);
// ... заполнение других реквизитов
СтрокаСправочника.Записать();
Совет: Всегда используйте СокрЛП перед записью строковых идентификаторов, чтобы избежать проблем с лишними пробелами.
Разберем еще один важный момент. Чтобы метод НайтиПоРеквизиту работал корректно и быстро, реквизит должен быть проиндексирован. Если в свойствах реквизита Инвен_N в конфигураторе стоит значение «Не индексировать», поиск по нему в больших справочниках может давать сбои или не учитывать последние изменения до обновления индексов полнотекстового поиска.
Для исправления ситуации необходимо:
ЗаводскоеОборудование.Инвен_N.Проанализируем ситуацию с точки зрения безопасности. Если в системе настроен механизм RLS (Record Level Security), программный код может выполняться под полными правами (например, в привилегированном модуле на сервере) и успешно создавать записи. Однако текущий пользователь, открывающий форму списка, может не иметь прав на просмотр записей определенной группы или организации.
В этом случае данные в базе есть, программный поиск их видит, но в интерфейсе пользователя они будут скрыты программными фильтрами доступа.
Если вы столкнулись с «исчезновением» записанных данных, рекомендуем придерживаться следующего алгоритма действий:
ВЫБРАТЬ * ИЗ Справочник.ЗаводскоеОборудование ГДЕ Инвен_N ПОДОБНО "%ваш_номер%". Это исключит программные ошибки записи.Элементы.Список.Обновить().Следуя этим шагам, мы сможем гарантировать корректное отображение всех введенных данных и стабильную работу механизмов поиска в системе 1С.