Добрый день уважаемые форумчане! Делаю внешнюю обработку и проблема заключается в следующем: необходимо брать строки ТЧ документа и проверять на заполнение реквизитов Студент или Контрагент. Если хоть один из них заполнен, то пометка на удаление Ложь, если оба реквизита пустые тогда Истина. Код отрабатывает вообще непонятным образом, некоторые документы с 1 строкой зацикливаются по десяткам раз, другие с несколькими строками проходят по циклу как надо, некоторые доки попадают в выборку, но по циклу не проходят от слова совсем, некоторые корректные доки висят после обработки с пометкой на удаление, другие идентичные практически - без пометки. Запрос отрабатывает корректно, данные попадают верные. В общем какая-то дичь, сижу уже второй день, ничего понять не могу. Отладчик гонял на доке с 1 строкой, который падал в лютый цикл по 30 раз, ничего не дало (объективно говоря я не очень с ним дружу). Буду благодарен любой помощи! Код прикладываю ниже:

```1c
    Процедура КнопкаВыполнитьНажатие(Кнопка)

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | уз_ПриказПоУчебномуЗаведению.Ссылка,
    | уз_ПриказПоУчебномуЗаведению.Дата,
    | уз_ПриказПоУчебномуЗаведению.Номер,
    | уз_ПриказПоУчебномуЗаведению.Список.(
    | Контрагент,
    | Студент
    | )
    |ИЗ
    | Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
    |ГДЕ
    | уз_ПриказПоУчебномуЗаведению.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)";
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

    Если (ДокСсылка.Список.Количество() > 0) Тогда

    ДокОбъект = ДокСсылка.ПолучитьОбъект();

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

    Если (НЕ ЗначениеЗаполнено(ТекСтрока.Студент)) И (НЕ ЗначениеЗаполнено(ТекСтрока.Контрагент)) Тогда

    ДокОбъектЗапомнить = 0;

    ИначеЕсли (ЗначениеЗаполнено(ТекСтрока.Контрагент)) ИЛИ (ЗначениеЗаполнено(ТекСтрока.Студент)) Тогда

    ДокОбъектЗапомнить = 1;

    КонецЕсли;

    КонецЦикла;

    Иначе

    ДокОбъектЗапомнить = 0;

    КонецЕсли;

    Если ДокОбъектЗапомнить = 0 Тогда

    ДокОбъект.УстановитьПометкуУдаления(Истина);
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Установлена пометка удаления на документ №: " + ДокОбъект.Номер + " от " + Строка(ДокОбъект.Дата));

    ИначеЕсли ДокОбъектЗапомнить = 1 Тогда

    ДокОбъект.УстановитьПометкуУдаления(Ложь);
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Снята пометка удаления с документа №: " + ДокОбъект.Номер + " от " + Строка(ДокОбъект.Дата));

    КонецЕсли;

    КонецЦикла;

    Сообщить("Обработка завершена!")

    КонецПроцедуры
```
---
Тогда вот так)) Сложно писать запрос не имея под рукой объектов)

```1c
    ВЫБРАТЬ
    уз_ПриказПоУчебномуЗаведению.Ссылка КАК уз_ПриказПоУчебномуЗаведению,
    уз_ПриказПоУчебномуЗаведению.ПометкаУдаления КАК ПометкаУдаления
    ПОМЕСТИТЬ ДокументыПриказ
    ИЗ
    Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
    ГДЕ
    уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДокументыПриказ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению,
    МАКСИМУМ(ВЫБОР
    КОГДА ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Студент, ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
    И ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
    КОНЕЦ) КАК УстановитьПометкуУдаления,
    ДокументыПриказ.ПометкаУдаления
    ПОМЕСТИТЬ ДокументыПриказСДаннымиПоТЧ
    ИЗ
    ДокументыПриказ КАК ДокументыПриказ
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
    ПО ДокументыПриказ.уз_ПриказПоУчебномуЗаведению = уз_ПриказПоУчебномуЗаведениюСписок.Ссылка

    СГРУППИРОВАТЬ ПО
    ДокументыПриказ.уз_ПриказПоУчебномуЗаведению,
    ДокументыПриказ.ПометкаУдаления
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДокументыПриказСДаннымиПоТЧ.уз_ПриказПоУчебномуЗаведению,
    ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления,
    ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
    ИЗ
    ДокументыПриказСДаннымиПоТЧ КАК ДокументыПриказСДаннымиПоТЧ
    ГДЕ
    НЕ ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления = ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
```
---
вы с какой целью в запрос включаете ТЧ документа, если потом ТЧ перебираете уже через объект документа?
---
забыл убрать из запроса
ну в принципе это на работоспособность отчета не влияет
---
Ну а что? Логично наверное работает: если в первой строке документа у вас не заполнено ни одно поле, а в последней - хоть одно, то ваш алгоритм снимет пометку удаления.
---
в том то и дело, что доки, которые с 1 заполненной строкой тоже висят с пометкой удаления
а так как Вы написали так и надо, что если хоть что-то заполнена, хоть одна строка, то пометка должна быть снята
---
Так если последняя строка будет не заполнена, то документ пометится на удаление.
---
ну это да, тут не обратил внимание, спасибо большое, исправил
---
А чем не устраивает такой запрос?

