Народ, доброго времени суток. Помогите разобраться. Обновился ЗУП с 3.1.14.500 до 3.1.18.46. Теперь табельщица не может проводить документ РаботаВВыходныеИПраздничныеДни. Пишет ошибку как на скриншоте. По данному документу есть пара ролей, которые его позволяют видоизменять - ПолныеПрава, ДобавлениеИзменениеРабочегоВремени. Еще роли на чтение. Все эти роли есть в соответсвующем профиле для табельщиков. В обновлённой и старой конфигурациях всё аналогично по данному документу. Но при этом выпадает ошибка. В обновленной конфе нашёл интересную роль УтверждениеДокументовУчетаРабочегоВремени. Но на этот документ она ни как не влияет.
Процедура ПроверитьПраваНаУтверждениеДокумента(ДокументОбъект, Отказ)
Если ПривилегированныйРежим() Тогда
Возврат;
КонецЕсли;
МенеджерДокумента = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ДокументОбъект.Ссылка);
ОписаниеРазделовДанных = МенеджерДокумента.ОписаниеРазделовДанных();
ПравоРедактирование = МногофункциональныеДокументыБЗККлиентСервер.ВидыПравНаРазделыДанных().Редактирование;
ПредыдущееСостояниеДокумента = Неопределено;
ЗначенияДоступа = Неопределено;
Для Каждого ОписаниеРаздела Из ОписаниеРазделовДанных Цикл
Если ОписаниеРаздела.Значение.РеквизитСостояние = Неопределено Тогда
Продолжить;
КонецЕсли;
ТребуетсяПроверка = Ложь;
Если ОписаниеРаздела.Значение.РеквизитСостояние = "Проведен"
Или ДокументОбъект[ОписаниеРаздела.Значение.РеквизитСостояние] Тогда
ТребуетсяПроверка = Истина;
ИначеЕсли Не ДокументОбъект[ОписаниеРаздела.Значение.РеквизитСостояние]Тогда
Если ПредыдущееСостояниеДокумента = Неопределено Тогда
ПредыдущееСостояниеДокумента = СостоянияРазделовДокументаВИБ(ДокументОбъект.Ссылка, ОписаниеРазделовДанных);
КонецЕсли;
ТребуетсяПроверка = ПредыдущееСостояниеДокумента[ОписаниеРаздела.Значение.РеквизитСостояние];
КонецЕсли;
Если ТребуетсяПроверка Тогда
Если ЗначенияДоступа = Неопределено Тогда
ЗначенияДоступа = МенеджерДокумента.ЗначенияДоступа(ДокументОбъект);
КонецЕсли;
Если Не ЕстьПравоНаРаздел(ПравоРедактирование, ОписаниеРаздела.Ключ, ЗначенияДоступа) Тогда
ТекстСообщения = НСтр("ru = '%1 - недостаточно прав для работы с утвержденным документом.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ДокументОбъект);
ВызватьИсключение(ТекстСообщения);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
В этой процедуре есть функция ЕстьПравоНаРаздел. В неё подается параметр ПравоРедактирования
Функция ЕстьПравоНаРаздел(ВидПрава, РазделДанных, ЗначенияДоступа = Неопределено) Экспорт
Если ПривилегированныйРежим() И ОбщегоНазначения.РежимОтладки() Тогда
ВызватьИсключение НСтр("ru = 'Проверка доступа на уровне записей производится в привилегированном режиме'");
КонецЕсли;
ВидыПрав = МногофункциональныеДокументыБЗККлиентСервер.ВидыПравНаРазделыДанных();
РазделыДанных = МногофункциональныеДокументыБЗККлиентСервер.РазделыДанных();
// Для рабочего времени не проверяем ограничения на уровне записей.
// достаточно наличия роли-флага
Если РазделДанных = РазделыДанных.РабочееВремя
И УправлениеДоступом.ЕстьРоль(Метаданные.Роли.УтверждениеДокументовУчетаВремени.Имя) Тогда
Возврат Истина;
КонецЕсли;
// Просмотр кадровых данных доступен всегда, считаем что если доступен документ (определяется отдельной ролью),
// то доступны и кадровые данные
Если ВидПрава = ВидыПрав.Просмотр
Если ВидПрава = ВидыПрав.Редактирование
И РазделДанных = РазделыДанных.КадровыеДанные Тогда
Возврат Истина;
КонецЕсли;
Если ЗначенияДоступа = Неопределено Тогда
ЗначенияДоступа = НовыйЗначенияДоступа();
КонецЕсли;
ЕстьПравоПоОрганизации = ЕстьПраваНаДоступПоОрганизации(ВидПрава, РазделДанных, ЗначенияДоступа.Организации);
ЕстьПравоПоФизическимЛицам = ЕстьПраваНаДоступПоФизическимЛицам(
ВидПрава,
РазделДанных,
ЗначенияДоступа.ФизическиеЛица);
Возврат ЕстьПравоПоОрганизации И ЕстьПравоПоФизическимЛицам;
КонецФункции
Показать
И вот тут самое интересное. Блок про раздел кадровые данные. Условие не выполняется:
Если ВидПрава = ВидыПрав.Просмотр
И РазделДанных = РазделыДанных.КадровыеДанные Тогда
Требуется просмотр, а у нас редактирование...
Дальше идет блок
Здесь я пока не разобрался о чём речь идёт вообще...
Это всё в типовом модуле МногофункциональныеДокументыБЗК,
В предыдущей сборке 3.1.14.500 весь этот код вообще в другом виде и модуле
Судя по скриншоту это явно программная проверка каких-то прав и потом вызов исключения. Под рукой ЗУП нет, в ERP беглый поиск выдал вот такое в общем модуле ЗарплатаКадрыРасширенный, процедура ПередЗаписьюМногофункциональногоДокумента. Смотрите отладчиком, что там происходит.
Если ДокументУтвержден И ИспользуетсяРасчетЗарплаты
И Не (ПолныеПраваНаДокумент И Не ЕстьОграниченияНаУровнеЗаписейПоВидуУчета("Изменение", ОписаниеДокумента.ВидУчета, ДанныеДляПроверкиОграничений, Отказ)) Тогда
ТекстСообщения = НСтр("ru = '%1 - недостаточно прав для работы с утвержденным документом.';
|en = '%1 - insufficient rights to work with the confirmed document.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Объект);
ВызватьИсключение(ТекстСообщения);
КонецЕсли;
Процедура ПроверитьПраваНаУтверждениеДокумента(ДокументОбъект, Отказ)
Если ПривилегированныйРежим() Тогда
Возврат;
КонецЕсли;
МенеджерДокумента = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ДокументОбъект.Ссылка);
ОписаниеРазделовДанных = МенеджерДокумента.ОписаниеРазделовДанных();
ПравоРедактирование = МногофункциональныеДокументыБЗККлиентСервер.ВидыПравНаРазделыДанных().Редактирование;
ПредыдущееСостояниеДокумента = Неопределено;
ЗначенияДоступа = Неопределено;
Для Каждого ОписаниеРаздела Из ОписаниеРазделовДанных Цикл
Если ОписаниеРаздела.Значение.РеквизитСостояние = Неопределено Тогда
Продолжить;
КонецЕсли;
ТребуетсяПроверка = Ложь;
Если ОписаниеРаздела.Значение.РеквизитСостояние = "Проведен"
Или ДокументОбъект[ОписаниеРаздела.Значение.РеквизитСостояние] Тогда
ТребуетсяПроверка = Истина;
ИначеЕсли Не ДокументОбъект[ОписаниеРаздела.Значение.РеквизитСостояние]Тогда
Если ПредыдущееСостояниеДокумента = Неопределено Тогда
ПредыдущееСостояниеДокумента = СостоянияРазделовДокументаВИБ(ДокументОбъект.Ссылка, ОписаниеРазделовДанных);
КонецЕсли;
ТребуетсяПроверка = ПредыдущееСостояниеДокумента[ОписаниеРаздела.Значение.РеквизитСостояние];
КонецЕсли;
Если ТребуетсяПроверка Тогда
Если ЗначенияДоступа = Неопределено Тогда
ЗначенияДоступа = МенеджерДокумента.ЗначенияДоступа(ДокументОбъект);
КонецЕсли;
Если Не ЕстьПравоНаРаздел(ПравоРедактирование, ОписаниеРаздела.Ключ, ЗначенияДоступа) Тогда
ТекстСообщения = НСтр("ru = '%1 - недостаточно прав для работы с утвержденным документом.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ДокументОбъект);
ВызватьИсключение(ТекстСообщения);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
В этой процедуре есть функция ЕстьПравоНаРаздел. В неё подается параметр ПравоРедактирования
Функция ЕстьПравоНаРаздел(ВидПрава, РазделДанных, ЗначенияДоступа = Неопределено) Экспорт
Если ПривилегированныйРежим() И ОбщегоНазначения.РежимОтладки() Тогда
ВызватьИсключение НСтр("ru = 'Проверка доступа на уровне записей производится в привилегированном режиме'");
КонецЕсли;
ВидыПрав = МногофункциональныеДокументыБЗККлиентСервер.ВидыПравНаРазделыДанных();
РазделыДанных = МногофункциональныеДокументыБЗККлиентСервер.РазделыДанных();
// Для рабочего времени не проверяем ограничения на уровне записей.
// достаточно наличия роли-флага
Если РазделДанных = РазделыДанных.РабочееВремя
И УправлениеДоступом.ЕстьРоль(Метаданные.Роли.УтверждениеДокументовУчетаВремени.Имя) Тогда
Возврат Истина;
КонецЕсли;
// Просмотр кадровых данных доступен всегда, считаем что если доступен документ (определяется отдельной ролью),
// то доступны и кадровые данные
Если ВидПрава = ВидыПрав.Просмотр
Если ВидПрава = ВидыПрав.Редактирование
И РазделДанных = РазделыДанных.КадровыеДанные Тогда
Возврат Истина;
КонецЕсли;
Если ЗначенияДоступа = Неопределено Тогда
ЗначенияДоступа = НовыйЗначенияДоступа();
КонецЕсли;
ЕстьПравоПоОрганизации = ЕстьПраваНаДоступПоОрганизации(ВидПрава, РазделДанных, ЗначенияДоступа.Организации);
ЕстьПравоПоФизическимЛицам = ЕстьПраваНаДоступПоФизическимЛицам(
ВидПрава,
РазделДанных,
ЗначенияДоступа.ФизическиеЛица);
Возврат ЕстьПравоПоОрганизации И ЕстьПравоПоФизическимЛицам;
КонецФункции
Показать
И вот тут самое интересное. Блок про раздел кадровые данные. Условие не выполняется:
Если ВидПрава = ВидыПрав.Просмотр
И РазделДанных = РазделыДанных.КадровыеДанные Тогда
Требуется просмотр, а у нас редактирование...
Дальше идет блок
Здесь я пока не разобрался о чём речь идёт вообще...
Это всё в типовом модуле МногофункциональныеДокументыБЗК,
В предыдущей сборке 3.1.14.500 весь этот код вообще в другом виде и модуле
(8) Добрый! В модуле "МногофункциональныеДокументыБЗК" поменял код функции "ЕстьПравоНаРаздел" :
Функция ЕстьПравоНаРаздел(ВидПрава, РазделДанных, ЗначенияДоступа = Неопределено) Экспорт
Если ПривилегированныйРежим() И ОбщегоНазначения.РежимОтладки() Тогда
ВызватьИсключение НСтр("ru = 'Проверка доступа на уровне записей производится в привилегированном режиме'");
КонецЕсли;
ВидыПрав = МногофункциональныеДокументыБЗККлиентСервер.ВидыПравНаРазделыДанных();
РазделыДанных = МногофункциональныеДокументыБЗККлиентСервер.РазделыДанных();
// Для рабочего времени не проверяем ограничения на уровне записей.
// достаточно наличия роли-флага
Если РазделДанных = РазделыДанных.РабочееВремя
И УправлениеДоступом.ЕстьРоль(Метаданные.Роли.УтверждениеДокументовУчетаВремени.Имя) Тогда
Возврат Истина;
КонецЕсли;
// Просмотр кадровых данных доступен всегда, считаем что если доступен документ (определяется отдельной ролью),
// то доступны и кадровые данные
// Мой комментарий ++
// После обновления до версии 3.1.18.46 стала выпадать ошибка проведения документа -
// недостаточно прав для работы с утвержденным документом. Поэтому заменили на ВидыПрав.Редактирование,
// т.к. в процедуре "ПроверитьПраваНаУтверждениеДокумента" берется вид права Редактирование.
//Если ВидПрава = ВидыПрав.Просмотр
// Мой комментарий --
Если ВидПрава = ВидыПрав.Редактирование
И РазделДанных = РазделыДанных.КадровыеДанные Тогда
Возврат Истина;
КонецЕсли;
Если ЗначенияДоступа = Неопределено Тогда
ЗначенияДоступа = НовыйЗначенияДоступа();
КонецЕсли;
ЕстьПравоПоОрганизации = ЕстьПраваНаДоступПоОрганизации(ВидПрава, РазделДанных, ЗначенияДоступа.Организации);
ЕстьПравоПоФизическимЛицам = ЕстьПраваНаДоступПоФизическимЛицам(
ВидПрава,
РазделДанных,
ЗначенияДоступа.ФизическиеЛица);
Возврат ЕстьПравоПоОрганизации И ЕстьПравоПоФизическимЛицам;
КонецФункции
Показать
После этого возвращается истина и всё отрабатывается как нужно.
У меня вылетает "Проверка доступа на уровне записей производится в привилегированном режиме", когда пытаюсь открыть в отпуске "данные расчета среднего заработка" ("карандашик"),НО ТОЛЬКО ЕСЛИ ПРЕДПРИЯТИЕ ОТКРЫТО ВРежимОтладки
Если открываю предприятие без этого режима, то "карандашик" в отпуске открывает форму.
Вот что ответили в 1С
1С Линия консультации <v8@1c.ru>
23 июня 2022, 9:52
"Добрый день,
По результатам расследования в отделе разработки:
Спасибо, понятно. Это техническая особенность, задача по устранению которой записана, но очередь до неё в обозримом будущем не дойдёт."
Ошибку не зарегистрировали даже.
"ТЕХНИЧЕСКАЯ ОСОБЕННОСТЬ" - теперь это так называется (((((
ЗУП 3.1.27.111 Отладка показала, что человеку нужно было добавить права на один из этих регистров согласно этому коду
Функция РегистрДляПроверкиДоступаПоОрганизации(ВидПрава, РазделДанных)
ВидыПрав = МногофункциональныеДокументыБЗККлиентСервер.ВидыПравНаРазделыДанных();
РазделыДанных = МногофункциональныеДокументыБЗККлиентСервер.РазделыДанных();
Если РазделДанных = РазделыДанных.КадровыеДанные
И ВидПрава = ВидыПрав.Редактирование Тогда
Возврат Метаданные.РегистрыСведений.КадровыеДанныеРедактированиеОрганизации
ИначеЕсли РазделДанных = РазделыДанных.НачисленнаяЗарплата
И ВидПрава = ВидыПрав.Редактирование Тогда
Возврат Метаданные.РегистрыСведений.НачисленнаяЗарплатаРедактированиеОрганизации;
ИначеЕсли РазделДанных = РазделыДанных.НачисленнаяЗарплата
И ВидПрава = ВидыПрав.Просмотр Тогда
Возврат Метаданные.РегистрыСведений.НачисленнаяЗарплатаПросмотрОрганизации;
ИначеЕсли РазделДанных = РазделыДанных.ПлановыеНачисления
И ВидПрава = ВидыПрав.Редактирование Тогда
Возврат Метаданные.РегистрыСведений.ПлановыеНачисленияРедактированиеОрганизации;
ИначеЕсли РазделДанных = РазделыДанных.ПлановыеНачисления
И ВидПрава = ВидыПрав.Просмотр Тогда
Возврат Метаданные.РегистрыСведений.ПлановыеНачисленияПросмотрОрганизации;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Показать
В моем случае это был "РегистрыСведений.НачисленнаяЗарплатаРедактированиеОрганизации" т.к. не хотел распроводиться документ "Отпуск".
Посмотрел в правах на этот регистр и увидел на него такие права "Редактирвоание начисленной зарплаты в документах".
Добавил эту роль для пользователя и все пошло!
Надеюсь кому поможет, без правки кода.