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