Разработка и Конфигурация · 11 мин
Что такое соответствие в 1С и как с ним работать
Соответствие в 1С — коллекция пар «ключ-значение». Разбираем создание, методы, перебор, отличия от структуры и таблицы значений, типичные ошибки и примеры кода.
Соответствие в 1С — это встроенный тип коллекции, который хранит пары «ключ — значение» и позволяет быстро находить значение по уникальному ключу. В отличие от массива, где доступ идёт по числовому индексу, в соответствии ключом может быть строка, число, дата, ссылка на объект или значение другого типа. Это делает соответствие основным инструментом для кэширования данных, поиска дублей и организации словарей внутри кода.
Тип «Соответствие» доступен во встроенном языке 1С:Предприятие 8 на всех конфигурациях — и в типовых «Бухгалтерии», «Управлении торговлей», «Зарплате и управлении персоналом», и в самописных решениях. Работает он только в оперативной памяти: данные соответствия не сохраняются в базе и исчезают после завершения выполнения кода.
Типичные сценарии использования — подсчёт количества вхождений элементов, быстрая проверка «встречался ли уже такой ключ», сопоставление значений из двух источников (например, кодов контрагентов из внешней системы и ссылок из справочника 1С). Ниже разберём создание, методы, перебор, сравнение с другими коллекциями и ошибки, которые чаще всего допускают начинающие разработчики.
Как устроено соответствие и чем оно отличается от других коллекций
Каждый элемент соответствия — это объект типа «КлючИЗначение» с двумя свойствами: Ключ и Значение. Ключ внутри одной коллекции уникален: если вставить значение по уже существующему ключу, старое значение будет перезаписано без ошибки. Значения, наоборот, могут повторяться сколько угодно раз.
Ключом может быть значение практически любого типа: строка, число, дата, булево, ссылка на справочник или документ. Порядок элементов в соответствии не гарантирован и не должен использоваться в логике — если нужен упорядоченный обход, коллекцию предварительно выгружают или сортируют отдельно.
Ближайшие «родственники» соответствия — структура и таблица значений, но у них разное назначение. Структура подходит для фиксированного небольшого набора именованных полей, таблица значений — для табличных данных с колонками и отборами. Соответствие выигрывает, когда ключи заранее неизвестны, появляются динамически и не являются допустимыми идентификаторами (например, содержат пробелы или являются ссылками).
| Критерий | Соответствие | Структура | Таблица значений |
|---|---|---|---|
| Тип ключа | Почти любой, включая ссылки | Только допустимый идентификатор | Имена колонок — идентификаторы |
| Добавление ключей на лету | Да | Да, через Вставить | Нужно добавлять колонку |
| Поиск по ключу | Очень быстрый | Быстрый | Через Найти/НайтиСтроки |
| Типичное применение | Словари, кэш, подсчёт | Параметры, наборы полей | Табличные данные, отборы |
Создание соответствия и заполнение данными
Коллекция создаётся конструктором Новый Соответствие. Сразу после создания она пустая, и элементы добавляются методом Вставить(Ключ, Значение) либо прямым присваиванием через квадратные скобки.
Кэш = Новый Соответствие;
Кэш.Вставить("АдресСервера", "srv-01.local");
Кэш.Вставить("Таймаут", 30);
Кэш["РежимОтладки"] = Истина; // аналог Вставить
// Подсчёт вхождений
Счётчики = Новый Соответствие;
Для Каждого СтрокаТовара Из Товары Цикл
Текущее = Счётчики.Получить(СтрокаТовара.Номенклатура);
Если Текущее = Неопределено Тогда
Текущее = 0;
КонецЕсли;
Счётчики.Вставить(СтрокаТовара.Номенклатура, Текущее + 1);
КонецЦикла;Обратите внимание на приём из примера: перед увеличением счётчика проверяется, существует ли уже значение по ключу. Если ключа нет, метод Получить() возвращает Неопределено, и попытка прибавить единицу к Неопределено вызовет ошибку. Это стандартный шаблон безопасной работы с соответствием.
Ещё один рабочий сценарий — кэширование ссылок, чтобы не выполнять повторные запросы к базе внутри цикла. При обработке тысяч строк разница между «запрос в каждой итерации» и «один запрос + соответствие» измеряется в разы по времени выполнения.
Чтение значений: оператор [] и метод Получить()
Есть два способа прочитать значение по ключу, и они ведут себя по-разному при отсутствующем ключе. Оператор квадратных скобок Кэш[\"Ключ\"] при отсутствии ключа также возвращает Неопределено и не вызывает исключения — это безопасный способ чтения. Метод Получить(Ключ) работает аналогично и иногда удобнее, когда ключ вычисляется выражением.
Опасность возникает не при чтении, а при дальнейшем использовании результата. Если код ожидает, что значение всегда существует, и сразу обращается к его свойствам или выполняет с ним арифметику, отсутствующий ключ приведёт к ошибке выполнения. Поэтому результат чтения принято проверять на Неопределено до использования.
Для проверки самого факта наличия ключа отдельного метода «Содержит» в платформе нет — используется та же проверка Соответствие.Получить(Ключ) <> Неопределено. Учтите тонкость: если вы сами вставили значение Неопределено по какому-то ключу, отличить «ключа нет» от «значение равно Неопределено» таким способом нельзя. Если это критично, храните вместо значений структуры-обёртки.
Перебор, удаление и проверка размера
Перебор выполняется циклом Для Каждого, где переменная цикла имеет тип «КлючИЗначение». Внутри цикла доступны свойства Ключ и Значение. Количество элементов возвращает метод Количество(), полная очистка — метод Очистить(), удаление одного элемента — Удалить(Ключ).
Для Каждого Элемент Из Счётчики Цикл
Сообщить(Строка(Элемент.Ключ) + ": " + Элемент.Значение);
КонецЦикла;
Если Счётчики.Количество() > 0 Тогда
Счётчики.Удалить(НенужныйКлюч);
КонецЕсли;Удалять элементы прямо внутри цикла перебора по той же коллекции не следует — это приводит к непредсказуемому пропуску элементов или ошибке. Безопасный приём: сначала в цикле собрать ключи на удаление в отдельный массив, затем вторым проходом удалить их.
- 1Создайте пустой массив для ключей на удаление
- 2Переберите соответствие циклом Для Каждого и добавляйте в массив ключи, не прошедшие условие
- 3После цикла пройдите по массиву и вызовите Удалить(Ключ) для каждого
- 4Проверьте результат методом Количество() — он должен уменьшиться на число удалённых
Типичные сценарии применения
Поиск дублей
Классическая задача — найти повторяющиеся значения в списке. Каждое значение вставляется в соответствие как ключ; если при вставке значение по ключу уже существует, значит, найден дубль. Это работает значительно быстрее вложенных циклов сравнения, особенно на больших объёмах.
Сопоставление данных из внешних источников
При загрузке из Excel, CSV или веб-сервиса внешние коды сопоставляют со ссылками справочников 1С. Один запрос выбирает все нужные ссылки, результат выгружается в соответствие «код → ссылка», и дальнейшая загрузка идёт без обращений к базе. Такой же приём используют при обмене между конфигурациями с разными идентификаторами.
Передача данных между подсистемами
Соответствие удобно как контейнер результата, когда набор возвращаемых параметров заранее не фиксирован. Например, функция расчёта может вернуть соответствие, где ключи — имена показателей, а значения — рассчитанные суммы. В отличие от структуры, ключи могут формироваться динамически из данных.
Сравнение вариантов
Ключи любого типа, динамическое добавление, быстрый поиск. Не сериализуется напрямую в JSON без преобразования.
Ключи — только допустимые идентификаторы. Подходит для фиксированных наборов параметров и прямой записи в JSON.
Когда важен порядок и не нужен поиск по ключу. Поиск элемента — линейный перебор.
Ограничения и типичные ошибки
Соответствие не хранится в базе данных и не передаётся между клиентом и сервером автоматически в произвольном виде — при разработке управляемых форм учитывайте контекст выполнения. Также соответствие нельзя напрямую записать в JSON штатным средством: обычно данные предварительно переносят в структуру, если ключи позволяют, или формируют массив структур «ключ-значение».
Ещё одно ограничение — неопределённый порядок обхода. Если бизнес-логика требует вывода в определённой последовательности (например, по алфавиту ключей), соответствие выгружают в таблицу значений и сортируют, либо порядок хранят отдельным массивом ключей.
Отдельная группа ошибок связана с ключами сложных типов. Ссылки на объекты сравниваются корректно, но если ключом выступает изменяемое значение или результат преобразования (например, строка с разным регистром букв), легко получить «промах» при поиске. Для строковых ключей из внешних источников полезно нормализовать их функциями СокрЛП() и приведением регистра.
Как проверить результат
Возвращается вставленное значение ожидаемого типа
Возвращается Неопределено — ключ не совпал по типу или написанию
Значение перезаписано, Количество() не изменилось
Количество() выросло — ключи фактически различаются
Цикл обошёл все элементы, Ключ и Значение доступны
Часть элементов пропущена — вероятно, коллекция менялась внутри цикла
Частые вопросы о соответствии в 1С
Чем соответствие отличается от структуры?
Структура требует, чтобы ключи были допустимыми идентификаторами (начинались с буквы, без пробелов и спецсимволов), а соответствие принимает ключи любых типов, включая ссылки, даты и строки с пробелами. Структура удобнее для фиксированных наборов параметров и прямой записи в JSON, соответствие — для динамических словарей и быстрого поиска.
Что вернёт чтение по несуществующему ключу?
И оператор квадратных скобок, и метод Получить() вернут Неопределено без генерации ошибки. Исключение возникнет позже, если попытаться использовать это Неопределено в арифметике или обратиться к его свойствам, поэтому результат всегда проверяют.
Можно ли сохранить соответствие в базе данных?
Напрямую — нет, соответствие существует только в оперативной памяти. Для хранения его преобразуют: сериализуют через ЗначениеВСтрокуВнутр в хранилище значения, либо переносят данные в табличную часть, регистр сведений или JSON-строку.
Как отсортировать соответствие по ключам?
Штатной сортировки у соответствия нет. Практический способ — выгрузить пары в таблицу значений с колонками «Ключ» и «Значение», отсортировать её методом Сортировать() и обойти уже таблицу. Альтернатива — хранить упорядоченный массив ключей рядом с соответствием.
Гарантирован ли порядок элементов при переборе?
Нет, платформа не гарантирует конкретный порядок обхода соответствия, и он может отличаться от порядка вставки. Логику, зависящую от последовательности элементов, на соответствии строить нельзя — используйте массив или отсортированную таблицу значений.
Когда соответствие лучше запроса к базе?
Когда одни и те же данные нужны многократно внутри одной обработки: один запрос заполняет соответствие, а дальше поиск идёт в памяти без обращений к СУБД. Для разовой проверки одного значения отдельный запрос проще и не требует дополнительного кода.
Что важно запомнить
Соответствие — коллекция «ключ-значение» с уникальными ключами любого типа и быстрым поиском. Создаётся через Новый Соответствие, заполняется Вставить(), читается с обязательной проверкой на Неопределено, перебирается циклом Для Каждого. Порядок элементов не гарантирован, в базе не хранится, в JSON напрямую не сериализуется.