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