14.01.2026 Степан Радченко 104
Как в системе программ 1С программно удалить ...

Содержание:

1.     Метод 1: Обратный цикл Пока в 1С

2.     Метод 2: Сбор строк для удаления при работе в системе 1С (Двухпроходный)

3.     Контекст выполнения: Клиент или Сервер при использовании программы 1С:Предприятие

 

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


Главное правило: Нельзя удалять из коллекции, которую обходишь

Представьте, что вы идете по лестнице и выбиваете из-под себя ступеньку, на которой стоите. Примерно то же самое происходит, когда вы пытаетесь удалить элемент из коллекции, используя стандартный цикл Для Каждого ... Из ... Цикл.


Неправильный код, который приведет к ошибке:


// ЭТОТ КОД РАБОТАЕТ НЕПРАВИЛЬНО!

// Получаем объект документа

ДокументОбъект = РеквизитФормыВЗначение("Объект");

ТабЧастьТовары = ДокументОбъект.Товары;

// Пытаемся удалить строки, где Количество равно нулю

Для Каждого СтрокаТЧ Из ТабЧастьТовары Цикл

    Если СтрокаТЧ.Количество = 0 Тогда

        // При удалении текущего элемента итератор "ломается"

        // и следующий элемент коллекции будет пропущен!

        ТабЧастьТовары.Удалить(СтрокаТЧ);

    КонецЕсли;

КонецЦикла;

 

Почему это не работает? Итератор, который используется в цикле Для Каждого, "запоминает" свою текущую позицию. Когда вы удаляете элемент, вся коллекция сдвигается. Элемент, который был следующим за удаленным, встает на его место. А итератор, ничего не зная об этом, просто переходит к следующей по счету позиции, тем самым пропуская только что сместившийся элемент. В итоге, если у вас идут две строки подряд, подлежащие удалению, удалена будет только первая из них.  

 

1.     Метод 1: Обратный цикл Пока в 1С


Чтобы избежать проблемы с итератором, нужно обходить коллекцию с конца к началу. В этом случае удаление элемента никак не влияет на те элементы, которые мы еще не просмотрели (так как они находятся "выше" по списку). Для этого идеально подходит цикл Пока.


Правильный код:


&НаСервере

Процедура УдалитьСтрокиНаСервере()

    // Получаем объект документа

    ДокументОбъект = РеквизитФормыВЗначение("Объект");

    ТабЧастьТовары = ДокументОбъект.Товары;

    // Обходим коллекцию с конца, используя индекс

    Индекс = ТабЧастьТовары.Количество() - 1;

    Пока Индекс >= 0 Цикл

       

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

        ТекущаяСтрока = ТабЧастьТовары[Индекс];

       

        // Проверяем условие

        Если ТекущаяСтрока.Количество = 0 Тогда

            // Смело удаляем, это ни на что не повлияет

            ТабЧастьТовары.Удалить(Индекс);

        КонецЕсли;

       

        // Переходим к предыдущему элементу

        Индекс = Индекс - 1;

       

    КонецЦикла;

   

    // Возвращаем измененные данные обратно на форму

    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");

КонецПроцедуры


Этот надежен, эффективен и легко читается.


2.     Метод 2: Сбор строк для удаления при работе в системе 1С (Двухпроходный)


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

1.          Сначала в обычном цикле Для Каждого собрать в массив те строки, которые нужно удалить.

2.          Затем обойти этот массив и удалить найденные строки из табличной части.


Правильный код:


&НаСервере

Процедура УдалитьСтрокиНаСервере()

    // Получаем объект документа

    ДокументОбъект = РеквизитФормыВЗначение("Объект");

    ТабЧастьТовары = ДокументОбъект.Товары;

    // 1. Собираем строки для удаления

    МассивДляУдаления = Новый Массив;

    Для Каждого СтрокаТЧ Из ТабЧастьТовары Цикл

        Если СтрокаТЧ.Количество = 0 Тогда

            МассивДляУдаления.Добавить(СтрокаТЧ);

        КонецЕсли;

    КонецЦикла;

   

    // 2. Удаляем собранные строки

    Для Каждого СтрокаКУдалению Из МассивДляУдаления Цикл

        ТабЧастьТовары.Удалить(СтрокаКУдалению);

    КонецЦикла;

   

    // Возвращаем измененные данные обратно на форму

    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");

КонецПроцедуры

    

