Зачем нужна точка при обращении к реквизитам 1С и как она работает на самом деле

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

В среде разработчиков 1С укоренилось мнение, что обращение к реквизитам объекта через точку (например, СсылкаНаДокумент.Дата) — это «плохой тон» и признак низкой квалификации. Однако платформа десятилетиями сохраняет этот механизм. Разберемся детально, почему этот инструмент существует, какие процессы он запускает в оперативной памяти и на сервере СУБД, и когда «греховная» точка на самом деле эффективнее изящного запроса.

Механика «точки»: что происходит под капотом

Проанализируем ситуацию: когда мы пишем КонтрагентСсылка.ИНН, платформа 1С не просто запрашивает одно поле из таблицы. Она выполняет полноценное считывание всего объекта. На уровне SQL это превращается в запрос SELECT * FROM ... WHERE ID = .... В память сервера приложений (в рабочий процесс rphost) передаются все реквизиты объекта, включая все его табличные части и даже реквизиты с типами «ХранилищеЗначения», если они не вынесены в отдельные таблицы.

Рассмотрим ключевые особенности этого процесса:

  1. Объектный кэш: После первого обращения через точку весь объект попадает в кэш сеанса. Повторные обращения к любым другим реквизитам этого же объекта (например, к КПП или Наименованию) в течение того же серверного вызова (или короткого промежутка времени) уже не потребуют обращения к базе данных. Данные будут мгновенно извлечены из оперативной памяти.
  2. Срок жизни кэша: Согласно документации 1С, данные удерживаются в кэше около 20 минут. Однако есть важный нюанс: через 20 секунд после попадания в кэш при очередном обращении система выполнит проверку (версионный контроль) — не изменился ли объект в базе. Если изменился, кэш обновится.
  3. Транзакционный кэш: Внутри транзакции система использует отдельный, гарантированно актуальный кэш, чтобы исключить чтение устаревших данных.

Когда точка оправдана: аргументы «ЗА»

Несмотря на избыточность, использование точки имеет свои неоспоримые плюсы, которые мы разберем далее.

1. Скорость разработки и читаемость кода
Напишем и сравним два фрагмента кода для получения одного реквизита. Вариант с запросом:


Запрос = Новый Запрос("ВЫБРАТЬ ИНН ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", СсылкаНаКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ИНН = Выборка.ИНН;
КонецЕсли;

Вариант через точку:

ИНН = СсылкаНаКонтрагента.ИНН;

Второй вариант в 5 раз короче. Если это не критичный к нагрузке участок (например, форма настройки или разовая обработка), экономия времени программиста и простота дальнейшей поддержки кода перевешивают затраты серверных ресурсов.

2. Обеспечение логической целостности (Объектный подход)
Выясним важную деталь: обращение через точку гарантирует, что вы получите состояние объекта на один и тот же момент времени. Если вы читаете 10 реквизитов через точку, вы читаете «срез» одного объекта. Если вы будете делать 10 отдельных запросов (что утрированно, но случается), между первым и десятым запросом данные в базе могут быть изменены другим пользователем. Объектная модель 1С спроектирована так, чтобы вы работали с целостной сущностью.

3. Повторное использование данных
Если в алгоритме вам нужно обратиться к 15 реквизитам одного и того же справочника в разных местах процедуры, первое обращение через точку «прогреет» кэш, и последующие 14 обращений отработают быстрее, чем любой, даже самый оптимизированный запрос, так как не будет затрат на сетевой трафик до SQL-сервера.

Когда точка становится ядом: проблема N+1

Главный сценарий, где точка абсолютно недопустима — это циклы. Рассмотрим классическую ошибку:


Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
    Артикул = СтрокаТЧ.Номенклатура.Артикул; // ОШИБКА!
КонецЦикла;

Если в табличной части 100 строк, система выполнит 100 отдельных SQL-запросов к таблице номенклатуры, каждый раз вычитывая все поля карточки товара. Это классическая проблема «N+1». В таких случаях необходимо заранее выбрать все артикулы одним запросом во временную таблицу или структуру.

Альтернативные методы получения данных

Разберем, чем заменить точку, если объект целиком нам не нужен, а писать запрос слишком долго.

В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) предусмотрен «золотой стандарт» — модуль ОбщегоНазначения. Рассмотрим его методы:

  1. ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ИмяРеквизита") — выполняет быстрый запрос к базе, извлекая только одно указанное поле.
  2. ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Рекв1, Рекв2") — возвращает структуру с нужными данными.
  3. ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивСсылок, "ИмяРеквизита") — идеален для работы с массивами данных вне циклов.

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

Исключения: «Бесплатные» обращения через точку

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

Резюме: правила хорошего тона

Подведем итог и сформулируем правила использования точки при обращении к реквизитам:

  1. Никогда не используйте точку в циклах по ссылочным типам. Здесь только запрос или предварительная подготовка данных.
  2. Используйте точку в нечасто запускаемом коде, если вам нужно получить 1-2 простых реквизита (например, номер или дату документа) и вы не хотите «раздувать» код запросами.
  3. Используйте точку, если вам нужно более 50% реквизитов объекта. В этом случае накладные расходы на формирование структуры запроса и передачу данных по полям будут сопоставимы с чтением объекта целиком.
  4. Пользуйтесь функциями БСП ЗначениеРеквизитаОбъекта как компромиссом между скоростью разработки и производительностью системы.
  5. Помните про «тяжелые» объекты. Обращение через точку к маленькому справочнику «Ставки НДС» практически безвредно. Обращение через точку к огромному документу «Начисление зарплаты» с тысячами строк в ТЧ — это серьезный удар по памяти сервера.

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

← На главную