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