При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда добавленные через расширение реквизиты или справочники корректно работают под полными правами, но вызывают критическую ошибку у обычных пользователей. Рассмотрим типовой сценарий на примере конфигурации УТ 11.4: в расширении создан справочник Автомобили, а в документ РеализацияТоваровУслуг добавлен реквизит, ссылающийся на этот справочник. При попытке вывести данные в динамический список журнала продаж система выдает ошибку: «Поле не найдено...». Разберем детально, почему это происходит и как правильно настроить систему.
Первым делом проанализируем текст ошибки. Система сообщает, что поле РеализацияТоваровУслуг.СТО_Автомобиль.ГосНомер не найдено. На первый взгляд, запрос составлен верно, и в конфигураторе поле отображается. Однако для платформы 1С видимость данных в динамическом списке напрямую зависит от прав доступа текущего пользователя. Если у пользователя нет прав на чтение хотя бы одного элемента в цепочке обращения, платформа «скрывает» это поле из метаданных для этого сеанса, что и приводит к ошибке выполнения запроса.
Рассмотрим цепочку обращения в запросе автора:
РеализацияТоваровУслуг.СТО_Автомобиль.ГосНомер КАК СТО_АвтомобильГосНомер
Чтобы этот фрагмент кода работал, у пользователя должны быть права одновременно на:
РеализацияТоваровУслуг.СТО_Автомобиль, добавленного в этот документ через расширение.Автомобили.ГосНомер внутри нового справочника.Если хотя бы одно из этих условий не соблюдено, динамический список не сможет инициализировать запрос.
Выясним, как правильно добавить права в расширении. В 1С права, заданные в основной конфигурации, не распространяются автоматически на новые объекты расширения (если не включены специальные опции). Рассмотрим по шагам процесс создания роли:
СТО_РаботаСАвтомобилями).Автомобили и заимствованный документ РеализацияТоваровУслуг.Автомобили установим права: Чтение и Просмотр.РеализацияТоваровУслуг перейдем к списку реквизитов и найдем добавленный нами реквизит СТО_Автомобиль. Установим для него право Просмотр.После этого система начнет «видеть» поле в запросе динамического списка, и ошибка исчезнет.
Посмотрим на настройки самого расширения. В корне дерева объектов расширения (самый верхний элемент) есть палитра свойств. Там находится флаг «Устанавливать права для новых объектов».
Если этот флаг установлен, то при добавлении в расширение любого нового объекта (справочника, документа, регистра) права на него будут автоматически добавлены во все роли, существующие в этом расширении. Это может значительно упростить жизнь разработчику, однако требует осторожности с точки зрения безопасности данных.
Иногда причина кроется не в ролях, а в функциональных опциях. Проанализируем ситуацию: если ваш новый справочник или реквизит привязан к какой-либо Функциональной опции, и эта опция в текущей базе выключена, поле также будет недоступно в метаданных запроса. Убедитесь, что для новых объектов не заданы лишние функциональные опции, или что они включены в константах системы.
Разберем, как сделать работу журнала документов более быстрой. В типовых решениях, таких как УТ 11.4 или ERP, журналы документов (например, журнал продаж) строятся не на таблицах документов, а на специальном регистре сведений РеестрДокументов. Автор вопроса добавил ЛЕВОЕ СОЕДИНЕНИЕ с таблицей Документ.РеализацияТоваровУслуг прямо в динамический список:
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО РеестрДокументовПереопределяемый.Ссылка = РеализацияТоваровУслуг.Ссылка
Это рабочее решение, но оно может замедлить открытие журнала, если в базе сотни тысяч документов. Рассмотрим более производительный вариант:
РеестрДокументов.СТО_АвтомобильГосНомер.РеестрДокументов.СТО_АвтомобильГосНомер без всяких соединений.Этот подход не только ускорит работу, но и упростит управление правами, так как данные будут браться из одной таблицы реестра.
Если права настроены, а ошибка сохраняется, выполним следующие действия:
/ClearCache.Подводя итог, можно сказать, что в 90% случаев проблема «невидимости» реквизита расширения в динамическом списке решается именно через создание отдельной роли внутри расширения и включение в нее прав на чтение и просмотр всех задействованных в цепочке запроса объектов.