В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с неочевидным поведением динамических списков. Одна из таких проблем — внезапное возникновение ошибки: «Внутренняя ошибка динамического списка. Поле <ИмяПоля> не найдено в источнике доступных настроек». При этом поле физически существует в метаданных, оно доступно в запросе, но система отказывается открывать форму списка. Проанализируем причины этой ошибки и найдем эффективные способы ее решения.
Рассмотрим типовой сценарий: разработчик создает нетиповой регистр сведений (например, для хранения настроек интеграции с внешними базами данных). Одно из полей регистра (измерение) предназначено для хранения пароля. Для обеспечения конфиденциальности в свойствах этого поля устанавливается флажок Режим пароля. После этого при попытке открыть форму списка этого регистра система выдает критическую ошибку.
Проанализируем, почему это происходит. Динамический список в 1С базируется на технологии Системы Компоновки Данных (СКД). Когда мы открываем форму, СКД инициализирует схему и доступные настройки (отборы, группировки, сортировки). У платформы есть жесткое ограничение: поля, помеченные свойством Режим пароля, исключаются из механизмов компоновки. Это сделано в целях безопасности, чтобы пароли нельзя было случайно вывести в отчет, использовать в группировках или увидеть в настройках компоновщика.
Важный нюанс: если такое поле является измерением регистра, возникает неустранимый конфликт. Измерения образуют уникальный ключ записи. Динамический список обязан считывать все измерения, чтобы идентифицировать строки, но СКД блокирует доступ к «секретному» полю. В итоге список не может построить корректный запрос, что и приводит к ошибке «Поле не найдено».
Выясним, как быстро вернуть работоспособность форме списка. Если вам необходимо, чтобы форма открывалась здесь и сейчас, выполните следующие действия:
РегистрСведений.После этих действий ошибка исчезнет, так как поле станет доступным для системы компоновки данных. Однако пароль теперь будет отображаться в виде обычного текста, что небезопасно. Рассмотрим, как это исправить правильно.
Проанализируем структуру регистра. Использование пароля в качестве измерения — это концептуальная ошибка проектирования. Измерение подразумевает, что по нему может выполняться поиск, и оно влияет на уникальность записи. Вряд ли вам нужно иметь несколько записей, различающихся только паролем.
Правильным архитектурным решением будет следующий алгоритм:
Строка).Режим пароля в метаданных, если планируется использование в динамических списках.Перенос в ресурсы позволяет динамическому списку работать стабильнее, так как ресурсы не всегда обязательны для инициализации ключа записи в настройках СКД, в отличие от измерений.
Если мы сняли флажок в метаданных, нам все равно нужно скрыть символы пароля от пользователя в интерфейсе. Рассмотрим, как это сделать правильно на уровне Управляемой формы:
Этот подход является профессиональным стандартом:
В некоторых случаях ошибка сохраняется, если поле добавлено в «Выбранные поля» динамического списка в конфигураторе. Проанализируем, как исключить его программно или через настройки:
ВЫБРАТЬ..., если оно не требуется для отображения.Посмотрим на ситуацию шире. Хранение паролей в открытом виде в строковых полях — плохая практика, даже если включен Режим пароля. Рассмотрим более надежные варианты:
1. Хранение хеш-сумм. Если вам нужно только проверять пароль (например, при авторизации внутри вашей системы), храните не сам пароль, а его хеш (SHA-256). Для этого в 1С используется объект ХешированиеДанных.
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(СтрокаПароля);
ХешСтрока = НРег(СтрЗаменить(Строка(Хеширование.ХешСумма), " ", ""));
2. Использование защищенных хранилищ. Для хранения паролей к внешним сервисам в типовых конфигурациях (УТ 11, ERP, БСП) лучше использовать механизм «Защищенное хранилище». Данные в нем шифруются на уровне платформы и не хранятся в обычных таблицах регистров.
3. Шифрование данных. Если необходимо хранить именно обратимый пароль, используйте средства криптографии 1С (объект МенеджерКриптографии), чтобы в базе лежала зашифрованная двоичная строка, а расшифровка происходила только в момент использования в коде.
Выясним основные выводы нашего разбора:
Соблюдение этих правил позволит вам избежать «внутренних ошибок» и обеспечит стабильную работу интерфейса ваших решений на базе 1С.