Как правильно получать значения реквизитов объекта с клиента в 1С и почему метод ЗначениеРеквизитаОбъекта считается устаревшим

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

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью получить данные объекта (справочника или документа), имея на руках только ссылку на клиенте. Традиционно для этого использовались функции общего модуля ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Однако в современных конфигурациях, таких как УТ 11, ERP 2.5 или БП 3.0, можно заметить, что данные методы помечены аннотацией "Устарел" (Deprecated). В рамках данной статьи мы разберем, почему это произошло, какие подводные камни таит в себе работа с сервером с клиента и как писать код, применяя шаблоны для соблюдения стандартов и методик разработки конфигураций 1С.

Анализ проблемы: почему метод помечен как устаревший

Рассмотрим ситуацию, когда разработчик вызывает серверный метод для получения одного реквизита. На первый взгляд, это кажется удобным. Однако с точки зрения архитектуры платформы 1С, каждый такой вызов — это полноценный "круг" (round-trip) между клиентским приложением и сервером. Проанализируем, что происходит "под капотом":

  1. Сериализация: Клиент упаковывает параметры вызова (ссылку и имя реквизита) в пакет для передачи.
  2. Сетевой трафик: Пакет передается по сети на сервер приложений.
  3. Десериализация: Сервер распаковывает данные.
  4. Запрос к БД: Выполняется SQL-запрос.
  5. Обратный процесс: Результат снова упаковывается, передается на клиент и распаковывается.

Если подобных вызовов много (например, внутри цикла), производительность системы падает в геометрической прогрессии. Чтобы выявить такие проблемные места, рекомендуется проводить регулярный замер производительности контура 1С и поиск узких мест. Именно поэтому разработчики Библиотеки стандартных подсистем (БСП) пометили эти методы как устаревшие — чтобы стимулировать программистов использовать более эффективные подходы, а для автоматизированной проверки кода можно задействовать статический анализатор кода проектов.

Разница между обращением через точку и функцией модуля

Выясним причину, по которой использование функции ЗначениеРеквизитаОбъекта вообще появилось в практике. Рассмотрим два варианта получения данных на сервере:

Вариант 1: Обращение через точку

Наименование = СсылкаНаТовар.Наименование;

В этом случае платформа неявно считывает весь объект целиком из базы данных. Если в справочнике "Номенклатура" десятки реквизитов и несколько тяжелых табличных частей, 1С все равно прочитает их все и поместит в кэш объектов. Это крайне нерационально при необходимости получить только одну строку.

Вариант 2: Использование специализированной функции


Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаТовар, "Наименование");

Эта функция выполняет узконаправленный SQL-запрос SELECT Наименование FROM ... WHERE Ссылка = .... Это работает значительно быстрее и потребляет меньше памяти сервера.

Проблема N+1 и избыточные вызовы

Посмотрим на ситуацию, которая чаще всего приводит к замедлению работы интерфейса. Представим код, написанный на клиенте:


Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    Артикул = ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(СтрокаТЧ.Номенклатура, "Артикул");
    // Какая-то логика
КонецЦикла;

Здесь кроется главная ошибка. На каждой итерации цикла приложение "ходит" на сервер. Если в таблице 100 строк, мы получим 100 серверных вызовов. Правильный подход заключается в том, чтобы один раз перейти в серверный контекст формы и использовать механизм, похожий на пакетную выборку данных, чтобы за один запрос получить данные для всех ссылок и вернуть их на клиент в виде структуры или соответствия.

Современный стандарт: пакетное чтение данных

В актуальных версиях БСП рекомендуется использовать метод ЗначенияРеквизитовОбъекта (во множественном числе). Разобраться во всех нюансах поможет справочник по методам БСП с примерами использования. Рассмотрим пример, как получить сразу несколько полей за один раз, что является хорошим тоном:


Данные = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаОбъект, "Артикул, Код, ПометкаУдаления");
Если Не Данные.ПометкаУдаления Тогда
    Сообщить(Данные.Артикул);
КонецЕсли;

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

Использование параметра ВыбратьРазрешенные

Проанализируем важный параметр — ВыбратьРазрешенные. В 1С настроены права доступа на уровне записей (RLS).

По умолчанию в большинстве функций БСП этот параметр позволяет безопасно проверять данные, не опасаясь ошибок доступа.

Как правильно организовать работу на форме

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

  1. Создайте на форме процедуру с директивой &НаСервереБезКонтекста (если не нужны данные самой формы) или &НаСервере.
  2. В этой процедуре соберите массив нужных ссылок.
  3. Вызовите метод ОбщегоНазначения.ЗначенияРеквизитовОбъектов (для массива ссылок).
  4. Верните результат на клиент.

Такой подход минимизирует количество транзакций между слоями приложения и обеспечивает максимальное быстродействие даже при слабом интернет-соединении.

Резюме по использованию кэширования

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

Подведем итог: Статус "Устарел" — это не запрет, а предупреждение о том, что ваш код может работать неоптимально. Переход к пакетному чтению данных и минимизация серверных вызовов — ключевые навыки профессионального разработчика 1С.

← На главную