Добрый день уважаемые форумчане! Делаю внешнюю обработку и проблема заключается в следующем: необходимо брать строки ТЧ документа и проверять на заполнение реквизитов Студент или Контрагент. Если хоть один из них заполнен, то пометка на удаление Ложь, если оба реквизита пустые тогда Истина. Код отрабатывает вообще непонятным образом, некоторые документы с 1 строкой зацикливаются по десяткам раз, другие с несколькими строками проходят по циклу как надо, некоторые доки попадают в выборку, но по циклу не проходят от слова совсем, некоторые корректные доки висят после обработки с пометкой на удаление, другие идентичные практически - без пометки. Запрос отрабатывает корректно, данные попадают верные. В общем какая-то дичь, сижу уже второй день, ничего понять не могу. Отладчик гонял на доке с 1 строкой, который падал в лютый цикл по 30 раз, ничего не дало (объективно говоря я не очень с ним дружу). Буду благодарен любой помощи! Код прикладываю ниже:
Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| уз_ПриказПоУчебномуЗаведению.Ссылка,
| уз_ПриказПоУчебномуЗаведению.Дата,
| уз_ПриказПоУчебномуЗаведению.Номер,
| уз_ПриказПоУчебномуЗаведению.Список.(
| Контрагент,
| Студент
| )
|ИЗ
| Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
|ГДЕ
| уз_ПриказПоУчебномуЗаведению.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДокСсылка = ВыборкаДетальныеЗаписи.Ссылка;
Если (ДокСсылка.Список.Количество() > 0) Тогда
ДокОбъект = ДокСсылка.ПолучитьОбъект();
Для каждого ТекСтрока Из ДокОбъект.Список Цикл
Если (НЕ ЗначениеЗаполнено(ТекСтрока.Студент)) И (НЕ ЗначениеЗаполнено(ТекСтрока.Контрагент)) Тогда
ДокОбъектЗапомнить = 0;
ИначеЕсли (ЗначениеЗаполнено(ТекСтрока.Контрагент)) ИЛИ (ЗначениеЗаполнено(ТекСтрока.Студент)) Тогда
ДокОбъектЗапомнить = 1;
КонецЕсли;
КонецЦикла;
Иначе
ДокОбъектЗапомнить = 0;
КонецЕсли;
Если ДокОбъектЗапомнить = 0 Тогда
ДокОбъект.УстановитьПометкуУдаления(Истина);
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Установлена пометка удаления на документ №: " + ДокОбъект.Номер + " от " + Строка(ДокОбъект.Дата));
ИначеЕсли ДокОбъектЗапомнить = 1 Тогда
ДокОбъект.УстановитьПометкуУдаления(Ложь);
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Снята пометка удаления с документа №: " + ДокОбъект.Номер + " от " + Строка(ДокОбъект.Дата));
КонецЕсли;
КонецЦикла;
Сообщить("Обработка завершена!")
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Корректировка в табличной части единицы измерения для номенклатуры (Метаданные)
- Ведение взаиморасчетов в конфигурациях «Комплексная автоматизация 1.1» и «Управление производственным предприятием 1.3» - часть 2
- Исправление реализации путем заполнения правильных кодов строк в табличной части Товары
- Маркировка лекарственных препаратов. Часть первая "Быстрая интеграция"
- Заполнение табличной части "Этапы и графики оплат" в документах Реализация по соглашениям
Найденные решения
(15) Тогда вот так)) Сложно писать запрос не имея под рукой объектов)
ВЫБРАТЬ
уз_ПриказПоУчебномуЗаведению.Ссылка КАК уз_ПриказПоУчебномуЗаведению,
уз_ПриказПоУчебномуЗаведению.ПометкаУдаления КАК ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказ
ИЗ
Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
ГДЕ
уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению,
МАКСИМУМ(ВЫБОР
КОГДА ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Студент, ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
И ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ) КАК УстановитьПометкуУдаления,
ДокументыПриказ.ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказСДаннымиПоТЧ
ИЗ
ДокументыПриказ КАК ДокументыПриказ
ЛЕВОЕ СОЕДИНЕНИЕ Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
ПО ДокументыПриказ.уз_ПриказПоУчебномуЗаведению = уз_ПриказПоУчебномуЗаведениюСписок.Ссылка
СГРУППИРОВАТЬ ПО
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказ.ПометкаУдаления
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказСДаннымиПоТЧ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления,
ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
ИЗ
ДокументыПриказСДаннымиПоТЧ КАК ДокументыПриказСДаннымиПоТЧ
ГДЕ
НЕ ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления = ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
А чем не устраивает такой запрос?
При условии конечно, что Студент и Контрагент у вас реквизиты не составного типа, и примерно того типа, что я указал (можно и поменять).
Далее просто перебираете результат запроса и на основании "УстановитьПометкуУдаления" устанавливаете или снимаете пометку на удаление.
ВЫБРАТЬ
уз_ПриказПоУчебномуЗаведениюСписок.Ссылка КАК Ссылка,
МАКСИМУМ(ВЫБОР
КОГДА уз_ПриказПоУчебномуЗаведениюСписок.Студент = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
И уз_ПриказПоУчебномуЗаведениюСписок.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ) КАК УстановитьПометкуУдаления
ИЗ
Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
ГДЕ
уз_ПриказПоУчебномуЗаведениюСписок.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
СГРУППИРОВАТЬ ПО
уз_ПриказПоУчебномуЗаведениюСписок.Ссылка
УПОРЯДОЧИТЬ ПО
Ссылка
АВТОУПОРЯДОЧИВАНИЕ
ПоказатьПри условии конечно, что Студент и Контрагент у вас реквизиты не составного типа, и примерно того типа, что я указал (можно и поменять).
Далее просто перебираете результат запроса и на основании "УстановитьПометкуУдаления" устанавливаете или снимаете пометку на удаление.
Ну во-первых, я бы все это выбрал запросом. Во-вторых результат выборки обошел бы в цикле, я бы вернул только документы которые нужны для того чтобы установить флаг удаления. И все. Пишешь запрос к ТЧ документа. Устанавливаешь параметры отбора. Делов на 3 копейки.
ВЫБРАТЬ
| уз_ПриказПоУчебномуЗаведению.Ссылка КАК Ссылка
|ИЗ
| уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведению
|ГДЕ
| уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
| И уз_ПриказПоУчебномуЗаведению.Студент = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
| И уз_ПриказПоУчебномуЗаведению.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)";
(13) Вы считаете, что проще перебор строк сделать? И быстрее? В моем запросе минимум необходимого. Просьба указать не перегруженность, может что-то и не учел)
Upd. Автор же еще хочет предусмотреть ситуацию, когда документ помечен на удаление, а пометка должна быть снята.
Upd. Автор же еще хочет предусмотреть ситуацию, когда документ помечен на удаление, а пометка должна быть снята.
(14) Мне кажется у ваших обоих запросов есть недочёт. У автора есть ветка в условии
Где при условии, что таб часть пустая, то ставится пометка на удаление. В ваших запросах будет потеря этих доков.
Это так, чтобы автор если что копировал внимательно)
Если (ДокСсылка.Список.Количество() > 0) Тогда
Где при условии, что таб часть пустая, то ставится пометка на удаление. В ваших запросах будет потеря этих доков.
Это так, чтобы автор если что копировал внимательно)
(15) Тогда вот так)) Сложно писать запрос не имея под рукой объектов)
ВЫБРАТЬ
уз_ПриказПоУчебномуЗаведению.Ссылка КАК уз_ПриказПоУчебномуЗаведению,
уз_ПриказПоУчебномуЗаведению.ПометкаУдаления КАК ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказ
ИЗ
Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
ГДЕ
уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению,
МАКСИМУМ(ВЫБОР
КОГДА ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Студент, ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
И ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ) КАК УстановитьПометкуУдаления,
ДокументыПриказ.ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказСДаннымиПоТЧ
ИЗ
ДокументыПриказ КАК ДокументыПриказ
ЛЕВОЕ СОЕДИНЕНИЕ Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
ПО ДокументыПриказ.уз_ПриказПоУчебномуЗаведению = уз_ПриказПоУчебномуЗаведениюСписок.Ссылка
СГРУППИРОВАТЬ ПО
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказ.ПометкаУдаления
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказСДаннымиПоТЧ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления,
ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
ИЗ
ДокументыПриказСДаннымиПоТЧ КАК ДокументыПриказСДаннымиПоТЧ
ГДЕ
НЕ ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления = ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
Показать
(16)
Одно уточнение, каким образом мне сейчас работать с пометкой удаление у док-тов? Выборка.Ссылка и ПолучитьОбъект не работают
Заранее большое спасибо за ответ!
ВЫБРАТЬ
уз_ПриказПоУчебномуЗаведению.Ссылка КАК уз_ПриказПоУчебномуЗаведению,
уз_ПриказПоУчебномуЗаведению.ПометкаУдаления КАК ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказ
ИЗ
Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
ГДЕ
уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению,
МАКСИМУМ(ВЫБОР
КОГДА ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Студент, ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
И ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ) КАК УстановитьПометкуУдаления,
ДокументыПриказ.ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказСДаннымиПоТЧ
ИЗ
ДокументыПриказ КАК ДокументыПриказ
ЛЕВОЕ СОЕДИНЕНИЕ Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
ПО ДокументыПриказ.уз_ПриказПоУчебномуЗаведению = уз_ПриказПоУчебномуЗаведениюСписок.Ссылка
СГРУППИРОВАТЬ ПО
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказ.ПометкаУдаления
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказСДаннымиПоТЧ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления,
ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
ИЗ
ДокументыПриказСДаннымиПоТЧ КАК ДокументыПриказСДаннымиПоТЧ
ГДЕ
НЕ ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления = ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
Показатьуз_ПриказПоУчебномуЗаведению.Ссылка КАК уз_ПриказПоУчебномуЗаведению,
уз_ПриказПоУчебномуЗаведению.ПометкаУдаления КАК ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказ
ИЗ
Документ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению
ГДЕ
уз_ПриказПоУчебномуЗаведению.Ссылка.Дата < ДАТАВРЕМЯ(2017, 1, 1, 0, 0, 0)
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению КАК уз_ПриказПоУчебномуЗаведению,
МАКСИМУМ(ВЫБОР
КОГДА ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Студент, ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
И ЕСТЬNULL(уз_ПриказПоУчебномуЗаведениюСписок.Контрагент, ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ) КАК УстановитьПометкуУдаления,
ДокументыПриказ.ПометкаУдаления
ПОМЕСТИТЬ ДокументыПриказСДаннымиПоТЧ
ИЗ
ДокументыПриказ КАК ДокументыПриказ
ЛЕВОЕ СОЕДИНЕНИЕ Документ.уз_ПриказПоУчебномуЗаведению.Список КАК уз_ПриказПоУчебномуЗаведениюСписок
ПО ДокументыПриказ.уз_ПриказПоУчебномуЗаведению = уз_ПриказПоУчебномуЗаведениюСписок.Ссылка
СГРУППИРОВАТЬ ПО
ДокументыПриказ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказ.ПометкаУдаления
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДокументыПриказСДаннымиПоТЧ.уз_ПриказПоУчебномуЗаведению,
ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления,
ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
ИЗ
ДокументыПриказСДаннымиПоТЧ КАК ДокументыПриказСДаннымиПоТЧ
ГДЕ
НЕ ДокументыПриказСДаннымиПоТЧ.УстановитьПометкуУдаления = ДокументыПриказСДаннымиПоТЧ.ПометкаУдаления
Одно уточнение, каким образом мне сейчас работать с пометкой удаление у док-тов? Выборка.Ссылка и ПолучитьОбъект не работают
Заранее большое спасибо за ответ!
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот