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