1С бухгалтерия

Поставили задачу разделить учет в 1С БП 3.0 по подразделениям, чтобы привязать к конкретному пользователю его подразделение и он видел информацию только по своему подразделению (естественно в рамках одной организации).

Под руками оказалась бухгалтерия версии Корп, где для документов и в регистре бухгалтерии уже заведено поле ПодразделениеОрганизации. Но почему-то ограничение доступа по подразделениям настроить нельзя. Даже для того, чтобы появилась возможность назначить пользователю подразделение пришлось написать обработку для установки значения константы ОграничиватьДоступНаУровнеЗаписейПодразделенияОрганизаций в Истина (обработку прилагаю).

Кроме как задействовать RLS, другого пути не вижу, тем более что в базе было несколько организаций по которым тоже надо было разделять данные. Поэтому закрыв глаза на потерю производительности включил эту возможность в настройках программы.

В конфигураторе завел новую роль, скопировав типовую ДобавлениеИзменениеДанныхБухгалтерии. В этой роли стал править типовой Шаблон ограничений "ПоЗначениям". Типовой шаблон я предварительно скопировал и назвал "ПоЗначениям1". Вот такой код моего шаблона:

#Если СтрСодержит("#Параметр(1)","Документ.") или СтрСодержит("#Параметр(1)","ЖурналДокументов.Деньги") #Тогда
	ГДЕ	
	НЕ &АвторизованныйПользователь В
				(ВЫБРАТЬ
					ЗначенияГруппДоступа.ГруппаДоступа.Пользователь КАК ГруппаДоступаПользователь
				ИЗ
					РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа
				ГДЕ
					ЗначенияГруппДоступа.ГруппаДоступа.Пользователь = &АвторизованныйПользователь)
	#Если
	"#Параметр(1)" = "ЖурналДокументов.Деньги" или
	"#Параметр(1)" = "Документ.ПоступлениеТоваровУслуг" или
	"#Параметр(1)" = "Документ.РеализацияТоваровУслуг" или
	"#Параметр(1)" = "Документ.ПриходныйКассовыйОрдер" или
	"#Параметр(1)" = "Документ.РасходныйКассовыйОрдер" или
	"#Параметр(1)" = "Документ.СписаниеСРасчетногоСчета" или
	"#Параметр(1)" = "Документ.ОтчетОРозничныхПродажах" или
	"#Параметр(1)" = "Документ.ОказаниеУслуг" или
	"#Параметр(1)" = "Документ.СписаниеТоваров" или
	"#Параметр(1)" = "Документ.СчетНаОплатуПокупателю" или
	"#Параметр(1)" = "Документ.ТребованиеНакладная" или
	"#Параметр(1)" = "Документ.АвансовыйОтчет" или
	"#Параметр(1)" = "Документ.ВводНачальныхОстатков" или
	"#Параметр(1)" = "Документ.ВедомостьНаВыплатуЗарплатыВБанк" или
	"#Параметр(1)" = "Документ.ВедомостьНаВыплатуЗарплатыВКассу" или
	"#Параметр(1)" = "Документ.ВозвратМатериаловИзЭксплуатации" или
	"#Параметр(1)" = "Документ.ВозвратТоваровОтПокупателя" или
	"#Параметр(1)" = "Документ.ВозвратТоваровПоставщику" или
	"#Параметр(1)" = "Документ.ВосстановлениеНДС" или
	"#Параметр(1)" = "Документ.ГТДИмпорт" или
	"#Параметр(1)" = "Документ.ЗаявлениеОВвозеТоваров" или
	"#Параметр(1)" = "Документ.ИнвентаризацияНЗП" или
	"#Параметр(1)" = "Документ.ИнвентаризацияОС" или
	"#Параметр(1)" = "Документ.КадровыйПеревод" или
	"#Параметр(1)" = "Документ.КомплектацияНоменклатуры" или
	"#Параметр(1)" = "Документ.КорректировкаДолга" или
	"#Параметр(1)" = "Документ.КорректировкаПоступления" или
	"#Параметр(1)" = "Документ.КорректировкаРеализации" или
	"#Параметр(1)" = "Документ.МодернизацияОС" или
	"#Параметр(1)" = "Документ.НачислениеЗарплаты" или
	"#Параметр(1)" = "Документ.НачислениеНДСпоСМРхозспособом" или
	"#Параметр(1)" = "Документ.ОплатаПлатежнойКартой" или
	"#Параметр(1)" = "Документ.ОприходованиеТоваров" или
	"#Параметр(1)" = "Документ.ОтражениеНачисленияНДС" или
	"#Параметр(1)" = "Документ.ОтчетКомиссионераОПродажах" или
	"#Параметр(1)" = "Документ.ОтчетКомитентуОПродажах" или
	"#Параметр(1)" = "Документ.ОтчетПроизводстваЗаСмену" или
	"#Параметр(1)" = "Документ.ПередачаМатериаловВЭксплуатацию" или
	"#Параметр(1)" = "Документ.ПереоценкаТоваровВРознице" или
	"#Параметр(1)" = "Документ.ПередачаТоваров" или
	"#Параметр(1)" = "Документ.ПеремещениеОС" или
	"#Параметр(1)" = "Документ.ПоступлениеНаРасчетныйСчет" или
	"#Параметр(1)" = "Документ.ПоступлениеНМА" или
	"#Параметр(1)" = "Документ.ПриемНаРаботу" или
	"#Параметр(1)" = "Документ.ПринятиеКУчетуНМА" или
	"#Параметр(1)" = "Документ.ПринятиеКУчетуОС" или
	"#Параметр(1)" = "Документ.РаспределениеНДС" или
	"#Параметр(1)" = "Документ.СписаниеМатериаловИзЭксплуатации" или
	"#Параметр(1)" = "Документ.СписаниеНДС" или
	"#Параметр(1)" = "Документ.СписаниеНМА" или
	"#Параметр(1)" = "Документ.СписаниеОС" 
	#Тогда				
		ИЛИ ПодразделениеОрганизации В
	#ИначеЕсли	"#Параметр(1)" = "Документ.ПеремещениеТоваров" #Тогда
		ИЛИ ПодразделениеОтправитель В
			(ВЫБРАТЬ
				ЗначенияГруппДоступа.ЗначениеДоступа КАК ЗначениеДоступа
			ИЗ
				РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа
			ГДЕ
				ЗначенияГруппДоступа.ЗначениеРазрешено
				И ЗначенияГруппДоступа.ГруппаДоступа.Пользователь = &АвторизованныйПользователь)	
		ИЛИ ПодразделениеПолучатель В
	#Иначе
		ИЛИ Организация В
	#КонецЕсли	
			(ВЫБРАТЬ
				ЗначенияГруппДоступа.ЗначениеДоступа КАК ЗначениеДоступа
			ИЗ
				РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа
			ГДЕ
				ЗначенияГруппДоступа.ЗначениеРазрешено
				И ЗначенияГруппДоступа.ГруппаДоступа.Пользователь = &АвторизованныйПользователь)	
 
