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