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

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

Структура в 1С: что это и как с ней работать

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

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

Главное назначение структуры — передача и хранение произвольных наборов параметров. Когда процедуре нужно получить пять-десять разнородных значений, удобнее упаковать их в одну структуру, чем перечислять десять параметров в объявлении. Структуры активно используются при обмене данными, формировании отчётов, работе с JSON и HTTP-запросами.

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

Что представляет собой структура и чем она отличается от других коллекций

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

В 1С есть несколько коллекций, похожих по назначению, и их часто путают. Массив хранит значения по числовым индексам и подходит для однотипных списков. Соответствие похоже на структуру, но ключом может быть значение любого типа, а не только строка. СписокЗначений хранит пары «значение — представление» и ориентирован на интерактивный выбор пользователем.

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

Структура

Именованные параметры, передача данных между процедурами, JSON. Ключи — только строки.

Соответствие

Ключи любого типа, например ссылки на элементы справочника. Удобно для кэшей и сопоставлений.

Массив

Однотипный упорядоченный список без имён, доступ по индексу.

СписокЗначений

Интерактивный выбор, отметки элементов, отображение пользователю.

Практическое правило простое: если данные описываются осмысленными именами («Организация», «ДатаНачала», «СуммаДокумента») — берите структуру. Если нужен быстрый поиск по ссылке-ключу — соответствие. Если порядок и индексы важнее имён — массив.

Как создать структуру и заполнить её данными

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

bsl
Параметры = Новый Структура;
Параметры.Вставить("Организация", ТекущаяОрганизация);
Параметры.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Параметры.Вставить("СуммаДокумента", 15000);

// Альтернатива — через конструктор:
Параметры2 = Новый Структура("Организация, ДатаНачала", ТекущаяОрганизация, НачалоМесяца(ТекущаяДата()));

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

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

Как проверить наличие ключа и безопасно прочитать значение

Самая частая ошибка новичков — чтение ключа, которого нет в структуре. Программа аварийно завершается с сообщением «Поле объекта не обнаружено». Чтобы этого избежать, используйте метод Свойство, который возвращает Истина, если ключ существует, и может записать значение в переданную переменную.

bsl
ЗначениеОрганизации = Неопределено;
Если Параметры.Свойство("Организация", ЗначениеОрганизации) Тогда
    // Ключ есть, значение в переменной ЗначениеОрганизации
Иначе
    // Ключа нет — задаём значение по умолчанию
    ЗначениеОрганизации = Справочники.Организации.ПустаяСсылка();
КонецЕсли;

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

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

Где структуры применяются на практике

Наиболее типовой сценарий — передача параметров между процедурами и функциями. Вместо длинного списка аргументов объявляется один параметр-структура, а вызываемый код извлекает из него нужные ключи. Это упрощает доработку: добавление нового параметра не требует менять сигнатуру процедуры во всех местах вызова.

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

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

Процедура принимает больше 4–5 параметровПризнак для упаковки в структуру

Сгруппируйте связанные параметры и передайте одной структурой

Данные приходят из JSON или HTTPЕстественное представление — структура

Используйте ПрочитатьJSON с чтением в структуру

Нужен отбор по нескольким полямСтруктура отбора

Имена ключей должны совпадать с именами полей отбора

Нужен поиск по ссылке как по ключуСтруктура не подойдёт

Используйте соответствие — ключи могут быть любого типа

Типичные ошибки и ограничения структур

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

Ещё одно ограничение — структура не сериализуется в хранилище значений и не сохраняется в базе как есть. Если нужно сохранить набор параметров между сеансами, его сериализуют в JSON-строку или XML и сохраняют как строку, либо раскладывают по полям объекта конфигурации.

Типичные ошибки
01
Чтение несуществующего ключа без проверки Свойство() — аварийное завершение кода
02
Опечатка в имени ключа — ошибка всплывёт только в runtime, а не при синтаксической проверке
03
Попытка использовать ссылку или число как ключ — ошибка: ключами могут быть только строки
04
Передача структуры по значению вместо ссылки в глубокую цепочку вызовов без понимания копирования
05
Использование структуры там, где нужен типизированный объект — потеря контроля состава данных

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

Как проверить результат и отладить работу со структурой

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

Порядок проверки структуры
  1. 1
    Поставьте точку останова после заполнения структуры
  2. 2
    Откройте табло (или окно «Вычислить выражение») и добавьте переменную структуры
  3. 3
    Разверните структуру и сверьте состав ключей с ожидаемым
  4. 4
    Проверьте типы значений — часто вместо ссылки оказывается строка или Неопределено
  5. 5
    Проверьте вложенные структуры и массивы на каждом уровне
Контрольные точки

Как отличить корректную структуру от проблемной

Состав ключей
Норма

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

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

Ключ отсутствует или назван иначе, чем читает вызываемый код

Типы значений
Норма

Ссылки — это ссылки, даты — даты

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

Вместо ссылки строка с наименованием, вместо даты — Неопределено

Обязательные параметры
Норма

Заполнены до вызова процедуры

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

Значение Неопределено доходит до бизнес-логики и вызывает сбой

Если структура передаётся между клиентом и сервером, помните про ограничения: в тонком и веб-клиенте через границу вызова проходят только сериализуемые типы. Ссылки, примитивы, вложенные структуры и массивы переносятся нормально, а вот объекты типа «Запрос» или «ТабличныйДокумент» в структуре через вызов сервера не передадите.

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

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

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

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

Напрямую — нет, структура существует только в памяти. Для хранения её сериализуют в строку JSON или XML и сохраняют в строковый реквизит, либо раскладывают значения по реквизитам объекта конфигурации.

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

Используйте метод Вставить с переменной: Параметры.Вставить(ИмяКлюча, Значение). Читать такой ключ нужно через квадратные скобки — Параметры[ИмяКлюча] — с предварительной проверкой методом Свойство.

Что будет, если обратиться к несуществующему ключу?

Возникнет ошибка времени выполнения «Поле объекта не обнаружено», и выполнение кода прервётся. Чтобы этого избежать, проверяйте наличие ключа методом Свойство или оборачивайте чтение в попытку-исключение.

Можно ли вкладывать структуры друг в друга?

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

Когда структуру лучше заменить другим решением?

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

Итог

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

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