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