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