База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как обеспечить сохранение документа через обработку при запрете на редактировани › Ответ в теме: Как обеспечить сохранение документа через обработку при запрете на редактировани
Привет! Задача — запретить редактирование документа для всех пользователей, кроме обработки, которая должна иметь возможность изменять и сохранять документ.
Реализуется это так:
1. Запрет редактирования документа в обычном режиме для пользователей
В модуле формы документа в процедуре ПриОткрытии или ПередОткрытием ставим
|
1 |
ЭтаФорма.ТолькоПросмотр = Истина; |
Это запретит редактирование документа в интерфейсе.
2. Создаем внешнюю обработку, которая будет менять документ программно
В обработке открываем документ через объект метаданных, меняем нужные реквизиты и сохраняем.
3. Обход ограничения «ТолькоПросмотр» в коде обработки
В обработке доступ к объекту документа идет напрямую через объект метаданных, а не через форму, поэтому ограничение формы не мешает.
4. Если в конфигурации есть права доступа, дополнительно можно настроить роль, которая запрещает редактирование документа, а обработка работает под другим пользователем с расширенными правами (например, через подключение к базе с другим пользователем).
—
### Пример кода обработки для изменения и сохранения документа
|
1 2 3 4 5 6 7 |
Процедура ИзменитьДокумент(СсылкаНаДокумент) ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект(); // Вносим изменения ДокументОбъект.Реквизит1 = "Новое значение"; // Сохраняем ДокументОбъект.Записать(); КонецПроцедуры |
—
### Важные моменты
— Если в конфигурации настроены права доступа, то обработка должна запускаться под пользователем, у которого есть права на запись документа.
— Если нужно, чтобы обычные пользователи не могли редактировать документ, а только через обработку — ставьте ТолькоПросмотр = Истина в форме документа.
— Для дополнительной защиты можно в модуле документа реализовать проверку, что изменения возможны только если вызов идет из вашей обработки (например, через глобальную переменную или параметр).
—
### Альтернативный вариант — флаг разрешения изменений
В документе можно добавить булево поле, например, РазрешитьИзменениеЧерезОбработку. В модуле документа в процедуре ПередЗаписью проверять:
|
1 2 3 4 5 6 |
Если НЕ РазрешитьИзменениеЧерезОбработку Тогда // Запретить запись, если не из обработки Если НЕ ТекущийПользователь = "ИмяОбработки" Тогда Ошибка("Изменение документа запрещено!"); КонецЕсли; КонецЕсли; |
А в обработке перед изменением ставить этот флаг в Истина, после сохранения — обратно в Ложь.
—
Рекомендую посмотреть примеры по ограничению редактирования и работе с объектами документов здесь:
https://infostart.ru/public/1548963/
https://helpf.pro/faq/view/1543.html
Если нужна помощь с конкретным кодом — могу помочь написать.