Где правильно прописывать настройки формы: в ПриСозданииНаСервере или ПриЧтенииНаСервере?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка управляемых форм в 1С:Предприятии 8.3 часто вызывает вопросы относительно правильного размещения кода для настройки внешнего вида и логики формы. Один из самых распространенных камней преткновения – это выбор между серверными обработчиками ПриСозданииНаСервере и ПриЧтенииНаСервере для управления видимостью, доступностью элементов и другими настройками формы. Давайте разберемся, в чем их принципиальные отличия и как эффективно использовать каждый из них.

Многие разработчики, особенно начинающие, сталкиваются с ситуацией, когда настройки формы, заданные в ПриСозданииНаСервере, перестают работать после перезагрузки данных формы или при переходе между записями. Это происходит из-за глубокого непонимания жизненного цикла управляемой формы и особенностей работы серверных обработчиков. Рассмотрим эти обработчики подробнее, чтобы избежать подобных ошибок и строить надежные, производительные решения.

Понимание ключевых обработчиков формы на сервере

Для начала, давайте четко определим назначение и момент вызова каждого из этих важных серверных обработчиков формы.

  1. ПриЧтенииНаСервере

    Этот обработчик является первым, который вызывается на сервере при открытии формы существующего объекта. Это крайне важный момент: для нового, еще не записанного объекта, процедура ПриЧтенииНаСервере не вызывается. Когда этот обработчик срабатывает, данные формы уже заполнены значениями из прикладного объекта, с которым связана форма. Сам объект (например, ДокументОбъект или СправочникОбъект) доступен в памяти сервера через параметр ТекущийОбъект или, чаще, через свойство формы Объект. Это позволяет нам обращаться к реквизитам объекта, вызывать его экспортные методы и выполнять другие действия, непосредственно связанные с данными уже существующей записи.

    Основное назначение ПриЧтенииНаСервере:

    • Подготовка дополнительных данных формы, которые зависят от данных существующего объекта. Например, мы можем получить значения из связанных объектов, агрегировать данные или выполнить сложные вычисления, основанные на текущих данных объекта.
    • Заполнение служебных реквизитов формы, которые потом будут использоваться для настройки визуального представления.
    • Вызов экспортных процедур прикладного объекта.

    Пример кода в ПриЧтенииНаСервере:

    
    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
        // Здесь ТекущийОбъект - это ссылка на прикладной объект (например, ДокументОбъект)
        // Мы можем получить данные из объекта и заполнить реквизиты формы,
        // которые будут использоваться позже для настройки видимости/доступности.
        Если ТекущийОбъект.Проведен Тогда
            // Установим реквизит формы, чтобы потом использовать его для видимости
            ЭтаФорма.ДополнительныеСвойства.УстановленФлагПроведен = Истина;
        Иначе
            ЭтаФорма.ДополнительныеСвойства.УстановленФлагПроведен = Ложь;
        КонецЕсли;
    
        // Если у объекта есть реквизит "Менеджер", получим его имя
        Если ТекущийОбъект.Менеджер.Пустая() Тогда
            ЭтаФорма.РеквизитФормыМенеджер = "";
        Иначе
            ЭтаФорма.РеквизитФормыМенеджер = ТекущийОбъект.Менеджер.Наименование;
        КонецЕсли;
    
        // ... другие действия, зависящие от данных ТекущегоОбъекта
    КонецПроцедуры
    

    Обратите внимание, что в ПриЧтенииНаСервере мы не должны напрямую настраивать видимость или доступность элементов формы. Мы должны лишь собрать необходимые для этого данные в реквизиты формы, которые уже будут обработаны в следующем обработчике.

  2. ПриСозданииНаСервере

    Этот обработчик вызывается после ПриЧтенииНаСервере (если форма открывается для существующего объекта) или сразу, если открывается форма нового, еще не записанного объекта. Ключевое отличие: на этом этапе прикладной объект (ДокументОбъект, СправочникОбъект и т.п.) уже отсутствует в памяти сервера. Все данные объекта, которые нужны форме, уже должны быть загружены в ее реквизиты.

    Основное назначение ПриСозданииНаСервере:

    • Полная подготовка самой формы к открытию, ее внешнего представления. Это идеальное место для настройки видимости, доступности, цвета, шрифта элементов формы на основе реквизитов формы, которые были заполнены в ПриЧтенииНаСервере (для существующих объектов) или имеют значения по умолчанию (для новых объектов).
    • Настройка параметров динамических списков.
    • Отмена открытия формы, установив параметр Отказ в значение Истина.
    • Выполнение всех действий по заполнению, проверке и обработке данных, которые необходимы при открытии формы, но не требуют прямого доступа к прикладным объектам.
    • Инициализация формы для нового объекта (заполнение реквизитов по умолчанию, установка начальных значений).

    Пример кода в ПриСозданииНаСервере:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Здесь мы используем реквизиты формы, которые могли быть заполнены в ПриЧтенииНаСервере
        // или инициализированы для нового объекта.
    
        // Пример настройки видимости элемента в зависимости от реквизита формы
        Если ЭтаФорма.ДополнительныеСвойства.УстановленФлагПроведен Тогда
            Элементы.ГруппаПроведенногоДокумента.Видимость = Истина;
            Элементы.КомандаЗаполнитьТаблицу.Доступность = Ложь;
        Иначе
            Элементы.ГруппаПроведенногоДокумента.Видимость = Ложь;
            Элементы.КомандаЗаполнитьТаблицу.Доступность = Истина;
        КонецЕсли;
    
        // Настройка доступности элемента на основе текстового реквизита
        Если Не ПустаяСтрока(ЭтаФорма.РеквизитФормыМенеджер) Тогда
            Элементы.ПолеМенеджер.Доступность = Ложь; // Если менеджер уже указан, запрещаем менять
        Иначе
            Элементы.ПолеМенеджер.Доступность = Истина;
        КонецЕсли;
    
        // Если открывается новая форма, можем установить начальные значения
        Если ЭтаФорма.Объект.ЭтоНовый Тогда
            ЭтаФорма.Объект.Дата = ТекущаяДата();
            ЭтаФорма.Объект.Организация = УправлениеПользователями.ПолучитьОсновнуюОрганизациюПользователя();
        КонецЕсли;
    
        // ... другие действия по настройке формы
    КонецПроцедуры
    
  3. ПриОткрытии (на клиенте)

    Этот обработчик срабатывает на клиенте, после всех серверных обработчиков (ПриЧтенииНаСервере и ПриСозданииНаСервере), непосредственно перед тем, как форма становится видимой пользователю. Важно отметить, что для вызова этой процедуры она должна быть явно назначена как обработчик события в свойствах формы.

    Основное назначение ПриОткрытии:

    • Выполнение действий, которые невозможно осуществить на сервере (например, работа с контекстом клиентского приложения, вывод интерактивных окон, требующих ответа пользователя). В случаях, когда такие повторяющиеся операции нужно выполнять в закрытых системах без API, используется платформа для создания программных роботов OneRPA.
    • Выполнение действий, которые должны быть выполнены только при гарантированном открытии формы (например, задавать вопросы пользователю или выводить предупреждения).
    • Отмена открытия формы (аналогично ПриСозданииНаСервере, но на клиенте).

    Пример кода в ПриОткрытии:

    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        // Задать вопрос пользователю
        Если Вопрос("Продолжить работу с формой?", РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да) = КодВозвратаДиалога.Нет Тогда
            Отказ = Истина;
            Возврат;
        КонецЕсли;
    
        // Установить фокус на определенный элемент
        Элементы.Наименование.УстановитьФокус();
    КонецПроцедуры
    

