Как отредактировать дополнительный реквизит на форме документа в закрытом периоде?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Почему возникает блокировка и почему не помогает простая разблокировка?

В типовых конфигурациях, таких как Управление торговлей 11 или Бухгалтерия 3.0, проверка даты запрета выполняется не только на уровне данных, но и на уровне метаданных формы. В процедуре ПриЧтенииНаСервере вызывается механизм БСП, который устанавливает свойство ЭтаФорма.ТолькоПросмотр = Истина. Это «тяжелое» ограничение, которое распространяется на все элементы управления, связанные с данными документа. Установка Доступность = Истина для конкретного поля не работает, так как блокировка всей формы имеет приоритет в иерархии элементов.

Вариант 1: Использование Расширений конфигурации (рекомендуемый способ)

Чтобы разрешить редактирование конкретного реквизита, не ломая общую логику закрытого периода, необходимо аккуратно вмешаться в процесс установки режима «только просмотр». Рассмотрим шаги по реализации через расширение:

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

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

Важно помнить, что если вы используете команду для сохранения данных, у кнопки должен быть снят признак ИзменяетСохраняемыеДанные, чтобы система не считала, что нажатие кнопки пытается изменить сам объект ДокументОбъект, что вызвало бы ошибку записи в закрытом периоде.

Вариант 2: Вынос функционала в отдельную форму регистра сведений

Если задача заключается исключительно в хранении отметки (например, «Оригинал получен»), самым архитектурно верным подходом является работа не через форму документа, а через форму регистра сведений. В этом случае вы полностью обходите блокировки документа:

Вариант 3: Использование дополнительных реквизитов и сведений (ДРс)

Если конфигурация поддерживает механизм Дополнительные реквизиты и сведения (типовой функционал БСП), используйте его. Добавьте свой реквизит через подсистему «Дополнительные реквизиты». Преимущества данного метода:

  1. Система сама добавит реквизит на форму в типовые области.
  2. Для таких реквизитов в настройках даты запрета можно задать исключения, позволяющие редактировать их даже после закрытия периода.
  3. Нет необходимости писать код и создавать расширения.

Важные замечания при реализации

При программном внесении изменений в закрытом периоде всегда помните о методах записи:

Если вы записываете значение в регистр, используйте метод Записать() набора записей, а не метод Записать() самого документа. Вызов ДокументОбъект.Записать() инициирует выполнение всех процедур перед записью, включая проверку дат запрета и перепроведение, что приведет к ошибке. Если же вам необходимо обновить данные именно в документе, используйте Объект.Записать(РежимЗаписиДокумента.Запись), предварительно убедившись, что в настройках формы снят флаг ПриЗаписиПерепроводить.

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

← На главную