При разработке отчетов на Системе Компоновки Данных (СКД) в 1С мы часто сталкиваемся с ситуациями, когда поведение отчета для пользователей с разными правами отличается. Особенно остро это проявляется, когда у пользователя с полными правами все работает корректно, а у пользователя с ограниченными правами некоторые поля просто исчезают из структуры отчета, хотя данные, казалось бы, должны быть доступны. Рассмотрим подробнее одну из таких распространенных проблем и ее решения.
Представим, что у нас есть отчет на СКД со следующей иерархической структурой:
Когда пользователь с полными правами запускает этот отчет, все поля отображаются в соответствии с заданной структурой, и отчет выглядит красиво и функционально. Однако, если тот же отчет запускает пользователь с ограниченными правами, мы обнаруживаем, что поле "Контрагент" отсутствует в структуре. Это означает, что пользователь не может ни добавить его в выбранные поля, ни использовать для отбора или группировки.
Важный нюанс: часто в таких ситуациях данные, связанные с "Контрагентом", все же доступны. Например, при двойном клике по расшифровке, где должны были быть данные контрагентов, они отображаются. Это ключевой момент, указывающий на то, что проблема не в отсутствии прав на чтение самих данных контрагентов, а в том, как СКД определяет видимость этого поля в структуре отчета и его доступность для пользователя в режиме настройки.
Мы пытаемся загрузить настройки отчета в режиме пользователя, но и это не помогает – поле "Контрагент" по-прежнему не появляется в структуре. Это говорит о том, что проблема кроется глубже, возможно, в механизмах работы СКД с правами доступа или с особенностями описания полей в схеме компоновки данных.
Одним из наиболее эффективных решений данной проблемы, которое часто срабатывает в подобных случаях, является явное указание псевдонима для поля на вкладке "Компоновка данных" в схеме компоновки данных. Давайте разберем, почему это помогает и как это сделать по шагам.
Когда мы формируем запрос в СКД, мы можем получить поле, например, из таблицы РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт.Контрагент. СКД анализирует запрос и определяет набор доступных полей. Однако, иногда из-за особенностей механизмов проверки прав доступа или из-за сложной структуры запроса (например, если поле является частью составного типа или получается через несколько соединений), СКД может испытывать затруднения с однозначным определением доступности поля для пользователя с ограниченными правами. Система может "перестраховаться" и просто не включить поле в список доступных для настройки, даже если права на чтение самих данных есть.
Присвоение полю явного псевдонима делает его однозначно определенным для СКД. Это как бы "указывает пальцем" на конкретное поле и его тип, помогая системе более точно применить проверку прав доступа. Когда СКД видит явно определенное поле с псевдонимом, ей становится проще сопоставить его с правами пользователя, даже если до этого возникала неоднозначность.
Контрагент, мы можем явно указать ему псевдоним, если это не сделано автоматически. Если запрос выглядит как ВЫБРАТЬ ... Контрагент ИЗ ..., вы можете изменить его на ВЫБРАТЬ ... Контрагент КАК МойКонтрагент ИЗ .... Даже если псевдоним уже есть, но проблема сохраняется, попробуйте явно пересоздать его или убедиться, что он прописан корректно.Пример:
Допустим, ваш запрос изначально выглядит так:
ВЫБРАТЬ
ПродажиОбороты.Организация,
ПродажиОбороты.Контрагент
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
Чтобы явно задать псевдоним для поля "Контрагент", мы можем изменить запрос следующим образом:
ВЫБРАТЬ
ПродажиОбороты.Организация,
ПродажиОбороты.Контрагент КАК Клиент
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
Теперь в схеме компоновки данных появится поле "Клиент". Именно это поле мы и должны использовать в структуре отчета, отборах и группировках. Часто такое явное переименование помогает СКД корректно обработать права доступа и сделать поле видимым для пользователя с ограниченными правами.
Это решение особенно полезно, когда СКД автоматически заполняет поля, и внутренние механизмы платформы не могут однозначно связать права доступа пользователя с конкретным полем, особенно если оно является частью более сложного объекта или составного типа. Явный псевдоним устраняет эту неоднозначность.
Хотя явное указание псевдонима часто является панацеей, проблема невидимости полей в СКД может быть многофакторной. Давайте рассмотрим другие распространенные причины и способы их устранения, которые могут дополнить или стать альтернативой основному решению.
Функциональные опции (ФО) в 1С — это мощный механизм для управления видимостью функционала конфигурации. Если какое-либо поле отчета или объект, к которому оно относится, включено в состав функциональной опции, которая отключена для данного пользователя или для конфигурации в целом, то это поле просто не будет отображаться в списке доступных полей отчета. СКД автоматически скрывает элементы интерфейса, связанные с отключенными функциональными опциями.
Как проверить и что делать:
Даже если у пользователя есть прямые права на чтение справочника "Контрагенты", но функциональная опция, которая "показывает" эти контрагенты в интерфейсе или в отчетах, отключена, поле может быть скрыто. Это своего рода "фильтр" верхнего уровня, который работает независимо от базовых прав доступа к данным.
Проблема отсутствия поля "Контрагент" в структуре отчета, даже при наличии прав на чтение самих контрагентов, часто возникает из-за механизмов проверки прав доступа СКД, особенно когда поле является частью составного типа данных. Рассмотрим этот момент детальнее.
Что такое составной тип данных?
В 1С многие ссылки могут иметь составной тип. Например, поле "Регистратор" в регистрах бухгалтерии может ссылаться на разные виды документов (например, "РеализацияТоваровУслуг", "ПоступлениеТоваровУслуг", "СписаниеСРасчетногоСчета" и т.д.). Аналогично, поле "Контрагент" в какой-либо таблице может быть составным типом, который включает не только "Справочник.Контрагенты", но и, например, "Справочник.ФизическиеЛица" или даже какой-то документ, если логика конфигурации предусматривает такое разнообразие.
Как СКД обрабатывает составные типы и права:
Когда СКД сталкивается с полем составного типа, она должна определить, какие части этого типа доступны пользователю. Если у пользователя нет прав хотя бы на один из типов, входящих в этот составной тип, то все поле целиком может стать недоступным в режиме "1С:Предприятие" для данного пользователя. Например, если поле "Контрагент" в запросе СКД получается через сущность (например, через документ), к которой у пользователя нет полных прав (или даже прав на чтение одного из возможных типов-значений), то СКД может "перестраховаться" и полностью скрыть это поле из доступных элементов для отчета.
СКД в такой ситуации не всегда может корректно определить, к какой именно таблице или типу данных необходимо проверять права, и может принять решение о сокрытии поля, чтобы не допустить потенциальный несанкционированный доступ. Даже если для типа "Справочник.Контрагенты" права есть, но поле "Контрагент" в запросе получается через другую сущность (например, через поле документа, которое может содержать контрагента, но к самому документу нет прав), СКД может посчитать поле недоступным.
Что делать в такой ситуации:
ВЫРАЗИТЬОдним из распространенных решений для случаев, когда поля составного типа не отображаются из-за проблем с правами, является явное приведение типа в запросе СКД с помощью конструкции ВЫРАЗИТЬ(<Поле> КАК <Тип>). Этот метод помогает СКД точно понять, к какому типу данных относится поле, и, как следствие, корректно применить проверку прав.
Почему это работает?
Как мы уже выяснили, СКД может испытывать трудности с определением доступности полей составного типа. Когда мы используем ВЫРАЗИТЬ, мы явно указываем системе, что нас интересует только определенная часть составного типа. Это снимает двусмысленность и позволяет СКД сфокусироваться на проверке прав именно для указанного типа данных.
Пример использования:
Предположим, у нас есть поле Документ.Контрагент, которое может быть ссылкой не только на Справочник.Контрагенты, но и, например, на Справочник.Организации или Справочник.ФизическиеЛица (гипотетически, в зависимости от логики вашей конфигурации). Если у пользователя нет прав на Справочник.Организации, но есть на Справочник.Контрагенты, все поле Документ.Контрагент может быть скрыто.
Чтобы явно указать СКД, что мы хотим работать именно со справочником контрагентов, мы можем изменить наш запрос так:
ВЫБРАТЬ
...
ВЫРАЗИТЬ(Документ.Контрагент КАК Справочник.Контрагенты) КАК МойКонтрагент
...
В этом примере:
Документ.Контрагент — это исходное поле с составным типом.Справочник.Контрагенты — это тип, к которому мы явно приводим наше поле.МойКонтрагент — это новый псевдоним, который будет содержать ссылку именно на контрагента.После применения ВЫРАЗИТЬ и указания псевдонима, СКД будет проверять права доступа именно к Справочник.Контрагенты для поля МойКонтрагент. Если у пользователя есть необходимые права на этот справочник, поле станет видимым и доступным для использования в отчете.
Этот метод является очень мощным инструментом для решения проблем с правами и видимостью полей, когда речь идет о составных типах данных в СКД. Мы используем его, чтобы "подсказать" системе, как правильно интерпретировать и проверять права для конкретного поля.
В схеме компоновки данных для каждого поля существуют настройки, которые определяют, как оно может быть использовано в отчете. Это флаги "Ограничение использования", которые можно найти на вкладке "Поля" в конструкторе схемы компоновки данных. Если для поля "Контрагент" или для его родительских полей (например, полей, через которые получается ссылка на контрагента) установлены неправильные ограничения, это также может привести к тому, что поле не будет видно в следующих элементах пользовательского интерфейса:
Как проверить настройки "Ограничение использования":
Мы должны убедиться, что для поля "Контрагент" (или его псевдонима) в схеме компоновки данных не стоят явные запреты на использование, которые могли бы быть установлены разработчиком или случайно. Эти настройки предназначены для тонкой доводки отчета и ограничения функционала, но иногда они могут стать причиной неожиданного поведения.
Таким образом, хотя у пользователя и были права на чтение контрагентов, СКД могла "не увидеть" или неверно интерпретировать доступность поля "Контрагент" в структуре отчета из-за множества факторов: от тонкостей работы функциональных опций и сложностей составных типов данных до неявного определения поля в запросе или специфических настроек "Ограничения использования" в самой схеме СКД. Явное указание псевдонима часто помогает СКД однозначно идентифицировать это поле и правильно применить к нему имеющиеся права, но всегда полезно помнить и о других возможных причинах.