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