Как отредактировать документ если этого нельзя делать

2011-06-03_213924Часто в учетных программах требуется разграничение прав пользователей и при этом обычно есть пользователи, которым, например, разрешено вводить новые документы, но запрещено редактировать уже введенные. К примеру, продавцы в отделе продаж оформляют расходные накладные на клиентов в течении рабочего дня, но не могут изменить накладную, которая введена вчера. Такие ограничения в 1С:Предприятии версии 7.7 накладываются программно, т.е. в модулях формы и документа добавляются команды проверки условий и разрешается или нет запись, проведение и т.д. Связано это прежде всего с тем, что на уровне конфигурации, в наборе прав пользователя возможен запрет на доступ к проведенным документам но нельзя наложить такой запрет по условию – только если в документе указан контрагент с каким-то признаком или если документ введен какое-то число дней назад. И так обстоит со всеми остальными ограничениями. Поэтому, когда требуется определить гибкие условия доступа пользователей к объектам программы, приходится всё делать программными обработками при наступлении нужных событий – записи, открытия или проведения документа, элемента справочника, журнала.

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

Прежде всего нужен будет единый указатель на дату, которая будет считаться сегодняшним днем – для этого подойдет константа с типом “Дата” и именем, например, “РабочаяДата”. Также необходимо предусмотреть сдвиг этой даты при наступлении нового рабочего дня: обычно достаточно при проведении документа сравнить дату документа с константой, если константа меньше, присвоить ей значение даты документа.

Затем в модулях форм всех документов, на которые нужно наложить ограничение, необходимо добавить проверку даты при открытии формы и при записи, удобнее это сделать через глобальную процедуру, а еще возможно, что в модуле уже присутствует вызов какой-то проверочной процедуры, тогда можно просто ее модифицировать. Я обычно делаю глобальную процедуру глДокументыФормыПриОткрытии() и вставляю ее во все документы без исключения, а уже в этой процедуре определяю условия для конкретного документа если нужно. Также и с процедурой глДокументыФормыПриЗаписи(). В этих процедурах прописывается проверка дат, возможно каких-то признаков документа или среды пользователя, если по результатам проверки нужно отменить действие, достаточно вызвать СтатусВозврата(0). В процедуре ПриОткрытии можно применить метод ТолькоПросмотр(1) и открыть документ в режиме просмотра без редактирования.

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

2011-06-03_213604

На приведенном рисунке показан журнал расходных накладных в который добавлена кнопка “Редактировать доставку”, по нажатию на кнопку открывается форма, содержащая несколько реквизитов, которые можно отредактировать и сохранить в документе.

Описанный способ имитирует разграничение прав наподобие того, как это реализовано в восьмой версии, там в доступах есть группа прав с термином “Интерактивный”. Например есть “Изменение” документа и “Интерактивное изменение”, как раз то, что описано выше – у пользователя оставлен доступ на редактирование документа, но при открытии формы мы выдаем ему отказ, т.е. запрещаем интерактивное изменение, как если бы в восьмой версии убрали птицу с параметра “Интерактивное изменение”.