Проблема
Две организации работают в одной информационной базе 1С с применением RLS (у каждой организации доступ на документы только по своей организации). Необходимо, чтобы при оформлении документа «Перемещение товаров» по хозяйственной операции – «Перемещение товаров между филиалами», документ, созданный организацией отправителем на организацию получатель, был доступен обоим организациям. Организация отправитель может изменять весь реквизитный состав документа, а организация получатель только определенные реквизиты.
Ограничения типовых решений заключается в том, что документ «Перемещение товаров» по хозяйственной операции – «Перемещение товаров между филиалами», доступен только организации отправителю.
Описание решения проблемы
Для решения поставленной проблемы в максимально короткие сроки, необходимо добавить в документ новые реквизиты организация отправитель и организация получатель с типом: «Контрагенты» вывести для пользователей видимость новых реквизитов, а типовые реквизиты: «Организация» и «ОрганизацияПолучатель» скрыть. Для каждой организации создается свой контрагент и они связываются через реквизит справочника «Контрагент»: «ОрганизационнаяЕдиница». В форме выбора контрагента в документе «Перемещение товаров» выводить, только контрагентов, которые связаны с организациями. При выборе контрагента заполнять типовые реквизиты: «Организация» и «ОрганизацияПолучатель» через привилегированный режим по реквизиту «ОрганизационнаяЕдиница». Также необходимо добавить, чтобы документ «Перемещение товаров» проверял по RLS организацию по двум реквизитам: «Организация» и «ОрганизацияПолучатель». Для ограничения реквизитного состава документа между организациями реализуется через проверку на доступность реквизита: «Организация» (организация отправитель).
Необходимые доработки
Доработки можно реализовать в расширении.
- Добавить два новых реквизита в документ «Перемещение товаров»: ОрганизацияК (тип: Контрагенты), ОрганизацияПолучательК (Тип:Контрагенты).
- В контрагентах заполнить реквизит – «ОрганизационнаяЕдиница», нужной организацией. При создании каждой организации создается контрагент с заполненным реквизитом: «ОрганизационнаяЕдиница».
- Добавить код в обработчик «НачалоВыбора» для реквизита: «ОрганизацияК» и «ОрганизацияПолучательК» (будут только доступны контрагенты с заполненным реквизитом «ОрганизационнаяЕдиница» и не помеченные на удаления; автоматически заполнятся типовые реквизиты на основании добавленных реквизитов):
&НаКлиенте
Процедура ОрганизацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
               СтандартнаяОбработка = Ложь;       
ОрганизацияНачалоВыбораДляХозОперацииПеремешениеТоваровМеждуФилиалами(Элемент);
             
КонецПроцедуры
/////////////////////////////////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ОрганизацияНачалоВыбораДляХозОперацииПеремешениеТоваровМеждуФилиалами(Элемент)
              
        Если Объект.ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ПеремещениеТоваровМеждуФилиалами") Тогда                                                         
               НастройкиКомпоновки = Новый НастройкиКомпоновкиДанных;
               ГруппаОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
               ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
           
               ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
               ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ПометкаУдаления");
               ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеРавно;
               ЭлементОтбора.Использование  = Истина;
               ЭлементОтбора.ПравоеЗначение = Истина;
               ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
               ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ОрганизационнаяЕдиница");
               ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеРавно;
               ЭлементОтбора.Использование  = Истина;
               ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Справочник.Организации.ПустаяСсылка");
                           
               ПараметрыОтбора = Новый Структура;
               ПараметрыОтбора.Вставить("ФиксированныеНастройки", НастройкиКомпоновки);
               ПараметрыОтбора.Вставить("РежимВыбора",Истина);
                            
               ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбора", ЭтотОбъект, Элемент.Имя);
                         
               ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора",ПараметрыОтбора, ЭтаФорма, , , ,ОбработкаВыбора);                            
       КонецЕсли;
                    
КонецПроцедуры
/////////////////////////////////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПриЗакрытииФормыВыбора(Значение, ДопПараметры) экспорт
             
   Если Значение = Неопределено Тогда
        Возврат;
   КонецЕсли;
   
   Объект[ДопПараметры] = Значение;
              
   ОрганизацияДляЗаполнения  = ПолучитьОрганизациюПоКонтрагенту(Значение);
   Если ЗначениеЗаполнено(ОрганизацияДляЗаполнения) Тогда
        Объект[Сред(ДопПараметры,4)] = ОрганизацияДляЗаполнения;
    КонецЕсли;             
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////////////////
&НаСервереБезКонтекста
Функция ПолучитьОрганизациюПоКонтрагенту(Контрагент)
    УстановитьПривилегированныйРежим(Истина);
    Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент,"ОрганизационнаяЕдиница");
            