#КонецЕсли		
 
 
 
#Если Ложь #Тогда
	#Параметр(1)
	#Параметр(2)
	#Параметр(3)
	#Параметр(4)
	#Параметр(5)
	#Параметр(6)
	#Параметр(7)
	#Параметр(8)
	#Параметр(9)
	#Параметр(10)
	#Параметр(11)
	#Параметр(12)
	#Параметр(13)
	#Параметр(14)
	#Параметр(15)
	#Параметр(16)
	#Параметр(17)
	#Параметр(18)
	#Параметр(19)
	#Параметр(20)
	#Параметр(21)
	#Параметр(22)
	#Параметр(23)
	#Параметр(24)
	#Параметр(25)
	#Параметр(26)
	#Параметр(27)
	#Параметр(28)
	#Параметр(29)
	#Параметр(30)
	#Параметр(31)
	#Параметр(32)
	#Параметр(33)
	#Параметр(34)
	#Параметр(35)
#КонецЕсли

Почему так сложно и для чего я навставлял столько параметров. Для того, чтобы не переписывать ограничение доступа в каждом объекте метаданных из этой роли. Почти во всех объектах скопированной роли прописан вызов шаблона "ПоЗначениям", поэтому я делаю что мне надо только в одном месте - в этом самом шаблоне. Количество параметров определяется вызовом данного шаблона для каждого объекта метаданных, который выглядит примерно так:

