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