Таким образом, мы видим, что основное правило заключается в следующем: ПриЧтенииНаСервере — для получения данных из объекта, ПриСозданииНаСервере — для настройки внешнего вида формы на основе этих данных (и для инициализации новых объектов), а ПриОткрытии — для клиентских интерактивных действий.

Настройка видимости и доступности элементов формы: лучшие практики

Как мы уже выяснили, программное управление видимостью и доступностью элементов формы лучше всего выполнять в ПриСозданииНаСервере, используя свойства Видимость и Доступность соответствующего элемента формы. Однако, есть и другие подходы, которые мы должны рассмотреть. Для интерактивного изменения и анализа свойств элементов формы непосредственно на лету в режиме предприятия можно использовать редактор управляемых форм в режиме предприятия.

  1. Программное управление через свойства Видимость и Доступность

    Это прямой и очевидный способ. Мы обращаемся к элементу формы через коллекцию Элементы и устанавливаем его свойства. Этот подход является базовым и подходит для большинства случаев, когда логика настройки достаточно проста или зависит от нескольких параметров.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // ... (получение данных в реквизиты формы)
    
        // Настройка видимости кнопки "Отменить проведение"
        Элементы.КнопкаОтменитьПроведение.Видимость = ЭтаФорма.Объект.Проведен;
    
        // Настройка доступности поля "Комментарий"
        Элементы.Комментарий.Доступность = ПравоДоступа("ИзменениеКомментария", Метаданные.Документы.МойДокумент);
    КонецПроцедуры
    

    При этом мы всегда должны стремиться к тому, чтобы эти настройки были выполнены один раз при открытии формы на сервере, в ПриСозданииНаСервере. Если же видимость или доступность должны меняться динамически в процессе работы пользователя с формой (например, при изменении какого-либо реквизита формы), нам придется вызывать серверные процедуры для пересчета и обновления этих свойств. Мы должны избегать частых обращений к серверу для таких мелких задач, так как это может значительно замедлить работу пользователя.

  2. Пользовательская видимость

    Существует свойство Пользовательская видимость, которое настраивается в конфигураторе для каждого элемента формы. Это свойство определяет начальную видимость элемента формы для разных ролей или профилей. Главная особенность: пользователь может самостоятельно изменить это свойство в режиме "1С:Предприятие" через пункт меню "Изменить форму", и эти изменения сохранятся для его профиля. Важно понимать, что программно управлять свойством Пользовательская видимость невозможно. Если мы устанавливаем Видимость = Ложь, элемент становится невидимым, независимо от настройки пользовательской видимости.

    Используем Пользовательскую видимость, когда хотим дать пользователю возможность самому решать, видеть ему этот элемент или нет, но при этом иметь начальную настройку по умолчанию.

  3. Условное оформление формы

    Для сложного и зависящего от данных условного отображения элементов мы настоятельно рекомендуем использовать механизм Условного оформления формы. Этот механизм позволяет настраивать внешний вид элементов (видимость, доступность, цвет фона, цвет текста, шрифт и т.д.) в зависимости от различных условий, заданных на основе данных формы, без написания дополнительного кода в обработчиках. Мы можем настроить его как в конфигураторе, так и программно. Для автоматического формирования программного кода таких настроек можно применить конструктор кода условного оформления для табличных частей.

    Преимущества Условного оформления формы:

    • Декларативность: Логика оформления четко отделена от функциональной логики, что делает код более чистым и понятным.
    • Производительность: Система 1С оптимизирована для работы с условным оформлением, и в большинстве случаев оно работает эффективнее, чем ручная программная установка свойств.
    • Универсальность: Мы можем задавать множество условий для разных элементов, создавая сложный, но при этом легко поддерживаемый интерфейс.
    • Автоматическое обновление: При изменении данных, влияющих на условие, оформление обновляется автоматически.

    Хотя возможности условного оформления могут быть ограничены для очень специфических задач (например, если логика оформления требует вызова сложной серверной функции, которая не может быть выражена в условиях), для большинства стандартных сценариев (например, "если сумма больше X, поле красное", "если статус Y, кнопка невидима") это является предпочтительным способом.

    Пример программного создания условного оформления (обычно делается в ПриСозданииНаСервере):

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Создаем новый элемент условного оформления
        НовыйЭлементОформления = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
    
        // Условие: если сумма документа больше 1000
        НовоеУсловие = НовыйЭлементОформления.Условие.Элементы.Добавить(Тип("ЭлементУсловияКомпоновкиДанных"));
        НовоеУсловие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СуммаДокумента");
        НовоеУсловие.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
        НовоеУсловие.ПравоеЗначение = 1000;
    
        // Оформление: сделать поле "СуммаДокумента" жирным и красным
        НовыйЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина));
        НовыйЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(255, 0, 0));
    
        // Область применения: только поле "СуммаДокумента"
        НовоеПоле = НовыйЭлементОформления.Поля.Элементы.Добавить();
        НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("СуммаДокумента"); // Имя реквизита формы
    
        // Второй элемент оформления: если документ проведен, группа недоступна
        Если ЭтаФорма.Объект.Проведен Тогда
            НовыйЭлементОформления2 = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
            НовоеУсловие2 = НовыйЭлементОформления2.Условие.Элементы.Добавить(Тип("ЭлементУсловияКомпоновкиДанных"));
            НовоеУсловие2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Проведен");
            НовоеУсловие2.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
            НовоеУсловие2.ПравоеЗначение = Истина;
            НовыйЭлементОформления2.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);
            НовоеПоле2 = НовыйЭлементОформления2.Поля.Элементы.Добавить();
            НовоеПоле2.Поле = Новый ПолеКомпоновкиДанных("ГруппаДляРедактирования"); // Имя элемента формы
        КонецЕсли;
    КонецПроцедуры
    

Примеры размещения логики: общий подход

Для иллюстрации правильного размещения логики, рассмотрим типичный сценарий: нам нужно показать или скрыть группу элементов на форме в зависимости от статуса объекта (например, "Проведен" или "НеПроведен") и наличия определенного реквизита.

  1. Шаг 1: Загрузка или инициализация данных в ПриЧтенииНаСервере

    Если форма открывается для существующего объекта, мы в ПриЧтенииНаСервере извлекаем из объекта все необходимые для настройки формы данные и помещаем их в реквизиты формы. Если форма открывается для нового объекта, этот шаг пропускается.

    
    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
        // Проверяем, проведен ли документ. Результат сохраняем в реквизит формы.
        ЭтаФорма.ДокументПроведен = ТекущийОбъект.Проведен;
    
        // Если есть какой-то сложный статус, который не является реквизитом объекта,
        // но вычисляется на его основе, мы его здесь вычисляем.
        ЭтаФорма.ИмеетОсобыйСтатус = ДополнительныеФункции.ОпределитьОсобыйСтатус(ТекущийОбъект);
    
        // ... другие данные, необходимые для настройки формы.
    КонецПроцедуры
    
  2. Шаг 2: Настройка формы в ПриСозданииНаСервере

    После того как необходимые данные загружены в реквизиты формы (или инициализированы для нового объекта), мы используем их для настройки внешнего вида формы. Если мы хотим инициализировать реквизиты для нового объекта, это также делаем здесь.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Инициализация реквизитов для нового объекта
        Если ЭтаФорма.Объект.ЭтоНовый Тогда
            ЭтаФорма.ДокументПроведен = Ложь; // Новый документ не проведен
            ЭтаФорма.ИмеетОсобыйСтатус = Ложь; // Новый документ пока не имеет особого статуса
            ЭтаФорма.Объект.Дата = ТекущаяДата();
            ЭтаФорма.Объект.Ответственный = Пользователи.ТекущийПользователь();
        КонецЕсли;
    
        // Настройка видимости группы в зависимости от статуса документа
        Элементы.ГруппаДополнительныхПолейДляПроведенного.Видимость = ЭтаФорма.ДокументПроведен;
    
        // Настройка доступности поля по особому статусу
        Элементы.ПолеОсобогоПараметра.Доступность = Не ЭтаФорма.ИмеетОсобыйСтатус;
    
        // Создание условного оформления для выделения важных полей
        МыСоздадимУсловноеОформлениеПолей();
    КонецПроцедуры
    
    &НаСервере
    Процедура МыСоздадимУсловноеОформлениеПолей()
        // Пример использования условного оформления
        // Если документ не проведен, поле "ДатаПроведения" невидимо
        НовыйЭлемент = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
        НовоеУсловие = НовыйЭлемент.Условие.Элементы.Добавить(Тип("ЭлементУсловияКомпоновкиДанных"));
        НовоеУсловие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДокументПроведен"); // Реквизит формы
        НовоеУсловие.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        НовоеУсловие.ПравоеЗначение = Ложь;
        НовыйЭлемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
        НовоеПоле = НовыйЭлемент.Поля.Элементы.Добавить();
        НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("ДатаПроведения"); // Имя элемента формы
    КонецПроцедуры
    

