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