```1c
    ВЫБРАТЬ
    уз_ПриказПоУчебномуЗаведениюСписок.Ссылка КАК Ссылка,
    МАКСИМУМ(ВЫБОР
    КОГДА уз_ПриказПоУчебномуЗаведениюСписок.Студент = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
    И уз_ПриказПоУчебномуЗаведениюСписок.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
    КОНЕЦ) КАК УстановитьПометкуУдаления
    ИЗ
    Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
    ГДЕ
    уз_ПриказПоУчебномуЗаведениюСписок.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)

    СГРУППИРОВАТЬ ПО
    уз_ПриказПоУчебномуЗаведениюСписок.Ссылка

    УПОРЯДОЧИТЬ ПО
    Ссылка
    АВТОУПОРЯДОЧИВАНИЕ
```

При условии конечно, что Студент и Контрагент у вас реквизиты не составного типа, и примерно того типа, что я указал (можно и поменять).

Далее просто перебираете результат запроса и на основании "УстановитьПометкуУдаления" устанавливаете или снимаете пометку на удаление.
---
Ну во-первых, я бы все это выбрал запросом. Во-вторых результат выборки обошел бы в цикле, я бы вернул только документы которые нужны для того чтобы установить флаг удаления. И все. Пишешь запрос к ТЧ документа. Устанавливаешь параметры отбора. Делов на 3 копейки.

```1c
    ВЫБРАТЬ
    | уз_ПриказПоУчебномуЗаведению.Ссылка КАК Ссылка
    |ИЗ
    | уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведению
    |ГДЕ
    | уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
    | И уз_ПриказПоУчебномуЗаведению.Студент = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
    | И уз_ПриказПоУчебномуЗаведению.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)";
```
---
в любом случае работать со всеми доками придется, т.к. часть доков, которые нужны, помечены на удаление
---
Так в мой запрос можно расширить и сделать еще сравнение текущей пометки на удаление с той, которую предлагает запрос. И обрабатывать только те документы, у которых несовпадение)
---
я вот как раз сейчас с Вашим запросом копаюсь)
---
К чему эти усложнения? Вариант предложенный (9) уже по своей сути перегружен не нужными сравнениями, задача здесь примитивная.
---
Вы считаете, что проще перебор строк сделать? И быстрее? В моем запросе минимум необходимого. Просьба указать не перегруженность, может что-то и не учел)

Upd. Автор же еще хочет предусмотреть ситуацию, когда документ помечен на удаление, а пометка должна быть снята.
---
Мне кажется у ваших обоих запросов есть недочёт. У автора есть ветка в условии

```1c
    Если (ДокСсылка.Список.Количество() > 0) Тогда
```

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

```1c
    ВЫБРАТЬ
    уз_ПриказПоУчебномуЗаведению.Ссылка КАК уз_ПриказПоУчебномуЗаведению,
    уз_ПриказПоУчебномуЗаведению.ПометкаУдаления КАК ПометкаУдаления
    ПОМЕСТИТЬ ДокументыПриказ
    ИЗ
    Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
    ГДЕ
    уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДокументыПриказ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению,
    МАКСИМУМ(ВЫБОР
    КОГДА ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Студент, ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
    И ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
    КОНЕЦ) КАК УстановитьПометкуУдаления,
    ДокументыПриказ.ПометкаУдаления
    ПОМЕСТИТЬ ДокументыПриказСДаннымиПоТЧ
    ИЗ
    ДокументыПриказ КАК ДокументыПриказ
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
    ПО ДокументыПриказ.уз_ПриказПоУчебномуЗаведению = уз_ПриказПоУчебномуЗаведениюСписок.Ссылка

    СГРУППИРОВАТЬ ПО
    ДокументыПриказ.уз_ПриказПоУчебномуЗаведению,
    ДокументыПриказ.ПометкаУдаления
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДокументыПриказСДаннымиПоТЧ.уз_ПриказПоУчебномуЗаведению,
    ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления,
    ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
    ИЗ
    ДокументыПриказСДаннымиПоТЧ КАК ДокументыПриказСДаннымиПоТЧ
    ГДЕ
    НЕ ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления = ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
```
---
Одно уточнение, каким образом мне сейчас работать с пометкой удаление у док-тов? Выборка.Ссылка и ПолучитьОбъект не работают
Заранее большое спасибо за ответ!
---
Судя по тексту запроса
ТекущийДокумент = Выборка.уз_ПриказПоУчебномуЗаведению.ПолучитьОбъект();
ТекущийДокумент.УстановитьПометкуУдаления(Выборка.УстановитьПометкуУдаления)
---
Большое спасибо! Всё работает!