К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как создать соответствие в 1С: подробное руководство

Как создать соответствие в 1С: синтаксис, методы Вставить, Получить, перебор пар, типичные ошибки и отличия от структуры. Практические примеры кода.

Соответствие в 1С — это универсальная коллекция пар «ключ — значение», которая позволяет быстро находить данные по произвольному ключу: коду номенклатуры, ИНН контрагента, ссылке на документ. В отличие от массива, поиск в соответствии не требует перебора элементов, поэтому на больших объёмах данных оно работает заметно быстрее.

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

Что такое соответствие и когда его применять

Соответствие (Map) хранит набор пар, где каждый ключ уникален. Если вставить элемент с уже существующим ключом, старое значение будет заменено новым. Порядок элементов при переборе не гарантируется и не должен использоваться в логике программы.

Типичные сценарии применения: подсчёт количества документов по контрагентам, быстрый поиск строки таблицы по ссылке, сопоставление кодов старой и новой системы при миграции, хранение настроек с произвольными ключами. Если ключи — это простые строковые идентификаторы без пробелов и спецсимволов, часто удобнее структура, но соответствие универсальнее.

Создание соответствия и добавление элементов

Объект создаётся конструктором Новый Соответствие. Добавление выполняется методом Вставить или оператором квадратных скобок:

Цены = Новый Соответствие;

Цены.Вставить("Номенклатура001", 1500);

Цены.Вставить("Номенклатура002", 2300);

Цены["Номенклатура003"] = 3100; // альтернативный синтаксис

Ключом может быть не только строка: допустимы числа, даты, ссылки на справочники и документы, значения перечислений. Например, при группировке по контрагенту ключом служит ссылка на элемент справочника «Контрагенты», а значением — массив документов или сумма.

bsl
ИтогиПоКонтрагентам = Новый Соответствие;
Для Каждого Строка Из ТаблицаДокументов Цикл
    Сумма = ИтогиПоКонтрагентам[Строка.Контрагент];
    Если Сумма = Неопределено Тогда
        Сумма = 0;
    КонецЕсли;
    ИтогиПоКонтрагентам[Строка.Контрагент] = Сумма + Строка.Сумма;
КонецЦикла;

Получение и проверка значений

Метод Получить(Ключ) возвращает значение по ключу или Неопределено, если ключ отсутствует. Это безопасный способ чтения: обращение через квадратные скобки к несуществующему ключу также вернёт Неопределено, но при присваивании создаст новый элемент, что не всегда нужно.

Перед обращением к свойствам полученного значения обязательно проверяйте его на Неопределено, особенно если соответствие заполняется из внешних данных. Для подсчёта элементов используется метод Количество(), для удаления — Удалить(Ключ), для полной очистки — Очистить().

Порядок действий
  1. 1
    Создайте объект: Коллекция = Новый Соответствие
  2. 2
    Добавьте элементы методом Вставить(Ключ, Значение) или через квадратные скобки
  3. 3
    Проверяйте наличие ключа: Значение = Коллекция.Получить(Ключ); Если Значение = Неопределено Тогда ...
  4. 4
    Переберите пары циклом Для Каждого КлючИЗначение Из Коллекция
  5. 5
    Проверьте результат: Количество() совпадает с ожидаемым числом уникальных ключей

Перебор элементов соответствия

Перебор выполняется циклом Для Каждого, где переменная цикла содержит объект с полями Ключ и Значение:

Для Каждого Пара Из ИтогиПоКонтрагентам Цикл

Сообщить(Строка(Пара.Ключ) + ": " + Пара.Значение);

КонецЦикла;

Внутри цикла допустимо изменять значения существующих ключей, но добавлять или удалять элементы во время перебора небезопасно — поведение цикла в этом случае не гарантируется. Если нужно удалить часть элементов, сначала соберите ключи в отдельный массив, а затем удаляйте после завершения цикла.

Отличия соответствия от структуры и массива

Выбор коллекции влияет и на читаемость кода, и на производительность. Основные различия сведены ниже.

