Как настроить права для изменения ответственных лиц организации в 1С:УПП 1.3 без изменения конфигурации?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

В организациях нередко возникает ситуация, когда на одной должности посменно трудятся несколько сотрудников — например, два кассира с графиком работы «неделя через неделю». При формировании кассовых документов (приходных и расходных кассовых ордеров) в печатных формах должны стоять реальные фамилии дежурящих сотрудников. Однако стандартная типовая настройка прав в конфигурации «1С:Управление производственным предприятием 1.3» жестко ограничивает доступ к изменению регистра сведений ОтветственныеЛицаОрганизаций.

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

Анализ прав доступа к регистру ответственных лиц в типовой конфигурации

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

  1. Откроем дерево метаданных, кликнем правой кнопкой мыши по ветке Роли и выберем пункт Все роли.
  2. Найдем в списке объектов регистр сведений ОтветственныеЛицаОрганизаций.
  3. Посмотрим на матрицу прав: права Изменение, Запись и Удаление для этого объекта присутствуют только у двух типовых ролей: ПолныеПрава и НастройкаНСИ.

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

Кроме того, регистр ОтветственныеЛицаОрганизаций является периодическим (периодичность установлена «В пределах дня»). Это накладывает архитектурное ограничение: в рамках одних суток программа не позволит зарегистрировать двух разных кассиров для одной и той же организации. Срез последних всегда возвращает запись, актуальную на дату и время проведения документа.

Способ 1. Заполнение графика смен в регистре заранее (организационный)

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

  1. Пользователь с административными правами (главный бухгалтер или администратор базы) открывает регистр сведений ОтветственныеЛицаОрганизаций.
  2. Зная рабочий график кассиров, ответственный сотрудник вносит записи на месяц или квартал вперед будущими датами (например, каждый понедельник с даты начала смены нового кассира).
  3. При проведении и печати документов типовой механизм 1С автоматически получает срез последних на дату документа, безошибочно подставляя нужную фамилию.

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

Способ 2. Внешняя печатная форма с определением кассира по автору документа

Если кассиры меняются нерегулярно или часто подменяют друг друга в течение дня, глобальная привязка к организации через регистр не сработает. Наиболее удобным и чистым решением является разработка внешней печатной формы (ВПФ) для документов ПриходныйКассовыйОрдер и РасходныйКассовыйОрдер.

Разберем логику работы такого решения по шагам:

  1. В типовых документах кассы всегда заполняется реквизит Ответственный (ссылка на справочник Пользователи).
  2. Каждый кассир входит в систему под своей учетной записью со своим паролем. При создании ордера он автоматически становится его автором.
  3. Во внешней печатной форме переопределяется алгоритм заполнения реквизитов подписанта: вместо вызова среза последних из регистра ответственных лиц берутся данные связанного физического лица непосредственно из пользователя, создавшего документ.

Посмотрим на пример кода алгоритма получения данных кассира для макета ордера:


// Получаем физическое лицо и должность текущего ответственного за документ
ФизЛицоКассира = ШапкаДокумента.Ответственный.ФизЛицо;
Если ЗначениеЗаполнено(ФизЛицоКассира) Тогда
    // Получаем актуальные паспортные данные или ФИО физлица
    ФамилияИнициалы = ФизическиеЛица.ФамилияИнициалыФизЛица(ФизЛицоКассира);
    ОбластьМакета.Параметры.КассирФИО = ФамилияИнициалы;
Иначе
    // Если физлицо не привязано к пользователю, берем стандартное ответственное лицо
    ОбластьМакета.Параметры.КассирФИО = ШапкаДокумента.Кассир;
КонецЕсли;

Такая внешняя печатная форма подключается через справочник ВнешниеОбработки и назначается в качестве основной. При этом конфигурация остается полностью типовой и сохраняет поддержку производителя.

Способ 3. Внешняя обработка со сменой ответственного через COM-соединение

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

Если пользователям принципиально нужна кнопка для смены себя в роли кассира без изменения конфигурации, задачу можно решить через фоновое подключение внешнего COM-соединения под специальным техническим пользователем:

  1. В информационной базе создается сервисный пользователь (например, РоботНСИ) с полными правами, для которого запрещен интерактивный вход.
  2. Создается внешняя обработка (.epf), доступная кассирам. На форме размещается кнопка «Стать кассиром».
  3. По нажатию кнопки обработка программно устанавливает соединение с текущей информационной базой через объект V83.COMConnector под служебной учетной записью.
  4. Через полученное COM-соединение создается набор записей регистра и выполняется запись с датой текущего дня.

Посмотрим на пример процедуры записи ответственного лица через COM-коннектор:


Процедура УстановитьКассираЧерезCOM(ОрганизацияСсылка, ФизЛицоСсылка)
    Коннектор = Новый COMОбъект("V83.COMConnector");
    СтрокаСоединения = "Srvr=""Server1C"";Ref=""BaseUPP"";Usr=""РоботНСИ"";Pwd=""SecretPass"";";
    
    Попытка
        Соединение = Коннектор.Connect(СтрокаСоединения);
    Исключение
        Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Получаем менеджер регистра в контексте COM-сеанса с полными правами
    НаборЗаписей = Соединение.РегистрыСведений.ОтветственныеЛицаОрганизаций.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Организация.Установить(Соединение.XMLЗначение(Соединение.Тип("СправочникСсылка.Организации"), XMLСтрока(ОрганизацияСсылка)));
    НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
    
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.Период = НачалоДня(ТекущаяДата());
    НоваяЗапись.Организация = Соединение.XMLЗначение(Соединение.Тип("СправочникСсылка.Организации"), XMLСтрока(ОрганизацияСсылка));
    НоваяЗапись.ОтветственноеЛицо = Соединение.Перечисления.ОтветственныеЛицаОрганизаций.Кассир;
    НоваяЗапись.ФизическоеЛицо = Соединение.XMLЗначение(Соединение.Тип("СправочникСсылка.ФизическиеЛица"), XMLСтрока(ФизЛицоСсылка));
    
    НаборЗаписей.Записать(Истина);
    Сообщить("Ответственное лицо успешно обновлено!");
КонецПроцедуры

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

← На главную