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

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

Структура в 1С: что это и как её использовать

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

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

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

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

Что такое структура и как она устроена

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

Ключи структуры должны быть уникальными: если добавить элемент с уже существующим ключом, значение будет перезаписано. Обращение к элементу выполняется либо через точку (Структура.ИмяКлюча), либо через квадратные скобки со строковым выражением (Структура["ИмяКлюча"]), что удобно, когда имя ключа формируется динамически.

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

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

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

// Пустая структура с постепенным наполнением

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

ПараметрыОтбора.Вставить("Организация", ТекущаяОрганизация);

ПараметрыОтбора.Вставить("Период", НачалоМесяца(ТекущаяДата()));

// Создание одной строкой

ДанныеСтроки = Новый Структура("Номенклатура, Количество, Цена",

НоменклатураСсылка, 5, 1200);

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

Для чтения значений с защитой от ошибок используется метод Свойство(): он возвращает Истина, если ключ найден, и помещает значение в переменную, переданную вторым параметром.

Если ПараметрыОтбора.Свойство("Организация", Организация) Тогда

// работаем с переменной Организация

КонецЕсли;

Порядок работы со структурой
  1. 1
    Создайте структуру через Новый Структура с нужным набором ключей
  2. 2
    Заполните значения через Вставить() или присваивание по ключу
  3. 3
    Перед чтением проверяйте наличие ключа методом Свойство()
  4. 4
    Переберите элементы циклом Для Каждого ... Из ... при необходимости обхода
  5. 5
    Проверьте результат в отладчике, развернув переменную структуры

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

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

КритерийСтруктураСоответствиеМассив
Тип ключаСтрока-идентификаторЛюбой типЧисловой индекс от 0
Обращение через точкуДаНетНет
Чтение несуществующего ключаОшибка (через точку)Возвращает НеопределеноОшибка выхода за границы
Типичное применениеПараметры, именованные данныеКэши, поиск по ссылкеУпорядоченные списки

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

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

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

Структура

Именованные параметры и наборы полей; ключи известны заранее. Ограничение: ключи только строковые, нельзя сериализовать напрямую в запрос.

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

Ключи — ссылки или значения произвольного типа, нужен быстрый поиск. Ограничение: нет доступа через точку, легче пропустить отсутствие ключа.

Массив

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

Типовые сценарии применения структуры

Передача параметров в процедуры и функции

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

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

Отборы и параметры запросов

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

Возврат нескольких значений из функции

Функция в 1С возвращает одно значение, но на практике часто нужно вернуть результат операции плюс сопутствующие данные: признак успеха, текст ошибки, рассчитанные суммы. Возврат структуры с полями Успех, СообщениеОбОшибке, Результат — распространённый и читаемый паттерн.

Единообразие важнее краткости: договоритесь в команде об одинаковых именах ключей для типовых структур (например, всегда Успех/ОписаниеОшибки). Это заметно упрощает сопровождение кода и поиск мест использования.
ПЗ
Практическое замечание

Ограничения и подводные камни

Структура не сериализуется «сама по себе»: её нельзя напрямую поместить в хранилище значения, параметр сеанса или передать между сеансами без преобразования. Для передачи между клиентом и сервером структура подходит, если содержит только сериализуемые платформой типы, но для сохранения в базу потребуется запись в реквизиты объекта или преобразование, например, в JSON.

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

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

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

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

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

Для программной проверки используйте метод Количество() (число элементов), перебор циклом Для Каждого Элемент Из Структура Цикл с доступом к Элемент.Ключ и Элемент.Значение, а также метод Очистить() для сброса содержимого перед повторным использованием переменной.

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

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

Наличие нужных ключей
Норма

Свойство() возвращает Истина для каждого обязательного ключа

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

Свойство() возвращает Ложь — ключ не добавлен или имя с опечаткой

Состав структуры в отладчике
Норма

В табло видны все ожидаемые пары ключ-значение

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

Лишние или отсутствующие элементы, значения Неопределено там, где ожидались данные

Поведение после вызова процедуры
Норма

Исходная структура не изменилась, если это не предусмотрено

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

Значения перезаписаны вызванным кодом — нужна копия структуры

FAQ

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

Структура требует строковые ключи-идентификаторы и позволяет обращение через точку, а при чтении несуществующего ключа выдаёт ошибку. Соответствие принимает ключи любого типа и при отсутствии ключа возвращает Неопределено. Для именованных параметров обычно берут структуру, для поиска по ссылкам — соответствие.

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

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

Как проверить, есть ли ключ в структуре?

Используйте метод Свойство("ИмяКлюча", ПеременнаяЗначения): он вернёт Истина, если ключ существует, и запишет значение во второй параметр. Вызов с одним параметром просто вернёт признак наличия ключа.

Передаётся ли структура в процедуру по значению или по ссылке?

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

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

Да, значением элемента структуры может быть другая структура, массив или их комбинация произвольной глубины. Это используется для описания иерархических настроек, но чрезмерная вложенность затрудняет отладку — разумно ограничиваться двумя-тремя уровнями.

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

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

Итог

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

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