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