Программирование на платформе 1С:Предприятие таит в себе множество нюансов, которые не всегда лежат на поверхности или подробно описаны в официальной справке. Одной из таких интересных особенностей является работа с объектом Соответствие (Map). Большинство разработчиков привыкли использовать стандартный метод Вставить() для добавления новых пар «ключ-значение», однако существует альтернативный, более лаконичный синтаксис с использованием квадратных скобок []. Рассмотрим подробнее, как это работает, почему это возможно и стоит ли применять данный подход в реальных проектах.
Традиционно код для заполнения коллекции Соответствие выглядит следующим образом:
Карта = Новый Соответствие;
Карта.Вставить("0001", Истина);
Карта.Вставить("0002", Ложь);
Однако, как показывает практика и обсуждения опытных разработчиков, платформа поддерживает и другой вариант записи, который автоматически создает элемент, если ключа еще нет в коллекции:
Карта = Новый Соответствие;
Карта["0001"] = Истина;
Карта["0002"] = Ложь;
Карта["Круть"] = 100500;
Карта[Справочники.Номенклатура.ПустаяСсылка()] = '20190522';
Разберем, что здесь происходит. В момент выполнения строки Карта["0001"] = Истина платформа проверяет наличие ключа "0001". Если ключ найден, значение обновляется. Если ключа нет, он создается автоматически. Это поведение очень похоже на работу ассоциативных массивов в таких языках, как PHP, JavaScript или C#.
Проанализируем ситуацию с точки зрения производительности и логики работы платформы. На самом деле, оператор доступа по индексу [] в 1С реализован универсально. Но его поведение критически зависит от типа объекта, к которому мы обращаемся.
Структура["НовыйКлюч"] = 10; и такого ключа еще нет, система выдаст ошибку «Поле объекта не обнаружено». В структуре состав ключей (свойств) более жестко детерминирован.Массив[Размер + 1] приведет к ошибке выхода за границы диапазона.Выясним причину, по которой метод через квадратные скобки кажется многим удобнее. Во-первых, это сокращает объем кода. Во-вторых, для разработчиков, пришедших из других языков программирования, такой синтаксис является более естественным и читаемым. Однако стоит помнить, что в официальных стандартах разработки фирмы 1С рекомендуется использовать Вставить(), так как это явно указывает на намерение модифицировать коллекцию.
Многие программисты опасаются использовать недокументированные фичи. Посмотрим на пример из справки (синтакс-помощника). Там указано, что для объекта Соответствие доступно обращение к значению элемента посредством оператора [...]. Там не сказано прямо, что этот оператор можно использовать для создания нового элемента, но и запрета на это нет. Поскольку эта особенность работает стабильно еще со времен платформы 8.2.13, ее вряд ли можно считать «багом», который внезапно исправят.
Тем не менее, использование такого подхода несет определенные риски:
Вставить() проще поставить точку останова на метод, если нужно отловить момент изменения коллекции.Значение = Карта[Ключ], если ключа нет, вернется Неопределено. Если мы случайно используем это в выражении присваивания, мы можем создать лишние элементы в коллекции, не планируя этого.Рассмотрим ситуацию, где краткий синтаксис может быть полезен. Например, при подсчете количества вхождений элементов в поток данных:
Счетчик = Новый Соответствие;
Для Каждого Строка Из ТаблицаДанных Цикл
// Стандартный подход
ТекущееЗначение = Счетчик.Получить(Строка.Номенклатура);
НовоеЗначение = ?(ТекущееЗначение = Неопределено, 1, ТекущееЗначение + 1);
Счетчик.Вставить(Строка.Номенклатура, НовоеЗначение);
// Подход через квадратные скобки (лаконично)
Счетчик[Строка.Номенклатура] = ?(Счетчик[Строка.Номенклатура] = Неопределено, 1, Счетчик[Строка.Номенклатура] + 1);
КонецЦикла;
Проанализируем второй вариант. Он выглядит компактнее, хотя и требует внимательности. Важно помнить, что Соответствие — это единственная универсальная коллекция в 1С, где ключом может выступать любой тип данных: Число, Дата, Булево или любая Ссылка. Это делает использование [] еще более мощным инструментом.
В среде 1С-разработчиков часто ведутся споры о «синтаксическом сахаре» — конструкциях, которые не добавляют новых возможностей, но делают написание кода приятнее. Примером может служить тернарный оператор ?(). Одни считают, что Если ... Тогда ... КонецЕсли гораздо читабельнее, другие предпочитают экономить место на экране.
Посмотрим на это со стороны сопровождения кода. В 1С читабельность зачастую важнее размера листинга. Когда бизнес-логика сложная, километровые запросы и длинные названия переменных (например, Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия) помогают избежать ошибок. Использование «хаков» вроде квадратных скобок в Соответствии — это вопрос договоренности внутри команды разработки. Если вся команда понимает, как это работает, такой код имеет право на жизнь.
Мы разобрали малоизвестную, но эффективную возможность платформы 1С. Подведем итоги:
Карта[Ключ] = Значение полностью заменяет Карта.Вставить(Ключ, Значение) для объекта Соответствие.Структура при добавлении новых ключей.Век живи — век учись. Платформа 1С постоянно развивается, и знание таких тонкостей помогает писать более гибкий и современный код, даже если вы решите придерживаться классических методов в своей повседневной работе.