Как изменить отдельные реквизиты документа в закрытом периоде, если форма открыта только для просмотра

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В чем заключается проблема установки свойства «ТолькоПросмотр» для формы

Рассмотрим распространенную ситуацию при разработке в 1С: в документ добавляется новый функционал (например, отметка о наличии оригиналов документов, статусы подписания или данные о претензиях), который пользователи должны заполнять даже в закрытых периодах. Однако если в системе сработала дата запрета изменения данных, форма документа открывается платформой со свойством ЭтаФорма.ТолькоПросмотр = Истина.

Важно учитывать ключевую особенность платформы: если свойство ТолькоПросмотр установлено для всей формы глобально, 1С автоматически блокирует редактирование всех элементов управления и скрывает стандартные кнопки записи. Включение свойства Доступность = Истина или сброс ТолькоПросмотр = Ложь для конкретных полей на форме в этом случае не даст результата, пока вся форма заблокирована.

Решение 1: Программное управление доступностью элементов формы

Проанализируем основной способ разблокировки нужных полей непосредственно на форме документа. Чтобы разрешить редактирование конкретных реквизитов при установленной дате запрета изменения, необходимо изменить подход к блокировке формы:

  1. Оставляем свойство всей формы ЭтаФорма.ТолькоПросмотр = Ложь.
  2. В обработчике ПриСозданииНаСервере обходим коллекцию элементов формы и программно устанавливаем свойство ТолькоПросмотр = Истина для всех полей, кроме разрешенных.
  3. При сохранении изменений записываем документ без выполнения проверок бизнес-логики и перепроведения движения.

Посмотрим на пример кода для серверного модуля формы:


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

КонецПроцедуры

Для записи документа в закрытом периоде пользователем с ограниченными правами запись необходимо выполнять на сервере в привилегированном режиме методом УстановитьПривилегированныйРежим(Истина).

Чтобы обновление реквизитов не вызывало повторные проверки даты запрета в объекте, перед вызовом метода Записать() устанавливают флаг загрузки данных:


&НаСервере
Процедура ЗаписатьСлужебныеДанныеНаСервере()
    
    УстановитьПривилегированныйРежим(Истина);
    
    ОбъектДокумента = РеквизитФормыВЗначение("Объект");
    ОбъектДокумента.ОбменДанными.Загрузка = Истина;
    ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);
    
    ЗначениеВРеквизитФормы(ОбъектДокумента, "Объект");

КонецПроцедуры

Решение 2: Использование отдельной обработки для редактирования служебных данных

Выясним причину, почему прямой ввод данных в документ закрытого периода может быть нежелателен. Запись объекта документа даже без проведения влечет за собой риски изменения версии объекта, срабатывания подписок на события и случайного сброса согласованных данных. В качестве альтернативы можно предоставить пользователям специальную обработку или вспомогательное окно ввода.

Разберем по шагам, как работает этот вариант:

  1. Пользователь открывает документ в режиме чтения.
  2. По специальной кнопке на форме открывается вспомогательная форма обработки.
  3. Пользователь вносит изменения в обработке (например, отмечает флаг получения оригинала).
  4. Обработка сохраняет данные в документе под привилегированным режимом без перевода формы самого документа в режим редактирования.

Решение 3: Хранение служебных сведений в независимом регистре сведений (Рекомендуемый подход)

Рассмотрим наиболее надежный и правильный с точки зрения архитектуры подход. Если к документу требуется привязать дополнительные данные (статусы оригиналов, отметки о претензиях, служебные табличные части), их рекомендуется хранить не в самом документе, а в независимом регистре сведений.

Преимущества такого решения:

  1. Сам документ остается полностью заблокированным в закрытом периоде и не перезаписывается.
  2. Данные регистра сведений привязаны к документу через измерение со ссылкой на объект.
  3. Пользователь редактирует данные регистра напрямую из формы документа или связанной формы.
  4. В типовых конфигурациях на базе Библиотеки Стандартных Подсистем (БСП) для подобных задач применяется штатный механизм Дополнительных сведений.

Таким образом, для задачи изменения служебных полей в закрытом периоде наиболее безопасным решением является вынос данных в независимый регистр сведений или использование подсистемы дополнительных сведений БСП, а при невозможности изменения структуры данных — программное управление свойством ТолькоПросмотр для отдельных элементов формы.

← На главную