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

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

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

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

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

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

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

Метод Удалить(): базовый синтаксис

Метод вызывается у объекта типа «Структура» и принимает имя ключа в виде строки. Синтаксис предельно лаконичен:

СтруктураДанных = Новый Структура;

СтруктураДанных.Вставить("Номенклатура", СсылкаНаТовар);

СтруктураДанных.Вставить("Количество", 10);

СтруктураДанных.Вставить("СлужебныйКлюч", Истина);

// Удаляем служебный ключ

СтруктураДанных.Удалить("СлужебныйКлюч");

После выполнения Удалить("СлужебныйКлюч") в структуре останутся только «Номенклатура» и «Количество». Попытка обратиться к удалённому ключу через СтруктураДанных.СлужебныйКлюч приведёт к ошибке «Поле объекта не обнаружено».

Обратите внимание: метод не возвращает удалённое значение. Если значение нужно сохранить перед удалением, его следует сначала прочитать в отдельную переменную, и только потом вызывать Удалить().

Проверка существования ключа перед удалением

Если вызвать Удалить() для ключа, которого нет в структуре, платформа выдаст ошибку выполнения. В типовых сценариях, где состав структуры заранее известен, это не проблема. Но когда структура формируется динамически или приходит извне (из другого модуля, из формы, из обмена), обязательна проверка.

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

Если СтруктураДанных.Свойство("СлужебныйКлюч") Тогда

СтруктураДанных.Удалить("СлужебныйКлюч");

КонецЕсли;

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

Безопасное удаление ключа
  1. 1
    Получите или сформируйте структуру
  2. 2
    Проверьте наличие ключа через Свойство("ИмяКлюча")
  3. 3
    При необходимости сохраните значение в переменную
  4. 4
    Вызовите Удалить("ИмяКлюча")
  5. 5
    Проверьте результат повторным вызовом Свойства — должно вернуться Ложь

Удаление нескольких значений и работа в цикле

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

КлючиДляУдаления = Новый Массив;

КлючиДляУдаления.Добавить("ВременныйПризнак");

КлючиДляУдаления.Добавить("СлужебныйКлюч");

КлючиДляУдаления.Добавить("Отладка");

Для Каждого ИмяКлюча Из КлючиДляУдаления Цикл

Если СтруктураДанных.Свойство(ИмяКлюча) Тогда

СтруктураДанных.Удалить(ИмяКлюча);

КонецЕсли;

КонецЦикла;

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

// Удаляем все ключи, начинающиеся с "Врем"

КлючиДляУдаления = Новый Массив;

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

Если СтрНачинаетсяС(Элемент.Ключ, "Врем") Тогда

КлючиДляУдаления.Добавить(Элемент.Ключ);

КонецЕсли;

КонецЦикла;

Для Каждого ИмяКлюча Из КлючиДляУдаления Цикл

СтруктураДанных.Удалить(ИмяКлюча);

КонецЦикла;

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

Полная очистка и альтернативные подходы

Если нужно убрать не отдельные значения, а все элементы сразу, перебирать ключи не требуется — достаточно присвоить переменной новую пустую структуру или пересоздать объект:

СтруктураДанных = Новый Структура;

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

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

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

Удалить(Ключ)

Точечное удаление одного элемента. Подходит, когда нужно убрать один-два известных ключа, сохранив остальное.

Цикл по списку ключей

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

Новая структура

Полная замена объекта. Быстро, но разрывает ссылки на старый объект — не подходит при передаче по ссылке.

Формирование новой структуры с нужными ключами

Альтернатива удалению, когда проще перечислить, что оставить. Исходные данные сохраняются.

Особенности: регистр, типы ключей и связанные объекты

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

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

Отдельно стоит упомянуть фиксированные структуры (ФиксированнаяСтруктура): они доступны только для чтения, и метод Удалить() у них отсутствует. Попытка изменить такой объект приведёт к ошибке. Если нужно модифицировать данные, сначала создайте обычную структуру и скопируйте в неё нужные элементы.

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

После удаления полезно убедиться, что структура пришла в ожидаемое состояние. Простейший способ — повторный вызов Свойство(), который должен вернуть Ложь, и проверка количества элементов через СтруктураДанных.Количество().

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

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

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

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

Наличие удалённого ключа
Норма

Свойство("Ключ") возвращает Ложь

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

Свойство() возвращает Истина — удаление не выполнено или удалён другой ключ

Количество элементов
Норма

Количество() уменьшилось на число удалённых ключей

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

Количество не изменилось или уменьшилось больше ожидаемого

Дальнейшая работа кода
Норма

Обращения к оставшимся ключам проходят без ошибок

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

Ошибка «Поле объекта не обнаружено» — удалён нужный ключ или нарушен порядок вызовов

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

Что произойдёт, если удалить несуществующий ключ?

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

Можно ли удалить значение, оставив ключ?

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

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

Сначала получите саму структуру из родительской коллекции (например, ЭлементСоответствия.Значение), затем вызовите у неё Удалить(). Поскольку структура — ссылочный тип, изменения отразятся и внутри родительской коллекции, дополнительно ничего возвращать не нужно.

Работает ли Удалить() на тонком клиенте и в веб-клиенте?

Да, структура и её методы доступны во всех клиентских контекстах и на сервере. Ограничение одно: если структура сформирована на сервере и передана на клиент, составные типы значений (ссылки, запросы) могут быть недоступны, но само удаление ключей работает везде одинаково.

Чем структура отличается от соответствия при удалении?

Синтаксис удаления одинаков — Удалить(Ключ). Разница в ключах: у структуры ключ — только строка-идентификатор, у соответствия ключом может быть значение любого типа, включая ссылки и числа. Поэтому для соответствия проверка перед удалением делается иначе — через поиск ключа или Попытка/Исключение.

Можно ли отменить удаление ключа?

Нет, операция необратима. Если есть вероятность, что удалённые данные понадобятся, сохраните копию структуры или значение ключа в отдельную переменную до вызова Удалить(). Для сложных сценариев удобно вести отдельную структуру «удалённых» значений для последующего анализа.

Итог

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

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