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

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

1С: в чём разница между структурой и соответствием

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

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

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

Что такое структура в 1С

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

Параметры = Новый Структура;

Параметры.Вставить("Организация", СсылкаНаОрганизацию);

Параметры.Вставить("Период", ТекущаяДатаСеанса());

// Или сразу с инициализацией:

Отбор = Новый Структура("Номенклатура, Склад", Товар, ОсновнойСклад);

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

Если Параметры.Свойство("Склад", Склад) Тогда

// ключ есть, значение в переменной Склад

Иначе

Склад = СкладПоУмолчанию();

КонецЕсли;

Что такое соответствие в 1С

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

Остатки = Новый Соответствие;

Остатки.Вставить(СсылкаНоменклатура, 150);

Остатки.Вставить(СсылкаДругойТовар, 0);

Количество = Остатки[СсылкаНоменклатура]; // 150

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

Сравнение основных характеристик

ПараметрСтруктураСоответствие
Тип ключаТолько строка, валидное имя переменнойЛюбой тип (строка, число, ссылка, дата)
Доступ к значениюЧерез точку и через скобкиТолько через квадратные скобки
Отсутствующий ключ при чтенииИсключение «Поле объекта не обнаружено»Возвращает Неопределено
Проверка наличия ключаСвойство("Имя", Значение)Сравнение с Неопределено после чтения
Фиксированный набор ключейДа, обычно известен заранееНет, ключи — динамические данные
Типовое применениеПараметры процедур, настройки, отборыКэши, группировки, сопоставление данных

Из таблицы видно главное: структура описывает «объект с известными полями», соответствие — «словарь произвольных данных». Это разное назначение, а не два способа сделать одно и то же.

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

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

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

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

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

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

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

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

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

// Выгружаем цены одним запросом и кладём в соответствие

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

КэшЦен.Вставить(Выборка.Номенклатура, Выборка.Цена);

КонецЦикла;

// В цикле обработки обращаемся к кэшу, а не к базе

Цена = КэшЦен[ТекущийТовар];

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

Цена = 0; // товара нет в кэше

КонецЕсли;

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

Типичные ошибки и подводные камни

Первая группа ошибок связана с обращением к несуществующим ключам. В структуре чтение Параметры.НеобязательныйПараметр без предварительной проверки через Свойство() роняет код исключением. В соответствии обратная проблема: отсутствующий ключ возвращает Неопределено, и если дальше это значение попадает в арифметику или запрос, ошибка проявится далеко от места причины.

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

Третья группа — ключи соответствия не того типа. Если в кэш ключи кладутся как ссылки, а читаются как строки (или наоборот), соответствие честно вернёт Неопределено: ключи разных типов не равны. При отладке это выглядит как «данные есть, но не находятся».

Типичные ошибки
01
Чтение необязательного свойства структуры без Свойство() — исключение на данных, где параметр не передан
02
Использование Неопределено из соответствия в расчётах без проверки — ошибка всплывает далеко от источника
03
Ключи разных типов при записи и чтении соответствия (ссылка vs строка) — значения «теряются»
04
Передача соответствия туда, где платформа ожидает структуру (параметры форм, оповещения)
05
Строковые имена ключей структуры с пробелами — синтаксическая ошибка при создании

Проверка результата и отладка

При работе со структурой проверяйте наличие необязательных ключей до чтения и задавайте значения по умолчанию в месте получения параметров, а не разбросанными проверками по коду. Для соответствия полезно сразу после чтения нормализовать результат: Если Значение = Неопределено Тогда Значение = 0; — так дальше по коду тип предсказуем.

В отладчике обе коллекции раскрываются как список пар «ключ–значение». Для больших соответствий удобно проверять конкретный ключ выражением Кэш[ИскомаяСсылка] в табло, а не листать тысячи элементов. Если значение не находится, первым делом сравните тип ключа в табло с типом ключа при записи.

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

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

Чтение параметра из структуры
Норма

Перед чтением вызвано Свойство() или ключ гарантированно заполнен

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

Код падает с «Поле объекта не обнаружено» на части данных

Чтение из соответствия
Норма

Результат сравнивается с Неопределено до использования

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

Неопределено уходит в арифметику или запрос без проверки

Тип ключа при записи и чтении
Норма

Один и тот же тип (например, всегда ссылка)

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

Запись по ссылке, чтение по строке — значения не находятся

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

Можно ли обойти структуру циклом?

Да, обе коллекции поддерживают обход через «Для Каждого КлючИЗначение Из Коллекция Цикл». У структуры элемент — объект с полями Ключ (строка) и Значение. Имейте в виду, что порядок обхода структуры соответствует порядку добавления, а для соответствия порядок не гарантирован.

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

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

Можно ли сериализовать структуру или соответствие в JSON?

Структура сериализуется в JSON штатно через ЗаписьJSON — ключи становятся именами свойств объекта. Соответствие напрямую в JSON-объект не превращается, если ключи не строки; их придётся преобразовывать в строки вручную или использовать массив пар.

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

Фиксированная структура создаётся на основе обычной и после создания неизменяема: нельзя добавить, удалить или изменить значения. Платформа применяет её там, где нужна гарантия неизменности переданных параметров.

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

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

Как проверить, есть ли ключ в соответствии, если значение может быть Неопределено?

Прямого метода «СодержитКлюч» у соответствия нет. Если значение Неопределено является осмысленным, храните вместо него маркер (например, пустую структуру) или ведите отдельный учёт добавленных ключей. Чаще всего проще договориться, что Неопределено означает «ключа нет».

Итог

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

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