Оптимизация и передача данных между формами и процедурами

Помимо выбора правильного обработчика для настроек формы, разработчикам часто приходится решать задачи передачи данных между различными частями системы или между формами. Мы рассмотрим несколько эффективных подходов, которые могут косвенно влиять на процесс настройки формы.

  1. Параметры формы

    Самый прямой способ передачи данных при открытии формы – это использование параметров формы. Мы можем создавать реквизиты формы и устанавливать их значения перед открытием. Это полезно для передачи идентификаторов, фильтров или других значений, которые будут использоваться формой для инициализации или настройки.

    
    // На клиенте, перед открытием формы
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ВыбранныйСклад", СсылкаНаСклад);
    ПараметрыОткрытия.Вставить("ТолькоПросмотр", Истина);
    
    НоваяФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаДокумента", ПараметрыОткрытия);
    НоваяФорма.Открыть();
    
    // В форме документа (в ПриСозданииНаСервере)
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Параметры.Свойство("ВыбранныйСклад") Тогда
            ЭтаФорма.Объект.Склад = Параметры.ВыбранныйСклад;
        КонецЕсли;
        Если Параметры.Свойство("ТолькоПросмотр") И Параметры.ТолькоПросмотр Тогда
            ЭтаФорма.ТолькоПросмотр = Истина; // Реквизит формы
            Элементы.ГруппаОсновная.ТолькоПросмотр = Истина;
            ЭтаФорма.Доступность = Ложь;
        КонецЕсли;
    КонецПроцедуры
    
  2. Параметры сеанса

    Это общие объекты конфигурации, предназначенные для хранения значений, уникальных для каждого клиентского сеанса. Их значения сохраняются в течение всего сеанса работы пользователя и доступны на сервере. Параметры сеанса часто используются для разграничения доступа к данным (RLS), но также могут применяться для передачи данных, например, имени текущего пользователя или списка доступных регионов. Инициализация параметров сеанса должна происходить в модуле сеанса. Мы должны быть осторожны с их использованием для временных данных, так как они существуют в течение всего сеанса.

    
    // В МодулеСеанса, ПриУстановкеПараметровСеанса
    Процедура ПриУстановкеПараметровСеанса(ЗначенияПараметров)
        ЗначенияПараметров.ТекущийПользователь = Пользователи.ТекущийПользователь();
        ЗначенияПараметров.ТекущийЯзык = Метаданные.Языки.Русский;
    КонецПроцедуры;
    
    // В модуле формы или в общем модуле (сервер)
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если ПараметрыСеанса.ТекущийПользователь.РольДоступна("ПолныеПрава") Тогда
            Элементы.ГруппаАдминистрирования.Видимость = Истина;
        Иначе
            Элементы.ГруппаАдминистрирования.Видимость = Ложь;
        КонецЕсли;
    КонецПроцедуры
    
  3. Временное хранилище (буфер)

    В Библиотеке стандартных подсистем (БСП) есть механизмы для работы с внутренним буфером обмена, например, процедуры СкопироватьВБуферОбмена и СтрокиИзБуфераОбмена. Это позволяет временно сохранять произвольные данные на сервере и получать их по строковому идентификатору. Этот подход может быть полезен для передачи больших объемов данных между процедурами или в сценариях, где ограничено использование параметров сеанса (например, в расширениях конфигурации, где доступ к параметрам сеанса может быть ограничен).

    
    // В общем модуле на сервере
    Функция ПоместитьДанныеВоВременноеХранилище(Данные) Экспорт
        Возврат ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор());
    КонецФункции
    
    Функция ПолучитьДанныеИзВременногоХранилища(Адрес) Экспорт
        Возврат ПолучитьИзВременногоХранилища(Адрес);
    КонецФункции
    
    // В форме
    &НаКлиенте
    Процедура ОткрытьФормуСОгромнымиДанными()
        БольшаяТаблицаДанных = ПолучитьБольшуюТаблицуДанныхНаСервере();
        АдресДанных = ВзаимодействиеСервер.ПоместитьДанныеВоВременноеХранилище(БольшаяТаблицаДанных); // Вызов серверной функции
                
        ПараметрыОткрытия = Новый Структура("АдресДанных", АдресДанных);
        ОткрытьФорму("Обработка.МояОбработка.Форма", ПараметрыОткрытия);
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьБольшуюТаблицуДанныхНаСервере()
        // ... Здесь формируется большая таблица ...
        Возврат Новый ТаблицаЗначений(); // Пример
    КонецФункции
    
    // В ПриСозданииНаСервере целевой формы
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Параметры.Свойство("АдресДанных") Тогда
            ЭтаФорма.БольшаяТаблицаДанных = ВзаимодействиеСервер.ПолучитьДанныеИзВременногоХранилища(Параметры.АдресДанных);
            // Теперь можно использовать БольшаяТаблицаДанных для настройки формы
        КонецЕсли;
    КонецПроцедуры
    
  4. Метод Оповестить()

    Позволяет одной форме оповещать другую (ее владельца) о произошедшем событии, передавая при этом структуру данных. Форма-владелец обрабатывает это оповещение в процедуре ОбработкаОповещения. Этот механизм полезен, когда мы хотим, чтобы дочерняя форма уведомила родительскую о каких-либо изменениях или выбранных значениях, после чего родительская форма может обновить свои данные или внешний вид.

    
    // В дочерней форме, после выбора значения
    &НаКлиенте
    Процедура ВыбратьИЗакрыть()
        Оповестить("ВыбранКонтрагент", ЭтаФорма.Объект.СсылкаНаКонтрагента, ЭтаФорма.УникальныйИдентификатор);
        Закрыть();
    КонецПроцедуры
    
    // В родительской форме
    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
        Если ИмяСобытия = "ВыбранКонтрагент" Тогда
            ЭтаФорма.Контрагент = Параметр; // Обновляем реквизит формы
            ОбновитьОтображениеКонтрагента(); // Вызов серверного метода для обновления видимости
        КонецЕсли;
    КонецПроцедуры
    
    &НаСервере
    Процедура ОбновитьОтображениеКонтрагента()
        Если ЭтаФорма.Контрагент.Пустая() Тогда
            Элементы.ГруппаРеквизитовКонтрагента.Видимость = Ложь;
        Иначе
            Элементы.ГруппаРеквизитовКонтрагента.Видимость = Истина;
        КонецЕсли;
    КонецПроцедуры
    

