При внедрении и сопровождении 1С:ERP Управление предприятием и 1С:Управление торговлей часто возникает задача: ограничить менеджерам возможность вносить изменения в документы Заказ клиента и Заказ поставщика после того, как они были согласованы, отгружены или переведены в статус Закрыт. Разберем особенности типовой логики системы, штатные механизмы контроля и надежные программные способы реализации запрета через расширение конфигурации.
Проанализируем архитектурную концепцию типовых решений 1С. Заказ в системе — это в первую очередь инструмент оперативного планирования отгрузок, обеспечения потребностей и резервирования товаров. Разработчики конфигурации закладывают возможность корректировки строк даже после частичной или полной отгрузки, например:
Штатная система прав доступа (роли) назначается на документ целиком и не разделяет права на запись в зависимости от значений реквизитов Статус или Состояние. Кроме того, механизм Даты запрета изменения данных привязывается к дате документа и не защищает закрытый заказ, если сделка была оформлена текущим днем.
Рассмотрим стандартные механизмы 1С:ERP, позволяющие защитить данные или выявить несанкционированные правки без доработки программного кода.
1. Механизм проверки документов с запретом редактирования
В разделе НСИ и администрирование – Финансовый результат и контроллинг включим функциональную опцию Проверка документов в режиме С запретом редактирования. После закрытия сделки или согласования документа контролер или ответственный сотрудник устанавливает статус Проверен. С этого момента заказ блокируется для редактирования, проведения и отмены проведения для всех пользователей, не имеющих роли Право изменения статусов проверки документов.
2. Ограничение прав на отклонение от условий продаж и закупок
Если отключить у пользователей роль Отклонение от условий продаж (или Отклонение от условий закупок), система запретит проводить заказ при изменении цен, скидок, условий и графиков оплаты, если они расходятся с типовым или индивидуальным соглашением. В таком случае менеджер не сможет изменить критические коммерческие условия без повторного прохождения процесса согласования.
3. Версионирование объектов для аудита изменений
В разделе НСИ и администрирование – Общие настройки – История изменений настроим версионирование для документов Заказ клиента и Заказ поставщика в режиме При проведении или При записи. Механизм позволит точно видеть, кто именно, в какое время и какие реквизиты или строки табличной части скорректировал в документе.
Если требуется жестко заблокировать изменение документов со статусом Закрыт или Согласован, создадим расширение без снятия основной конфигурации с поддержки. Разберем двухуровневую схему защиты: проверку при записи на сервере и блокировку пользовательского интерфейса формы.
Шаг 1. Серверный контроль в модуле объекта (основная защита)
Перехватим событие ПередЗаписью модуля документа. Это гарантирует блокировку изменений не только через экранную форму, но и при групповой обработке или обмене данными. Добавим в расширение роль-исключение РазрешитьРедактированиеЗакрытыхЗаказов для администраторов или руководителей.
Посмотрим на пример обработчика в расширении для документа ЗаказКлиента:
&Вместо("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Выполняем типовую логику конфигурации
ПродолжитьВызов(Отказ, РежимЗаписи, РежимПроведения);
Если Отказ Или ЭтоНовый() Тогда
Возврат;
КонецЕсли;
// Проверяем наличие специальной роли у текущего пользователя
Если РольДоступна("РазрешитьРедактированиеЗакрытыхЗаказов") Или РольДоступна("ПолныеПрава") Тогда
Возврат;
КонецЕсли;
// Считываем исходное состояние документа из базы данных
СтатусВБазе = Ссылка.Статус;
// Проверяем статус в базе данных до применения текущих изменений
Если СтатусВБазе = Перечисления.СтатусыЗаказовКлиентов.Закрыт
Или (СтатусВБазе = Перечисления.СтатусыЗаказовКлиентов.КВыполнению И ЗначениеЗаполнено(Ссылка.ДатаСогласования)) Тогда
Отказ = Истина;
ВызватьИсключение "Редактирование закрытого или согласованного заказа запрещено политикой безопасности компании.";
КонецЕсли;
КонецПроцедуры
Шаг 2. Блокировка элементов формы (пользовательский интерфейс)
Для удобства работы менеджеров заблокируем редактирование полей непосредственно при открытии документа, чтобы пользователь сразу видел статус формы ТолькоПросмотр.
Разберем процедуру расширения формы документа:
&После("ПриЧтенииНаСервере")
Процедура Расш1_ПриЧтенииНаСервере(ТекущийОбъект)
Если РольДоступна("РазрешитьРедактированиеЗакрытыхЗаказов") Или РольДоступна("ПолныеПрава") Тогда
Возврат;
КонецЕсли;
Если ТекущийОбъект.Статус = Перечисления.СтатусыЗаказовКлиентов.Закрыт Тогда
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Таким образом, сочетание серверного контроля ПередЗаписью и интерфейсного свойства ТолькоПросмотр обеспечивает надежную защиту закрытых документов от любых несанкционированных изменений со стороны менеджеров.