Как использовать квадратные скобки для добавления элементов в Соответствие в 1С

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

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

Суть вопроса: использование квадратных скобок для инициализации

Традиционно код для заполнения коллекции Соответствие выглядит следующим образом:


Карта = Новый Соответствие;
Карта.Вставить("0001", Истина);
Карта.Вставить("0002", Ложь);

Однако, как показывает практика и обсуждения опытных разработчиков, платформа поддерживает и другой вариант записи, который автоматически создает элемент, если ключа еще нет в коллекции:


Карта = Новый Соответствие;
Карта["0001"] = Истина;
Карта["0002"] = Ложь;
Карта["Круть"] = 100500;
Карта[Справочники.Номенклатура.ПустаяСсылка()] = '20190522';

Разберем, что здесь происходит. В момент выполнения строки Карта["0001"] = Истина платформа проверяет наличие ключа "0001". Если ключ найден, значение обновляется. Если ключа нет, он создается автоматически. Это поведение очень похоже на работу ассоциативных массивов в таких языках, как PHP, JavaScript или C#.

Технический анализ и сравнение с методом Вставить

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

  1. Соответствие: Здесь оператор работает в режиме «L-Value» (значение слева). Это значит, что он может принимать значение. Внутренняя архитектура хеш-таблицы 1С позволяет инициализировать пару «ключ-значение» при попытке записи по несуществующему индексу.
  2. Структура: А вот здесь этот фокус не пройдет. Если вы попробуете написать Структура["НовыйКлюч"] = 10; и такого ключа еще нет, система выдаст ошибку «Поле объекта не обнаружено». В структуре состав ключей (свойств) более жестко детерминирован.
  3. Массив: В массивах квадратные скобки позволяют только изменять уже существующий индекс. Попытка записи в Массив[Размер + 1] приведет к ошибке выхода за границы диапазона.

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

Документированность и риски

Многие программисты опасаются использовать недокументированные фичи. Посмотрим на пример из справки (синтакс-помощника). Там указано, что для объекта Соответствие доступно обращение к значению элемента посредством оператора [...]. Там не сказано прямо, что этот оператор можно использовать для создания нового элемента, но и запрета на это нет. Поскольку эта особенность работает стабильно еще со времен платформы 8.2.13, ее вряд ли можно считать «багом», который внезапно исправят.

Тем не менее, использование такого подхода несет определенные риски:

Практические примеры применения

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


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

Проанализируем второй вариант. Он выглядит компактнее, хотя и требует внимательности. Важно помнить, что Соответствие — это единственная универсальная коллекция в 1С, где ключом может выступать любой тип данных: Число, Дата, Булево или любая Ссылка. Это делает использование [] еще более мощным инструментом.

Синтаксический сахар и культура кода

В среде 1С-разработчиков часто ведутся споры о «синтаксическом сахаре» — конструкциях, которые не добавляют новых возможностей, но делают написание кода приятнее. Примером может служить тернарный оператор ?(). Одни считают, что Если ... Тогда ... КонецЕсли гораздо читабельнее, другие предпочитают экономить место на экране.

Посмотрим на это со стороны сопровождения кода. В 1С читабельность зачастую важнее размера листинга. Когда бизнес-логика сложная, километровые запросы и длинные названия переменных (например, Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия) помогают избежать ошибок. Использование «хаков» вроде квадратных скобок в Соответствии — это вопрос договоренности внутри команды разработки. Если вся команда понимает, как это работает, такой код имеет право на жизнь.

Выводы

Мы разобрали малоизвестную, но эффективную возможность платформы 1С. Подведем итоги:

  1. Использование Карта[Ключ] = Значение полностью заменяет Карта.Вставить(Ключ, Значение) для объекта Соответствие.
  2. Это работает во всех версиях платформы 8.2 и 8.3.
  3. Метод не работает для объектов типа Структура при добавлении новых ключей.
  4. Данный подход ускоряет написание кода, но может вызвать вопросы при аудите кода на соответствие стандартам фирмы 1С.

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

← На главную