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