В стандартных средствах платформы 7 нет возможности ограничить доступ к отчётам только определёнными счетами, хотя вопрос этот периодически возникает. Для организации такого разграничения понадобятся небольшие доработки стандартных алгоритмов. Прежде всего во все отчёты, в которых мы хотим конкретному пользователю разрешить выбирать конкретные счета, в процедуру ПриНачалеВыбораЗначения(ИдентЭлемДиалога,Флаг) добавим:
Если ИдентЭлемДиалога = "Счет" Тогда
Если глКонтролироватьСчета = 0 Тогда
Флаг = 1;
Иначе
Флаг = 0;
Счет = глДоступныйСчет();
ПриВыбореСчета();
КонецЕсли;
КонецЕсли;
Таким образом мы в зависимости от значения переменной глКонтролироватьСчета перенаправим выбор счета в функцию глДоступныйСчет(). Теперь разберёмся с глобальным модулем. Вставим в него описание двух переменных
// Определение переменных
Перем глКонтролироватьСчета Экспорт;
Перем глСписокСчетов;
(глСписокСчетов будет списком значений, содержащих доступные счета) и функцию глДоступныйСчет()
//Функция глДоступныйСчет() - располагается в любом месте ГМ
Функция глДоступныйСчет() Экспорт
Перем сч;
Если глСписокСчетов.РазмерСписка()>0 Тогда
глСписокСчетов.ВыбратьЗначение(сч);
Иначе
сч = ПолучитьПустоеЗначение("Счет");
КонецЕсли;
Возврат(сч) ;
Теперь определим значение глКонтролироватьСчета и заполним глСписокСчетов. Сделаем это в процедуре ПриНачалеРаботыСистемы(). Используем одну хитрость. Если мы ограничиваем пользователю формирование каких-либо отчётов, то, естественно, нам придётся создавать для него новый набор прав. (Как минимум, мы запретим ему запуск любых внешних отчётов, использование шахматки - её-то списком счетов не ограничишь, ну и скорее всего ещё урежем его в правах.) Название нового набора прав будет состоять из слова "Только" и списка счетов через запятую. Например - "Только41,60,62". Используя этот нехитрый приём, мы обеспечим работу нашей системы ограничения стандартных отчётов для любого нового пользователя (например, "Только70,68,69", "Только50.51" и т.д.).
глСписоксчетов = СоздатьОбъект("СписокЗначений");
глКонтролироватьсчета = 1;
НаборПрав = НазваниеНабораПрав(1);
Если СокрЛП(НаборПрав)="" Тогда
ИначеЕсли Лев(СокрЛП(НаборПрав),6)="Только"
Прочитали название набора прав, если оно пустое (пользователь не авторизован) не делаем ничего, если же оно начинается со слова "Только", заполним глСписокСчетов. Для этого вычленим из названия набора прав значения кодов счетов. добавим их в список. Для счетов-групп добавим также все субсчета.
_Состав = Сред(НаборПрав,7);
Пока СтрДлина(_Состав)>0 Цикл
_Состав = СокрЛП(_Состав);
ПозицияЗапятой = Найти(_Состав,",");
Если ПозицияЗапятой = 0 Тогда
НовоеЗначение = _Состав; _Состав = "";
ИначеЕсли ПозицияЗапятой = 1 Тогда
_Состав = Сред(_Состав,2);
Продолжить;
Иначе
НовоеЗначение = СокрЛП(Лев(_Состав,ПозицияЗапятой - 1));
Если ПозицияЗапятой<СтрДлина(_Состав) Тогда
_Состав = Сред(_Состав,ПозицияЗапятой + 1);
Иначе
_Состав = "";
КонецЕсли;
КонецЕсли;
ДобавляемыйСчет = СчетПоКоду(НовоеЗначение) ;
глСписоксчетов.ДобавитьЗначение(ДобавляемыйСчет,""+НовоеЗначение+" "+ДобавляемыйСчет.Наименование);
Если ДобавляемыйСчет.ЭтоГруппа()=1 Тогда
ЕщеСчета = СоздатьОбъект(\"Счет\");
ЕщеСчета.ИспользоватьРодителя(ДобавляемыйСчет);
ЕщеСчета.ВыбратьСчета();
Пока ЕщеСчета.ПолучитьСчет() = 1 Цикл
глСписоксчетов.ДобавитьЗначение(ЕщеСчета.ТекущийСчет(),""+ЕщеСчета.Код+" "+ЕщеСчета.Наименование);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Для ситуации. когда название набора прав определено, но не начинается словом "Только" установим глКонтролироватьСчета в ноль.
Иначе
глКонтролироватьСчета = 0;
КонецЕсли;
Таким образом, для всех пользователей с набором прав "Только" у нас будут сформированы списки доступных счетов, для прочих авторизованных пользователей контроль выбора счета будет отключен, а неавторизованные пользователи не смогут использовать эти стандартные отчёты вообще (у них при включённом контроле список доступных счетов будет пустой).