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

10.01.22

Разработка - Универсальные функции

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

Проблема

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

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

 

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

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

 

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

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

  1. Добавить два новых реквизита в документ «Перемещение товаров»: ОрганизацияК (тип: Контрагенты), ОрганизацияПолучательК (Тип:Контрагенты).
  2. В контрагентах заполнить реквизит – «ОрганизационнаяЕдиница», нужной организацией. При создании каждой организации создается контрагент с заполненным реквизитом: «ОрганизационнаяЕдиница».
  3. Добавить код в обработчик «НачалоВыбора» для реквизита: «ОрганизацияК» и «ОрганизацияПолучательК» (будут только доступны контрагенты с заполненным реквизитом «ОрганизационнаяЕдиница» и не помеченные на удаления; автоматически заполнятся типовые реквизиты на основании добавленных реквизитов):
&НаКлиенте

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

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

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

&НаКлиенте

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте

Процедура ПриЗакрытииФормыВыбора(Значение, ДопПараметры) экспорт
             
   Если Значение = Неопределено Тогда
        Возврат;
   КонецЕсли;
   
   Объект[ДопПараметры] = Значение;
              
   ОрганизацияДляЗаполнения  = ПолучитьОрганизациюПоКонтрагенту(Значение);

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

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

    КонецЕсли;             

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

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

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

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

    УстановитьПривилегированныйРежим(Истина);
    Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент,"ОрганизационнаяЕдиница");
            
КонецФункции

 

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

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

 

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

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

 

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

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

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

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

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

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

 

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

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

 

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

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

 

Заключение

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

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

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

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159389    872    399    

861

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

16800 руб.

06.12.2023    8840    42    5    

73

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8500 руб.

10.11.2023    10412    36    20    

61

SALE! 20%

Зарплата Роли и права Системный администратор Бухгалтер Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Молдова Россия Казахстан Бухгалтерский учет Платные (руб)

Расширение позволяет максимально полно ограничить доступ пользователей к данным по заработной плате, а именно закрывает доступ к документам начисления и выплаты заработной платы, не позволяет просматривать бухгалтерские отчеты по счету учета зарплаты а также убирает зарплатные проводки из журнала проводок. Расширение запрещает просматривать платежные документы на выплату зарплаты, так же не доступны регламентные отчеты в ПФР и ИФНС. Расширение предлагает готовые настроенные профили "Бухгалтер без зарплаты", "Только просмотр без зарплаты".

5940 4752 руб.

27.05.2021    37556    264    92    

205

Логистика, склад и ТМЦ Роли и права Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Расширение для 1С:Бухгалтерия 3.0, которое позволяет использовать отдельные роли для доступа к складским документам, для доступа к документам раздела "Производство" и для доступа к документам раздела "Покупки".

4560 руб.

21.05.2019    1694762    570    194    

137

Ценообразование, анализ цен Роли и права Системный администратор Платформа 1С v8.3 Управление правами 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Расширение возможностей программы 1С УНФ. Функционал расширения - разграничение всевозможных прав пользователей и контроль при совершении различных действий.

3000 руб.

23.02.2018    58450    160    261    

152

Роли и права Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

Данная система разработана как альтернатива стандартной системе напоминаний. Но имеет ряд существенных преимуществ: отображение в базе или с отправкой по почте, свое расписание, возможность фильтрации по ролям и пользователям, формирование своих запросов и макетов, шаблоны писем, работа в фоне. А также может блокировать работу пользователей при заданных условиях. Может работать в составе любой конфигурации. Имеется справка с описанием возможностей. (Обновление от 20.02.2024, версия 2.2, расширение)

19200 руб.

29.11.2019    25657    16    8    

37
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ilkaev_log2021 04.01.22 21:16 Сейчас в теме
УправлениеДоступом.ЕстьПраво() вместо Попытка .ПолучитьОбъект() Исключение ..
12. Shining_ninja 2189 20.01.22 13:10 Сейчас в теме
(1) А что передавать первым параметром - Право?
2. ilkaev_log2021 04.01.22 21:17 Сейчас в теме
но в целом решение странное, не тянет на канон)
5. Shining_ninja 2189 07.01.22 11:53 Сейчас в теме
(2) решение рабочее, других решений не встречал пока. Минимум доработок.
3. mixsture 06.01.22 10:46 Сейчас в теме
Объект[Сред(ДопПараметры,4)] = ОрганизацияДляЗаполнения;


К чему этот глобализованный код, когда выбирают только организацию? Будто ДопПараметры может быть чем-то еще, кроме "ИС_Организация".
4. Shining_ninja 2189 07.01.22 11:52 Сейчас в теме
(3) может быть еще ОрганизацияПолучатель.
6. mixsture 07.01.22 15:27 Сейчас в теме
(4) Если честно, это где-то осталось за рамками кода и поэтому неочевидно.

Единственные похожие куски кода, это:
ИзменитьСвойствоЭлементаФормы(Форма, "СтраницаТовары", "ТолькоПросмотр", Истина);
ИзменитьСвойствоЭлементаФормы(Форма, "ИС_Страница_Маркировка", "ТолькоПросмотр", Истина);
ИзменитьСвойствоЭлементаФормы(Форма, "ИС_Организация", "ТолькоПросмотр", Истина);
ИзменитьСвойствоЭлементаФормы(Форма, "СкладОтправитель", "ТолькоПросмотр", Истина);


Ничего похожего на "ИС_ОрганизацияПолучатель" я не нашел.
8. Shining_ninja 2189 10.01.22 11:20 Сейчас в теме
(6) Это в четвертым пункте описывается
7. boevik 2 10.01.22 09:44 Сейчас в теме
Технически бог с ним. А формально: разве можно просто перемешать товары между юрлицами? Ведь хозяйственные операции, наверняка, должны быть реализация и поступление.
9. Shining_ninja 2189 10.01.22 11:21 Сейчас в теме
(7) между филиалами почему нет, в типовом это и реализовано - но работает только если не включен RLS
10. boevik 2 11.01.22 09:51 Сейчас в теме
(9) филиал это обычно обособленое подразделение. Юридическое лицо (организация) одно. Т.е. в rls из за организации проблемы не должно быть.
У вас, я так понял, разные юрлица оказались и просто перемещать товар вроде как не очень.
Либо я что то не понял.
11. Shining_ninja 2189 11.01.22 11:30 Сейчас в теме
(10)
филиал это обычно обособленое подразделение. Юридическое лицо (организация) одно. Т.е. в rls из за организации проблемы не должно быть.
У вас, я так понял, разные


Было одно юр. лицо и два обособленных подразделения (филиалы).

С включенном rls нельзя даже переносить с обособленного подразделения на обособленное подразделения - если данные обособленные подразделения не доступны.
13. Светлый ум 415 29.03.24 11:09 Сейчас в теме
Оставьте свое сообщение