Разработка и Конфигурация · 10 мин
1С: что лучше — Структура или Соответствие
Структура или Соответствие в 1С: различия, скорость доступа, изменяемость ключей, типичные сценарии использования и примеры кода для правильного выбора.
В языке 1С:Предприятия есть два похожих универсальных типа для хранения пар «ключ — значение»: Структура и Соответствие. Начинающие разработчики часто используют их как взаимозаменяемые, но это приводит к ошибкам времени выполнения, лишним проверкам и падению производительности в циклах. Типы различаются по допустимым ключам, способу обращения к элементам, изменяемости и поведению при передаче в методы.
Структура — это коллекция с фиксированным набором именованных полей, где ключ всегда строка и задаётся при создании. Соответствие — это словарь с динамическими ключами любого типа: строки, числа, ссылки, перечисления. Первый тип удобен для передачи параметров и описания объектов, второй — для кэширования, группировки и быстрого поиска по произвольным ключам.
Ниже разобраны различия типов, критерии выбора, примеры кода и типичные ошибки, которые встречаются в реальных конфигурациях при неправильном выборе коллекции.
Чем Структура отличается от Соответствия
Структура создаётся с фиксированным списком ключей: они перечисляются в конструкторе Новый Структура("Контрагент, Договор, Сумма") и не могут быть удалены или добавлены позже. Ключ всегда строка, причём обращаться к значению можно как через точку (Структура.Контрагент), так и через квадратные скобки (Структура["Контрагент"]). Обращение через точку к несуществующему полю вызывает ошибку.
Соответствие — полностью динамическая коллекция. Элементы добавляются методом Вставить(Ключ, Значение) в любой момент, ключом может быть значение произвольного типа: ссылка на справочник, число, дата, перечисление. Обращение возможно только через квадратные скобки или метод Получить(Ключ). При обращении к отсутствующему ключу возвращается Неопределено, ошибки не возникает.
| Критерий | Структура | Соответствие |
|---|---|---|
| Тип ключей | Только строки | Любой тип |
| Добавление ключей после создания | Нельзя | Можно (Вставить) |
| Удаление ключей | Нельзя | Можно (Удалить) |
| Обращение через точку | Да | Нет |
| Обращение к отсутствующему ключу | Ошибка (через точку) | Возвращает Неопределено |
| Проверка наличия ключа | Свойство(Имя, Значение) | Получить(Ключ) |
Когда выбирать Структуру
Структура оптимальна, когда состав данных известен на этапе написания кода и не меняется в процессе выполнения. Классические сценарии — параметры процедур и функций, результат разбора документа, набор реквизитов для передачи между методами, параметры открытия формы. Читаемость кода здесь выше: обращение Параметры.Организация понятнее, чем Параметры["Организация"], а компилятор подскажет опечатку в имени поля уже при проверке модуля.
Структура также стандарт де-факто для API в типовых конфигурациях: методы БСП принимают и возвращают именно структуры параметров. Если вы пишете переопределяемый обработчик или расширение, следуйте этому соглашению.
Пример: передача параметров в функцию
Функция СоздатьЗаказ(ПараметрыЗаказа)
// ПараметрыЗаказа — Структура с полями Контрагент, Склад, ДатаДоставки
Заказ = Документы.ЗаказКлиента.СоздатьДокумент();
Заказ.Контрагент = ПараметрыЗаказа.Контрагент;
Заказ.Склад = ПараметрыЗаказа.Склад;
Заказ.Записать();
Возврат Заказ.Ссылка;
КонецФункции
Параметры = Новый Структура("Контрагент, Склад, ДатаДоставки", Контрагент, Склад, Дата);
НовыйЗаказ = СоздатьЗаказ(Параметры);
Обратите внимание: если поле может отсутствовать, используйте проверку Если Параметры.Свойство("Склад", Склад) Тогда ... КонецЕсли; — метод Свойство вернёт Истина и запишет значение во второй параметр. Это безопасная альтернатива прямому обращению через точку.
Когда выбирать Соответствие
Соответствие незаменимо, когда ключи появляются в процессе работы алгоритма и их список заранее неизвестен. Типичные задачи: группировка строк таблицы по контрагентам, кэш уже найденных ссылок, подсчёт количества по категориям, сопоставление идентификаторов при обмене данными.
Главное преимущество — ключом может быть ссылка. Поиск по соответствию выполняется очень быстро (за счёт хеширования), тогда как поиск строки в таблице значений методом Найти без индекса перебирает всю коллекцию. В циклах по большим выборкам разница критична.
Пример: кэш ссылок при загрузке данных
КэшКонтрагентов = Новый Соответствие;
Для Каждого СтрокаДанных Из ДанныеЗагрузки Цикл
Контрагент = КэшКонтрагентов.Получить(СтрокаДанных.ИНН);
Если Контрагент = Неопределено Тогда
Контрагент = НайтиКонтрагентаПоИНН(СтрокаДанных.ИНН); // запрос к базе
КэшКонтрагентов.Вставить(СтрокаДанных.ИНН, Контрагент);
КонецЕсли;
// дальше работаем с найденной ссылкой без повторного запроса
КонецЦикла;
Без соответствия здесь пришлось бы выполнять запрос к базе для каждой строки — при тысячах строк загрузка замедлилась бы в разы. Именно такой сценарий — главный аргумент в пользу Соответствия.
Производительность и поведение в циклах
По скорости доступа к существующему элементу оба типа сопоставимы — оба используют внутренние механизмы быстрого поиска. Разница проявляется в сценариях: Соответствие выигрывает при массовом поиске в цикле, потому что запрос «есть ли такой ключ» выполняется за постоянное время, а Структура выигрывает в читаемости и контроле состава полей.
Частая антипрактика — использовать Структуру как динамический словарь через Вставить в цикле. Хотя метод Вставить у структуры существует и позволяет изменить значение существующего ключа, добавить новый ключ им нельзя (будет ошибка). Попытки обходных путей через пересоздание структуры в цикле — прямая дорога к деградации производительности.
Особенности: сериализация, фиксация и передача
Структура и Соответствие имеют фиксированные аналоги — ФиксированнаяСтруктура и ФиксированноеСоответствие, которые нельзя изменить после создания. Фиксированные коллекции безопасно передавать между клиентом и сервером и использовать как параметры, которые не должны меняться вызываемым кодом.
При сериализации (например, через ЗначениеВСтрокуВнутр или JSON) оба типа поддерживаются, но у структуры ключи гарантированно строковые, что упрощает запись в JSON. Соответствие с ключами-ссылками в JSON напрямую не сериализуется — ссылки нужно предварительно преобразовывать в строковые представления или GUID.
Ещё одно различие: структуру удобно обходить циклом Для Каждого КлючИЗначение Из Структура Цикл, когда состав полей небольшой и известен. Обход соответствия работает так же, но порядок элементов в соответствии не гарантирован — не стройте логику на порядке перебора.
Как выбрать коллекцию
Практический алгоритм выбора
Чтобы не гадать при каждом новом фрагменте кода, используйте простую последовательность проверок.
- 1Определите, известен ли список ключей на этапе написания кода. Если да — это Структура
- 2Проверьте тип ключей: если нужен не строковый тип (ссылка, число) — только Соответствие
- 3Оцените, будут ли ключи добавляться или удаляться в процессе работы — если да, Соответствие
- 4Если коллекция передаётся в типовые методы БСП — проверьте, какой тип они ожидают (обычно Структура)
- 5Для поиска в цикле по большой выборке постройте Соответствие один раз до цикла
- 6Проверьте результат: код не должен содержать обращений к полям структуры без проверки Свойство() там, где поле опционально
После выбора проверьте код на устойчивость: выполните его с неполным набором параметров (для структуры) и с пустым соответствием (для динамических данных). Оба сценария должны отрабатывать без исключений.
Как проверить результат
Все необязательные поля читаются через Свойство()
Есть обращения через точку к полям, которые могут отсутствовать
Соответствие построено один раз до цикла, поиск через Получить
Внутри цикла вызывается Найти() по таблице или запрос к базе
Строковые ключи нормализованы по регистру
Ключи вставляются «как есть» из разных источников
Частые вопросы
Можно ли добавить новое поле в существующую структуру?
Нет, состав ключей структуры фиксируется при создании. Метод Вставить у структуры меняет только значение существующего ключа. Если нужен расширяемый набор — используйте Соответствие или создайте новую структуру с нужным составом и скопируйте значения.
Что быстрее — Структура или Соответствие?
При доступе к существующему элементу разница практически незаметна. Реальный выигрыш Соответствия — в сценариях поиска по произвольным ключам в циклах, где альтернативой был бы перебор таблицы значений. Выбирайте тип по семантике задачи, а не по микрооптимизации.
Что вернёт обращение к несуществующему ключу?
У структуры обращение через точку к отсутствующему полю вызывает ошибку времени выполнения; метод Свойство() возвращает Ложь. У соответствия оператор [] и метод Получить() возвращают Неопределено без ошибки — это удобно, но может маскировать опечатки в ключах.
Можно ли использовать ссылку как ключ структуры?
Нет, ключи структуры — только строки, причём они должны быть допустимыми идентификаторами, если планируется обращение через точку. Для ключей-ссылок, чисел, дат используйте Соответствие.
Чем ФиксированнаяСтруктура отличается от обычной?
ФиксированнаяСтруктура создаётся на основе обычной и не допускает изменения значений и состава полей. Она безопасна для передачи между клиентом и сервером и гарантирует, что вызываемый код не изменит переданные параметры.
Что использовать для параметров открытия формы?
Структуру — это стандарт в типовых конфигурациях. Параметры формы имеют известный состав, строковые имена, а обращение через точку делает код обработчика ПриСозданииНаСервере читаемым.
Что важно запомнить
Структура — для фиксированного набора именованных параметров и передачи данных между методами. Соответствие — для динамических ключей любого типа, кэширования и быстрого поиска в циклах. Опциональные поля структуры читайте через Свойство(), поиск в больших циклах делайте через заранее построенное Соответствие.