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