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