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