В среде разработчиков 1С укоренилось мнение, что обращение к реквизитам объекта через точку (например, СсылкаНаДокумент.Дата) — это «плохой тон» и признак низкой квалификации. Однако платформа десятилетиями сохраняет этот механизм. Разберемся детально, почему этот инструмент существует, какие процессы он запускает в оперативной памяти и на сервере СУБД, и когда «греховная» точка на самом деле эффективнее изящного запроса.
Проанализируем ситуацию: когда мы пишем КонтрагентСсылка.ИНН, платформа 1С не просто запрашивает одно поле из таблицы. Она выполняет полноценное считывание всего объекта. На уровне SQL это превращается в запрос SELECT * FROM ... WHERE ID = .... В память сервера приложений (в рабочий процесс rphost) передаются все реквизиты объекта, включая все его табличные части и даже реквизиты с типами «ХранилищеЗначения», если они не вынесены в отдельные таблицы.
Рассмотрим ключевые особенности этого процесса:
Несмотря на избыточность, использование точки имеет свои неоспоримые плюсы, которые мы разберем далее.
1. Скорость разработки и читаемость кода
Напишем и сравним два фрагмента кода для получения одного реквизита. Вариант с запросом:
Запрос = Новый Запрос("ВЫБРАТЬ ИНН ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", СсылкаНаКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ИНН = Выборка.ИНН;
КонецЕсли;
Вариант через точку:
ИНН = СсылкаНаКонтрагента.ИНН;
Второй вариант в 5 раз короче. Если это не критичный к нагрузке участок (например, форма настройки или разовая обработка), экономия времени программиста и простота дальнейшей поддержки кода перевешивают затраты серверных ресурсов.
2. Обеспечение логической целостности (Объектный подход)
Выясним важную деталь: обращение через точку гарантирует, что вы получите состояние объекта на один и тот же момент времени. Если вы читаете 10 реквизитов через точку, вы читаете «срез» одного объекта. Если вы будете делать 10 отдельных запросов (что утрированно, но случается), между первым и десятым запросом данные в базе могут быть изменены другим пользователем. Объектная модель 1С спроектирована так, чтобы вы работали с целостной сущностью.
3. Повторное использование данных
Если в алгоритме вам нужно обратиться к 15 реквизитам одного и того же справочника в разных местах процедуры, первое обращение через точку «прогреет» кэш, и последующие 14 обращений отработают быстрее, чем любой, даже самый оптимизированный запрос, так как не будет затрат на сетевой трафик до SQL-сервера.
Главный сценарий, где точка абсолютно недопустима — это циклы. Рассмотрим классическую ошибку:
Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
Артикул = СтрокаТЧ.Номенклатура.Артикул; // ОШИБКА!
КонецЦикла;
Если в табличной части 100 строк, система выполнит 100 отдельных SQL-запросов к таблице номенклатуры, каждый раз вычитывая все поля карточки товара. Это классическая проблема «N+1». В таких случаях необходимо заранее выбрать все артикулы одним запросом во временную таблицу или структуру.
Разберем, чем заменить точку, если объект целиком нам не нужен, а писать запрос слишком долго.
В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) предусмотрен «золотой стандарт» — модуль ОбщегоНазначения. Рассмотрим его методы:
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ИмяРеквизита") — выполняет быстрый запрос к базе, извлекая только одно указанное поле.ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Рекв1, Рекв2") — возвращает структуру с нужными данными.ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивСсылок, "ИмяРеквизита") — идеален для работы с массивами данных вне циклов.Проанализируем производительность: эти методы используют закэшированные тексты запросов, что делает их крайне быстрыми, при этом они не забивают память сервера ненужными табличными частями объектов.
Не многие знают, что существуют обращения через точку, которые не вызывают обращения к базе данных или не читают объект целиком. Проанализируем их:
Ссылка.Ссылка — платформа понимает тавтологию и не идет в базу.ТипЗнч(Ссылка) — информация о типе хранится в самой ссылке.Ссылка.УникальныйИдентификатор() — ГУИД является частью ссылки, чтение объекта не требуется.ПредставлениеСсылки = Строка(Ссылка) — если представление объекта (например, Наименование + Код) настроено стандартно, платформа часто может получить его без полной десериализации объекта.Подведем итог и сформулируем правила использования точки при обращении к реквизитам:
ЗначениеРеквизитаОбъекта как компромиссом между скоростью разработки и производительностью системы.Таким образом, точка — это не ошибка проектирования платформы, а мощный инструмент с автоматическим кэшированием, который требует осознанного применения. Платформа 1С дает разработчику выбор: либо строгий контроль ресурсов через запросы, либо высокая скорость разработки через объектную модель.