КонецФункции
4. Добавить код в обработчик «ПриИзменении» для реквизита: «ОрганизацияК» и «ОрганизацияПолучательК» (это необходимо для изменения, например по вводу по строке):
&НаКлиенте
Процедура ОрганизацияКПриИзменении(Элемент)
	
	ПриЗакрытииФормыВыбора(Объект.ОрганизацияК, Элемент.Имя);
	
КонецПроцедуры
///////////////////////////////////////////////////////////
&НаКлиенте
Процедура ОрганизацияПолучательКПриИзменении(Элемент)
	
	ПриЗакрытииФормыВыбора(Объект.ОрганизацияПолучательК, Элемент.Имя);
	
КонецПроцедуры
5. Изменить код в обработчике «ПриЗаполненииОграниченияДоступа» модуля менеджера документа:
Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	| ( ЗначениеРазрешено(Организация) 
	|  ИЛИ ЗначениеРазрешено(ОрганизацияПолучатель) )
	|	И( ЗначениеРазрешено(СкладОтправитель)
	|	ИЛИ ЗначениеРазрешено(СкладПолучатель)
	|	) ";
6. Для подмены типовых реквизитов на добавленные, необходимо в процедуре общего модуля (или непосредственно в самом документе в процедуре: «ПриСозданииНаСервере»):
СобытияФорм.ПриСозданииНаСервере
Организовать программный вывод добавленных реквизитов и скрытие типовых реквизитов, также нужно учитывать хозяйственную операцию документа.
Добавление и скрытие реквизитов также должно отрабатывать и в процедуре формы документа – «ХозяйственнаяОперацияПриИзмененииСервер».
Обязательно организовать связь добавленных реквизитов и обработчиков событий:
Форма.Элементы.ОрганизацияК.УстановитьДействие("НачалоВыбора", " ОрганизацияКНачалоВыбора");
Форма.Элементы.ОрганизацияПолучательК.УстановитьДействие("НачалоВыбора", "ОрганизацияКНачалоВыбора");	
	
Форма.Элементы.ОрганизацияК.УстановитьДействие("ПриИзменении", "ОрганизацияКПриИзменении");
Форма.Элементы.ОрганизацияПолучательК.УстановитьДействие("ПриИзменении", "ОрганизацияПолучательКПриИзменении");
7. Реализация доступности различного реквизитного состава для организаций, реализуется в процедуре общего модуля (или непосредственно в самом документе в процедуре: «ПриСозданииНаСервере»): СобытияФорм.ПриСозданииНаСервере
Если Форма.Объект.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеремещениеТоваровМеждуФилиалами 
		И ЗначениеЗаполнено(Форма.Объект.ИС_Организация) Тогда
		
		Попытка	
			Форма.Объект.Организация.ПолучитьОбъект(); 		
		Исключение
			ИзменитьСвойствоЭлементаФормы(Форма, "СтраницаТовары", "ТолькоПросмотр", Истина); 
			ИзменитьСвойствоЭлементаФормы(Форма, "ОрганизацияК", "ТолькоПросмотр", Истина);
			ИзменитьСвойствоЭлементаФормы(Форма, "СкладОтправитель", "ТолькоПросмотр", Истина);
		КонецПопытки;
				
КонецЕсли;
8. В модуле объекта документа в процедуре: «ОбработкаПроверкиЗаполнения» необходимо добавить в начала процедуры, код для проведения проверок без учета RLS (т.к. доступ будет не на все объекты):
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеремещениеТоваровМеждуФилиалами Тогда
		УстановитьПривилегированныйРежим(Истина);		
КонецЕсли;	
Заключение
Данный подход применим и для других ситуаций, когда нам нужно заполнить недоступными значениями на уровне RLS реквизит в любом документе.
Тестировалось на 1С:ERP. Управление холдингом (3.1.4.31), но подходит и для других современных конфигураций.
Вступайте в нашу телеграмм-группу Инфостарт
