Как всем известно, во многих конфигурациях есть документы, позволяющие произвольным образом редактировать регистры. Например, в УПП - это "Корректировка записей регистров" и "ОперацияБух", в торговле тоже есть - но кажется, по другому называются.
Это мощный и нужный инструмент, и во многих ситуациях без него не обойтись. Однако же, доступ к ним почему-то даден всем, у кого есть роль "Пользователь" - тоесть всем!
И часто бывает, его применяют не по назначению, а по ситуации - и тогда перестают сходиться партии с оборотно-сальдовой, а у программиста добавляется головной боли.
Изложенное здесь решение - полумера для тех случаев, когда и документ применять надо, и совсем бесконтрольно оставить бухгалтерию нельзя.
Суть идеи такова: добавить к документу подписку на событие "Проведение" и в ней анализировать, кому можно ломать базу руками, а кому нельзя. Тогда бухгалтер создает документ, заполняет его и идет кланяться либо главбуху, либо программисту, либо другому ответственному человеку, который этот документ и проведет.
Однако - и это послужило причиной создания публикации - ситуация немного усложняется тем, что документ "Корректировка записей регистров" и "Операция" не проводятся в принципе! Они пишут регистры программно, не используя механизм проведения.
Это поведение можно перехитрить таким образом:
- при записи документа выключать (устанавливать в "Ложь" активность записей - тогда они будут присутствовать, но в отчетах не отразятся;
- одновременно устанавливать документу признак "Пометка удаления" в "Истина" - чтобы бухгалтерия видела, что документ у неё не проведен.
Если все-же необходимость остается, то схема действий следующая:
- Создаем подписку на событие "ПередЗаписью" и включаем туда нужные документы.
- в код процедуры-обработчика пишем следующее:
Процедура ЗапретПроведенияДокументовРучныхКорректировокПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ЭтоНовыйДокумент = Источник.ЭтоНовый();
Если ЭтоНовыйДокумент Тогда
РанееУстановленнаяПометкаУдаления = Ложь;
Иначе
Запрос = Новый Запрос();
Запрос.Текст ="
|ВЫБРАТЬ
| 0
|ИЗ
| Документ." +Источник.метаданные().Имя+" КАК Операция
|
|ГДЕ
| (Операция.Ссылка = &СсылкаНаОперацию) И
| (Операция.ПометкаУдаления = Ложь)";
Запрос.УстановитьПараметр("СсылкаНаОперацию", Источник.Ссылка);
Результат = Запрос.Выполнить();
РанееУстановленнаяПометкаУдаления = Результат.Пустой();
КонецЕсли;
Если не РольДоступна(Метаданные.ОсновнаяРоль) Тогда
Если НЕ ЭтоНовыйДокумент Тогда
Если не РанееУстановленнаяПометкаУдаления Тогда
Отказ=Истина;
#Если Клиент Тогда
Сообщить("Документы типа """+Источник.метаданные().Синоним+""" Вам разрешено редактировать только помеченные на удаление!",СтатусСообщения.Важное);
#КонецЕсли
КонецЕсли;
КонецЕсли;
Источник.ПометкаУдаления=Истина;
Для каждого Движение Из Источник.движения Цикл
Движение.УстановитьАктивность(Ложь);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Таким образом, "провести" документ сможет только пользователь, которому доступна основная роль (указанная в свойствах конфигурации). Также, только при наличии этой роли можно будет снять либо установить пометку удаления, в прочих случаях - она всегда будет установлена, а движения документа - неактивны.