Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
20 сен 2021, 05:48

Запрос ко всем документам и последующее удаление определенных документов

Автор Varlant1n, 26 окт 2020, 08:49

0 Пользователей и 1 гость просматривают эту тему.

Varlant1n

Здравствуйте, дорогие форумчане! Передо мной стоит задача создание внешней обработки с одной лишь кнопкой, при нажатии на которую произойдет следующее:
Обработка через запрос обратится ко всем документам. В каждом документе будут удалены все, кроме 5-и первых элементов в документе за месяц. То есть, как пример, у меня есть Документ АвансовыйОтчет. В этом документе очень много элементов. И они добавляются уже 8 месяцев. В каждом месяце добавлялось порядка 1000 элементов. Так вот при нажатии на кнопку мне надо, чтобы обработка в документе АвансовыйОтчет разделила элементы по месяцам и в каждом месяце удалила все, кроме первых 5 добавленных в этот месяц.
Пока что, я додумался обратиться только ко всем метаданным документов через запрос, но не смог дать границу времени, то есть каждый месяц. Пока для наглядности я оставил ТекущаяДата. На руках у меня есть щас этот код:


Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
        ИмяДокумента = МетоданноеДокументы.Имя;
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    Ссылка
        |ИЗ
        |    Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
        |ГДЕ
        |    "+ИмяДокумента+".Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата";
        НачальнаяДата = ТекущаяДата();
        КонечнаяДата = ТекущаяДата();
        Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
        Запрос.УстановитьПараметр("НачальнаяДата",КонечнаяДата);
        Результат = Запрос.Выполнить();
        ВыборкаДокументов = Результат.Выбрать();
        Пока ВыборкаДокументов.Следующий() Цикл
            ВыборкаДокументов.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
            ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
            УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
        КонецЦикла;
    КонецЦикла;

Varlant1n

Я чуток доработал и сделал так:

Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ ПЕРВЫЕ 5
|    "+ИмяДокумента+".Ссылка
|ИЗ
|    Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
| УПОРЯДОЧИТЬ ПО
        | Дата
        |ИТОГИ ПО
        | Дата ПЕРИОДАМИ(МЕСЯЦ, &НачальнаяДата, &КонечнаяДата)";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("КонечнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить();
ВыборкаДокументов = Результат.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
ВыборкаДокументов.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УстановитьМонопольныйРежим(Истина);
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
КонецЦикла;
КонецЦикла;



Но я не могу додумать цикл, при котором первые 5 останутся, а остальные удалятся. Сейчас происходит обратное.
Добавлено: 26 окт 2020, 11:14


Я ещё дальше проработал код, но теперь мне выдается ошибка: Итератор для значения не определен.


Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   "+ИмяДокумента+".Ссылка
|ИЗ
|   Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
|ГДЕ
        |    "+ИмяДокумента+".Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
|УПОРЯДОЧИТЬ ПО
        | Дата";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("КонечнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить();
Нужные = 0;
Для каждого Элемент Из Результат Цикл
Нужные = Нужные + 1;
Если Нужные > 5 Тогда
Элемент.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УстановитьМонопольныйРежим(Истина);
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;



ls600

Цитата: Varlant1n от 26 окт 2020, 09:41Результат = Запрос.Выполнить();
Выгрузи результат в таблицу значений 
Результат = Запрос.Выполнить().Выгрузить();
И код заработает.


Varlant1n

Цитата: ls600 от 26 окт 2020, 14:02
Цитата: Varlant1n от 26 окт 2020, 09:41Результат = Запрос.Выполнить();
Выгрузи результат в таблицу значений 
Результат = Запрос.Выполнить().Выгрузить();
И код заработает.

Теперь выдает такую ошибку:
{Обработка.ОбезличиваниеДанных.Форма.Форма.Форма(31)}: Метод объекта не обнаружен (Следующий)
      Пока Результат.Следующий() Цикл

ef0din

Цитата: Varlant1n от 27 окт 2020, 16:42
Цитата: ls600 от 26 окт 2020, 14:02
Цитата: Varlant1n от 26 окт 2020, 09:41Результат = Запрос.Выполнить();
Выгрузи результат в таблицу значений 
Результат = Запрос.Выполнить().Выгрузить();
И код заработает.

Теперь выдает такую ошибку:
{Обработка.ОбезличиваниеДанных.Форма.Форма.Форма(31)}: Метод объекта не обнаружен (Следующий)
      Пока Результат.Следующий() Цикл


Для Каждого Стр Из Результат Цикл

Varlant1n

Цитата: ef0din от 27 окт 2020, 17:52Для Каждого Стр Из Результат Цикл


Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
        ИмяДокумента = МетоданноеДокументы.Имя;
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    "+ИмяДокумента+".Ссылка
        |ИЗ
        |    Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
        |ГДЕ
        |    "+ИмяДокумента+".Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
|УПОРЯДОЧИТЬ ПО
| Дата
|ИТОГИ ПО
| Дата ПЕРИОДАМИ(МЕСЯЦ, &НачальнаяДата, &КонечнаяДата)";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("КонечнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить().Выбрать();
Счетчик = 0;
Для Каждого ЭлементДокумента Из Результат Цикл
Счетчик = Счетчик + 1;
Если Счетчик > 5 Тогда
Попытка
ЭлементДокумента.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УстановитьМонопольныйРежим(Истина);
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;


Ошибка: {Обработка.ОбезличиваниеДанных.Форма.Форма.Форма(31)}: Итератор для значения не определен
      Для Каждого ЭлементДокумента Из Результат Цикл

ef0din

Цитата: Varlant1n от 28 окт 2020, 08:42
Цитата: ef0din от 27 окт 2020, 17:52Для Каждого Стр Из Результат Цикл


Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
        ИмяДокумента = МетоданноеДокументы.Имя;
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    "+ИмяДокумента+".Ссылка
        |ИЗ
        |    Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
        |ГДЕ
        |    "+ИмяДокумента+".Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
|УПОРЯДОЧИТЬ ПО
| Дата
|ИТОГИ ПО
| Дата ПЕРИОДАМИ(МЕСЯЦ, &НачальнаяДата, &КонечнаяДата)";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("КонечнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить().Выбрать();
Счетчик = 0;
Для Каждого ЭлементДокумента Из Результат Цикл
Счетчик = Счетчик + 1;
Если Счетчик > 5 Тогда
Попытка
ЭлементДокумента.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УстановитьМонопольныйРежим(Истина);
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;


Ошибка: {Обработка.ОбезличиваниеДанных.Форма.Форма.Форма(31)}: Итератор для значения не определен
      Для Каждого ЭлементДокумента Из Результат Цикл


Если хотите через "Выгрузить()" - тогда "Для Каждого", если через "Выбрать()" - тогда "Следующий()"

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск