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