Разработка отчетов на базе Системы компоновки данных (СКД) в среде 1С — это мощный инструмент, однако он таит в себе множество нюансов, связанных с механизмом обеспечения безопасности. Одной из наиболее часто встречающихся и трудноуловимых проблем является внезапное «исчезновение» колонок или полей в отчете, когда его запускает пользователь с ограниченными правами. При этом под полными правами отчет работает безупречно.
В этой статье мы подробно разберем, почему СКД ведет себя именно так, проанализируем конкретный пример из практики и выработаем системный подход к решению подобных задач.
Рассмотрим ситуацию, когда в запросе СКД используется объединение нескольких таблиц, а также активное обращение к реквизитам через точку от ссылочных полей. Проблема заключается в том, что СКД, в отличие от простого запроса (Запрос), не всегда выдает ошибку «Недостаточно прав». Вместо этого система старается максимально «мягко» отобразить результат: если у пользователя нет прав на чтение конкретного поля или объекта, к которому идет обращение, СКД просто исключает это поле из выборки, из доступных полей компоновки и из итогового макета.
Проанализируем пример запроса, который может вызвать подобное поведение:
ВЫБРАТЬ
ПродажиПоФамильно.Период,
ПродажиПоФамильно.Регистратор,
ПродажиПоФамильно.Сотрудник,
ПродажиПоФамильно.Количество КАК Количество,
ПродажиПоФамильно.Регистратор.Склад КАК Склад
ИЗ
РегистрНакопления.ПродажиПоФамильно КАК ПродажиПоФамильно
ГДЕ
ПродажиПоФамильно.Товар = &Номенклатура
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыВРознице.Период,
ТоварыВРознице.Регистратор,
ВЫБОР
КОГДА ТоварыВРознице.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
ТОГДА ТоварыВРознице.Регистратор._Продал
ИНАЧЕ ТоварыВРознице.Регистратор.Ответственный
КОНЕЦ,
ТоварыВРознице.Количество,
ТоварыВРознице.Склад
ИЗ
РегистрНакопления.ТоварыВРознице КАК ТоварыВРознице
ГДЕ
ТоварыВРознице.Номенклатура = &Номенклатура
В данном случае поле Сотрудник формируется из разных источников. Обратите внимание на конструкцию ВЫБОР во втором блоке. Здесь идет обращение к реквизитам _Продал и Ответственный через поле Регистратор.
Поле Регистратор в регистрах накопления всегда имеет составной тип. Оно может включать в себя десятки различных видов документов. Когда мы пишем в запросе Регистратор.Ответственный, система 1С на уровне платформы проверяет права пользователя на все типы документов, которые могут являться регистраторами для данного регистра.
Если хотя бы на один тип документа (например, КорректировкаСерийИХарактеристикТоваров или ВозвратТоваровОтПокупателя) у пользователя отсутствует право Просмотр или Чтение, СКД может посчитать все выражение с разыменованием ссылки недоступным. Выясним причину на конкретном примере: автор темы обнаружил, что забыл установить галочку «Просмотр» для документа КорректировкаСерийИХарактеристикТоваров. Несмотря на то, что этот документ мог даже не присутствовать в данных за выбранный период, само его наличие в метаданных как возможного регистратора блокировало вывод поля для пользователя.
Для оптимизации работы с правами и повышения производительности запросов крайне рекомендуется использовать конструкцию ВЫРАЗИТЬ. Проанализируем, как это помогает: когда мы явно указываем тип, система перестает проверять права на все остальные возможные типы составного поля.
Вместо обращения Регистратор.Ответственный в блоке ИНАЧЕ, правильнее будет написать:
ВЫБОР
КОГДА ТоварыВРознице.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
ТОГДА ВЫРАЗИТЬ(ТоварыВРознице.Регистратор КАК Документ.ВозвратТоваровОтПокупателя)._Продал
ИНАЧЕ ВЫРАЗИТЬ(ТоварыВРознице.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Ответственный
КОНЕЦ
Хотя этот код выглядит более громоздким, он избавляет СКД от необходимости проверять права на лишние типы документов, что часто решает проблему исчезающих колонок.
Разберем ситуацию с ограничениями на уровне записей (RLS). Если в конфигурации настроены ограничения (например, менеджер видит только свои продажи), то обычный запрос к таблице может завершиться ошибкой, если в выборку попадет хотя бы одна «чужая» запись.
В СКД использование ВЫБРАТЬ РАЗРЕШЕННЫЕ является обязательным стандартом. Если этого слова нет, и система безопасности находит записи, к которым нет доступа, СКД может повести себя непредсказуемо — либо выдать ошибку, либо скрыть данные целиком. Проверьте, чтобы каждый блок ВЫБРАТЬ в вашем запросе начинался именно так:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
...
Если вы столкнулись с тем, что поле в отчете не выводится, пройдите по следующим шагам:
ТоварыВРознице). Для каждой роли пользователя убедитесь, что на все эти документы даны права «Чтение» и «Просмотр».Сотрудник в конфигураторе.Чтобы избежать подобных проблем в будущем, придерживайтесь следующих правил при работе с СКД:
ВЫБРАТЬ РАЗРЕШЕННЫЕ.Регистратор.Склад.Организация...). Чем длиннее цепочка, тем выше шанс наткнуться на отсутствие прав в одном из звеньев.Регистратор или другие поля составного типа, всегда используйте ВЫРАЗИТЬ.Подводя итог, можно сказать, что проблема автора темы была классической: СКД обнаружила потенциальную возможность обращения к документу КорректировкаСерийИХарактеристикТоваров через поле Регистратор, и, не найдя у пользователя прав на этот объект, превентивно скрыла все зависимые поля. Будьте внимательны к составным типам — именно они чаще всего являются причиной «магии» в правах доступа 1С.