|
Разрешение ручной корректировки проводок для роли в 1с:Бухгалтерия предприятия 8 | ☑ | ||
---|---|---|---|---|
0
Scorp1985
28.11.13
✎
07:29
|
Добрый день!
Появилась необходимость создать роли с ограниченными правами в 1с:Бухгалтерия предприятия 8.2 Добавил роль, назначил пользователю. Сначала у пользователя пропала галка "Ручная корректировка" вообще. Поправил в конфигурации, там в коде было железно прописано скрывать галку для всех ролей, кроме "ПолныеПрава" и "ПравоГлавногоБухгалтера". Сделал так: ИначеЕсли РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава") Тогда РучнаяКорректировка = ДокументОбъект.РучнаяКорректировка; Если ДокументОбъект.Проведен ИЛИ РучнаяКорректировка ИЛИ ДокументОбъект.метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Запретить Тогда ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Нет; Иначе ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Верх; КонецЕсли; //added_by_Shtreys// ИначеЕсли РольДоступна("ПравоНаРучнуюКорректировкуПроводок") Тогда РучнаяКорректировка = ДокументОбъект.РучнаяКорректировка; Если ДокументОбъект.Проведен ИЛИ РучнаяКорректировка ИЛИ ДокументОбъект.метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Запретить Тогда ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Нет; Иначе ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Верх; КонецЕсли; //end_of added_by_Shtreys// Теперь флаг можно установить, поменять проводки, но после нажатия "ок" и повторного открытия проводок они опять становятся автоматическими. Как подпилить?) |
|||
1
anaed
28.11.13
✎
07:35
|
(0) дать уже пользователю право гб, спорим в коде еще не раз проверяется РольДоступна("ПравоГлавногоБухгалтера")?
|
|||
2
Scorp1985
28.11.13
✎
09:23
|
(1) Цель - чётко разграничить права пользователей. Единственный вариант - искать в коде РольДоступна("ПравоГлавногоБухгалтера") и везде где надо править код?
|
|||
3
Scorp1985
28.11.13
✎
09:30
|
Нашёл все вхождения строки
РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава") Не так уж много вхождений, кто-нибудь может объяснить где действительно требуется дописать ещё роль, а где не нужно для ручной корректировки? a) Если Не (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда ЭлементыФормы.ДействияФормы.Кнопки.Настройка.Доступность = Ложь; КонецЕсли; b) Если Метаданные.Роли.Найти("ПравоГлавногоБухгалтера") <> Неопределено Тогда АдминистраторУчетнойЗаписи = РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава"); Иначе АдминистраторУчетнойЗаписи = РольДоступна("ПолныеПрава"); КонецЕсли; c) Если НЕ ОбщегоНазначения.ЕстьРеквизитДокумента("РучнаяКорректировка", ДокументОбъект.Метаданные()) Тогда ИначеЕсли РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда //Заполним недостающие поля записей регистров Для каждого СтрокаТаблицы Из Регистры Цикл Если СтрокаТаблицы.Отображение И СтрокаТаблицы.Прочитан Тогда ТабличнаяЧасть = ЭлементыФормы[СтрокаТаблицы.Имя].Значение; Иначе Продолжить; КонецЕсли; Для каждого Запись Из ТабличнаяЧасть Цикл Если СтрокаТаблицы.ТипРегистра = "РегистрСведений" Тогда Если НЕ Метаданные.РегистрыСведений[СтрокаТаблицы.Имя].ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда Если Запись.Период = Дата('00010101') Тогда Запись.Период = ДокументОбъект.Дата; КонецЕсли; КонецЕсли; Иначе Если Запись.Период = Дата('00010101') Тогда Запись.Период = ДокументОбъект.Дата; КонецЕсли; КонецЕсли; Запись.Активность = ДокументОбъект.Проведен или (ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация")); Если НЕ ЗначениеЗаполнено(Запись.Регистратор) Тогда Запись.Регистратор = ДокументОбъект.Ссылка; КонецЕсли; //Обработаем регистры, формы которых предопределены в обработке Если (СтрокаТаблицы.Имя = "Хозрасчетный") Тогда Если НЕ ЗначениеЗаполнено(Запись.Организация) Тогда Запись.Организация = ДокументОбъект.Организация; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; //Установим признак ручной корректировки в документе Для каждого СтрокаТаблицыРегистров из Регистры Цикл Если СтрокаТаблицыРегистров.Прочитан Тогда ИмяРегистра = СтрокаТаблицыРегистров.Имя; Если ЭлементыФормы.Найти(ИмяРегистра)<>неопределено Тогда ДокументОбъект.Движения[ИмяРегистра].Загрузить(ЭлементыФормы[ИмяРегистра].Значение.Выгрузить()); КонецЕсли; КонецЕсли; КонецЦикла; ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка; Попытка ДокументОбъект.Записать(); Исключение Сообщить("При попытке записи документа возникла ошибка:" + ОписаниеОшибки(), СтатусСообщения.Важное); Возврат; КонецПопытки; ИначеЕсли ДокументОбъект.РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда //Восстановим автоматические движения документа Если Вопрос("Ручная корректировка движений документа отменена. |Восстановить движения сформированные автоматически?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка; Попытка ОбщегоНазначения.ИзменитьАктивностьПоРегистратору(ДокументОбъект,ложь); Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда ФормаДокумента = ДокументОбъект.ПолучитьФорму("ФормаДокумента"); ФормаДокумента.ВыполнитьОперацию(); Иначе ДокументОбъект.Записать(?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.ОтменаПроведения)); КонецЕсли; Исключение Сообщить("При попытке проведения документа возникла ошибка. Проведение документа отменено.", СтатусСообщения.Важное); ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения); КонецПопытки; КонецЕсли; Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда // Для обновления статуса операции в обработке Закрытия месяца ОбщегоНазначения.ВыполнитьОповещение("РегОперация", ДокументОбъект.Состояние, ДокументОбъект.ВидОперации); КонецЕсли; d) Если НЕ ОбщегоНазначения.ЕстьРеквизитДокумента("РучнаяКорректировка", ДокументОбъект.Метаданные()) Тогда ИначеЕсли РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда //Заполним недостающие поля записей регистров Для каждого СтрокаТаблицы Из Регистры Цикл Если СтрокаТаблицы.Отображение И СтрокаТаблицы.Прочитан Тогда ТабличнаяЧасть = ЭлементыФормы[СтрокаТаблицы.Имя].Значение; Иначе Продолжить; КонецЕсли; Для каждого Запись Из ТабличнаяЧасть Цикл Если СтрокаТаблицы.ТипРегистра = "РегистрСведений" Тогда Если НЕ Метаданные.РегистрыСведений[СтрокаТаблицы.Имя].ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда Если Запись.Период = Дата('00010101') Тогда Запись.Период = ДокументОбъект.Дата; КонецЕсли; КонецЕсли; Иначе Если Запись.Период = Дата('00010101') Тогда Запись.Период = ДокументОбъект.Дата; КонецЕсли; КонецЕсли; Запись.Активность = ДокументОбъект.Проведен или (ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация")); Если НЕ ЗначениеЗаполнено(Запись.Регистратор) Тогда Запись.Регистратор = ДокументОбъект.Ссылка; КонецЕсли; //Обработаем регистры, формы которых предопределены в обработке Если (СтрокаТаблицы.Имя = "Хозрасчетный") Тогда Если НЕ ЗначениеЗаполнено(Запись.Организация) Тогда Запись.Организация = ДокументОбъект.Организация; КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; //Установим признак ручной корректировки в документе Для каждого СтрокаТаблицыРегистров из Регистры Цикл Если СтрокаТаблицыРегистров.Прочитан Тогда ИмяРегистра = СтрокаТаблицыРегистров.Имя; Если ЭлементыФормы.Найти(ИмяРегистра)<>неопределено Тогда ДокументОбъект.Движения[ИмяРегистра].Загрузить(ЭлементыФормы[ИмяРегистра].Значение.Выгрузить()); КонецЕсли; КонецЕсли; КонецЦикла; ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка; Попытка ДокументОбъект.Записать(); Исключение Сообщить("При попытке записи документа возникла ошибка:" + ОписаниеОшибки(), СтатусСообщения.Важное); Возврат; КонецПопытки; ИначеЕсли ДокументОбъект.РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда //Восстановим автоматические движения документа Если Вопрос("Ручная корректировка движений документа отменена. |Восстановить движения сформированные автоматически?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка; Попытка ОбщегоНазначения.ИзменитьАктивностьПоРегистратору(ДокументОбъект,ложь); Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда ФормаДокумента = ДокументОбъект.ПолучитьФорму("ФормаДокумента"); ФормаДокумента.ВыполнитьОперацию(); Иначе ДокументОбъект.Записать(?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.ОтменаПроведения)); КонецЕсли; Исключение Сообщить("При попытке проведения документа возникла ошибка. Проведение документа отменено.", СтатусСообщения.Важное); ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения); КонецПопытки; КонецЕсли; Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда // Для обновления статуса операции в обработке Закрытия месяца ОбщегоНазначения.ВыполнитьОповещение("РегОперация", ДокументОбъект.Состояние, ДокументОбъект.ВидОперации); КонецЕсли; Прошу прощения за обилие кода, но хотелось бы чётко понять, что влияет на возможность ручной корректировки и не дописать лишнего. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |