Каталог решений - Перемещение товаров между филиалами в одной информационной базе 1С с применением RLS

Перемещение товаров между филиалами в одной информационной базе 1С с применением RLS

Перемещение товаров между филиалами в одной информационной базе 1С с применением RLS

В наличии

В своей статье Ретунский Александр, аналитик-эксперт компании АО «Корпоративные ИТ-проекты» (официальный партнер ИнфоСофт), поделится опытом решения задачи по перемещению товаров между филиалами в одной информационной базе 1С с применением RLS.

Категория:

Описание

Проблема

Две организации работают в одной информационной базе 1С  с применением RLS (у каждой организации доступ на документы только по своей организации). Необходимо, чтобы при оформлении документа «Перемещение товаров» по хозяйственной операции – «Перемещение товаров между филиалами», документ, созданный организацией отправителем на организацию получатель, был доступен обоим организациям. Организация отправитель может изменять весь реквизитный состав документа, а организация получатель только определенные реквизиты.

Ограничения типовых решений заключается в том, что документ «Перемещение товаров» по хозяйственной операции – «Перемещение товаров между филиалами», доступен только организации отправителю.

 

Описание решения проблемы

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

 

Необходимые доработки

Доработки можно реализовать в расширении.

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

 

4. Добавить код в обработчик «ПриИзменении» для реквизита: «ОрганизацияК» и «ОрганизацияПолучательК» (это необходимо для изменения, например по вводу по строке):

  &НаКлиенте
  Процедура ОрганизацияКПриИзменении(Элемент)
  	
  	ПриЗакрытииФормыВыбора(Объект.ОрганизацияК, Элемент.Имя);
  	
  КонецПроцедуры
  ///////////////////////////////////////////////////////////
  &НаКлиенте
  Процедура ОрганизацияПолучательКПриИзменении(Элемент)
  	
  	ПриЗакрытииФормыВыбора(Объект.ОрганизацияПолучательК, Элемент.Имя);
  	
  КонецПроцедуры
  

 

5. Изменить код в обработчике «ПриЗаполненииОграниченияДоступа» модуля менеджера документа:

  Ограничение.Текст =
  	"РазрешитьЧтениеИзменение
  	|ГДЕ
  	| ( ЗначениеРазрешено(Организация) 
  	|  ИЛИ ЗначениеРазрешено(ОрганизацияПолучатель) )
  	|	И( ЗначениеРазрешено(СкладОтправитель)
  	|	ИЛИ ЗначениеРазрешено(СкладПолучатель)
  	|	) ";
  

 

6. Для подмены типовых реквизитов на добавленные, необходимо в процедуре общего модуля (или непосредственно в самом документе в процедуре: «ПриСозданииНаСервере»):

СобытияФорм.ПриСозданииНаСервере

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

Добавление и скрытие реквизитов также должно отрабатывать и в процедуре формы документа – «ХозяйственнаяОперацияПриИзмененииСервер».

Обязательно организовать связь добавленных реквизитов и обработчиков событий:

  Форма.Элементы.ОрганизацияК.УстановитьДействие("НачалоВыбора", " ОрганизацияКНачалоВыбора");
  Форма.Элементы.ОрганизацияПолучательК.УстановитьДействие("НачалоВыбора", "ОрганизацияКНачалоВыбора");	
  	
  Форма.Элементы.ОрганизацияК.УстановитьДействие("ПриИзменении", "ОрганизацияКПриИзменении");
  Форма.Элементы.ОрганизацияПолучательК.УстановитьДействие("ПриИзменении", "ОрганизацияПолучательКПриИзменении");
  

 

7. Реализация доступности различного реквизитного состава для организаций, реализуется в процедуре общего модуля (или непосредственно в самом документе в процедуре: «ПриСозданииНаСервере»): СобытияФорм.ПриСозданииНаСервере

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

 

8. В модуле объекта документа в процедуре: «ОбработкаПроверкиЗаполнения» необходимо добавить в начала процедуры, код для проведения проверок без учета RLS (т.к. доступ будет не на все объекты):

  Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеремещениеТоваровМеждуФилиалами Тогда
  		УстановитьПривилегированныйРежим(Истина);		
  КонецЕсли;	

 

Заключение

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

Тестировалось на 1С:ERP. Управление холдингом (3.1.4.31), но подходит и для других современных конфигураций.

has been added to your cart:
Оформление заказа