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

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

Как очистить колонку табличной части в 1С

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

Очистка колонки табличной части — типовая задача, которая возникает и у пользователя, и у разработчика 1С. Бухгалтеру нужно обнулить цены в документе поступления, программисту — сбросить значения реквизита при изменении ключевого поля шапки. Способ решения зависит от того, работаете вы в режиме предприятия через интерфейс или пишете код на встроенном языке.

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

Ниже разобраны четыре рабочих подхода: программная очистка через цикл, метод ЗаполнитьЗначения, интерактивная обработка «Групповое изменение реквизитов» и очистка на управляемой форме. Для каждого способа приведены условия применения, ограничения и проверка результата.

Чем очистка колонки отличается от очистки табличной части

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

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

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

Способ 1. Очистка колонки циклом по строкам

Самый универсальный программный приём — перебор строк табличной части с присвоением пустого значения нужному реквизиту. Он работает в любой версии платформы 8.x, на клиенте и на сервере, и позволяет добавить условия: очищать не все строки, а только отобранные по признаку.

Для Каждого СтрокаТовары Из Объект.Товары Цикл

СтрокаТовары.Скидка = 0;

КонецЦикла;

Тип присваиваемого значения должен соответствовать типу реквизита. Для числовой колонки подойдёт 0, для строковой — пустая строка "", для ссылочной — конструкция вида Справочники.Склады.ПустаяСсылка() или универсальное Неопределено, если состав типа это допускает. Несовпадение типов приведёт к ошибке преобразования значения при записи объекта.

Цикл незаменим, когда очистка нужна выборочно. Например, обнулить скидку только в строках с определённым складом:

Для Каждого СтрокаТовары Из Объект.Товары Цикл

Если СтрокаТовары.Склад = СкладОтгрузки Тогда

СтрокаТовары.Скидка = 0;

КонецЕсли;

КонецЦикла;

Способ 2. Метод ЗаполнитьЗначения — очистка одной строкой кода

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

Объект.Товары.ЗаполнитьЗначения(0, "Скидка");

// несколько колонок сразу:

Объект.Товары.ЗаполнитьЗначения(0, "Скидка, Наценка");

Метод короче и нагляднее цикла, но лишён гибкости: условие отбора строк в него не передаётся. Если нужно очистить колонку только в части строк, сначала получите массив строк через НайтиСтроки(Отбор) и уже по нему пройдитесь циклом. Для полной очистки колонки ЗаполнитьЗначения — предпочтительный вариант.

Учтите, что метод работает и на управляемой форме с данными типа ДанныеФормыКоллекция, поэтому его удобно вызывать в клиентских обработчиках, например при изменении договора в шапке документа, когда согласованные скидки должны сбрасываться.

bsl
Объект.Товары.ЗаполнитьЗначения(0, "Скидка");

Способ 3. Очистка колонки без программирования — обработка «Групповое изменение реквизитов»

Пользователю без доступа к конфигуратору поможет стандартная обработка «Групповое изменение реквизитов». В типовых конфигурациях она находится в разделе «Администрирование» → «Обслуживание» → «Корректировка данных». Обработка позволяет массово изменить реквизиты, включая табличные части, у отобранных документов.

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

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

Групповая очистка колонки через обработку
  1. 1
    Сделайте резервную копию или убедитесь, что она создаётся регламентно
  2. 2
    Откройте Администрирование → Обслуживание → Корректировка данных → Групповое изменение реквизитов
  3. 3
    Выберите тип документа и настройте отбор — сначала один документ для теста
  4. 4
    В реквизитах найдите табличную часть и нужную колонку, задайте пустое значение
  5. 5
    Выполните изменение и проверьте результат в тестовом документе
  6. 6
    Повторите операцию для полного отбора

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

На управляемой форме табличная часть документа представлена как ДанныеФормыКоллекция. Оба описанных приёма — цикл и ЗаполнитьЗначения — работают с ней напрямую, если обращаться через Объект.Товары в модуле формы. Ограничение появляется, когда код выполняется в клиентском контексте директивой &НаКлиенте: обращение к данным формы допустимо, но вызов серверных функций внутри цикла сильно замедлит работу на больших таблицах.

Для табличных частей в несколько тысяч строк переносите логику в серверную процедуру &НаСервере или &НаСервереБезКонтекста. Клиентский цикл по 10 000 строк с вызовами сервера внутри может занимать минуты, серверный — доли секунды. Признак проблемы: форма «зависает» при нажатии кнопки очистки.

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

Как проверить результат и не потерять данные

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

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

Признак того, что что-то пошло не так: после записи документа в смежных колонках появились нули, которых не было, или документ отказывается проводиться с ошибкой заполнения. В этом случае не записывайте дальше — восстановите объект из копии и пересмотрите код, особенно типы присваиваемых значений.

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

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

Количество строк табличной части
Норма

Совпадает с количеством до очистки

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

Строк стало меньше — вместо очистки колонки удалены строки

Значения целевой колонки
Норма

Пустые значения (0, пустая строка или ссылка) во всех строках

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

Часть строк сохранила старые значения — сработал отбор или прерван цикл

Смежные колонки и итоги
Норма

Другие реквизиты не изменились, итоги пересчитаны

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

Обнулились лишние колонки или итоги устарели

Типичные ошибки при очистке колонки

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

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

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

FAQ

Как очистить колонку только в выделенных строках табличной части?

На управляемой форме получите выделенные строки через Элементы.Товары.ВыделенныеСтроки, затем пройдитесь по ним циклом и обратитесь к строкам коллекции через Объект.Товары.НайтиПоИдентификатору(Ид). Каждой найденной строке присвойте пустое значение нужного реквизита.

Можно ли очистить колонку во всех документах сразу запросом?

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

Почему после очистки колонки сумма документа не пересчиталась?

Итоговые реквизиты шапки не пересчитываются автоматически при программном изменении табличной части. После очистки вызовите пересчёт: в типовых конфигурациях это процедуры обработки табличных частей или присвоение суммы документа через Объект.СуммаДокумента = Объект.Товары.Итог("Сумма").

Как очистить ссылочную колонку, например «Склад»?

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

Очистится ли колонка у всех строк, если табличная часть отфильтрована на форме?

Нет, если вы работаете через отбор строк на форме — цикл по отобранным строкам затронет только их. Метод ЗаполнитьЗначения по Объект.Товары обрабатывает всю коллекцию независимо от установленного на форме отбора. Выбирайте приём в зависимости от того, нужна полная или частичная очистка.

Итог

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

Очистка колонки — это обнуление одного реквизита во всех строках без удаления самих строк. Программно используйте цикл или ЗаполнитьЗначения, без кода — обработку «Групповое изменение реквизитов». Всегда проверяйте количество строк до и после, пересчитывайте итоги и тестируйте массовые операции на копии базы.