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