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