Как ограничить выбор банковских счетов организации для определенных пользователей в 1С:ERP

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При ведении учета в 1С:ERP Управление предприятием часто возникает ситуация, когда у организации открыто множество расчетных счетов (рублевые, валютные, специальные счета для гособоронзаказа или кредитные линии). При этом менеджерам по продажам для выставления счетов клиентам требуется доступ всего к двум-трем основным счетам, а остальные счета предназначены исключительно для бухгалтерии и казначейства. Случайный выбор не того расчетного счета приводит к ошибкам в первичных документах и неверным поступлениям оплат.

Разберем архитектурные особенности типовой конфигурации и рассмотрим все возможные варианты решения данной задачи: от штатных настроек без программирования до программных доработок через расширения.

Архитектурные особенности разграничения прав в 1С:ERP

Проанализируем, почему данную задачу нельзя решить простым включением стандартного ограничения доступа на уровне записей (RLS):

  1. Объединенное право доступа: В типовой подсистеме БСП и метаданных ERP права на чтение организаций и их банковских счетов объединены в общую роль ЧтениеОрганизацийИБанковскихСчетовОрганизаций. Банковские счета архитектурно подчинены справочнику Организации, поэтому возможность видеть организацию автоматически дает право видеть все ее расчетные счета.
  2. Отсутствие отдельного профиля групп доступа: Для справочника БанковскиеСчетаОрганизаций по умолчанию не предусмотрен отдельный вид доступа в группах доступа (в отличие от партнеров, складов или подразделений).
  3. Риски прямого использования RLS для счетов: Если искусственно переопределить ограничение доступа к счетам на уровне RLS, менеджеры при открытии старых документов или отчетов с недоступными счетами будут видеть надписи «Объект не найден», а при попытке перепроведения таких документов система выдаст ошибку нарушения прав доступа.

Вариант 1. Типовые способы без программирования

Рассмотрим варианты решения задачи средствами пользовательского интерфейса и штатных механизмов ERP:

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

Вариант 2. Фильтрация данных выбора через расширение конфигурации

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

Добавим в расширение модуль менеджера справочника БанковскиеСчетаОрганизаций и переопределим обработчик получения данных выбора:


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

В этом примере признак доступности счета для менеджеров можно хранить как в дополнительном реквизите справочника (что позволяет не менять структуру метаданных), так и в отдельном реквизите, добавленном через расширение.

Вариант 3. Контроль при проведении и записи документов

Посмотрим на сценарий, когда менеджер все же пытается сохранить документ с некорректным счетом (например, копированием другого документа). Для защиты от таких действий добавим проверку в событие ПередЗаписью документа в расширении:


&После("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если Отказ Или РежимПроведения <> РежимПроведенияДокумента.Проведение Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем ограничения только для менеджеров
    Если НЕ РольДоступна("ПолныеПрава") И НЕ РольДоступна("ДобавлениеИзменениеДанныхБухгалтерии") Тогда
        Если ЗначениеЗаполнено(ЭтотОбъект.БанковскийСчетОрганизации) 
            И НЕ ЭтотОбъект.БанковскийСчетОрганизации.ДополнительныйРеквизит_ДоступенМенеджерам Тогда
            
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                "Выбранный расчетный счет организации недоступен для оформления документов продаж.",
                ЭтотОбъект,
                "БанковскийСчетОрганизации",
                ,
                Отказ
            );
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Итоги и рекомендации

Выясним, какой подход выбрать для конкретной ситуации:

  1. Если требуется быстрое решение без привлечения программиста — зафиксируем счета в договорах и скроем поле выбора через стандартную настройку формы.
  2. Если менеджеры должны иметь возможность выбирать счет из строго ограниченного списка — используем переопределение ОбработкаПолученияДанныхВыбора в расширении.
  3. Не рекомендуется накладывать RLS-ограничения на справочник БанковскиеСчетаОрганизаций, так как это нарушает целостность отображения связанных документов и приводит к ошибкам Объект не найден.
← На главную