← Назад к вопросам
Что происходит, когда мы обращаемся к объекту через точку?
2.0 Middle🔥 161 комментариев
#Запросы и оптимизация#Стандарты разработки
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Суть операции
Когда мы пишем Объект.Свойство, 1С выполняет серию действий на уровне виртуальной машины (ВМ) для доступа к данному свойству или методу.
Этапы обращения
1. Разрешение имени (Name Resolution)
Документ.Номер // Что это? Свойство? Метод? Параметр?
1С должна определить, что представляет собой Номер:
- Реквизит документа
- Табличная часть
- Метод (функция модуля)
- Встроенное свойство (как
Пустая()илиСсылка) - Локальная переменная
Порядок поиска:
- Локальные переменные текущего контекста
- Параметры функции
- Реквизиты (свойства объекта)
- Методы объекта
- Встроенные методы типа
2. Получение значения свойства
Для справочников, документов и регистров:
Справочник.Контрагенты.ПолучитьОбъект(Ссылка); // Загружает из БД
Объект.Наименование; // Возвращает значение из памяти
Из БД или из памяти?
- Если объект уже в памяти (загружен ранее) → из памяти (быстро)
- Если объект новый/изменённый → из памяти (правильно)
- Если это
Ссылкана объект без загрузки → 1С обращается к БД
3. Валидация типа (Type Checking)
1С проверяет, правомерно ли обращение:
// ✅ Корректно
Число = 5;
Число + 3; // Сумма целых чисел
// ❌ Ошибка типа
Строка = "текст";
Строка + 3; // Невозможно: строку нельзя складывать с числом
При строгой типизации:
Функция ДобавитьЧисло(Число: Число) -> Число
Возврат Число + 1;
КонецФункции
Обращение к встроенным свойствам
Встроенные методы вызываются на уровне ВМ:
Таблица.Количество(); // Встроенный метод (быстро)
Таблица.Найти(Значение); // Встроенный поиск (оптимизирован)
Пользовательские свойства:
Функция МойМетод()
Возврат "результат";
КонецФункции
Результат = Объект.МойМетод(); // Выполняет код функции
Обращение к реквизитам документа
Документ = Документы.ПриходТоваров.ПолучитьОбъект(Ссылка);
Документ.Номер; // Как это работает?
Схема доступа:
- 1С ищет в метаданных конфигурации определение документа
- Проверяет есть ли реквизит
Номерв структуреПриходТоваров - Возвращает значение из переменной объекта в памяти
- Если объект не загружен → ленивая загрузка при первом обращении
Обращение к табличным частям
Документ.Товары.Добавить(); // Добавить строку
Документ.Товары[0].Номенклатура = ...; // Доступ к колонке
Внутренний процесс:
Документ.Товары→ возвращает объект типаТабличнаяЧасть.Добавить()→ встроенный метод ТЗ[0]→ возвращает строку (индексация в памяти).Номенклатура→ доступ к ячейке
Кэширование и оптимизация
// ❌ Неэффективно: многократный доступ
Для Индекс = 1 По 1000 Цикл
Сумма = Сумма + Документ.Товары[Индекс].Цена;
КонецЦикла;
// ✅ Эффективно: один раз в переменную
Товары = Документ.Товары;
Для Индекс = 1 По Товары.Количество() Цикл
Сумма = Сумма + Товары[Индекс].Цена;
КонецЦикла;
Обращение через динамические имена
ИмяСвойства = "Номер";
Значение = Документ[ИмяСвойства]; // Динамический доступ
Как это работает:
- 1С в runtime интерпретирует строку
- Ищет свойство с этим именем в объекте
- Если не найдено → исключение
- Медленнее чем прямой доступ
Практический пример производительности
// ❌ Медленно: обращение 1000 раз
Начало = ТекущееВремя();
Сумма = 0;
Для Индекс = 1 По Документ.Товары.Количество() Цикл
Сумма = Сумма + Документ.Товары[Индекс].Цена * Документ.Товары[Индекс].Количество;
КонецЦикла;
// ✅ Быстро: кэширование
Начало = ТекущееВремя();
Сумма = 0;
Товары = Документ.Товары;
КолВо = Товары.Количество();
Для Индекс = 1 По КолВо Цикл
СтрокаТовара = Товары[Индекс];
Сумма = Сумма + СтрокаТовара.Цена * СтрокаТовара.Количество;
КонецЦикла; // На 30% быстрее
Итоговая схема
Исходный код: Объект.Свойство
↓
Лексический анализ
↓
Синтаксический анализ (AST)
↓
Разрешение имён
↓
Проверка типов
↓
Генерация bytecode
↓
Выполнение на ВМ
↓
Результат
Понимание этих механик критично для оптимизации производительности в 1С.