Здраствуйте! Учусь программировать в 1с. Подскажите пожалуйста, мне нужно удалить строки из документа УстановкаКурсаВалют те строки, где нет предопределенных валют. Я сделал выборку этих строк, осталось только удалить. Код привожу ниже

```1c
    Процедура УдалитьСтрокиНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | УстановкаКурсаВалют.Ссылка КАК Ссылка1,
    | УстановкаКурсаВалют.ПометкаУдаления КАК ПометкаУдаления1,
    | УстановкаКурсаВалют.Номер КАК Номер,
    | УстановкаКурсаВалют.Дата КАК Дата,
    | УстановкаКурсаВалют.Проведен КАК Проведен,
    | УстановкаКурсаВалют.Курсы.(
    | Ссылка КАК СсылкаТЧ,
    | НомерСтроки КАК НомерСтрокиТЧ,
    | Валюта КАК ВалютаТЧ,
    | Курс КАК КурсТЧ,
    | Символ КАК Символ) КАК Курсы
    |ИЗ
    | Документ.УстановкаКурсаВалют КАК УстановкаКурсаВалют";

    ВыборкаДокумент = Запрос.Выполнить().Выбрать();

    УдалитьТП=Новый Массив;

    Пока ВыборкаДокумент.Следующий() Цикл ;
    ВыборкаНоменклатурныйСостав = ВыборкаДокумент.Курсы.Выбрать();

    Пока ВыборкаНоменклатурныйСостав.Следующий() Цикл
    ИмяПредопрЭлемента = Справочники.Валюты.ПолучитьИмяПредопределенного(ВыборкаНоменклатурныйСостав.ВалютаТЧ);
    Строка = ВыборкаНоменклатурныйСостав.ВалютаТЧ.Наименование;
    СсылкаСтроки = ВыборкаНоменклатурныйСостав.ВалютаТЧ.Ссылка;
    Если СокрЛП(ВРег(ИмяПредопрЭлемента)) <> СокрЛП(ВРег(Строка)) Или СсылкаСтроки.Пустая() Тогда

    УдалитьТП.Добавить(Строка); // Тут в массив пишу строки для удаления;
    Иначе

    КонецЕсли;

    КонецЦикла;
    КонецЦикла;

    КонецПроцедуры
```
---
Почувствуйте разницу, таксскать:

```1c
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | УстановкаКурсаВалют.Ссылка КАК Ссылка
    | УстановкаКурсаВалют.НомерСтроки КАК НомерСтроки
    |ИЗ
    | Документ.УстановкаКурсаВалют.Курсы КАК УстановкаКурсаВалют
    |ГДЕ
    | НЕ УстановкаКурсаВалют.Валюта.Предопределенный
    |ИТОГИ ПО
    | Ccылка";

    ВыборкаДокумент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаДокумент.Следующий() Цикл ;
    ДокОбъект = ВыборкаДокумент.Ссылка.ПолучитьОбъект();
    ТЗ = ДокументОбъект.Курсы.Выгрузить();
    ТЗ.Индексы.Добавить("НомерСтроки");
    ВыборкаНоменклатурныйСостав = ВыборкаДокумент.Выбрать();
    Пока ВыборкаНоменклатурныйСостав.Следующий() Цикл
    Строка = ТЗ.Найти(ВыборкаНоменклатурныйСостав.НомерСтроки, "НомерСтроки");
    ТЗ.Удалить(Строка);
    КонецЦикла;
    ДокОбъект.Загрузить(ТЗ);
    ДокОбъект.Записать(?(ДокОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись));
    КонецЦикла;
```
---
Почувствуйте разницу, таксскать:

```1c
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | УстановкаКурсаВалют.Ссылка КАК Ссылка
    | УстановкаКурсаВалют.НомерСтроки КАК НомерСтроки
    |ИЗ
    | Документ.УстановкаКурсаВалют.Курсы КАК УстановкаКурсаВалют
    |ГДЕ
    | НЕ УстановкаКурсаВалют.Валюта.Предопределенный
    |ИТОГИ ПО
    | Ccылка";

    ВыборкаДокумент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаДокумент.Следующий() Цикл ;
    ДокОбъект = ВыборкаДокумент.Ссылка.ПолучитьОбъект();
    ТЗ = ДокументОбъект.Курсы.Выгрузить();
    ТЗ.Индексы.Добавить("НомерСтроки");
    ВыборкаНоменклатурныйСостав = ВыборкаДокумент.Выбрать();
    Пока ВыборкаНоменклатурныйСостав.Следующий() Цикл
    Строка = ТЗ.Найти(ВыборкаНоменклатурныйСостав.НомерСтроки, "НомерСтроки");
    ТЗ.Удалить(Строка);
    КонецЦикла;
    ДокОбъект.Загрузить(ТЗ);
    ДокОбъект.Записать(?(ДокОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись));
    КонецЦикла;
```
---
Спасибо! Работает!

```1c
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | УстановкаКурсаВалют.Ссылка КАК Ссылка,
    | УстановкаКурсаВалют.НомерСтроки КАК НомерСтроки
    |ИЗ
    | Документ.УстановкаКурсаВалют.Курсы КАК УстановкаКурсаВалют
    |ГДЕ
    | НЕ УстановкаКурсаВалют.Валюта.Предопределенный
    |ИТОГИ ПО
    | УстановкаКурсаВалют.Ссылка";

    ВыборкаДокумент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаДокумент.Следующий() Цикл ;
    ДокОбъект = ВыборкаДокумент.Ссылка.ПолучитьОбъект();
    ТЗ = ДокОбъект.Курсы.Выгрузить();
    ТЗ.Индексы.Добавить("НомерСтроки");
    ВыборкаНоменклатурныйСостав = ВыборкаДокумент.Выбрать();
    Пока ВыборкаНоменклатурныйСостав.Следующий() Цикл
    Строка = ТЗ.Найти(ВыборкаНоменклатурныйСостав.НомерСтроки, "НомерСтроки");
    ТЗ.Удалить(Строка);
    КонецЦикла;
    ДокОбъект.Курсы.Загрузить(ТЗ);
    ДокОбъект.Записать(?(ДокОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись));
    КонецЦикла;
```
---
Можно сделать тупо выборку документов и по формуле

```1c
    КолСтрок = ДокументОбъект.Курсы.Количество();
    Для Счетчик = 1 По КолСтрок Цикл
    ТекСтрока = Поступление.Курсы[КолСтрок-1];
    Если не ТекСтрока.Номенклатура.Предопределенный Тогда
    ДокументОбъект.Курсы.Удалить(ТекСтрока);
    КонецЕсли;
    КонецЦикла;
```

очистить документы от непредопределенных элементов
---
ДокументОбъект
Количество строк может изменится и все сломается :)
Лучше, всё ж, в массив загнать нужные строки и по массиву уже обходить.
---
соглашусь, это и проще и надежнее
---
Не совсем понял как оно может измениться в документ-объекте помимо самого удаления строк)
Начинаем перебирать с конца, удаляем ненужные строки. Если б с начала начали перебор, то тогда, соглашусь, сломалось бы.
---
Ну да, вот на эту конструкцию внимания не обратил: "КолСтрок-1". Посмотрел только на "Счетчик = 1".

Согласен, Ваш код рабочий.
---
(7) Должно быть КолСтрок-Счетчик, иначе всегда будет удаляться последняя строка
---
Да, это промоморгал)