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

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

Решение 1: Использование события "ОбработкаВыбора"

Первый и часто наиболее эффективный способ получить выбранное значение, особенно для элементов типа "Поле выбора", — это перехватить событие ОбработкаВыбора. Это событие возникает, когда пользователь завершает выбор значения, например, из списка или диалога выбора. Главное преимущество этого метода заключается в том, что в момент вызова события система уже определила и передает нам выбранное значение.

Для того чтобы воспользоваться этим подходом, мы должны:

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

Давайте посмотрим на пример кода:


Процедура ПолеВыбора1ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // В данном случае, 'ВыбранноеЗначение' уже содержит выбранный элемент.
    // Если же в ПолеВыбора1 был указан ТипЗначения - это будет непосредственно значение,
    // иначе, это может быть ссылка на объект.
    ЭтаФорма.СозданныйРеквизит = ВыбранноеЗначение;
    
    // Если нам нужно получить текст представления или наименование:
    // ЭтаФорма.СозданныйРеквизитТекст = Строка(ВыбранноеЗначение);
    
    // Отменяем стандартную обработку, если хотим полностью управлять процессом
    // СтандартнаяОбработка = Ложь;
КонецПроцедуры

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

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

Решение 2: Прямое обращение к элементам формы через коллекцию "ЭлементыФормы"

В неуправляемых формах мы имеем возможность напрямую обращаться к элементам формы, используя коллекцию ЭлементыФормы, которая является свойством объекта ЭтаФорма. Эта коллекция содержит все элементы, размещенные на форме. Каждый элемент в этой коллекции доступен по своему имени, которое мы задаем при проектировании формы.

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

Рассмотрим шаги:

  1. Определите имя элемента формы, значение которого вы хотите получить (например, ПолеВыбора1, ПолеВводаДаты, ФлажокСогласия).
  2. В нужной процедуре или функции (например, в функции печати) обратитесь к элементу через ЭтаФорма.ЭлементыФормы.ИмяЭлемента.
  3. Получите или установите его значение через свойство .Значение.

Пример кода для доступа к значению элемента:


Процедура КомандаПечать()
    // Предположим, у нас есть поле выбора с именем "ПолеВыбора1"
    // и поле ввода даты с именем "ДатаДокумента".
    
    // Получаем выбранное значение из ПоляВыбора1
    ПеременнаяСВыбраннымЗначением = ЭтаФорма.ЭлементыФормы.ПолеВыбора1.Значение;
    
    // Получаем значение из ПоляВводаДаты
    ДатаДляПечати = ЭтаФорма.ЭлементыФормы.ДатаДокумента.Значение;
    
    // Далее используем эти значения в логике печати
    Сообщить("Выбранное значение: " + ПеременнаяСВыбраннымЗначением);
    Сообщить("Дата документа: " + ДатаДляПечати);
    
    // ... Вызываем печатную форму с этими данными ...
КонецПроцедуры

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

Решение 3: Работа с реквизитами формы

Одним из фундаментальных принципов работы форм в 1С является их тесная связь с реквизитами. Реквизиты формы – это по сути переменные, которые принадлежат форме и хранят данные. Многие элементы формы (например, поля ввода, флажки, поля выбора) на самом деле являются лишь визуальным представлением этих реквизитов.

Если элемент формы связан с каким-либо реквизитом, то любое изменение значения в этом элементе автоматически отражается в соответствующем реквизите формы, и наоборот. Это означает, что вместо прямого обращения к элементу формы, мы можем просто обратиться к реквизиту, с которым этот элемент связан.

Чтобы использовать этот подход, мы должны:

  1. Перейти на вкладку "Реквизиты" в конфигураторе для данной формы и убедиться, что нужный реквизит существует и имеет подходящий тип.
  2. На вкладке "Элементы" убедиться, что интересующий нас элемент формы связан с этим реквизитом. Обычно это указывается в свойствах элемента в поле "Данные" или "ОсновноеЗначение".
  3. Обратиться к реквизиту напрямую через объект ЭтаФорма.

Пример кода:


Процедура КомандаПечать()
    // Предположим, поле выбора связано с реквизитом формы "ВыбранныйВариант"
    // и поле ввода даты связано с реквизитом "ДатаДок".
    
    // Получаем значение реквизита "ВыбранныйВариант"
    ЗначениеДляПечати = ЭтаФорма.ВыбранныйВариант;
    
    // Получаем значение реквизита "ДатаДок"
    ДатаДляДокумента = ЭтаФорма.ДатаДок;
    
    // Далее используем эти реквизиты
    Сообщить("Значение реквизита: " + ЗначениеДляПечати);
    Сообщить("Значение даты: " + ДатаДляДокумента);
    
    // ... Продолжаем логику печати ...
КонецПроцедуры

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

Программное создание реквизитов и связывание их с элементами

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

Давайте разберем по шагам:

  1. Создадим реквизит формы в коде, например, при открытии формы или в обработчике события, если его тип не был известен заранее.
  2. Найдем соответствующий элемент формы и свяжем его с новым реквизитом.

Пример:


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

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

Особенности неуправляемых форм и их отличие от управляемых

Хотя мы и сосредоточились на неуправляемых формах, необходимо понимать их контекст. Неуправляемые формы были основным видом форм в 1С:Предприятие до версии 8.2 включительно. В них разработчик имел очень детальный контроль над расположением элементов и их поведением.

Основные отличия в контексте доступа к элементам:

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

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

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

← На главную