#ПоЗначениям("Документ.АвансовыйОтчет", "", "",
"Организации", "Организация",
"ПодразделенияОрганизаций","ПодразделениеОрганизации",
"","",
"","",
"","","","","","","","",
"","","","","","","","",
"","","","","","","",""
)

Поэтому пришлось перечислить все параметры #Параметр(n). В первом параметре #Параметр(1) передается имя объекта. Меня интересуют в основном документы, в которых есть реквизит ПодразделениеОрганизации, поэтому я проверяю права на чтение по подразделениям именно этих документов (перечислил не все, а только те, которые нужны организации для которой делал).
&АвторизованныйПользователь - это стандартный параметр, который берется из одноименного параметра сеанса. Разрешенные тому или иному пользователю подразделения и организации я беру из РегистрСведений.ЗначенияГруппДоступа. Это конечно очень упрощенный подход, но для себя я определил так, что в настройках профилей указываю, что все организации или все подразделения запрещены кроме перечисленных. Если у профиля нет таких значений, значит ему можно дать доступ на все. Поэтому у меня в запросе два условия ИЛИ пользователя нет среди ограничений ИЛИ если ограничение есть, то подразделение того или иного объекта соответствует доступным подразделениям пользователя.

Для справочников используется немного иной шаблон, который называется ПоЗначениямРасширенный. Я не стал особо вникать в него и задействовал типовой шаблон, который мной был назван ранее ПоЗначениям1. Задействовал его прежде всего для самого справочника Подразделения. Т.е. я переписал вызов шаблона для данного справочника следующим образом:

#ПоЗначениям1("Справочник.ПодразделенияОрганизаций", "", "",
"Организации", "Владелец",
"ПодразделенияОрганизаций","Ссылка",
"","",
"","",
"","","","","","","","",
"","","","","","","","",
"","","","","","","",""
)

Какие параметры передаются в шаблон подробно описаны в самом шаблоне. Если коротко, то в данном случае я дописал "ПодразделенияОрганизаций" - это имя справочника и "Ссылка" - это реквизит справочника, для которого мы пишем ограничения, данном случае это справочник ПодразделенияОрганизаций. Чуть выше связка "Организации", "Владелец", что означает ограничение этого справочника по Организации на основании реквизита Владелец.

В профиле надо будет установить примерно такой набор прав:

Базовые права
Базовые права Библиотеки интеграции с 1С:Документооборотом
Базовые права БРО
Базовые права Зарплата кадры
Базовые права Интернет-поддержки пользователей
Базовые права по электронным документам
Добавление и изменение данных бухгалтерии по подразделениям
Добавление изменение данных сотрудников
Добавление изменение данных физических лиц зарплата кадры
Запуск толстого клиента
Запуск тонкого клиента
Интерактивное открытие внешних отчетов и обработок
Использование "Досье контрагента"
Использование вариантов отчетов
Использование дополнительных отчетов и обработок
Использование интеграции с документооборот
Использование информационного центра
Использование монитора Интернет-поддержки
Использование структуры подчиненности
Использование универсального отчета
Режим "Все функции"
Сохранение данных пользователя
Чтение данных регламентированной отчетности
Чтение данных сотрудников
Чтение данных физических лиц зарплата кадры
Чтение курсов валют

Т.е. мы уже не даем право на использование типовой роли "Добавление и изменение данных бухгалтерии", вместо нее подсовываем свою "Добавление и изменение данных бухгалтерии по подразделениям".

Тут стоит сказать, что есть небольшая проблемка с созданием собственных ролей. Во-первых надо будет обновить Идентификаторы Объектов Метаданных. Как это сделать программа подскажет сама. Но даже после этого: роль создана, в профиле назначена, но если посмотреть на пользователя в конфигураторе, то у него эта роль может оказаться не назначенной. У меня было именно так. Оказалось, что надо еще Обновить параметры работы пользователей. Обе необходимые операции засунул в прикрепляемую обработку.

На документах все хорошо работает. Ограничения срабатывают. Но надо чтобы еще и проводки ограничить. И вот тут уже сложнее. В регистре бухгалтерии есть измерение Подразделение, но дело в том, что у него нет признака Балансовый. А без этого признака ограничения РЛС действовать не будут. Можно завести свое доп. измерение или сделать этот реквизит балансовым, но это чревато незакрытыми остатками и разрастанием базы в случае если будет движение между подразделениями.

Я все таки ввел свое измерение, назвал его ХА_Подразделение и сделал в модуле набора записей регистра бухгалтерии небольшую вставку, чтобы мой реквизит заполнялся.

Процедура ПередЗаписью(Отказ, РежимЗаписи)
.....
 
	// ХА
	Для Каждого Проводка Из ЭтотОбъект Цикл
		Если ЗначениеЗаполнено(Проводка.ПодразделениеДт) Тогда
			Проводка.ХА_Подразделение = Проводка.ПодразделениеДт;
		Иначе
			Проводка.ХА_Подразделение = Проводка.ПодразделениеКт;
		КонецЕсли;
		Если Проводка.ПодразделениеДт <> Проводка.ПодразделениеКт Тогда
			Отказ = Истина;
			Сообщить("Нельзя делать перемещение между подразделениями");
		КонецЕсли;
	КонецЦикла;
	// 		ХА
 
КонецПроцедуры

Но при этом договорились с бухгалтерами, что они не будут делать внутренних движений между подразделениями.
В шаблоне я прописал ограничения на основе этого измерения. Если открыть регистр бухгалтерии в пользовательском режиме, то ограничения работают как надо. Ожидал, что и все типовые отчеты заработают с ограничением. Но не тут то было. Оказывает все запросы в оборотках и иже с ними работают без приписки РАЗРЕШЕННЫЕ и соответственно выводят полностью все цифры не взирая на ограничения.

Вывод. Тот кто соберется делать такое разграничение надо несколько раз подумать, стоит ли связываться. Вполне возможно что проще закрыть все отчеты и дать доступ к каким-то самописным, которые уже будут ограничивать вывод данных.

Прикрепленный файлРазмерХитыПоследнее скачивание
OgranichenieDostupaPoPodrazdeleniyam.epf5.59 кб2934 дня 14 часов назад
ObnovitSpravochnikIdentifikatoryObektovMetadannyh.epf5.74 кб2924 дня 14 часов назад

Комментарии

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".
admin аватар

На тестовой базе ограничения сработали, а на рабочей нет.
В шаблоне ограничения доступа используется регистр "Таблицы групп доступа". В этом регистре не оказалось записей по таблице Организации. Есть процедура ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации(), которая должна обновлять этот регистр и еще несколько вспомогательных регистров. Но она мне не помогла.
Стал смотреть как заполняется этот регистр. Вышел на регистр сведений "Права ролей", где тоже нет записей на справочник Организации для новой роли. Его можно обновить из формы списка, но он обновляется только монопольно. После обновления этого регистра, запустил принудительное обновление регистра сведений "Таблицы групп доступа" (тоже из списка). После этого записи в данном регистре проявились.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".