Как правильно обращаться к свойствам объектов в 1С: через точку или квадратные скобки?

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

В процессе разработки на платформе «1С:Предприятие 8» программисты часто сталкиваются с дилеммой: как правильно обращаться к свойствам объектов, реквизитам или элементам коллекций? С одной стороны, существует классическое статическое обращение через точку (например, Объект.ИмяРеквизита). С другой стороны, синтаксис языка позволяет использовать квадратные скобки со строковым литералом (например, Объект["ИмяРеквизита"]). Некоторые разработчики отдают предпочтение второму варианту, мотивируя это эстетическими соображениями или особенностями подсветки синтаксиса в конфигураторе. Проанализируем эту ситуацию с точки зрения стандартов разработки, производительности системы, удобства поддержки и возможностей современных сред разработки.

Статическое обращение через точку: основы и преимущества

Использование оператора точка (.) является базовым и наиболее распространенным способом доступа к свойствам объектов в языке 1С. Этот подход называется статическим обращением, поскольку имя свойства жестко фиксируется в коде на этапе его написания. Рассмотрим ключевые преимущества данного подхода, которые делают его обязательным для большинства сценариев разработки:

  1. Работа автодополнения (IntelliSense). При вводе точки после объекта встроенный текстовый редактор конфигуратора или среды 1С:EDT мгновенно предлагает список доступных свойств, реквизитов и методов. Это значительно ускоряет написание кода и минимизирует количество опечаток. Если использовать квадратные скобки со строкой, среда разработки не сможет подсказать доступные варианты.
  2. Быстрый переход к объекту (F12). Использование точки позволяет использовать функцию «Перейти к определению». Например, выделив реквизит в коде Контрагент.ОсновнойДоговорКонтрагента и нажав горячую клавишу, мы мгновенно переместимся к этому реквизиту в дереве метаданных. При использовании конструкции Контрагент["ОсновнойДоговорКонтрагента"] такая навигация становится невозможной.
  3. Глобальный поиск по конфигурации. Если нам потребуется найти все места использования конкретного реквизита, поиск по строке вида «.ИмяРеквизита» даст точные результаты. Если же в коде хаотично используются конструкции с кавычками и скобками, поиск усложняется в разы, и возрастает риск пропустить важное упоминание реквизита.
  4. Автоматический рефакторинг. Современная среда разработки 1С:EDT (Enterprise Development Tools) поддерживает интеллектуальное переименование объектов метаданных и их свойств. Если мы решим переименовать реквизит СтатусОплаты в СтатусОплатыДокумента, среда разработки автоматически изменит все обращения через точку по всей конфигурации. Обращения, записанные в виде строк внутри квадратных скобок, инструмент рефакторинга проигнорирует, что приведет к фатальным ошибкам (Runtime Errors) при исполнении программы у пользователей.

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


// Правильно: статический доступ к реквизитам документа
СуммаДокумента = СсылкаНаДокумент.СуммаДокумента;
ВалютаДокумента = СсылкаНаДокумент.ВалютаРегламентированногоУчета;

Динамический доступ через квадратные скобки: когда он необходим?

Квадратные скобки ([]) представляют собой оператор динамического (или косвенного) обращения. Их использование оправдано и концептуально верно только в тех случаях, когда имя свойства или элемента заранее неизвестно и вычисляется непосредственно в процессе выполнения программного кода. Выделим основные ситуации, когда применение квадратных скобок является необходимым и единственно правильным решением:

  1. Итерирование по коллекциям и обход метаданных. Если нам необходимо в цикле обработать определенный набор реквизитов или колонок таблицы значений, имена которых хранятся в массиве или получаются динамически.
  2. Склеивание имени свойства из частей. Бывают задачи, когда имя реквизита зависит от какого-либо условия или индекса (например, Реквизит1, Реквизит2). В этом случае имя формируется конкатенацией строк.
  3. Работа со специализированными коллекциями данных. Например, при получении значений из соответствий (Соответствие) или структур, когда ключ передается в виде переменной.

Разберем практический пример, в котором использование квадратных скобок действительно необходимо для реализации универсального алгоритма обхода колонок таблицы значений:


// Пример динамического обхода колонок таблицы значений
Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
    Для Каждого Колонка Из ТаблицаТоваров.Колонки Цикл
        ИмяКолонки = Колонка.Имя;
        // Здесь имя свойства неизвестно на этапе компиляции,
        // поэтому использование квадратных скобок обязательно
        ТекущееЗначение = СтрокаТаблицы[ИмяКолонки];
        
        Если ТипЗнч(ТекущееЗначение) = Тип("Число") Тогда
            // Выполняем математические операции
            СтрокаТаблицы[ИмяКолонки] = ТекущееЗначение * Коэффициент;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Также квадратные скобки незаменимы при работе с объектом типа Соответствие, поскольку он изначально ориентирован на хранение пар "Ключ-Значение", где ключом может выступать объект любого типа (не только строка, удовлетворяющая правилам идентификаторов 1С):


