Как исправить ошибку «Поле не найдено в источнике доступных настроек» в динамическом списке 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с неочевидным поведением динамических списков. Одна из таких проблем — внезапное возникновение ошибки: «Внутренняя ошибка динамического списка. Поле <ИмяПоля> не найдено в источнике доступных настроек». При этом поле физически существует в метаданных, оно доступно в запросе, но система отказывается открывать форму списка. Проанализируем причины этой ошибки и найдем эффективные способы ее решения.

Разберем ситуацию и выявим причину

Рассмотрим типовой сценарий: разработчик создает нетиповой регистр сведений (например, для хранения настроек интеграции с внешними базами данных). Одно из полей регистра (измерение) предназначено для хранения пароля. Для обеспечения конфиденциальности в свойствах этого поля устанавливается флажок Режим пароля. После этого при попытке открыть форму списка этого регистра система выдает критическую ошибку.

Проанализируем, почему это происходит. Динамический список в 1С базируется на технологии Системы Компоновки Данных (СКД). Когда мы открываем форму, СКД инициализирует схему и доступные настройки (отборы, группировки, сортировки). У платформы есть жесткое ограничение: поля, помеченные свойством Режим пароля, исключаются из механизмов компоновки. Это сделано в целях безопасности, чтобы пароли нельзя было случайно вывести в отчет, использовать в группировках или увидеть в настройках компоновщика.

Важный нюанс: если такое поле является измерением регистра, возникает неустранимый конфликт. Измерения образуют уникальный ключ записи. Динамический список обязан считывать все измерения, чтобы идентифицировать строки, но СКД блокирует доступ к «секретному» полю. В итоге список не может построить корректный запрос, что и приводит к ошибке «Поле не найдено».

Способ 1. Отказ от режима пароля в метаданных (Самое быстрое решение)

Выясним, как быстро вернуть работоспособность форме списка. Если вам необходимо, чтобы форма открывалась здесь и сейчас, выполните следующие действия:

  1. Откройте конфигуратор и найдите нужный РегистрСведений.
  2. Перейдите на закладку Данные и откройте свойства проблемного поля (измерения).
  3. Снимите флажок Режим пароля.
  4. Обновите конфигурацию базы данных.

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

Способ 2. Перенос пароля из измерений в ресурсы

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

Правильным архитектурным решением будет следующий алгоритм:

  1. Удалите поле пароля из состава измерений.
  2. Создайте новое поле в составе ресурсов или реквизитов с тем же типом (например, Строка).
  3. Для этого ресурса также не рекомендуется включать Режим пароля в метаданных, если планируется использование в динамических списках.

Перенос в ресурсы позволяет динамическому списку работать стабильнее, так как ресурсы не всегда обязательны для инициализации ключа записи в настройках СКД, в отличие от измерений.

Способ 3. Безопасное отображение через свойства формы

Если мы сняли флажок в метаданных, нам все равно нужно скрыть символы пароля от пользователя в интерфейсе. Рассмотрим, как это сделать правильно на уровне Управляемой формы:

  1. Откройте форму списка или форму записи регистра.
  2. В дереве элементов формы найдите поле ввода, связанное с паролем.
  3. В свойствах этого элемента (а не в свойствах поля объекта!) установите флажок Режим пароля.

Этот подход является профессиональным стандартом:

Способ 4. Программная настройка динамического списка

В некоторых случаях ошибка сохраняется, если поле добавлено в «Выбранные поля» динамического списка в конфигураторе. Проанализируем, как исключить его программно или через настройки:

  1. Зайдите в свойства динамического списка на форме.
  2. Откройте ссылку Настройка списка.
  3. Убедитесь, что поле с паролем не выбрано для отображения по умолчанию.
  4. Если вы используете произвольный запрос, попробуйте явно исключить это поле из списка выборки ВЫБРАТЬ..., если оно не требуется для отображения.

Рекомендации по безопасности (Best Practices)

Посмотрим на ситуацию шире. Хранение паролей в открытом виде в строковых полях — плохая практика, даже если включен Режим пароля. Рассмотрим более надежные варианты:

1. Хранение хеш-сумм. Если вам нужно только проверять пароль (например, при авторизации внутри вашей системы), храните не сам пароль, а его хеш (SHA-256). Для этого в 1С используется объект ХешированиеДанных.


Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(СтрокаПароля);
ХешСтрока = НРег(СтрЗаменить(Строка(Хеширование.ХешСумма), " ", ""));

2. Использование защищенных хранилищ. Для хранения паролей к внешним сервисам в типовых конфигурациях (УТ 11, ERP, БСП) лучше использовать механизм «Защищенное хранилище». Данные в нем шифруются на уровне платформы и не хранятся в обычных таблицах регистров.

3. Шифрование данных. Если необходимо хранить именно обратимый пароль, используйте средства криптографии 1С (объект МенеджерКриптографии), чтобы в базе лежала зашифрованная двоичная строка, а расшифровка происходила только в момент использования в коде.

Резюме

Выясним основные выводы нашего разбора:

  1. Никогда не устанавливайте свойство Режим пароля в свойствах измерений регистра. Это гарантированно приведет к ошибке динамического списка.
  2. Если необходимо визуальное скрытие — устанавливайте Режим пароля в свойствах элемента формы (поля ввода).
  3. Пароли и конфиденциальные данные лучше хранить в ресурсах, а не в измерениях.
  4. При использовании платформы версии 8.3.13 и выше, всегда проверяйте настройки СКД внутри динамического списка, если добавляете новые поля в структуру регистра.

Соблюдение этих правил позволит вам избежать «внутренних ошибок» и обеспечит стабильную работу интерфейса ваших решений на базе 1С.

← На главную