В данном материале рассматривается механизм типовых конфигураций для обеспечения ограничения изменения данных в информационной базе ранее определенной даты.
Общее описание механизма.
Рассматриваемый механизм позволяет определить пользователям дату запрета редактирования данных. Если информация внесена в информационную базу раньше указанной даты, то эту информациюю нельзя будет отредактировать. Изменение даты доступно пользователям с определенными правами. Дата запрета редактирования данных может устанавливаться отдельно для управленческой и регламентированной информации. Кроме этого, дата запрета для регламентированной информации устанавливается отдельно для каждой организации. В случае, если дата не задана для организации, будет использоваться дата, установленная для управленческой информации. Каждая из дат (управленческая и регламентированная) устанавливается для каждой из определенных в конфигурации ролей пользователей (за исключением роли ПолныеПрава). Если пользователю доступно несколько ролей, берется минимальная из дат определенных для всех ролей пользователя.
Описание принципов действия.
Механизм обеспечивает контроль периода изменяемой информации для: - документов, как существующих проведенных, так и проводимых новых - наборов записей регистров накопления, регистров бухгалтерии
- наборов записей периодических регистров сведений
- наборов записей регистров расчета.
Непосредственно сам контроль для перечисленных объектов выполняется:
- для наборов записей регистров накопления
- для регистров бухгалтерии специальной процедурой, вызываемой из модуля набора в обработчике события ПередЗаписью
- для документов, наборов записей периодических регистров сведений а также регистров расчета – средствами механизма ограничения прав доступа на уровне записей (RLS)
Установка и хранение даты запрета изменений.
Установка даты запрета выполняется в специальной форме, отображающей структуру данных в виде дерева.
Даты запрета редактирования данных в информационной базе данных хранятся в специализированном непериодическом регистре сведений ГраницыЗапретаИзмененияДанных.
Измерения:
- Роль, тип :ПеречислениеСсылка.НаборПравПользователей
- Организация, тип: СправочникСсылка.Организация
Ресурсы:
- ГраницаЗапретаИзменений, тип: Дата, состав «Дата».
Для даты запрета изменения управленческих данных в качестве организации устанавливается пустая ссылка.
При запуске конфигурации данные из этого регистра для текущего пользователя переносятся в специально предназначенный для этого параметр сеанса ГраницыЗапретаИзмененияДанных, имеющий тип ХранилищеЗначений.
Это позволяет избежать многократного обращения к регистру сведений при проведении документа по нескольким регистрам одновременно.
Использование параметра сеанса вместо экспортной переменной модуля приложения обусловлено ее недоступностью в клиент-серверном режиме работы.
Перенос дат запрета изменения данных в параметр сеанса специальной процедурой УстановитьПараметрГраницыЗапретаИзмененияДанных(), вызываемой в обработчике события ПриНачалеРаботыСистемы() модуля приложения и модуля внешнего соединения.
Процедура УстановитьПараметрГраницыЗапретаИзмененияДанных() Экспорт Если РольДоступна("ПолныеПрава") Тогда ПараметрыСеанса.ГраницыЗапретаИзмененияДанных = Новый ХранилищеЗначения(Неопределено, Новый СжатиеДанных(0)); Возврат; // для роли полные права механизм не задействуется КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВЫБОР КОГДА (Границы.Организация) ЕСТЬ NULL ТОГДА &ПустаяОрганизация ИНАЧЕ Границы.Организация КОНЕЦ КАК Организация, | МИНИМУМ(ВЫБОР КОГДА (Границы.ГраницаЗапретаИзменений) ЕСТЬ NULL ТОГДА ДАТАВРЕМЯ(1, 1, 1) | ИНАЧЕ Границы.ГраницаЗапретаИзменений КОНЕЦ) КАК ГраницаЗапретаИзменений |ИЗ | Перечисление.НаборПравПользователей КАК НаборыПрав | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК Границы | ПО Границы.Роль = НаборыПрав.Ссылка | |ГДЕ | (НаборыПрав.Ссылка В (&СписокДоступныхРолей)) | |СГРУППИРОВАТЬ ПО | ВЫБОР КОГДА (Границы.Организация) ЕСТЬ NULL ТОГДА &ПустаяОрганизация ИНАЧЕ Границы.Организация КОНЕЦ"; Запрос.УстановитьПараметр("СписокДоступныхРолей", ПолучитьСписокНабораПрав()); Запрос.УстановитьПараметр("ПустаяОрганизация", ПараметрыСеанса.ПустаяОрганизация); РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда ПараметрыСеанса.ГраницыЗапретаИзмененияДанных = Новый ХранилищеЗначения(Неопределено, Новый СжатиеДанных(0)); Иначе Соответствие = Новый Соответствие; Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ГраницаЗапретаИзменений<>Дата('00010101') Тогда Соответствие[Выборка.Организация] = Выборка.ГраницаЗапретаИзменений; КонецЕсли; КонецЦикла; ЕСли Соответствие.Количество() = 0 Тогда Соответствие = Неопределено; КонецЕсли; ПараметрыСеанса.ГраницыЗапретаИзмененияДанных = Новый ХранилищеЗначения(Соответствие, Новый СжатиеДанных(0)); КонецЕсли; КонецПроцедуры |
В данной процедуре выполняется чтение из регистра сведений дат запрета редактирования данных и их сохранение в виде соответствия в параметре сеанса. Ключом данного соответствия является организация, для которой эта дата задана, значением - сама дата. Если регистр сведений ГраницыЗапретаИзмененияДанных не содержит ни одной записи (механизм контроля не задействован) в хранилище значения параметра сеанса записывается значение Неопределено.
Поскольку параметр сеанса не позволяет сохранять значение типа Соответствие, само соответствие (как и значение Неопределено) непосредственно в параметр не записывается. Данные значения сохраняются в нем как ХранилищеЗначений с минимальной степенью сжатия.
Используемые параметры сеанса.
Кроме уже упомянутого параметра сеанса ГраницыЗапретаИзмененияДанных механизмом используются также другие параметры. Для каждой из ролей, определенных в перечислении НаборПравПользователей определяется параметр сеанса, который хранит соответствующее значение перечисления.Например, ОбластьДанныхКладовщика, ОбластьДанныхМенеджераПоПродажам. Также используется параметр ПустаяОрганизация, хранящий пустое значение типа СправочникСсылка.Организации. Заполнение этих параметров сеанса выполняется при запуске конфигурации, в привилегированном модуле. Значения параметров сеанса используются в запросах ограничения прав доступа на уровне записей, которые описаны ниже.
Механизм контроля изменения записей в регистрах накопления и регистрах бухгалтерии.
Проверка наборов записей данных регистров выполняется специальной процедурой, вызываемой в обработчике события ПередЗаписью в модуле набора записей регистра.
Процедура ПередЗаписью(Отказ, Замещение) ПроверкаПериодаЗаписей(ЭтотОбъект, Отказ); КонецПроцедуры Процедура ПроверкаПериодаЗаписей(НаборЗаписей, Отказ) Экспорт //получение соответствия с датами из параметра сеанса СоответствиеГраницЗапрета = ПараметрыСеанса.ГраницыЗапретаИзмененияДанных.Получить(); // Если в параметре значение Неопределено, механизм контроля не задействован - выходим из процедуры ЕСли СоответствиеГраницЗапрета = Неопределено Тогда Возврат; КонецЕсли; МетаданныеНабора = НаборЗаписей.Метаданные(); ИмяРегистра = МетаданныеНабора.ПолноеИмя(); //Поиск в регистре измерения "Организация", если такое существует при контроле будет использоваться регламентная дата ЕстьОрганизация = (МетаданныеНабора.Измерения.Найти("Организация")<>Неопределено); // Если набор не содержит записей возможно выполняется отмена проведения документа - необходимо выполнить // проверку записей сохраненнных до этого. Если НаборЗаписей.Количество() = 0 Тогда Запрос = Новый Запрос; ВложенныйЗапрос = ""; ЕСли ЕстьОрганизация Тогда индекс = 1; ИмяПоляОрганизации = "Организация"; Для Каждого КлючИЗначение ИЗ СоответствиеГраницЗапрета Цикл ВложенныйЗапрос = ВложенныйЗапрос + ?(ВложенныйЗапрос = "", "", " |ОБЪЕДИНИТЬ") +" |ВЫБРАТЬ &Организация"+индекс+" КАК Организация, &ДатаЗапрета" + Формат(индекс, "ЧГ=0") + " КАК ДатаЗапрета"; Запрос.УстановитьПараметр("Организация"+индекс, КлючИЗначение.Ключ); ГраницаПериода = КлючИЗначение.Значение; Запрос.УстановитьПараметр("ДатаЗапрета"+индекс, ?(ГраницаПериода=Неопределено, NULL, ГраницаПериода)); индекс = индекс + 1; КонецЦикла; Иначе ПустаяОрганизация = Справочники.Организации.ПустаяСсылка(); ИмяПоляОрганизации = "&ПустаяОрганизация"; ВложенныйЗапрос = "ВЫБРАТЬ &ПустаяОрганизация КАК Организация, &ДатаЗапрета КАК ДатаЗапрета"; Запрос.УстановитьПараметр("ПустаяОрганизация", ПустаяОрганизация); ГраницаПериода = СоответствиеГраницЗапрета[ПустаяОрганизация]; Запрос.УстановитьПараметр("ДатаЗапрета", ?(ГраницаПериода=Неопределено, NULL, ГраницаПериода)); КонецЕсли; Запрос.Текст = " |ВЫБРАТЬ НаборЗаписей.Организация, НаборЗаписей.Период, ДатыЗапрета.Организация, ДатыЗапрета.ДатаЗапрета |ИЗ |( |ВЫБРАТЬ " + ИмяПоляОрганизации + " КАК Организация, МИНИМУМ(Период) КАК Период ИЗ " + ИмяРегистра + " КАК Набор |ГДЕ Регистратор = &Регистратор |СГРУППИРОВАТЬ ПО " + ИмяПоляОрганизации + " |) КАК НаборЗаписей |ЛЕВОЕ СОЕДИНЕНИЕ |(" + ВложенныйЗапрос + " |) КАК ДатыЗапрета |ПО НаборЗаписей.Организация = ДатыЗапрета.Организация |ГДЕ НаборЗаписей.Период < ДатыЗапрета.ДатаЗапрета ИЛИ ДатыЗапрета.ДатаЗапрета ЕСТЬ NULL"; Запрос.УстановитьПараметр("Регистратор", НаборЗаписей.Отбор.Регистратор.Значение); // для повышения быстродействия сравение периода в записях набора с искомыми выполним в запросе // т.е. на сервере, если запрещенных нет - результат запроса будет пустым Если НЕ Запрос.Выполнить().Пустой() Тогда Отказ = Истина; Иначе Отказ = Ложь; КонецЕсли; Иначе // В наборе есть записи. Поскольку набор еще не записан возможен только перебор // если находим запрещенную запись - проверять остальные уже необязательно Отказ = Ложь; Если ЕстьОрганизация Тогда Для Каждого Запись ИЗ НаборЗаписей Цикл ГраницаПоОрганизации = СоответствиеГраницЗапрета[Запись.Организация]; ЕСли ГраницаПоОрганизации <> Неопределено И Запись.Период < ГраницаПоОрганизации Тогда Отказ = Истина; Возврат; КонецЕсли; КонецЦикла; Иначе // дату запрета получаем только один раз ГраницаПериода = СоответствиеГраницЗапрета[Справочники.Организации.ПустаяСсылка()]; Если ГраницаПериода <> Неопределено Тогда Для Каждого Запись ИЗ НаборЗаписей Цикл ЕСли Запись.Период < ГраницаПериода Тогда Отказ = Истина; Возврат; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры |
Механизм контроля изменения документов.
Условно документы можно разбить на три группы:
- документы принадлежащие только управленческому учету
- документы, принадлежащие только регламентированному учету
- документы, принадлежность которых к виду учета устанавливается пользователем.
Контроль возможности выполнения документа реализуется с помощью механизма ограничения доступа на уровне записей (RLS). Ограничение устанавливается на право чтения, изменения и удаления документа. Для каждой из перечисленных групп документов используется свое ограничение.
Для документов первой группы:
ABCКлассификацияПокупателей ИЗ Документ.ABCКлассификацияПокупателей КАК ABCКлассификацияПокупателей ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных ПО (ГраницыЗапретаИзмененияДанных.Организация = &ПустаяОрганизация) И (ГраницыЗапретаИзмененияДанных.Роль = &ОбластьДанныхЗаведующегоСкладом) ГДЕ ВЫБОР КОГДА Проведен ТОГДА (ABCКлассификацияПокупателей.Дата >= ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений ИЛИ (ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений) ЕСТЬ NULL ) ИНАЧЕ Истина КОНЕЦ |
Для документов второй группы текст запроса аналогичен первой, за исключением соединения с регистром сведений. Здесь оно выполняется уже по организации, указанной в документе. То есть вместо:
ПО (ГраницыЗапретаИзмененияДанных.Организация = &ПустаяОрганизация) |
Указывается
ПО (ГраницыЗапретаИзмененияДанных.Организация = ИмяДокумента.Организация) |
Наиболее сложное ограничение применяется для документов третьей группы
АвансовыйОтчет ГДЕ ( ВЫБОР // документ проводится по нескольким видам учета КОГДА АвансовыйОтчет.ОтражатьВБухгалтерскомУчете И АвансовыйОтчет.ОтражатьВУправленческомУчете И АвансовыйОтчет.Проведен ТОГДА НЕ(1 В (ВЫБРАТЬ РАЗЛИЧНЫЕ 1 ИЗ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных ГДЕ ГраницыЗапретаИзмененияДанных.Организация = АвансовыйОтчет.Организация И ГраницыЗапретаИзмененияДанных.Роль = &ОбластьДанныхЗаведующегоСкладом И АвансовыйОтчет.Дата < ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений )) И НЕ(1 В (ВЫБРАТЬ РАЗЛИЧНЫЕ 1 ИЗ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных ГДЕ ГраницыЗапретаИзмененияДанных.Организация = &ПустаяОрганизация И ГраницыЗапретаИзмененияДанных.Роль = &ОбластьДанныхЗаведующегоСкладом И АвансовыйОтчет.Дата < ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений )) // документ проводится только по бух. учету КОГДА АвансовыйОтчет.ОтражатьВБухгалтерскомУчете И АвансовыйОтчет.Проведен ТОГДА НЕ(1 В (ВЫБРАТЬ РАЗЛИЧНЫЕ 1 ИЗ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных ГДЕ ГраницыЗапретаИзмененияДанных.Организация = АвансовыйОтчет.Организация И ГраницыЗапретаИзмененияДанных.Роль = &ОбластьДанныхЗаведующегоСкладом И АвансовыйОтчет.Дата < ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений )) // документ проводится только по упр. учету КОГДА АвансовыйОтчет.ОтражатьВУправленческомУчете И АвансовыйОтчет.Проведен ТОГДА НЕ(1 В (ВЫБРАТЬ РАЗЛИЧНЫЕ 1 ИЗ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных ГДЕ ГраницыЗапретаИзмененияДанных.Организация = &ПустаяОрганизация И ГраницыЗапретаИзмененияДанных.Роль = &ОбластьДанныхЗаведующегоСкладом И АвансовыйОтчет.Дата < ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений )) ИНАЧЕ ИСТИНА КОНЕЦ) |
Здесь данные получаются в зависимости от состояния документа:
– когда документ проводится одновременно по всем видам учета, в этом случае дата документа одновременно сравнивается и с управленческой и с регламентированной датой запрета
- когда документ проводится по только одному из видов учета – тогда дата документа сравнивается только с одной из дат запрета редактирования.
Проверка выполняется путем выполнения подзапроса к регистру сведений - если его результат не содержит ни одной строки, то есть условие
1 В ВЫБРАТЬ 1 ИЗ РегистрСведений.ГраницыЗапретаИзмененияДанных ... |
не выполняется, значит документ не наршает ограничений на дату запрета.
Механизм контроля изменений регистров сведений.
Здесь также используется механизм ограничения доступа к данным на уровне записей таблиц базы данных. При этом ограничение устанавливается на право изменения.
УчетнаяПолитика ИЗ РегистрСведений.УчетнаяПолитика КАК УчетнаяПолитика ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных ПО (ГраницыЗапретаИзмененияДанных.Роль = &ОбластьДанныхАдминистратораККМ) И (ГраницыЗапретаИзмененияДанных.Организация = &ПустаяОрганизация) ГДЕ (УчетнаяПолитика.Период >= ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений ИЛИ (ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений) ЕСТЬ NULL ) |
Механизм контроля изменений регистров расчета.
Также используется механизм ограничения доступа на уровне записей. Ограничение устанавливается на право изменения.
ЕСНДополнительныеНачисления ИЗ РегистрРасчета.ЕСНДополнительныеНачисления КАК ЕСНДополнительныеНачисления ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ГраницыЗапретаИзмененияДанных ПО (ГраницыЗапретаИзмененияДанных.Организация = &ПустаяОрганизация) И (ГраницыЗапретаИзмененияДанных.Роль = &ОбластьДанныхРегламентированнаяРасчетнаяИнформация) ГДЕ (ЕСНДополнительныеНачисления.ПериодРегистрации >= ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений ИЛИ (ГраницыЗапретаИзмененияДанных.ГраницаЗапретаИзменений) ЕСТЬ NULL ) |
Дата: 2018-11-18, просмотров: 413.