Этот метод чуть менее производителен из-за создания дополнительного массива и двойного обхода, но для небольших табличных частей разница незаметна. Иногда он может быть более читаемым. Важно, что метод Удалить() у коллекции табличной части может принимать в качестве параметра не только индекс, но и саму строку. 


3. Контекст выполнения: Клиент или Сервер при использовании программы 1С:Предприятие


Важно помнить, что изменение данных объекта (включая его табличные части) — это серверная операция. Приведенные выше примеры кода должны выполняться в процедурах и функциях с директивой &НаСервере или &НаСервереБезКонтекста. На клиенте вы можете работать только с данными формы, и после удаления строки из табличной части на форме, эти изменения нужно будет передать на сервер для записи в базу данных.

 

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


  Специалист компании ООО "Кодерлайн"

Степан Радченко

Наши проекты

ООО ХДМ Рус
ООО ХДМ Рус

Отрасль:
Торговля

Внедренное типовое решение:
1С:Бухгалтерия ПРОФ

Бухгалтерский учет Банк и касса Расчеты с контрагентами Торговые операции ...

ООО «ПЛЮСПЭЙ»
ООО «ПЛЮСПЭЙ»

Отрасль:
Организацией расчетов посредством электронных средств платежа

Внедренное типовое решение:
1С:Комплексная автоматизация

- Разработка подсистемы оперативного учета транзакций...

Внедрение 1С:Управление торговлей
ООО «Амперсенд»

Отрасль:
Оптовая торговля

Внедренное типовое решение:
1С:Управление торговлей

- Оформление заказов поставщикам;
- Управление отношениями с поставщиками;...

Внедрение «1С:Зарплата и управление персоналом 8 КОРП» в компании «ПБК»
ООО «Партнер Бухгалтер Консультант»

Отрасль:
Бухгалтерские услуги

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Интеграция продукта с базой данных оперативного учета Axapta;
- Доработка фу...

ФГОУ ВПО «Горский государственный аграрный университет»
ФГОУ ВПО «Горский государственный аграрный университет»

Отрасль:
Образование

Внедренное типовое решение:
1С:Колледж ПРОФ

- Управление персоналом и кадровый учет (HRM):
Кадровый учет
Управление об...

Автоматизация контроля исполнительской дисциплины на базе ПП «1С:Документооборот 8 ПРОФ»
ООО «ФСК Лидер»

Отрасль:
Строительство и девелопмент

Внедренное типовое решение:
1С:Документооборот 8 ПРОФ

- Делопроизводство;
- Учет и хранение документов;
- Учет и контроль исполне...

Автоматизация документооборота в компании ООО "Ликард"
ООО «Ликард» (ОАО ЛУКОЙЛ)

Отрасль:
Нефтесервис

Внедренное типовое решение:
1С:Документооборот КОРП

- Отказ от бумажного документооборота, от громоздких систем на базе офисного...

Автоматизация кадрового учета на базе ПП "1С:Зарплата и управление персоналом" в ТД НМК
ООО «Торговый дом Нальчикский молочный комбинат»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Зарплата и управление персоналом

- Кадровый учет;
- Расчет зарплаты;
- Регламентированная отчетность;
- А...

ОАО «Интер РАО – Электрогенерация»
ОАО «Интер РАО – Электрогенерация»

Отрасль:
Электрогенерация

Внедренное типовое решение:
1С:Управление производственным предприятием

Для работы 2500 пользователей в 9 часовых поясах организована территориально-...

Автоматизация учета на базе ПП "1С:Комплексная автоматизация 8" в ЗАО "Крюгер-Гранд"
ЗАО «Крюгер-Гранд»

Отрасль:
Производство

Внедренное типовое решение:
1С:Комплексная автоматизация

- Создание интерфейсов и наборов прав пользователей;
- Отражению временных ...

ОАО «Фаберлик»
ОАО «Фаберлик»

Отрасль:

Внедренное типовое решение:
1С:ERP. Управление производственным предприятием 2

- Регламентированный учет;
- Кадровый учет;...

ООО "ТК "Сытый Дом-НН"
ООО "ТК "Сытый Дом-НН"

Отрасль:
Торговля, склад, логистика, транспорт

Внедренное типовое решение:
1С:Управление торговлей 8

Взаиморасчеты с покупателями
Оптовая торговля
Управление складскими за...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение