Как правильно установить значение реквизита управляемой формы в 1С 8.3

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

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

Анализ проблемы: Элементы против Реквизитов

Рассмотрим классическую ситуацию. У управляемой формы есть реквизит ДокЗаказНаПеремещение с типом ссылки на документ ДокументСсылка.ЗаказНаПеремещение. Нам необходимо заполнить этот реквизит конкретным значением в процедуре ПриСозданииНаСервере().

Типичная ошибка выглядит следующим образом:


// ТАК ДЕЛАТЬ НЕЛЬЗЯ! Возникнет ошибка выполнения.
Элементы.ДокЗаказНаПеремещение = СсылкаНаЗаказ;

Давайте выясним причину, почему этот код не работает. В управляемом приложении 1С действует строгое разделение на данные и их визуальное представление:

Попытка присвоить значение напрямую элементу формы через Элементы.ИмяЭлемента = Значение ошибочна, поскольку элементы управления не хранят данные сами по себе — они лишь отображают то, что находится в связанных с ними реквизитах.

Правильное решение: Прямое обращение к реквизиту

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Правильная установка значения реквизита формы
    ДокЗаказНаПеремещение = Параметры.ЗначениеЗаказа;
    
КонецПроцедуры

В данном случае платформа автоматически обновит все связанные элементы управления на форме, и пользователь сразу увидит установленное значение в соответствующем поле ввода.

Реквизиты объекта против реквизитов формы

Важно четко различать, где именно объявлен реквизит, с которым вы работаете в коде:

  1. Реквизит принадлежит основному объекту формы (например, документу или справочнику): В этом случае обращение к нему происходит через точку от стандартного реквизита Объект. Например, если реквизит ДокЗаказНаПеремещение создан внутри самого документа в конфигураторе, код будет выглядеть так: Объект.ДокЗаказНаПеремещение = СсылкаНаЗаказ;
  2. Реквизит создан непосредственно в самой форме: Если реквизит создан на вкладке "Реквизиты" в редакторе формы и не принадлежит прикладному объекту (не находится внутри ветки "Объект"), мы обращаемся к нему напрямую без префиксов: ДокЗаказНаПеремещение = СсылкаНаЗаказ;

Связывание элементов интерфейса с реквизитами через "Путь к данным"

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

Если вы создаете элемент управления динамически из кода, вам обязательно нужно связать его со значением реквизита:


НовыйЭлемент = Элементы.Добавить("ПолеЗаказа", Тип("ПолеФормы"), ГруппаЭлементов);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

// Указываем путь к данным - имя нашего реквизита формы
НовыйЭлемент.ПутьКДанным = "ДокЗаказНаПеремещение";

Без указания свойства ПутьКДанным поле ввода на форме останется пустым и не связанным ни с какой переменной, и пользователь не сможет передать через него данные в систему.

Преобразование данных формы в прикладные объекты базы данных

Работа с основным реквизитом формы Объект имеет важный нюанс. На сервере формы тип данных этого реквизита — вовсе не реальный объект базы данных (такой как ДокументОбъект.ЗаказНаПеремещение), а специальный промежуточный тип ДанныеФормыСтруктура.

Этот тип оптимизирован для быстрой передачи между клиентом и сервером, но у него есть ограничение: у него нет методов прикладного объекта. Вы не можете вызвать из него процедуры модуля объекта или выполнить стандартные методы вроде Записать() или Заполнить().

Для выполнения бизнес-логики мы используем специальные методы взаимного преобразования:

Проанализируем пример выполнения бизнес-логики заполнения документа по правилам, описанным в его модуле:


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

Программное создание реквизитов формы

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

Рассмотрим, как правильно создавать и заполнять такие реквизиты:


&НаСервере
Процедура СоздатьРеквизитДинамически()
    
    // Описываем новый реквизит
    МассивДобавляемыхРеквизитов = Новый Массив;
    НовыйРеквизит = Новый РеквизитФормы("ДинамическийРеквизит", Новый ОписаниеТипов("Строка"));
    МассивДобавляемыхРеквизитов.Добавить(НовыйРеквизит);
    
    // Добавляем реквизит на форму
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    // Ошибка компиляции: ДинамическийРеквизит = "Привет";
    // ПРАВИЛЬНОЕ ОБРАЩЕНИЕ ЧЕРЕЗ КВАДРАТНЫЕ СКОБКИ ФОРМЫ:
    ЭтаФорма["ДинамическийРеквизит"] = "Значение успешно установлено!";
    
КонецПроцедуры

Автоматическое сохранение значений реквизитов формы

По умолчанию значения реквизитов формы, не связанных с реквизитами объекта, теряются при закрытии формы. Однако платформа 1С предоставляет мощный встроенный механизм сохранения настроек, который не требует написания программного кода:

  1. Откройте свойства управляемой формы в конфигураторе.
  2. Найдите свойство Автоматическое сохранение данных в настройках и установите его в значение Использовать.
  3. После этого в списке реквизитов формы (в правом верхнем углу редактора формы) появится специальная колонка Сохранение (с иконкой дискеты).
  4. Отметьте флажками те реквизиты, значения которых платформа должна автоматически сохранять при закрытии и восстанавливать при следующем открытии этой формы данным пользователем.

Таким образом, мы детально разобрали принципы работы с реквизитами управляемых форм 1С, изучили разницу между отображением и хранением данных, а также освоили передовые приемы работы с контекстом формы на сервере.

← На главную