Часто перед разработчиками и администраторами систем 1С встает задача автоматической актуализации даты запрета изменения данных. Например, необходимо, чтобы дата запрета ежедневно смещалась на вчерашний день, предотвращая редактирование документов задним числом. Рассмотрим, почему попытка реализовать такую логику через подписки на события является технической ошибкой и как правильно решить эту задачу в конфигурациях 1C (в частности, в Управление торговлей 10.3).
Проанализируем архитектурное устройство платформы 1С. Подписка на событие предназначенa для перехвата событий конкретных прикладных объектов метаданных — таких как справочники, документы, бизнес-процессы или наборы записей регистров.
Среди доступных событий для подписок присутствуют:
ПередЗаписью и ПриЗаписиОбработкаПроведения и ОбработкаУдаленияПроведенияПриУстановкеНовогоНомера и ПриКопированииОбработкаЗаполнения и ОбработкаПроверкиЗаполненияПередУдалениемВсе эти события относятся исключительно к объектной модели данных. События старта системы, такие как ПриНачалеРаботыСистемы или события модуля сеанса, являются событиями контекста сеанса пользователя. Для них платформенно не предусмотрен механизм подписок на события. Кроме того, попытка менять даты запрета при проведении документов внутри подписок на проведение не только нецелесообразна, но и приведет к блокировкам таблиц и существенному замедлению работы системы.
Выясним, как организовать смену даты запрета наиболее надежным способом. Оптимальным решением является использование механизм регламентных заданий. Это позволяет обновлять дату на сервере без привязки к действиям конкретных пользователей и факту их входа в программу.
Разберем по шагам алгоритм создания такого решения:
РегламентныеПроцедурыСервер) и пропишем в нем процедуру установки даты запрета.РегламентноеЗадание и укажем созданную процедуру в качестве метода.00:01:00.Пример кода для программной установки границы запрета изменения данных в конфигурации Управление торговлей 10.3:
Процедура УстановитьДатуЗапретаИзменения() Экспорт
ВчерашняяДата = НачалоДня(ТекущаяДата() - 86400);
// В УТ 10.3 границы запрета хранятся в регистре сведений "ГраницыЗапретаИзмененияДанных"
МенеджерЗаписи = РегистрыСведений.ГраницыЗапретаИзмененияДанных.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ГраницаЗапретаИзменений = ВчерашняяДата;
Попытка
МенеджерЗаписи.Записать();
Исключение
ЗаписьЖурналаРегистрации("Установка даты запрета",
УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если требуется менять дату непосредственно при запуске программы первым вошедшим пользователем, используем глобальный модуль приложения или модуль управляемого приложения в процедуре ПриНачалеРаботыСистемы().
Рассмотрим порядок реализации этого подхода:
Рассмотрим пример реализации проверки в модуле приложения:
Процедура ПриНачалеРаботыСистемы()
#Если Клиент Тогда
ОбновитьДатуЗапретаПриНеобходимости();
#КонецЕсли
КонецПроцедуры
Процедура ОбновитьДатуЗапретаПриНеобходимости()
ТребуемаяДата = НачалоДня(ТекущаяДата() - 86400);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ТОП 1
| ТекРегистр.ГраницаЗапретаИзменений КАК ГраницаЗапрета
|ИЗ
| РегистрСведений.ГраницыЗапретаИзмененияДанных КАК ТекРегистр";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
ВыполнитьОбновление = Истина;
Иначе
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ВыполнитьОбновление = (Выборка.ГраницаЗапрета < ТребуемаяДата);
КонецЕсли;
Если ВыполнитьОбновление Тогда
// Вызов серверной процедуры записи новой даты
УстановитьНовуюДатуЗапрета(ТребуемаяДата);
КонецЕсли;
КонецПроцедуры
Проанализируем особенности работы данных решений в реальных условиях эксплуатации:
1C:Enterprise Server строго по расписанию. В файловом режиме регламентные задания запускаются только при наличии активного сеанса программы или специально выделенного технологического сеанса.ПриНачалеРаботыСистемы() для него не сработает в полночь, так как повторного входа не происходит. В таких случаях регламентное задание является более надежным выбором.Управление торговлей 10.3 по умолчанию может не применяться, если в настройках параметров учета не включено ограничение прав доступа на уровне записей (RLS).