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

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

Как работать со структурой в 1С

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

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

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

Создание структуры: конструктор и пустой объект

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

// Пустая структура

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

// Ключи без значений (все равны Неопределено)

Отбор = Новый Структура("Организация, Склад, Номенклатура");

// Ключи со значениями

Данные = Новый Структура("Номер, Дата, Сумма", "0001", ТекущаяДатаСеанса(), 1500);

Частая ошибка — несовпадение количества ключей и значений в конструкторе. Если значений меньше, чем ключей, оставшиеся получат Неопределено; если больше — платформа выдаст ошибку при выполнении. Поэтому при перечислении более трёх-четырёх полей надёжнее создать структуру с ключами, а значения присваивать отдельными строками — так проще проверить соответствие глазами.

Чтение и изменение значений

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

ЗначениеСуммы = Неопределено;

Если Данные.Свойство("Сумма", ЗначениеСуммы) Тогда

// ключ есть, работаем со значением

Иначе

// ключа нет — задаём поведение по умолчанию

ЗначениеСуммы = 0;

КонецЕсли;

Для изменения состава используются методы Вставить("Ключ", Значение) и Удалить("Ключ"). Важная особенность: Вставить() с существующим ключом не вызывает ошибки, а молча перезаписывает значение. Это удобно для обновления, но опасно, если вы рассчитывали, что ключ ещё не занят.

Проверка наличия ключа и обход структуры

Метод Свойство() — стандартный способ проверки. У него есть нюанс: если ключ существует, но его значение равно Неопределено, метод всё равно вернёт Истина. То есть проверка отвечает на вопрос «есть ли ключ», а не «заполнено ли значение» — для второго нужна отдельная проверка через ЗначениеЗаполнено().

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

Для Каждого Элемент Из Данные Цикл

Сообщить(Элемент.Ключ + " = " + Элемент.Значение);

КонецЦикла;

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

Безопасное чтение значения из структуры
  1. 1
    Вызовите Структура.Свойство("ИмяКлюча", ПеременнаяЗначения)
  2. 2
    Проверьте возвращённое булево: Истина — ключ существует
  3. 3
    При отсутствии ключа присвойте переменной значение по умолчанию
  4. 4
    Если ключ есть, но значение может быть пустым, дополнительно проверьте через ЗначениеЗаполнено()

Структура как параметры и результат функции

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

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

Функция РассчитатьСкидку(Параметры)

Результат = Новый Структура("Успешно, СуммаСкидки, ТекстОшибки", Ложь, 0, "");

// ... логика расчёта ...

Возврат Результат;

КонецФункции

Договоритесь внутри команды о едином стиле имён ключей (например, всегда с заглавной буквы, без пробелов). Смешение стилей вроде "сумма" и "Сумма" в разных модулях — частый источник трудноотловимых ошибок, потому что имена ключей регистронезависимы, но читается такой код плохо.
ПЗ
Практическое замечание

Вложенные структуры и копирование

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

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

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

Структура или соответствие: что выбрать

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

КритерийСтруктураСоответствие
Тип ключаСтрока — допустимое имя переменнойЛюбой тип, включая ссылки
Доступ к значениюЧерез точку или Свойство()Только через квадратные скобки
Типичное применениеПараметры, настройки, именованные поляКэш по ссылкам, произвольные ключи
Сериализация в JSONНапрямуюТребует преобразования ключей

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

Маршрут решения

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

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

Проверка результата и ограничения

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

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

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

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

Состав ключей после формирования
Норма

Количество() совпадает с ожидаемым, все ключи читаются через Свойство()

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

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

Значения после передачи в процедуру
Норма

Получатель видит те же значения, что отправитель

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

Значения изменились — где-то структура модифицируется по ссылке

Передача с клиента на сервер
Норма

Вызов выполняется без ошибок сериализации

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

Ошибка передачи — внутри есть несериализуемое значение

Частые вопросы

Можно ли использовать в ключе структуры строку с пробелом?

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

Чем отличается Вставить() от присваивания через точку?

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

Как удалить все элементы структуры?

Вызовите метод Очистить() — он удаляет все ключи, оставляя пустой объект. Альтернатива — присвоить переменной новую пустую структуру, но тогда другие переменные, ссылающиеся на старый объект, продолжат видеть прежние данные.

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

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

Регистронезависимы ли имена ключей?

Да, как и все идентификаторы встроенного языка: ключи «Сумма» и «сумма» — это один и тот же ключ. Тем не менее стоит придерживаться единого написания, чтобы код было проще искать и читать.

Можно ли обойти структуру в заданном порядке?

Нет, порядок обхода не гарантирован платформой. Если последовательность важна, храните список ключей отдельно в массиве и обходите структуру по этому массиву.

Итог

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

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