Часто в практике автоматизации бизнес-процессов мы сталкиваемся с ситуацией, когда финансовый период уже закрыт, но менеджерам требуется выполнить действия, не влияющие на бухгалтерские итоги. Типичный пример: период закрывается 5-го числа, а оригиналы документов от поставщиков или подписанные сканы реализаций приходят позже. Пользователю нужно просто прикрепить скан-копию к документу (например, к документу РеализацияТоваровИУслуг), но система блокирует работу, ссылаясь на дату запрета редактирования.
Давайте подробно проанализируем эту ситуацию на примере конфигурации «Управление производственным предприятием 1.3» (УПП) и разберем по шагам, как решить эту задачу минимальными усилиями, не нарушая логику закрытого периода.
Чтобы понять, как обойти ограничение, нам нужно разобраться в архитектуре хранения присоединенных файлов. В конфигурации УПП (и во многих других классических конфигурациях) файлы не хранятся непосредственно внутри самого документа. Для них предусмотрен отдельный справочник — ХранилищеДополнительнойИнформации.
Проанализируем ситуацию на уровне базы данных: на сам справочник файлов дата запрета редактирования документа не распространяется напрямую. То есть, на уровне СУБД никакого запрета на запись нового элемента в этот справочник нет. Почему же тогда пользователь не может добавить файл?
Проблема кроется исключительно в пользовательском интерфейсе. Алгоритм работы типовой формы документа выглядит так:
ТолькоПросмотр = Истина.Также рассмотрим, почему не работает функция УстановитьПривилегированныйРежим(Истина), которую часто пытаются использовать разработчики. Привилегированный режим в 1С отключает только проверку прав доступа на уровне записей (RLS). Он не отключает алгоритмы проверки «Даты запрета редактирования», так как эта проверка прописана программно в обработчиках событий (например, в процедуре ПередЗаписью модуля объекта) и не является платформенным ограничением прав.
Поскольку мы выяснили, что запрета на запись файлов на уровне базы данных нет, мы можем обучить пользователя добавлять сканы вообще без доработок программы. Этот способ идеален, если конфигурация находится на жесткой поддержке и изменения вносить нельзя.
Рассмотрим по шагам действия пользователя:
ХранилищеДополнительнойИнформации.При таком подходе сам закрытый документ вообще не перезаписывается, дата запрета не срабатывает, а файл успешно прикрепляется к нужной реализации.
Если вариант с прямым доступом в справочник кажется пользователям слишком долгим и неудобным, мы можем немного скорректировать поведение формы закрытого документа. Наша цель — оставить весь документ защищенным от редактирования, но «разморозить» только одну кнопку вызова файлов.
Разберем, как это сделать. Нам необходимо вмешаться в модуль формы документа, в стандартную процедуру ПриОткрытии. В самом конце этой процедуры, когда система уже отработала свои типовые механизмы и перевела форму в режим «Только просмотр», мы добавим наш код.
Процедура ПриОткрытии()
// ... здесь располагается типовой код 1С ...
// Система устанавливает ЭтаФорма.ТолькоПросмотр = Истина
// Наша доработка:
// Проверяем, есть ли у пользователя специальная роль или право
Если РольДоступна("ДобавлениеФайловВЗакрытомПериоде") Тогда
// Принудительно делаем кнопку доступной,
// несмотря на то, что сама форма в режиме ТолькоПросмотр
ЭлементыФормы.КнопкаОткрытияФайлов.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Важное примечание: в зависимости от релиза и конкретной реализации подсистемы свойств и файлов, возможно потребуется также немного модифицировать форму списка самого справочника файлов, чтобы она не перенимала параметр ТолькоПросмотр от владельца (документа). Но базовый принцип остается неизменным — мы работаем только с доступностью элементов управления.
Иногда возникают задачи, когда необходимо не просто прикрепить внешний файл, но и, например, создать внешнюю обработку, которая пакетно загружает файлы и все-таки пытается инициировать запись чего-либо в связанный документ.
Рассмотрим подходы к программному обходу запрета редактирования. В старых обсуждениях часто встречается совет очистить глобальный параметр ПараметрыСеанса.ГраницаЗапретаИзмененияДанных, выполнить запись документа, а затем восстановить параметр обратно.
Почему так делать не стоит? Очистка параметров сеанса — глобальная операция. Если в момент выполнения вашего кода в том же сеансе сработает параллельный фоновый процесс или обработчик ожидания, он может записать данные, которые не должен был, так как граница запрета временно исчезла. Это потенциально опасный метод.
Посмотрим на современные и безопасные способы, которые рекомендуются разработчиками стандарта БСП (Библиотеки стандартных подсистем):
Способ А: Использование свойства "ДополнительныеСвойства"
В большинстве типовых конфигураций подписки на события, проверяющие дату запрета, умеют анализировать структуру ДополнительныеСвойства записываемого объекта. Мы можем передать туда специальный флаг-маркер прямо перед вызовом метода записи:
ОбъектДокумента = СсылкаНаЗакрытыйДокумент.ПолучитьОбъект();
// ... производим манипуляции с объектом, если нужно ...
// Устанавливаем специальный флаг для пропуска проверки
ОбъектДокумента.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения", Истина);
Попытка
ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);
Исключение
Сообщить("Ошибка записи: " + ОписаниеОшибки());
КонецПопытки;
Этот метод абсолютно безопасен. Он локален, действует только на один конкретный экземпляр объекта в памяти и никак не влияет на параметры всего сеанса.
Способ Б: Отключение проверки через процедуры платформы/БСП
В более свежих релизах конфигураций существует штатный программный интерфейс для временного отключения проверок для конкретного куска кода:
// Включаем игнорирование дат запрета
ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Истина);
Попытка
// Выполняем запись нужных элементов справочника или документа
Объект.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
// Обязательно возвращаем проверку обратно!
ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Ложь);
Мы проанализировали несколько путей решения проблемы с добавлением файлов в закрытом периоде. Самым оптимальным и «чистым» решением является понимание того факта, что запрет носит интерфейсный характер.
Если бизнес-процесс позволяет, лучше всего использовать прямое добавление файлов в справочник без изменения кода программы. Если же важен комфорт пользователя (менеджера), достаточно внести пару строк кода в процедуру ПриОткрытии формы документа, чтобы разблокировать конкретную кнопку, оставив бухгалтерские проводки и табличные части в полной безопасности.