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

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

Соответствие в 1С: что это и как использовать

Соответствие в 1С — это коллекция пар «ключ-значение». Разбираем, что это за тип данных, как создавать, заполнять, перебирать и где применять на практике.

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

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

Что такое соответствие как тип данных

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

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

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

Как создать и заполнить соответствие

Создание выполняется конструктором Новый Соответствие. Добавление элементов — методом Вставить(Ключ, Значение). Чтение — через оператор квадратных скобок Соответствие[Ключ] или метод Получить(Ключ).

bsl
Цены = Новый Соответствие;
Цены.Вставить("ТОВ-001", 1500);
Цены.Вставить("ТОВ-002", 2300);

// Чтение двумя способами
Цена = Цены["ТОВ-001"];        // 1500
Цена = Цены.Получить("ТОВ-999"); // Неопределено — ключа нет

Разница между двумя способами чтения принципиальна. Обращение через квадратные скобки к несуществующему ключу вернёт Неопределено, так же как и метод Получить. Однако присваивание через скобки Цены["ТОВ-003"] = 3000; тоже создаёт элемент — это допустимый способ вставки. Ошибка возникнет только если попытаться обратиться к свойству значения, которое равно Неопределено.

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

Перебор элементов и проверка наличия ключа

Обход соответствия выполняется циклом Для Каждого ... Из ... Цикл. Переменная цикла будет иметь тип «КлючИЗначение», у которого доступны свойства Ключ и Значение.

bsl
Для Каждого Элемент Из Цены Цикл
    Сообщить("Код: " + Элемент.Ключ + ", цена: " + Элемент.Значение);
КонецЦикла;

// Проверка наличия ключа
Если Цены.Получить("ТОВ-001") <> Неопределено Тогда
    // ключ существует
КонецЕсли;

Тонкий момент: проверка Получить(Ключ) <> Неопределено не сработает, если значение по ключу само равно Неопределено. Если такая ситуация возможна в вашей логике, надёжнее хранить в значениях структуру или признак заполненности, либо вести отдельный учёт вставленных ключей.

Типовые сценарии применения

Кэширование данных в цикле

Самая частая задача — избежать повторных запросов к базе внутри цикла. Например, при обработке таблицы товаров данные по каждому контрагенту запрашивают один раз и кладут в соответствие, а при повторном встречании берут из кэша. Это снижает нагрузку на СУБД и ускоряет обработку в разы.

Группировка и накопление итогов

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

Контроль дублей

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

Типичные ошибки
01
Обращение к свойству значения без проверки на Неопределено — при отсутствующем ключе код падает с ошибкой
02
Ожидание, что обход идёт в порядке добавления — порядок элементов соответствия не гарантирован
03
Использование соответствия там, где нужна сортировка или отборы — для этого служит таблица значений
04
Ключи разных типов для одних данных: строка '001' и число 1 — разные ключи, поиск не сработает

Соответствие, структура и таблица значений: что выбрать

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

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

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

Динамические ключи любого типа, быстрый поиск по ключу. Нет сортировки и отборов, порядок не гарантирован

Структура

Фиксированный набор полей, ключи — только строки, допустимые как имена идентификаторов. Удобна для параметров

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

Нужны сортировка, отбор, свёртка, итоги по колонкам. Тяжелее по памяти и медленнее при простом поиске по ключу

Массив

Важен порядок элементов и обход по индексу. Поиск значения — только перебором

Соответствие в учётном смысле: сопоставление данных

Вне программирования слово «соответствие» в 1С обычно означает сопоставление одних данных другим. Классические примеры: соответствие номенклатуры поставщика собственной номенклатуре при обмене по EDI или загрузке прайсов, соответствие счетов бухгалтерского и налогового учёта, сопоставление документов при синхронизации между конфигурациями (например, между УТ и БП).

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

При работе с сопоставлением данных проверяйте результат на небольшой выборке: загрузите один-два документа, убедитесь, что товары и контрагенты подставились корректно, и только потом запускайте полную загрузку. Ошибка в правилах сопоставления на большом объёме создаёт сотни дублей, чистка которых занимает значительно больше времени, чем предварительная проверка.

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

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

Поиск значения по ключу в коде
Норма

Возвращается ожидаемое значение, отличное от Неопределено

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

Получаете Неопределено — проверьте тип и точное значение ключа

Сопоставление номенклатуры при загрузке
Норма

В документе подставлены существующие товары из справочника

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

Создаются новые элементы с наименованиями поставщика — соответствие не настроено

Количество элементов после загрузки
Норма

Число новых элементов справочника соответствует ожиданиям

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

Резкий рост числа элементов — признак дублей

Часто задаваемые вопросы

Чем соответствие отличается от структуры в 1С?

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

Можно ли сохранить соответствие в базу данных?

Напрямую — нет, это коллекция времени выполнения. Для хранения данные переносят в регистр сведений, табличную часть или сериализуют через механизмы хранения значения. Для пар «ключ-значение» в базе чаще всего создают регистр сведений с измерением-ключом и ресурсом-значением.

Почему поиск по ключу возвращает Неопределено, хотя элемент добавлялся?

Чаще всего причина в несовпадении типов или значений ключа: строка с лишним пробелом, число вместо строки, другая ссылка на тот же логически объект из разных баз. Проверьте ключи через отладчик, сравнив тип и точное значение при вставке и при чтении.

Что быстрее: соответствие или поиск в таблице значений?

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

Где в типовых конфигурациях настраивается соответствие номенклатуры поставщика?

Обычно в карточке соглашения с поставщиком или в отдельном регистре сведений, доступном из раздела закупок. Точное расположение зависит от конфигурации: в УТ и ERP это регистр номенклатуры поставщиков, в БП — сопоставление при загрузке документов. Ищите по слову «номенклатура поставщика» в разделе закупок или в настройках обмена.

Можно ли перебрать соответствие в порядке добавления элементов?

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

Итог

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

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