Как получить данные из выбранной строки регистра сведений в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Понимание проблемы: КлючЗаписи vs Данные объекта

Когда мы открываем форму списка регистра сведений в режиме выбора (параметр РежимВыбора установлен в Истина), платформа при выборе строки возвращает КлючЗаписи. КлючЗаписи — это технический объект, который содержит только значения ключевых полей (измерений), обеспечивающих уникальность записи в базе данных. Он не содержит значений обычных реквизитов, даже если они визуально отображены в списке.

Если вы попытаетесь обратиться к ВыбранноеЗначение.Реквизит, платформа выдаст ошибку, так как КлючЗаписи не обладает такими свойствами. Чтобы получить доступ к данным, нам нужно «развернуть» этот ключ в полноценный объект.

Способ №1: Использование менеджера записи (Серверный подход)

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

Разберем этот процесс по шагам:

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

Пример реализации серверного получения данных:


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

Способ №2: Передача данных через структуру в оповещении (Клиентский подход)

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

Рассмотрим, как изменить модуль формы списка регистра:


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

После этого в вызывающей форме в ОбработкаВыбора мы получим уже готовую структуру:


&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
        // Теперь мы можем свободно обращаться к полям структуры
        Сообщить("Выбран контрагент: " + ВыбранноеЗначение.Контрагент);
    КонецЕсли;
КонецПроцедуры

Важные рекомендации при реализации

При работе с механизмами выбора в 1С обратите внимание на следующие нюансы:

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

← На главную