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