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