КритерийСоответствиеСтруктураМассив
Тип ключаЛюбой тип значенияТолько строка-идентификаторЧисловой индекс от 0
Поиск по ключуБыстрый, без перебораБыстрый, без перебораТолько перебором или по индексу
Порядок элементовНе гарантированНе гарантированСохраняется
Типичное применениеСопоставление по ссылкам, кодамПараметры, именованные наборыУпорядоченные списки

Сравнение вариантов

Соответствие

Подходит, когда ключи — ссылки, числа, даты или строки произвольного формата. Ограничение: порядок перебора не гарантирован.

Структура

Удобна для именованных параметров с ключами-идентификаторами. Ограничение: ключ не может содержать пробелы и спецсимволы.

Таблица значений

Лучше при сложной группировке с несколькими полями и необходимости сортировки, но требует больше кода для простого поиска.

Типичные ошибки и их последствия

Самая частая ошибка — обращение к свойствам значения без проверки на Неопределено: если ключа нет, программа завершится с ошибкой «Поле объекта не обнаружено». Вторая распространённая проблема — использование в качестве ключа изменяемых по представлению значений, когда разработчик ожидает совпадения строк разного регистра: «АРТ-001» и «арт-001» — это два разных ключа.

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

Типичные ошибки
01
Чтение свойств результата Получить() без проверки на Неопределено — ошибка выполнения при отсутствии ключа
02
Ожидание, что строковые ключи сравниваются без учёта регистра — ключи различаются, возникают дубли
03
Добавление или удаление элементов внутри цикла перебора — пропуск элементов и непредсказуемый результат
04
Расчёт на порядок перебора — порядок не гарантирован, печатные формы выводятся хаотично

Проверка результата и отладка

После заполнения соответствия убедитесь, что Количество() совпадает с числом ожидаемых уникальных ключей. Если ключей меньше, чем строк-источников, — часть данных перезаписалась из-за повторяющихся ключей; если больше — возможны различия в регистре или лишние пробелы в строковых ключах.

В отладчике соответствие просматривается через табло: добавьте переменную в окно «Вычислить выражение» и разверните элементы. Для быстрой диагностики в коде полезен вывод пар через Сообщить в тестовой базе, но не оставляйте такой вывод в рабочем коде — при больших объёмах он замедляет выполнение.

Контрольные точки

Как проверить результат

Количество() после заполнения
Норма

Равно числу уникальных ключей источника

Тревожный признак

Меньше ожидаемого — ключи дублируются и перезаписываются

Получить() по известному ключу
Норма

Возвращает ожидаемое значение

Тревожный признак

Возвращает Неопределено — проверьте регистр и пробелы ключа

Перебор в отладчике
Норма

Все пары содержат корректные Ключ и Значение

Тревожный признак

Часть значений пуста или не того типа

FAQ

Можно ли использовать ссылку на документ как ключ соответствия?

Да, ссылки любых объектных типов допустимы в качестве ключей и корректно сравниваются. Это один из самых практичных сценариев: например, накопление итогов по контрагентам или документам-основаниям.

Что вернёт обращение к несуществующему ключу?

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

Чем соответствие лучше массива при поиске?

Поиск в массиве требует перебора элементов, и время растёт пропорционально размеру. В соответствии поиск по ключу выполняется напрямую, поэтому на тысячах элементов разница в скорости становится существенной.

Как отсортировать соответствие по ключу?

Напрямую — никак: порядок перебора не гарантирован. Выгрузите ключи в массив, отсортируйте его, а затем обращайтесь к соответствию по отсортированным ключам, либо используйте таблицу значений с сортировкой.

Когда лучше выбрать структуру вместо соответствия?

Когда все ключи — строковые идентификаторы без пробелов и спецсимволов, а набор полей известен заранее. Структура позволяет обращаться к значениям через точку, что делает код короче и читабельнее.

Итог

Что важно запомнить

Соответствие создаётся конструктором Новый Соответствие, заполняется методом Вставить, читается через Получить с проверкой на Неопределено. Ключи уникальны и могут быть любого типа, порядок перебора не гарантирован, состав коллекции нельзя менять внутри цикла обхода.