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