В процессе разработки на платформе «1С:Предприятие 8» программисты часто сталкиваются с дилеммой: как правильно обращаться к свойствам объектов, реквизитам или элементам коллекций? С одной стороны, существует классическое статическое обращение через точку (например, Объект.ИмяРеквизита). С другой стороны, синтаксис языка позволяет использовать квадратные скобки со строковым литералом (например, Объект["ИмяРеквизита"]). Некоторые разработчики отдают предпочтение второму варианту, мотивируя это эстетическими соображениями или особенностями подсветки синтаксиса в конфигураторе. Проанализируем эту ситуацию с точки зрения стандартов разработки, производительности системы, удобства поддержки и возможностей современных сред разработки.
Использование оператора точка (.) является базовым и наиболее распространенным способом доступа к свойствам объектов в языке 1С. Этот подход называется статическим обращением, поскольку имя свойства жестко фиксируется в коде на этапе его написания. Рассмотрим ключевые преимущества данного подхода, которые делают его обязательным для большинства сценариев разработки:
Контрагент.ОсновнойДоговорКонтрагента и нажав горячую клавишу, мы мгновенно переместимся к этому реквизиту в дереве метаданных. При использовании конструкции Контрагент["ОсновнойДоговорКонтрагента"] такая навигация становится невозможной.СтатусОплаты в СтатусОплатыДокумента, среда разработки автоматически изменит все обращения через точку по всей конфигурации. Обращения, записанные в виде строк внутри квадратных скобок, инструмент рефакторинга проигнорирует, что приведет к фатальным ошибкам (Runtime Errors) при исполнении программы у пользователей.Посмотрим на классический пример правильного статического обращения к свойствам документа:
// Правильно: статический доступ к реквизитам документа
СуммаДокумента = СсылкаНаДокумент.СуммаДокумента;
ВалютаДокумента = СсылкаНаДокумент.ВалютаРегламентированногоУчета;
Квадратные скобки ([]) представляют собой оператор динамического (или косвенного) обращения. Их использование оправдано и концептуально верно только в тех случаях, когда имя свойства или элемента заранее неизвестно и вычисляется непосредственно в процессе выполнения программного кода. Выделим основные ситуации, когда применение квадратных скобок является необходимым и единственно правильным решением:
Реквизит1, Реквизит2). В этом случае имя формируется конкатенацией строк.Соответствие) или структур, когда ключ передается в виде переменной.Разберем практический пример, в котором использование квадратных скобок действительно необходимо для реализации универсального алгоритма обхода колонок таблицы значений:
// Пример динамического обхода колонок таблицы значений
Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
Для Каждого Колонка Из ТаблицаТоваров.Колонки Цикл
ИмяКолонки = Колонка.Имя;
// Здесь имя свойства неизвестно на этапе компиляции,
// поэтому использование квадратных скобок обязательно
ТекущееЗначение = СтрокаТаблицы[ИмяКолонки];
Если ТипЗнч(ТекущееЗначение) = Тип("Число") Тогда
// Выполняем математические операции
СтрокаТаблицы[ИмяКолонки] = ТекущееЗначение * Коэффициент;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Также квадратные скобки незаменимы при работе с объектом типа Соответствие, поскольку он изначально ориентирован на хранение пар "Ключ-Значение", где ключом может выступать объект любого типа (не только строка, удовлетворяющая правилам идентификаторов 1С):
// Работа с соответствием
ТаблицаСоответствий = Новый Соответствие;
ТаблицаСоответствий.Вставить(Справочники.Валюты.СистемнаяВалюта, 1.0);
ТаблицаСоответствий.Вставить(Справочники.Валюты.НайтиПоКоду("USD"), 85.5);
// Получение значения по ссылке-ключу через квадратные скобки
ТекущийКурс = ТаблицаСоответствий[СсылкаНаВалюту];
Противная сторона спора часто приводит довод о том, что обращение вида Объект["ИмяРеквизита"] удобнее читать, так как строковый литерал в кавычках подсвечивается в конфигураторе другим цветом (черным или отличным от цвета переменных), что визуально выделяет имя свойства. Проанализируем, почему этот аргумент несостоятелен и даже опасен:
Объект["Наименоване"]) не будет обнаружена конфигуратором при синтаксическом контроле. Программа успешно скомпилируется, а сбой произойдет непосредственно у пользователя в процессе работы. При использовании точки синтаксический контроль (и тем более строгая проверка в EDT) сразу выдаст предупреждение о наличии ошибки.а.б и избыточное а["б"].Выясним, как ведет себя платформа «1С:Предприятие 8» на уровне виртуальной машины при обработке этих двух конструкций. Существует распространенное заблуждение, что разницы в быстродействии нет. Однако технические замеры и логика работы платформы говорят о следующем:
Код на языке 1С компилируется в промежуточный байт-код, который затем интерпретируется виртуальной машиной платформы. При компиляции конструкции с точкой (Объект.Свойство) платформа может выполнить раннее связывание или оптимизировать доступ, закэшировав внутренний идентификатор свойства. Имя свойства известно заранее, и его поиск в таблице свойств объекта происходит максимально быстро.
При использовании квадратных скобок со строковым литералом (Объект["Свойство"]) платформе на этапе выполнения (runtime) приходится производить дополнительные операции:
На единичных операциях разница в микросекундах будет незаметна. Но если мы выполняем обработку больших массивов данных в цикле на миллионы итераций, разница в производительности становится ощутимой. Обращение через точку в таких сценариях работает стабильно быстрее и расходует меньше ресурсов процессора.
Фирма «1С» строго регламентирует требования к оформлению кода. В официальном документе «Стандарты и методики разработки», публикуемом на ИТС, четко прописано:
Использование квадратных скобок для статического обращения к свойствам объектов (когда имя свойства известно на этапе разработки) не допускается и является грубым нарушением стандартов кодирования.
Для контроля качества кода в современных командах используются специализированные инструменты автоматического анализа:
Объект["Свойство"] как ошибку стиля и несоответствие стандартам.Рассмотрим важные семантические различия системных коллекций 1С, которые влияют на выбор синтаксиса:
Структура. Ключи структуры должны удовлетворять требованиям к именам переменных (не могут содержать пробелов, спецсимволов и начинаться с цифры). К свойствам структуры рекомендуется всегда обращаться через точку. Если попытаться программно обратиться к структуре через скобки с невалидным именем ключа (например, Структура["Мой Ключ!"]), платформа выдаст ошибку.
Соответствие. Позволяет использовать любые типы данных в качестве ключа. Обращение через точку к соответствию синтаксически невозможно. Используйте только квадратные скобки Соответствие[Ключ] или метод Получить(). Важная особенность: если ключа нет в соответствии, обращение через [] не вызовет ошибку, а вернет значение Неопределено, в то время как у структуры обращение к несуществующему свойству через точку или скобки вызовет аварийное завершение программы (исключение).
COM-соединения. При интеграции с внешними системами (например, через COM-объекты Microsoft Excel, ADODB или другую базу 1С) использование квадратных скобок для обращения к свойствам внешних объектов часто приводит к падению системы с ошибкой «Метод объекта не обнаружен». Платформа корректно транслирует вызовы во внешние COM-интерфейсы только при использовании оператора точка (.).
Посмотрим на сравнительную таблицу правильного использования операторов доступа:
| Тип объекта / Операция | Использование точки (.) | Использование скобок ([]) |
|---|---|---|
| Реквизиты справочников, документов | Обязательно (Объект.Наименование) | Запрещено стандартами (Объект["Наименование"]) |
| Свойства структуры (Structure) | Рекомендуется (Структура.Ключ) | Допускается только при динамическом расчете имени ключа |
| Элементы соответствия (Map) | Невозможно синтаксически | Обязательно (Соответствие[Ключ]) |
| Колонки Таблицы значений (в цикле) | Неприменимо для универсальных алгоритмов | Рекомендуется для динамического доступа |
| COM-объекты (Excel, Word и др.) | Обязательно (Excel.Application.Visible) | Не поддерживается / Вызывает ошибки |
Подводя итог, можно с уверенностью сказать, что использование квадратных скобок для статического обращения к свойствам объектов в 1С является плохим стилем программирования и нарушением официальных стандартов. Написание кода должно подчиняться строгим правилам командной разработки, а не сиюминутным эстетическим предпочтениям отдельных сотрудников.
Для создания качественного, быстрого и поддерживаемого кода рекомендуем придерживаться следующего простого правила: если имя свойства известно на этапе написания кода — всегда пишите точку; если имя свойства вычисляется динамически во время выполнения программы или вы работаете со специфичной коллекцией (Соответствие, Массив) — используйте квадратные скобки. Это убережет ваши программные продукты от скрытых ошибок времени выполнения, облегчит рефакторинг и сделает код понятным для любого другого разработчика, который будет заниматься его поддержкой в будущем.