Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

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

Ретунский Александр Посмотреть все статьи >> Технический архитектор франчайзинговой сети «ИнфоСофт»
21.12.2021
2793
Время прочтения - 4 мин.
Заказать консультацию

Проблема

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

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

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

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

Подпишитесь на дайджест!
Подпишитесь на дайджест, и получайте ежемесячно подборку полезных статей.

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

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

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

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

2) В контрагентах заполнить реквизит – «ОрганизационнаяЕдиница», нужной организацией. При создании каждой организации создается контрагент с заполненным реквизитом: «ОрганизационнаяЕдиница».

3) Добавить код в обработчик «НачалоВыбора» для реквизита: «ОрганизацияК» и «ОрганизацияПолучательК» (будут только доступны контрагенты с заполненным реквизитом «ОрганизационнаяЕдиница» и не помеченные на удаления; автоматически заполнятся типовые реквизиты на основании добавленных реквизитов):

&НаКлиенте

Процедура ОрганизацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

              

               СтандартнаяОбработка = Ложь;

              

               ОрганизацияНачалоВыбораДляХозОперацииПеремешениеТоваровМеждуФилиалами(Элемент);

              

КонецПроцедуры

/////////////////////////////////////////////////////////////////////////////////////////////////////////

&НаКлиенте

Процедура ОрганизацияНачалоВыбораДляХозОперацииПеремешениеТоваровМеждуФилиалами(Элемент)

              

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

                                                              

                               НастройкиКомпоновки = Новый НастройкиКомпоновкиДанных;

                               ГруппаОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));

               ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

              

                               ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

                               ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ПометкаУдаления");

                               ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеРавно;

                               ЭлементОтбора.Использование  = Истина;

                               ЭлементОтбора.ПравоеЗначение = Истина;

                               ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

                               ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ОрганизационнаяЕдиница");

                               ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеРавно;

                               ЭлементОтбора.Использование  = Истина;

                               ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Справочник.Организации.ПустаяСсылка");

                              

                               ПараметрыОтбора = Новый Структура;

                               ПараметрыОтбора.Вставить("ФиксированныеНастройки", НастройкиКомпоновки);

                               ПараметрыОтбора.Вставить("РежимВыбора",Истина);

                              

                               ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбора", ЭтотОбъект, Элемент.Имя);

                              

                               ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора",ПараметрыОтбора, ЭтаФорма, , , ,ОбработкаВыбора);

                              

               КонецЕсли;

                    

КонецПроцедуры

/////////////////////////////////////////////////////////////////////////////////////////////////////////

&НаКлиенте

Процедура ПриЗакрытииФормыВыбора(Значение, ДопПараметры) экспорт

              

               Если Значение = Неопределено Тогда

        Возврат;

    КонецЕсли;

    

    Объект[ДопПараметры] = Значение;

              

               ОрганизацияДляЗаполнения  = ПолучитьОрганизациюПоКонтрагенту(Значение);

              

               Если ЗначениеЗаполнено(ОрганизацияДляЗаполнения) Тогда

                               Объект[Сред(ДопПараметры,4)] = ОрганизацияДляЗаполнения;

               КонецЕсли;

              

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////

&НаСервереБезКонтекста

Функция ПолучитьОрганизациюПоКонтрагенту(Контрагент)

               УстановитьПривилегированныйРежим(Истина);

              

               Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент,"ОрганизационнаяЕдиница");

              

КонецФункции

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

&НаКлиенте

Процедура ОрганизацияКПриИзменении(Элемент)

              

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

              

КонецПроцедуры

///////////////////////////////////////////////////////////

&НаКлиенте

Процедура ОрганизацияПолучательКПриИзменении(Элемент)

              

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

              

КонецПроцедуры

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

Ограничение.Текст =

               "РазрешитьЧтениеИзменение

               |ГДЕ

               | ( ЗначениеРазрешено(Организация)

               |  ИЛИ ЗначениеРазрешено(ОрганизацияПолучатель) )

               |              И( ЗначениеРазрешено(СкладОтправитель)

               |              ИЛИ ЗначениеРазрешено(СкладПолучатель)

               |              ) ";

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

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

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

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

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

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

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

              

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

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

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

            Если Форма.Объект.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеремещениеТоваровМеждуФилиалами

                                И ЗначениеЗаполнено(Форма.Объект.ИС_Организация) Тогда

                               

                                Попытка              

                                               Форма.Объект.Организация.ПолучитьОбъект();                   

                                Исключение

                                               ИзменитьСвойствоЭлементаФормы(Форма, "СтраницаТовары", "ТолькоПросмотр", Истина);

                                               ИзменитьСвойствоЭлементаФормы(Форма, "ИС_Страница_Маркировка", "ТолькоПросмотр", Истина);

                                               ИзменитьСвойствоЭлементаФормы(Форма, "ИС_Организация", "ТолькоПросмотр", Истина);

                                               ИзменитьСвойствоЭлементаФормы(Форма, "СкладОтправитель", "ТолькоПросмотр", Истина);

                                КонецПопытки;

                                                              

                КонецЕсли;

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

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

                               УстановитьПривилегированныйРежим(Истина);                   

               КонецЕсли;         


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


Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Отправить заявку

Нажимая на кнопку, вы даете согласие на обработку своих персональных данных и соглашаетесь с политикой конфиденциальности.

Рассказать друзьям
Для разработчиков 1С
Вам может быть интересно: