При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью получить данные объекта (справочника или документа), имея на руках только ссылку на клиенте. Традиционно для этого использовались функции общего модуля ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Однако в современных конфигурациях, таких как УТ 11, ERP 2.5 или БП 3.0, можно заметить, что данные методы помечены аннотацией "Устарел" (Deprecated). В рамках данной статьи мы разберем, почему это произошло, какие подводные камни таит в себе работа с сервером с клиента и как писать код, применяя шаблоны для соблюдения стандартов и методик разработки конфигураций 1С.
Рассмотрим ситуацию, когда разработчик вызывает серверный метод для получения одного реквизита. На первый взгляд, это кажется удобным. Однако с точки зрения архитектуры платформы 1С, каждый такой вызов — это полноценный "круг" (round-trip) между клиентским приложением и сервером. Проанализируем, что происходит "под капотом":
Если подобных вызовов много (например, внутри цикла), производительность системы падает в геометрической прогрессии. Чтобы выявить такие проблемные места, рекомендуется проводить регулярный замер производительности контура 1С и поиск узких мест. Именно поэтому разработчики Библиотеки стандартных подсистем (БСП) пометили эти методы как устаревшие — чтобы стимулировать программистов использовать более эффективные подходы, а для автоматизированной проверки кода можно задействовать статический анализатор кода проектов.
Выясним причину, по которой использование функции ЗначениеРеквизитаОбъекта вообще появилось в практике. Рассмотрим два варианта получения данных на сервере:
Вариант 1: Обращение через точку
Наименование = СсылкаНаТовар.Наименование;
В этом случае платформа неявно считывает весь объект целиком из базы данных. Если в справочнике "Номенклатура" десятки реквизитов и несколько тяжелых табличных частей, 1С все равно прочитает их все и поместит в кэш объектов. Это крайне нерационально при необходимости получить только одну строку.
Вариант 2: Использование специализированной функции
Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаТовар, "Наименование");
Эта функция выполняет узконаправленный SQL-запрос SELECT Наименование FROM ... WHERE Ссылка = .... Это работает значительно быстрее и потребляет меньше памяти сервера.
Посмотрим на ситуацию, которая чаще всего приводит к замедлению работы интерфейса. Представим код, написанный на клиенте:
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Артикул = ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(СтрокаТЧ.Номенклатура, "Артикул");
// Какая-то логика
КонецЦикла;
Здесь кроется главная ошибка. На каждой итерации цикла приложение "ходит" на сервер. Если в таблице 100 строк, мы получим 100 серверных вызовов. Правильный подход заключается в том, чтобы один раз перейти в серверный контекст формы и использовать механизм, похожий на пакетную выборку данных, чтобы за один запрос получить данные для всех ссылок и вернуть их на клиент в виде структуры или соответствия.
В актуальных версиях БСП рекомендуется использовать метод ЗначенияРеквизитовОбъекта (во множественном числе). Разобраться во всех нюансах поможет справочник по методам БСП с примерами использования. Рассмотрим пример, как получить сразу несколько полей за один раз, что является хорошим тоном:
Данные = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаОбъект, "Артикул, Код, ПометкаУдаления");
Если Не Данные.ПометкаУдаления Тогда
Сообщить(Данные.Артикул);
КонецЕсли;
Даже если вам нужен всего один реквизит сейчас, использование метода, возвращающего структуру, позволяет в будущем легко расширить список получаемых полей без изменения архитектуры вызова.
Проанализируем важный параметр — ВыбратьРазрешенные. В 1С настроены права доступа на уровне записей (RLS).
Истина, функция вернет Неопределено, если у пользователя нет прав на чтение конкретного объекта. Это предотвращает аварийное завершение работы программы.Ложь, при попытке обращения к запрещенным данным система выдаст исключение.По умолчанию в большинстве функций БСП этот параметр позволяет безопасно проверять данные, не опасаясь ошибок доступа.
Если вам нужно получить данные для логики на форме, не стоит дергать общий модуль напрямую с клиента. Разберем по шагам правильную последовательность действий:
&НаСервереБезКонтекста (если не нужны данные самой формы) или &НаСервере.ОбщегоНазначения.ЗначенияРеквизитовОбъектов (для массива ссылок).Такой подход минимизирует количество транзакций между слоями приложения и обеспечивает максимальное быстродействие даже при слабом интернет-соединении.
Важно помнить, что стандартные функции ОбщегоНазначения обычно не кэшируют результат. Каждый вызов — это новое обращение к базе данных. Если вы понимаете, что одни и те же данные (например, настройки программы или валюта учета) требуются постоянно, рассмотрите возможность использования функций с префиксом ПовторноеИспользование или сохраняйте полученные данные в переменных модуля формы, чтобы не запрашивать их повторно.
Подведем итог: Статус "Устарел" — это не запрет, а предупреждение о том, что ваш код может работать неоптимально. Переход к пакетному чтению данных и минимизация серверных вызовов — ключевые навыки профессионального разработчика 1С.