При передаче внешних обработок клиентам на предварительное тестирование часто возникает задача ограничить время их работы или защитить алгоритмы от несанкционированного копирования до момента окончательной оплаты. Разберем типичные ошибки при попытке закрыть обработку программно, проанализируем, почему простая проверка даты не дает гарантированного результата, и рассмотрим надежные архитектурные подходы к решению этой задачи.
Рассмотрим распространенную ошибку, возникающую при попытке написать проверку даты в модуле объекта обработки. Обращение к свойству ЭтаФорма доступно исключительно в модуле формы. Если попытаться вызвать метод ЭтаФорма.Закрыть() в модуле объекта, платформа выдаст исключение во время выполнения.
Если требуется корректно запретить открытие формы при наступлении определенной даты, проверку необходимо размещать в обработчиках событий формы. Проанализируем правильный пример для управляемой формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СрокДействия = Дата(2025, 05, 01);
Если ТекущаяДатаСеанса() > СрокДействия Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Срок действия демонстрационной версии обработки истек.";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Установка параметра Отказ = Истина в процедуре ПриСозданииНаСервере или ПриОткрытии отменяет открытие формы без возникновения критических ошибок в интерфейсе. Если же логика обработки вызывается программно без открытия формы через экспортные процедуры модуля объекта, то для отмены выполнения следует использовать генерацию исключения:
Процедура ВыполнитьДействие() Экспорт
СрокДействия = Дата(2025, 05, 01);
Если ТекущаяДатаСеанса() > СрокДействия Тогда
ВызватьИсключение "Использование обработки заблокировано: истек тестовый период.";
КонецЕсли;
// Основной рабочий алгоритм
КонецПроцедуры
Выясним причину, по которой простая проверка даты в сочетании с установкой пароля на модуль не является надежной защитой:
EPF) устроена так, что пароль или извлекается, или снимается сторонними утилитами за считанные секунды. Любой специалист с доступом к конфигуратору сможет убрать проверку даты из кода.ТекущаяДата() легко обходится пользователем путем перевода системных часов на клиентском компьютере или сервере назад.Если все же используется ограничение по времени, следует проверять перевод часов назад. Для этого при каждом запуске сохраняют время в ХранилищеОбщихНастроек. Если дата текущего сеанса меньше сохраненной даты предыдущего запуска, значит, время было изменено вручную, и запуск следует блокировать.
Наиболее практичный и распространенный способ демонстрации функционала без риска потери оплаты — вырезание части возможностей. Вместо ограничения по сроку обработка передается в режиме предпросмотра:
Такой подход полностью исключает полезную эксплуатацию разработки в рабочей базе до передачи полноценной версии, даже если клиент снимет пароль с модуля.
Если необходимо предоставить клиенту полнофункциональную версию на ограниченный срок, надежным архитектурным решением является вынос ключевых расчетов на собственный удаленный сервер (SaaS-подход):
HTTPСоединение и HTTPЗапрос.При таком подходе исходный код ключевого алгоритма физически не попадает на компьютер клиента, а доступ отключается разработчиком на стороне сервера в любой момент.
Если конфигурация клиента работает в режиме совместимости с версиями платформы 8.3.9 и выше, альтернативой внешней обработке может стать расширение конфигурации (файл с расширением .cfe).
Платформа 1С поддерживает механизм поставки расширений без исходных текстов модулей. При выгрузке расширения разработчик может снять флаги поставки исходного кода, что делает декомпиляцию и изменение алгоритмов клиентом значительно более сложной задачей по сравнению с обычным файлом EPF.
Рассмотрим дополнительные методы защиты кода, упомянутые при обсуждении задачи:
ПодключитьВнешнююКомпоненту.Для надежного контроля демонстрационного периода рекомендуется комбинировать ограничение функционала (демо-режим) с выносом критических расчетов на веб-сервисы, не полагаясь исключительно на установку пароля в файлах EPF.