← Назад к вопросам

Что происходит, когда мы обращаемся к объекту через точку?

2.0 Middle🔥 161 комментариев
#Запросы и оптимизация#Стандарты разработки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Суть операции

Когда мы пишем Объект.Свойство, 1С выполняет серию действий на уровне виртуальной машины (ВМ) для доступа к данному свойству или методу.

Этапы обращения

1. Разрешение имени (Name Resolution)

Документ.Номер  // Что это? Свойство? Метод? Параметр?

1С должна определить, что представляет собой Номер:

  • Реквизит документа
  • Табличная часть
  • Метод (функция модуля)
  • Встроенное свойство (как Пустая() или Ссылка)
  • Локальная переменная

Порядок поиска:

  1. Локальные переменные текущего контекста
  2. Параметры функции
  3. Реквизиты (свойства объекта)
  4. Методы объекта
  5. Встроенные методы типа

2. Получение значения свойства

Для справочников, документов и регистров:

Справочник.Контрагенты.ПолучитьОбъект(Ссылка);  // Загружает из БД
Объект.Наименование;  // Возвращает значение из памяти

Из БД или из памяти?

  • Если объект уже в памяти (загружен ранее) → из памяти (быстро)
  • Если объект новый/изменённый → из памяти (правильно)
  • Если это Ссылка на объект без загрузки → 1С обращается к БД

3. Валидация типа (Type Checking)

1С проверяет, правомерно ли обращение:

// ✅ Корректно
Число = 5;
Число + 3;  // Сумма целых чисел

// ❌ Ошибка типа
Строка = "текст";
Строка + 3;  // Невозможно: строку нельзя складывать с числом

При строгой типизации:

Функция ДобавитьЧисло(Число: Число) -> Число
    Возврат Число + 1;
КонецФункции

Обращение к встроенным свойствам

Встроенные методы вызываются на уровне ВМ:

Таблица.Количество();  // Встроенный метод (быстро)
Таблица.Найти(Значение);  // Встроенный поиск (оптимизирован)

Пользовательские свойства:

Функция МойМетод()
    Возврат "результат";
КонецФункции

Результат = Объект.МойМетод();  // Выполняет код функции

Обращение к реквизитам документа

Документ = Документы.ПриходТоваров.ПолучитьОбъект(Ссылка);
Документ.Номер;  // Как это работает?

Схема доступа:

  1. 1С ищет в метаданных конфигурации определение документа
  2. Проверяет есть ли реквизит Номер в структуре ПриходТоваров
  3. Возвращает значение из переменной объекта в памяти
  4. Если объект не загружен → ленивая загрузка при первом обращении

Обращение к табличным частям

Документ.Товары.Добавить();  // Добавить строку
Документ.Товары[0].Номенклатура = ...;  // Доступ к колонке

Внутренний процесс:

  1. Документ.Товары → возвращает объект типа ТабличнаяЧасть
  2. .Добавить() → встроенный метод ТЗ
  3. [0] → возвращает строку (индексация в памяти)
  4. .Номенклатура → доступ к ячейке

Кэширование и оптимизация

// ❌ Неэффективно: многократный доступ
Для Индекс = 1 По 1000 Цикл
    Сумма = Сумма + Документ.Товары[Индекс].Цена;
КонецЦикла;

// ✅ Эффективно: один раз в переменную
Товары = Документ.Товары;
Для Индекс = 1 По Товары.Количество() Цикл
    Сумма = Сумма + Товары[Индекс].Цена;
КонецЦикла;

Обращение через динамические имена

ИмяСвойства = "Номер";
Значение = Документ[ИмяСвойства];  // Динамический доступ

Как это работает:

  1. 1С в runtime интерпретирует строку
  2. Ищет свойство с этим именем в объекте
  3. Если не найдено → исключение
  4. Медленнее чем прямой доступ

Практический пример производительности

// ❌ Медленно: обращение 1000 раз
Начало = ТекущееВремя();
Сумма = 0;
Для Индекс = 1 По Документ.Товары.Количество() Цикл
    Сумма = Сумма + Документ.Товары[Индекс].Цена * Документ.Товары[Индекс].Количество;
КонецЦикла;

// ✅ Быстро: кэширование
Начало = ТекущееВремя();
Сумма = 0;
Товары = Документ.Товары;
КолВо = Товары.Количество();
Для Индекс = 1 По КолВо Цикл
    СтрокаТовара = Товары[Индекс];
    Сумма = Сумма + СтрокаТовара.Цена * СтрокаТовара.Количество;
КонецЦикла;  // На 30% быстрее

Итоговая схема

Исходный код: Объект.Свойство
        ↓
Лексический анализ
        ↓
Синтаксический анализ (AST)
        ↓
Разрешение имён
        ↓
Проверка типов
        ↓
Генерация bytecode
        ↓
Выполнение на ВМ
        ↓
Результат

Понимание этих механик критично для оптимизации производительности в 1С.

Что происходит, когда мы обращаемся к объекту через точку? | PrepBro