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