Для больших объемов табличных данных мы всегда рекомендуем формировать их на сервере, помещать во временное хранилище и передавать на клиент только адрес этого хранилища. Это позволяет избежать избыточной сериализации/десериализации данных, что значительно повышает производительность и отзывчивость интерфейса.

Общие рекомендации по размещению логики на форме

Для создания качественных и легко поддерживаемых форм, мы должны придерживаться следующих рекомендаций:

  1. Избегаем сложной логики в стандартных обработчиках: Мы не рекомендуем размещать сложную бизнес-логику непосредственно в стандартных обработчиках событий формы (ПриСозданииНаСервере, ПриЧтенииНаСервере, ПриОткрытии), за исключением вызова методов общих модулей или методов самой формы. Эти обработчики должны быть "тонкими" и служить точками входа для более специализированных процедур.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Вместо того чтобы писать всю логику здесь, вызовем специализированную процедуру
        НастроитьВидимостьЭлементовФормы();
        ИнициализироватьНовыйДокумент();
    КонецПроцедуры
    
  2. Используем значения по умолчанию и минимизируем явное указание размеров: По возможности мы должны использовать значения по умолчанию для свойств элементов и минимизировать явное указание размеров элементов (ширина, высота). Это позволяет формам корректно отображаться на разных экранах, с разными разрешениями и масштабами, а также упрощает адаптацию интерфейса.

  3. Все данные как реквизиты формы: Все данные, которые отображаются и редактируются в форме, должны быть описаны как реквизиты формы. Мы не должны использовать переменные модуля формы в качестве источников данных для элементов управления, так как это нарушает принцип связывания данных и может привести к непредсказуемому поведению. Реквизиты формы — это наш "контракт" с элементами управления.

  4. Минимизируем хранимые данные: Мы должны пересматривать логику формы и не хранить в ее реквизитах то, что можно быстро и эффективно получить на сервере при необходимости. Избыточное хранение данных увеличивает объем передаваемой информации между клиентом и сервером, что негативно сказывается на производительности.

В завершение, мы подчеркиваем, что глубокое понимание жизненного цикла управляемой формы и правильное распределение логики между серверными и клиентскими обработчиками — это ключ к созданию производительных, надежных и легко поддерживаемых решений на платформе 1С:Предприятие 8.3. Мы надеемся, что этот подробный разбор поможет вам избежать распространенных ошибок и значительно улучшит качество ваших разработок. А для контроля корректности данных после внедрения новых доработок в учетных системах применяется автоматическая сверка проводок между базами 1С, позволяющая быстро найти расхождения.

← На главную