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

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

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

Причина возникновения ошибки

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

Правильное решение: обращение к серверу

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

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


ПараметрыПодбора = Новый Структура("ЗакрыватьПриВыборе", Истина);
Эл = ОткрытьФормуМодально("Справочник.Номенклатура.ФормаВыбора", ПараметрыПодбора);

После того как мы получили ссылку в переменную Эл, нам нужно отправить ее в серверную функцию для получения кода:


Если ЗначениеЗаполнено(Эл) Тогда
    КодЭлемента = ПолучитьКодЭлементаНаСервере(Эл);
КонецЕсли;

&НаСервереБезКонтекста
Функция ПолучитьКодЭлементаНаСервере(Ссылка)
    Возврат Ссылка.Код;
КонецФункции

Почему это важно

  1. Разделение контекста: На клиенте недопустимы тяжелые обращения к базе данных. Использование функций &НаСервереБезКонтекста позволяет платформе эффективно взаимодействовать с СУБД.
  2. Тип данных: Когда вы видите в отладчике тип СправочникСсылка.Номенклатура, это подтверждает, что ссылка получена успешно. Вы можете передавать эту ссылку в любые серверные процедуры, где доступны методы для считывания объектов.
  3. Безопасность и производительность: Выполнение операций на сервере гарантирует, что вы получите актуальные данные из базы, не перегружая при этом клиентское приложение.

Отказ от модальности в современном коде

Важно отметить, что метод ОткрытьФормуМодально постепенно вытесняется из современной разработки. Платформа 1С рекомендует переходить на асинхронные вызовы. В будущем старайтесь использовать метод ОткрытьФорму с передачей обработчика оповещения.

При использовании асинхронного подхода вы открываете форму и указываете процедуру, которая будет вызвана при закрытии окна выбора:


// На клиенте
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", Параметры, ЭтаФорма);

// В этой же форме обработчик
&НаКлиенте
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
    // Получаем реквизиты на сервере
    КодОбъекта = ПолучитьКодНаСервере(ЗначениеВыбора);
КонецПроцедуры

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

← На главную