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

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

Как изменить значение в структуре 1С

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

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

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

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

Что такое структура в 1С и как она хранит значения

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

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

Изменение значения напрямую по ключу

Самый простой способ — присвоение через точку, когда имя ключа известно и ключ гарантированно существует в структуре:

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

Данные.Сумма = 250; // значение изменено

Данные.Количество = 10; // значение изменено

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

Изменение и добавление через метод Вставить()

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

Настройки = Новый Структура;

Настройки.Вставить("Организация", СсылкаНаОрганизацию);

Настройки.Вставить("Организация", ДругаяОрганизация); // значение заменено

Настройки.Вставить("Период", ТекущаяДатаСеанса()); // ключ добавлен

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

Проверка наличия ключа перед изменением

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

ТекущееЗначение = Неопределено;

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

Параметры.Вставить("Склад", НовыйСклад); // ключ есть — меняем

Иначе

Параметры.Вставить("Склад", СкладПоУмолчанию); // ключа нет — задаём

КонецЕсли;

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

Порядок безопасного изменения значения
  1. 1
    Проверьте наличие ключа методом Свойство()
  2. 2
    Если ключ есть — присвойте новое значение через точку или Вставить()
  3. 3
    Если ключа нет — добавьте его методом Вставить()
  4. 4
    Проверьте результат, прочитав значение обратно

Изменение значений в цикле при обходе структуры

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

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

Если ТипЗнч(Элемент.Значение) = Тип("Число") Тогда

Итоги.Вставить(Элемент.Ключ, Окр(Элемент.Значение, 2));

КонецЕсли;

КонецЦикла;

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

Типичные ошибки
01
Присваивание Элемент.Значение = ... в цикле — изменяется локальная копия, структура остаётся прежней
02
Обращение к несуществующему ключу через точку — ошибка «Поле объекта не обнаружено»
03
Изменение структуры, переданной по ссылке, без учёта того, что вызывающий код тоже увидит изменения
04
Использование ключа с пробелом или дефисом — такой ключ недоступен через точку

Особые случаи: фиксированная структура и вложенные структуры

Фиксированная структура

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

Изменяемая = Новый Структура(ФиксированнаяСтруктура);

Изменяемая.Вставить("Период", НоваяДата);

Вложенные структуры

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

Если Настройки.Свойство("Отбор") Тогда

Настройки.Отбор.Вставить("Склад", НовыйСклад);

КонецЕсли;

Способы изменения значения

Присваивание через точку

Быстро и читаемо, но только для гарантированно существующих ключей, допустимых в синтаксисе идентификаторов

Метод Вставить()

Универсально: меняет или добавляет ключ, имя можно формировать динамически строкой

Новый Структура(ФиксированнаяСтруктура)

Единственный вариант для изменения данных из фиксированной структуры — через создание изменяемой копии

Проверка результата и отладка

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

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

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

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

Чтение значения после присваивания
Норма

Возвращается новое значение

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

Возвращается старое значение — изменение не применилось

Наличие ключа после Вставить()
Норма

Свойство() возвращает Истина

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

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

Поведение вызывающего кода
Норма

Изменения видны там, где ожидались

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

Структура изменилась в неожиданном месте — побочный эффект передачи по ссылке

Часто задаваемые вопросы

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

Используйте метод Вставить("Ключ", Значение) — он перезапишет существующее значение или добавит новую пару. Если нужно различать ситуации, предварительно проверьте наличие ключа методом Свойство().

Почему изменение в цикле Для Каждого не сохраняется?

Потому что переменная цикла содержит копию элемента. Присваивание Элемент.Значение = Х меняет только эту копию. Изменяйте структуру через Вставить(Элемент.Ключ, НовоеЗначение).

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

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

Как изменить значение в фиксированной структуре?

Фиксированная структура неизменяема. Создайте на её основе обычную структуру конструктором Новый Структура(ФиксированнаяСтруктура), внесите изменения и работайте с копией.

Изменится ли структура в вызывающем коде, если я поменял её внутри процедуры?

Да. Структура передаётся по ссылке, поэтому все изменения внутри процедуры видны снаружи. Если это нежелательно, передавайте копию структуры.

Итог

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

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