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

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

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

Концепция разделения данных и интерфейса

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

Мы должны изменять именно те данные (реквизиты), к которым привязан элемент. Связь между элементом формы и реквизитом задается через свойство ПутьКДанным, что важно понимать для добавления реквизитов и элементов формы — есть инструмент программного изменения форм и значений полей. Это свойство представляет собой просто строку-указатель, которая говорит платформе, откуда брать данные для отрисовки элемента на экране. Изменить само содержимое свойства ПутьКДанным программно на клиенте невозможно — платформа выдаст ошибку о недоступности. Запоминаем: значение присваивают не элементу формы, а реквизиту!

Присвоение значений реквизитам формы и объекта

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

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

Как изменить значение декорации (надписи)

Иногда на форме располагаются элементы, у которых вообще нет свойства ПутьКДанным, а само значение не является реквизитом. Речь идет об элементах типа «Декорация - Надпись». Если перед нами именно декорация, то значение нужно записывать напрямую в свойство визуального элемента Заголовок через коллекцию Элементы.

Разберем по шагам пример такого присвоения:


Элементы.НадписьДнейОсвобожденияОтРаботы.Заголовок = Текст;

В данном случае мы обращаемся к конкретному элементу управления и напрямую меняем его отображаемый текст.

Использование коллекции "ЭтаФорма"

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

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


ЭтаФорма["ИмяРеквизита"] = Значение;

Если это реквизит основного объекта (документа, справочника), то обращение идет через свойство объекта:


ЭтаФорма.Объект["ИмяРеквизита"] = Значение;

Работа с табличными частями и динамическими списками

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

Проанализируем ситуацию с таблицей. Для получения строки мы используем свойство ТекущиеДанные:


СтрокаТаблицы = Элементы.ИмяТабличнойЧасти.ТекущиеДанные;
Если СтрокаТаблицы <> Неопределено Тогда
    СтрокаТаблицы.ИмяРеквизита = Значение;
КонецЕсли;

Обязательно делайте проверку на Неопределено, чтобы избежать ошибок, если пользователь не выделил ни одну строку в таблице.

Ограничения клиента при работе со ссылочными типами

При работе на клиенте важно помнить об архитектурных ограничениях. Если для заполнения поля формы вам нужно взять данные из другого ссылочного значения (например, подтянуть ИНН из справочника «Контрагенты»), на клиенте обратиться к реквизитам ссылки «через точку» (например, Контрагент.ИНН) нельзя.

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

Управление типами значений на клиенте

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

Для этого мы обращаемся к коллекции Элементы и свойству ОграничениеТипа:


Элементы.ИмяПоля.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

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

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

← На главную