// Работа с соответствием
ТаблицаСоответствий = Новый Соответствие;
ТаблицаСоответствий.Вставить(Справочники.Валюты.СистемнаяВалюта, 1.0);
ТаблицаСоответствий.Вставить(Справочники.Валюты.НайтиПоКоду("USD"), 85.5);

// Получение значения по ссылке-ключу через квадратные скобки
ТекущийКурс = ТаблицаСоответствий[СсылкаНаВалюту];

Анализ аргумента «подсветки черненьким» и субъективного удобства

Противная сторона спора часто приводит довод о том, что обращение вида Объект["ИмяРеквизита"] удобнее читать, так как строковый литерал в кавычках подсвечивается в конфигураторе другим цветом (черным или отличным от цвета переменных), что визуально выделяет имя свойства. Проанализируем, почему этот аргумент несостоятелен и даже опасен:

Технические нюансы производительности и компиляции

Выясним, как ведет себя платформа «1С:Предприятие 8» на уровне виртуальной машины при обработке этих двух конструкций. Существует распространенное заблуждение, что разницы в быстродействии нет. Однако технические замеры и логика работы платформы говорят о следующем:

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

При использовании квадратных скобок со строковым литералом (Объект["Свойство"]) платформе на этапе выполнения (runtime) приходится производить дополнительные операции:

  1. Вычислить выражение внутри квадратных скобок (в данном случае получить строковую константу).
  2. Вычислить хэш-код полученной строки.
  3. Выполнить динамический поиск по хэш-таблице свойств объекта для нахождения соответствующего индекса или адреса памяти.

На единичных операциях разница в микросекундах будет незаметна. Но если мы выполняем обработку больших массивов данных в цикле на миллионы итераций, разница в производительности становится ощутимой. Обращение через точку в таких сценариях работает стабильно быстрее и расходует меньше ресурсов процессора.

Официальные стандарты разработки фирмы «1С» и автоматизированный контроль

Фирма «1С» строго регламентирует требования к оформлению кода. В официальном документе «Стандарты и методики разработки», публикуемом на ИТС, четко прописано:

Использование квадратных скобок для статического обращения к свойствам объектов (когда имя свойства известно на этапе разработки) не допускается и является грубым нарушением стандартов кодирования.

Для контроля качества кода в современных командах используются специализированные инструменты автоматического анализа:

Специфика работы со структурами, соответствиями и COM-объектами

Рассмотрим важные семантические различия системных коллекций 1С, которые влияют на выбор синтаксиса:

Структура. Ключи структуры должны удовлетворять требованиям к именам переменных (не могут содержать пробелов, спецсимволов и начинаться с цифры). К свойствам структуры рекомендуется всегда обращаться через точку. Если попытаться программно обратиться к структуре через скобки с невалидным именем ключа (например, Структура["Мой Ключ!"]), платформа выдаст ошибку.

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

COM-соединения. При интеграции с внешними системами (например, через COM-объекты Microsoft Excel, ADODB или другую базу 1С) использование квадратных скобок для обращения к свойствам внешних объектов часто приводит к падению системы с ошибкой «Метод объекта не обнаружен». Платформа корректно транслирует вызовы во внешние COM-интерфейсы только при использовании оператора точка (.).

Посмотрим на сравнительную таблицу правильного использования операторов доступа:

Тип объекта / Операция Использование точки (.) Использование скобок ([])
Реквизиты справочников, документов Обязательно (Объект.Наименование) Запрещено стандартами (Объект["Наименование"])
Свойства структуры (Structure) Рекомендуется (Структура.Ключ) Допускается только при динамическом расчете имени ключа
Элементы соответствия (Map) Невозможно синтаксически Обязательно (Соответствие[Ключ])
Колонки Таблицы значений (в цикле) Неприменимо для универсальных алгоритмов Рекомендуется для динамического доступа
COM-объекты (Excel, Word и др.) Обязательно (Excel.Application.Visible) Не поддерживается / Вызывает ошибки

Резюме и рекомендации для разработчиков

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

Для создания качественного, быстрого и поддерживаемого кода рекомендуем придерживаться следующего простого правила: если имя свойства известно на этапе написания кода — всегда пишите точку; если имя свойства вычисляется динамически во время выполнения программы или вы работаете со специфичной коллекцией (Соответствие, Массив) — используйте квадратные скобки. Это убережет ваши программные продукты от скрытых ошибок времени выполнения, облегчит рефакторинг и сделает код понятным для любого другого разработчика, который будет заниматься его поддержкой в будущем.

← На главную