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

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

Как очистить переменную в 1С: практическое руководство

Как очистить переменную в 1С: Неопределено, пустые значения, очистка коллекций, таблиц значений и реквизитов формы. Примеры кода и типичные ошибки.

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

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

Ниже разобраны все основные сценарии: от простых примитивных типов до таблиц значений, реквизитов формы и параметров запроса, с примерами кода, проверками результата и типичными ошибками.

Что значит «очистить переменную» в контексте 1С

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

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

Важно понимать, что Неопределено не равно пустой строке, нулю или пустой ссылке. Сравнение Неопределено = "" вернёт Ложь, а попытка сложить Неопределено с числом вызовет ошибку исполнения. Поэтому после очистки переменной через Неопределено код обязан проверять её перед использованием.

Очистка примитивных типов: строки, числа, даты, булево

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

СтрокаДанных = "";            // пустая строка

СуммаИтог = 0; // ноль

ДатаОтбора = '00010101'; // пустая дата

ПризнакОбработан = Ложь; // сброс флага

ЛюбаяПеременная = Неопределено; // универсальный сброс

Выбор между пустым значением типа и Неопределено зависит от дальнейшего использования. Если переменная сразу после очистки участвует в конкатенации строк или арифметике, безопаснее присвоить "" или 0 — тогда не потребуется дополнительных проверок. Если переменная служит признаком «данные ещё не загружены», логичнее Неопределено с явной проверкой.

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

Убедиться, что переменная очищена, можно простым сравнением. Для Неопределено используйте строгое сравнение: Если Переменная = Неопределено Тогда ... КонецЕсли;. Для «пустоты» любого типа удобна функция ЗначениеЗаполнено(Переменная) — она возвращает Ложь для пустых строк, нулей, пустых дат, пустых ссылок и Неопределено.

Очистка коллекций: массивы, структуры, соответствия, списки значений

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

Массив.Очистить();           // массив станет пустым, Количество() = 0

Соответствие.Очистить(); // все пары ключ-значение удалены

СписокЗначений.Очистить(); // список пуст

Структура = Новый Структура; // у структуры метода Очистить() нет — создаём заново

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

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

Очистка таблицы значений и дерева значений

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

ТаблицаДанных.Очистить();        // строки удалены, колонки на месте

ДеревоЗначений.Строки.Очистить(); // очистка строк верхнего уровня дерева

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

Для дерева значений метод Очистить() вызывается у коллекции строк: Дерево.Строки.Очистить(). То же относится и к вложенным уровням иерархии — у каждой строки есть своя коллекция Строки, которую можно очистить независимо.

Порядок действий при очистке таблицы значений
  1. 1
    Убедитесь, что переменная содержит именно таблицу значений: ТипЗнч(ТЗ) = Тип("ТаблицаЗначений")
  2. 2
    Если таблица используется в других переменных или реквизитах формы — решите, нужна ли общая очистка, или сделайте копию
  3. 3
    Вызовите ТЗ.Очистить() для удаления всех строк с сохранением колонок
  4. 4
    Проверьте результат: ТЗ.Количество() должно вернуть 0
  5. 5
    При повторном наполнении убедитесь, что добавляемые строки соответствуют сохранившимся колонкам

Очистка ссылочных значений и реквизитов объектов

Ссылочные переменные (документы, справочники, перечисления) очищают присвоением пустой ссылки. Получить её можно двумя способами: через менеджер типа — Справочники.Номенклатура.ПустаяСсылка(), либо универсально — через метод ПустаяСсылка() самого объекта или значения.

ТекущийКонтрагент = Справочники.Контрагенты.ПустаяСсылка();

ТекущийДокумент = Документы.РеализацияТоваровУслуг.ПустаяСсылка();

Если тип переменной заранее неизвестен (составной тип реквизита), универсального «очистить ссылку» нет — нужно либо знать конкретный тип, либо присвоить Неопределено. Проверка на пустоту выполняется функцией ЗначениеЗаполнено() или методом ссылки Пустая().

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

Очистка реквизитов и элементов управляемой формы

На управляемой форме реквизиты очищаются теми же присвоениями, но с учётом их типа. Реквизит типа «ТаблицаЗначений» или «ДинамическийСписок» имеет свои особенности: таблицу формы очищают через Объект.ТабличнаяЧасть.Очистить() для данных объекта или РеквизитТаблица.Очистить() для реквизита формы.

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

Отдельный случай — динамический список с произвольным запросом. Его «очистка» обычно означает сброс отборов и параметров, а не удаление строк: параметры сбрасывают через Список.Параметры.УстановитьЗначениеПараметра(), а отборы — очисткой элементов настройки. Удалять строки из динамического списка напрямую нельзя — он лишь отображает данные запроса.

Проверка результата и типичные ошибки

После очистки полезно убедиться, что переменная действительно в ожидаемом состоянии. Набор проверок зависит от типа: для коллекций — Количество() = 0, для ссылок — Пустая() или ЗначениеЗаполнено(), для универсального случая — сравнение с Неопределено.

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

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

Коллекция после Очистить()
Норма

Количество() возвращает 0, обход циклом не выполняется

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

Количество() больше 0 — очистка вызвана не у той переменной или не у того объекта

Ссылочная переменная
Норма

ЗначениеЗаполнено() возвращает Ложь

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

Функция возвращает Истина — присвоена пустая ссылка другого типа или значение не изменено

Переменная после присвоения Неопределено
Норма

Сравнение с Неопределено даёт Истина, ТипЗнч() = Неопределено

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

Переменная всё ещё содержит старое значение — присвоение выполнено в другой области видимости

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

Ещё одна частая проблема — область видимости. Если переменная объявлена в модуле, а очистка выполняется внутри процедуры с одноимённой локальной переменной, модульная переменная останется неизменной. При подозрении на такую ситуацию проверьте, не объявлена ли переменная повторно через Перем внутри процедуры.

В циклах обработки данных очищайте переменные-аккумуляторы в начале итерации, а не в конце: при выходе через Прервать или Продолжить состояние останется предсказуемым, и отладка заметно упростится.
ПЗ
Практическое замечание

Часто задаваемые вопросы

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

Это разные типы. Пустая строка — значение типа Строка нулевой длины, с ней можно выполнять строковые операции. Неопределено означает отсутствие значения; операции с ним без предварительной проверки вызывают ошибку. Сравнение Неопределено = "" всегда возвращает Ложь.

Как очистить переменную составного типа, если тип заранее неизвестен?

Присвойте Неопределено — это работает для любого типа. Если нужно «пустое» значение конкретного типа, сначала определите тип через ТипЗнч(), а затем присвойте соответствующее пустое значение: пустую ссылку, ноль, пустую строку или пустую дату.

Нужно ли вручную освобождать память после очистки переменной?

Нет. Платформа 1С автоматически уничтожает значения, на которые не осталось ссылок. Присвоив переменной Неопределено или новое значение, вы отпускаете старое, и сборщик мусора сделает остальное. Явных команд освобождения памяти во встроенном языке нет.

Как очистить только часть строк таблицы значений по условию?

Используйте НайтиСтроки() с отбором и удаляйте найденные строки через Удалить() в цикле. Альтернатива — получить новую таблицу методом Скопировать() с параметром отбора, оставив только нужные строки, и присвоить её исходной переменной.

Почему после Очистить() коллекция в другой переменной тоже стала пустой?

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

Как сбросить параметр запроса, если он больше не нужен?

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

Итог

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

Способ очистки определяется типом значения: примитивы — присвоением пустого значения или Неопределено, коллекции и таблицы — методом Очистить(), ссылки — ПустаяСсылка(). Помните, что коллекции передаются по ссылке, у структуры нет метода Очистить(), а очистка реквизита объекта требует записи для сохранения в базе.