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