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