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

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

1С: что лучше — Структура или Соответствие

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

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

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

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

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

Структура создаётся с фиксированным списком ключей: они перечисляются в конструкторе Новый Структура("Контрагент, Договор, Сумма") и не могут быть удалены или добавлены позже. Ключ всегда строка, причём обращаться к значению можно как через точку (Структура.Контрагент), так и через квадратные скобки (Структура["Контрагент"]). Обращение через точку к несуществующему полю вызывает ошибку.

Соответствие — полностью динамическая коллекция. Элементы добавляются методом Вставить(Ключ, Значение) в любой момент, ключом может быть значение произвольного типа: ссылка на справочник, число, дата, перечисление. Обращение возможно только через квадратные скобки или метод Получить(Ключ). При обращении к отсутствующему ключу возвращается Неопределено, ошибки не возникает.

КритерийСтруктураСоответствие
Тип ключейТолько строкиЛюбой тип
Добавление ключей после созданияНельзяМожно (Вставить)
Удаление ключейНельзяМожно (Удалить)
Обращение через точкуДаНет
Обращение к отсутствующему ключуОшибка (через точку)Возвращает Неопределено
Проверка наличия ключаСвойство(Имя, Значение)Получить(Ключ)

Когда выбирать Структуру

Структура оптимальна, когда состав данных известен на этапе написания кода и не меняется в процессе выполнения. Классические сценарии — параметры процедур и функций, результат разбора документа, набор реквизитов для передачи между методами, параметры открытия формы. Читаемость кода здесь выше: обращение Параметры.Организация понятнее, чем Параметры["Организация"], а компилятор подскажет опечатку в имени поля уже при проверке модуля.

Структура также стандарт де-факто для API в типовых конфигурациях: методы БСП принимают и возвращают именно структуры параметров. Если вы пишете переопределяемый обработчик или расширение, следуйте этому соглашению.

Пример: передача параметров в функцию

Функция СоздатьЗаказ(ПараметрыЗаказа)

// ПараметрыЗаказа — Структура с полями Контрагент, Склад, ДатаДоставки

Заказ = Документы.ЗаказКлиента.СоздатьДокумент();

Заказ.Контрагент = ПараметрыЗаказа.Контрагент;

Заказ.Склад = ПараметрыЗаказа.Склад;

Заказ.Записать();

Возврат Заказ.Ссылка;

КонецФункции

Параметры = Новый Структура("Контрагент, Склад, ДатаДоставки", Контрагент, Склад, Дата);

НовыйЗаказ = СоздатьЗаказ(Параметры);

Обратите внимание: если поле может отсутствовать, используйте проверку Если Параметры.Свойство("Склад", Склад) Тогда ... КонецЕсли; — метод Свойство вернёт Истина и запишет значение во второй параметр. Это безопасная альтернатива прямому обращению через точку.

Когда выбирать Соответствие

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

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

Пример: кэш ссылок при загрузке данных

КэшКонтрагентов = Новый Соответствие;

Для Каждого СтрокаДанных Из ДанныеЗагрузки Цикл

Контрагент = КэшКонтрагентов.Получить(СтрокаДанных.ИНН);

Если Контрагент = Неопределено Тогда

Контрагент = НайтиКонтрагентаПоИНН(СтрокаДанных.ИНН); // запрос к базе

КэшКонтрагентов.Вставить(СтрокаДанных.ИНН, Контрагент);

КонецЕсли;

// дальше работаем с найденной ссылкой без повторного запроса

КонецЦикла;

Без соответствия здесь пришлось бы выполнять запрос к базе для каждой строки — при тысячах строк загрузка замедлилась бы в разы. Именно такой сценарий — главный аргумент в пользу Соответствия.

Производительность и поведение в циклах

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

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

Типичные ошибки
01
Использовать Структуру как динамический словарь: попытка Вставить с новым ключом вызывает ошибку времени выполнения
02
Обращаться к полю структуры через точку без проверки Свойство() — программа падает, если поле не передали
03
Искать в таблице значений методом Найти внутри цикла вместо построения Соответствия — квадратичное время работы
04
Хранить в соответствии ключи-строки с разным регистром и удивляться «пропавшим» значениям
05
Передавать соответствие как параметры в методы БСП, где ожидается структура

Особенности: сериализация, фиксация и передача

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

При сериализации (например, через ЗначениеВСтрокуВнутр или JSON) оба типа поддерживаются, но у структуры ключи гарантированно строковые, что упрощает запись в JSON. Соответствие с ключами-ссылками в JSON напрямую не сериализуется — ссылки нужно предварительно преобразовывать в строковые представления или GUID.

Ещё одно различие: структуру удобно обходить циклом Для Каждого КлючИЗначение Из Структура Цикл, когда состав полей небольшой и известен. Обход соответствия работает так же, но порядок элементов в соответствии не гарантирован — не стройте логику на порядке перебора.

Маршрут решения

Как выбрать коллекцию

Состав полей известен при написании кода, ключи — имена параметровИспользуйте Структуру
Ключи — ссылки, числа или появляются в процессе выполненияИспользуйте Соответствие
Нужен быстрый поиск внутри большого циклаПостройте Соответствие заранее и ищите через Получить
Набор данных не должен изменяться вызываемым кодомИспользуйте ФиксированнуюСтруктуру или ФиксированноеСоответствие
Нужна сериализация в JSON с простыми ключамиПредпочтительнее Структура

Практический алгоритм выбора

Чтобы не гадать при каждом новом фрагменте кода, используйте простую последовательность проверок.

Порядок выбора
  1. 1
    Определите, известен ли список ключей на этапе написания кода. Если да — это Структура
  2. 2
    Проверьте тип ключей: если нужен не строковый тип (ссылка, число) — только Соответствие
  3. 3
    Оцените, будут ли ключи добавляться или удаляться в процессе работы — если да, Соответствие
  4. 4
    Если коллекция передаётся в типовые методы БСП — проверьте, какой тип они ожидают (обычно Структура)
  5. 5
    Для поиска в цикле по большой выборке постройте Соответствие один раз до цикла
  6. 6
    Проверьте результат: код не должен содержать обращений к полям структуры без проверки Свойство() там, где поле опционально

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

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

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

Обращение к полям структуры
Норма

Все необязательные поля читаются через Свойство()

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

Есть обращения через точку к полям, которые могут отсутствовать

Поиск в цикле
Норма

Соответствие построено один раз до цикла, поиск через Получить

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

Внутри цикла вызывается Найти() по таблице или запрос к базе

Ключи соответствия
Норма

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

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

Ключи вставляются «как есть» из разных источников

Частые вопросы

Можно ли добавить новое поле в существующую структуру?

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

Что быстрее — Структура или Соответствие?

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

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

У структуры обращение через точку к отсутствующему полю вызывает ошибку времени выполнения; метод Свойство() возвращает Ложь. У соответствия оператор [] и метод Получить() возвращают Неопределено без ошибки — это удобно, но может маскировать опечатки в ключах.

Можно ли использовать ссылку как ключ структуры?

Нет, ключи структуры — только строки, причём они должны быть допустимыми идентификаторами, если планируется обращение через точку. Для ключей-ссылок, чисел, дат используйте Соответствие.

Чем ФиксированнаяСтруктура отличается от обычной?

ФиксированнаяСтруктура создаётся на основе обычной и не допускает изменения значений и состава полей. Она безопасна для передачи между клиентом и сервером и гарантирует, что вызываемый код не изменит переданные параметры.

Что использовать для параметров открытия формы?

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

Итог

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

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