Разработка и Конфигурация · 8 мин
Как создать соответствие в 1С: подробное руководство
Как создать соответствие в 1С: синтаксис, методы Вставить, Получить, перебор пар, типичные ошибки и отличия от структуры. Практические примеры кода.
Соответствие в 1С — это универсальная коллекция пар «ключ — значение», которая позволяет быстро находить данные по произвольному ключу: коду номенклатуры, ИНН контрагента, ссылке на документ. В отличие от массива, поиск в соответствии не требует перебора элементов, поэтому на больших объёмах данных оно работает заметно быстрее.
Разработчики используют соответствие для кэширования промежуточных результатов, сопоставления данных при обмене между системами, группировки строк табличных частей и подсчёта итогов по произвольным признакам. Ниже разобраны создание объекта, основные методы, перебор элементов, отличия от структуры и типичные ошибки.
Что такое соответствие и когда его применять
Соответствие (Map) хранит набор пар, где каждый ключ уникален. Если вставить элемент с уже существующим ключом, старое значение будет заменено новым. Порядок элементов при переборе не гарантируется и не должен использоваться в логике программы.
Типичные сценарии применения: подсчёт количества документов по контрагентам, быстрый поиск строки таблицы по ссылке, сопоставление кодов старой и новой системы при миграции, хранение настроек с произвольными ключами. Если ключи — это простые строковые идентификаторы без пробелов и спецсимволов, часто удобнее структура, но соответствие универсальнее.
Создание соответствия и добавление элементов
Объект создаётся конструктором Новый Соответствие. Добавление выполняется методом Вставить или оператором квадратных скобок:
Цены = Новый Соответствие;
Цены.Вставить("Номенклатура001", 1500);
Цены.Вставить("Номенклатура002", 2300);
Цены["Номенклатура003"] = 3100; // альтернативный синтаксис
Ключом может быть не только строка: допустимы числа, даты, ссылки на справочники и документы, значения перечислений. Например, при группировке по контрагенту ключом служит ссылка на элемент справочника «Контрагенты», а значением — массив документов или сумма.
ИтогиПоКонтрагентам = Новый Соответствие;
Для Каждого Строка Из ТаблицаДокументов Цикл
Сумма = ИтогиПоКонтрагентам[Строка.Контрагент];
Если Сумма = Неопределено Тогда
Сумма = 0;
КонецЕсли;
ИтогиПоКонтрагентам[Строка.Контрагент] = Сумма + Строка.Сумма;
КонецЦикла;Получение и проверка значений
Метод Получить(Ключ) возвращает значение по ключу или Неопределено, если ключ отсутствует. Это безопасный способ чтения: обращение через квадратные скобки к несуществующему ключу также вернёт Неопределено, но при присваивании создаст новый элемент, что не всегда нужно.
Перед обращением к свойствам полученного значения обязательно проверяйте его на Неопределено, особенно если соответствие заполняется из внешних данных. Для подсчёта элементов используется метод Количество(), для удаления — Удалить(Ключ), для полной очистки — Очистить().
- 1Создайте объект: Коллекция = Новый Соответствие
- 2Добавьте элементы методом Вставить(Ключ, Значение) или через квадратные скобки
- 3Проверяйте наличие ключа: Значение = Коллекция.Получить(Ключ); Если Значение = Неопределено Тогда ...
- 4Переберите пары циклом Для Каждого КлючИЗначение Из Коллекция
- 5Проверьте результат: Количество() совпадает с ожидаемым числом уникальных ключей
Перебор элементов соответствия
Перебор выполняется циклом Для Каждого, где переменная цикла содержит объект с полями Ключ и Значение:
Для Каждого Пара Из ИтогиПоКонтрагентам Цикл
Сообщить(Строка(Пара.Ключ) + ": " + Пара.Значение);
КонецЦикла;
Внутри цикла допустимо изменять значения существующих ключей, но добавлять или удалять элементы во время перебора небезопасно — поведение цикла в этом случае не гарантируется. Если нужно удалить часть элементов, сначала соберите ключи в отдельный массив, а затем удаляйте после завершения цикла.
Отличия соответствия от структуры и массива
Выбор коллекции влияет и на читаемость кода, и на производительность. Основные различия сведены ниже.
| Критерий | Соответствие | Структура | Массив |
|---|---|---|---|
| Тип ключа | Любой тип значения | Только строка-идентификатор | Числовой индекс от 0 |
| Поиск по ключу | Быстрый, без перебора | Быстрый, без перебора | Только перебором или по индексу |
| Порядок элементов | Не гарантирован | Не гарантирован | Сохраняется |
| Типичное применение | Сопоставление по ссылкам, кодам | Параметры, именованные наборы | Упорядоченные списки |
Сравнение вариантов
Подходит, когда ключи — ссылки, числа, даты или строки произвольного формата. Ограничение: порядок перебора не гарантирован.
Удобна для именованных параметров с ключами-идентификаторами. Ограничение: ключ не может содержать пробелы и спецсимволы.
Лучше при сложной группировке с несколькими полями и необходимости сортировки, но требует больше кода для простого поиска.
Типичные ошибки и их последствия
Самая частая ошибка — обращение к свойствам значения без проверки на Неопределено: если ключа нет, программа завершится с ошибкой «Поле объекта не обнаружено». Вторая распространённая проблема — использование в качестве ключа изменяемых по представлению значений, когда разработчик ожидает совпадения строк разного регистра: «АРТ-001» и «арт-001» — это два разных ключа.
Также не стоит использовать соответствие там, где важен порядок обхода: для вывода данных в печатную форму в заданной последовательности предварительно выгрузите ключи в массив и отсортируйте его либо используйте таблицу значений.
Проверка результата и отладка
После заполнения соответствия убедитесь, что Количество() совпадает с числом ожидаемых уникальных ключей. Если ключей меньше, чем строк-источников, — часть данных перезаписалась из-за повторяющихся ключей; если больше — возможны различия в регистре или лишние пробелы в строковых ключах.
В отладчике соответствие просматривается через табло: добавьте переменную в окно «Вычислить выражение» и разверните элементы. Для быстрой диагностики в коде полезен вывод пар через Сообщить в тестовой базе, но не оставляйте такой вывод в рабочем коде — при больших объёмах он замедляет выполнение.
Как проверить результат
Равно числу уникальных ключей источника
Меньше ожидаемого — ключи дублируются и перезаписываются
Возвращает ожидаемое значение
Возвращает Неопределено — проверьте регистр и пробелы ключа
Все пары содержат корректные Ключ и Значение
Часть значений пуста или не того типа
FAQ
Можно ли использовать ссылку на документ как ключ соответствия?
Да, ссылки любых объектных типов допустимы в качестве ключей и корректно сравниваются. Это один из самых практичных сценариев: например, накопление итогов по контрагентам или документам-основаниям.
Что вернёт обращение к несуществующему ключу?
И метод Получить(), и обращение через квадратные скобки вернут Неопределено. Ошибки не возникает, но последующее обращение к свойствам такого значения вызовет исключение, поэтому нужна проверка.
Чем соответствие лучше массива при поиске?
Поиск в массиве требует перебора элементов, и время растёт пропорционально размеру. В соответствии поиск по ключу выполняется напрямую, поэтому на тысячах элементов разница в скорости становится существенной.
Как отсортировать соответствие по ключу?
Напрямую — никак: порядок перебора не гарантирован. Выгрузите ключи в массив, отсортируйте его, а затем обращайтесь к соответствию по отсортированным ключам, либо используйте таблицу значений с сортировкой.
Когда лучше выбрать структуру вместо соответствия?
Когда все ключи — строковые идентификаторы без пробелов и спецсимволов, а набор полей известен заранее. Структура позволяет обращаться к значениям через точку, что делает код короче и читабельнее.
Что важно запомнить
Соответствие создаётся конструктором Новый Соответствие, заполняется методом Вставить, читается через Получить с проверкой на Неопределено. Ключи уникальны и могут быть любого типа, порядок перебора не гарантирован, состав коллекции нельзя менять внутри цикла обхода.