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