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

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


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

Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dehro 7 23.10.20 12:32 Сейчас в теме
ВЫБРАТЬ
	ОтпускаОрганизаций.Ссылка,
	НАЧАЛОПЕРИОДА(ОтпускаОрганизаций.Дата, МЕСЯЦ) КАК ТекМесяц,
	ОтпускаОрганизаций.Дата КАК Дата
ИЗ
	Документ.ОтпускаОрганизаций КАК ОтпускаОрганизаций
ГДЕ
	ОтпускаОрганизаций.Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата

УПОРЯДОЧИТЬ ПО
	Дата
ИТОГИ ПО
	ТекМесяц
Показать
3. Varlant1n 23.10.20 12:42 Сейчас в теме
(2)Здравствуйте!
1) Вы же в данном запросе обращаетесь к одному документу.
2) Вы в запросе не определяете МЕЖДУ &НачальнаяДата И &КонечнаяДата, как период за месяц, с момента добавления элементов. ("В принципе моя проблема и заключается в этом".
3) Так же в запросе нет условия о том, чтобы обработка выбирала только первые пять элементов.
4. Torin 830 23.10.20 12:56 Сейчас в теме
(3)
Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
        ИмяДокумента = МетоданноеДокументы.Имя;
        Запрос = Новый Запрос;
        Запрос.Текст =  
        "ВЫБРАТЬ
        |    Ссылка
        |ИЗ
        |    Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
        |ГДЕ
        |    "+ИмяДокумента+".Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата";
        НачальнаяДата = ТекущаяДата();
        КонечнаяДата = ТекущаяДата();
        Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
        Запрос.УстановитьПараметр("НачальнаяДата",КонечнаяДата);
        Результат = Запрос.Выполнить().Выгрузить();
        Нужные = 0;
        Пока Для Каждого Стр из  Результат Цикл
Нужные = Нужные+1;
            Если Нужные < 5 Тогда
            Стр.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
            ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
            УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
Иначе
Прервать;
        КонецЦикла;
    КонецЦикла;
Показать
5. Varlant1n 23.10.20 13:55 Сейчас в теме
(4)Здравствуйте. А разве в запросе
"ВЫБРАТЬ
        |    Ссылка


будут выбираться все документы? И ещё НачальнаяДата И конецнаяДата, разве, должны оставаться Текищими? Ведь в таком случае у меня не будет деления элементов на периоды (месяца). Я думал записать это как-то в виде цикла 1 по 12. Чтобы разделить на месяца, но не знаю как я могу то логически записать.
7. Torin 830 23.10.20 14:39 Сейчас в теме
(5)Похоже у вас уже сводиться к теме "Сделай за меня"
8. Varlant1n 23.10.20 14:42 Сейчас в теме
(7)Нет, просто мой вопрос и заключался в том, что я сам не могу додумать. И поэтому я попросил у Вас помощи, а так я из тех людей, которые даже получив ответ,попробуют его изменить/упростить и понять для дальнейшей работы. Спасибо за внимание!
6. dehro 7 23.10.20 14:11 Сейчас в теме
Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ТаблицаДокументов.Ссылка КАК Ссылка,
| НАЧАЛОПЕРИОДА(ТаблицаДокументов.Дата, МЕСЯЦ) КАК ТекМесяц,
| 1 КАК ИтогДокумент,
| ТаблицаДокументов.Дата КАК Дата
|ПОМЕСТИТЬ Свод
|ИЗ
| Документ."+ИмяДокумента+" КАК ТаблицаДокументов
|ГДЕ
| ТаблицаДокументов.Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
| И НЕ ТаблицаДокументов.ПометкаУдаления
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| Свод1.Ссылка КАК Ссылка
|ИЗ
| Свод КАК Свод1
| ЛЕВОЕ СОЕДИНЕНИЕ Свод КАК Свод2
| ПО Свод1.ТекМесяц = Свод2.ТекМесяц
| И Свод1.Дата >= Свод2.Дата
|
|СГРУППИРОВАТЬ ПО
| Свод1.Ссылка,
| Свод1.ТекМесяц,
| Свод1.Дата
|
|ИМЕЮЩИЕ
| СУММА(Свод2.ИтогДокумент) > 5";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("НачальнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить();
ВыборкаДокументов = Результат.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
ВыборкаДокументов.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
КонецЦикла;
КонецЦикла;


Таки ответ был нужен? Вот с отбором 5 документов в запросе

И лучше в текст запроса сразу вставить имеющийся документ, а потом через СтрЗаменить изменять.
9. Varlant1n 23.10.20 14:52 Сейчас в теме
(6)Сейчас попробую. Спасибо заранее. Выглядит устрашающе)
10. SlavaKron 23.10.20 14:54 Сейчас в теме
(9)
Выглядит устрашающе

Вы сами указали на то, что
в запросе нет условия о том, чтобы обработка выбирала только первые пять элементов
, вот и получили монстра вместо элементарного алгоритма на встроенном языке.
11. Varlant1n 26.10.20 09:41 Сейчас в теме
(6) Извините, что отвечаю поздно. Я проверил Ваш запрос, но он не работает. При этом не выдает ошибок. Я сам доработал и сделал чуток полегче, без Сводов. Получилось следующее, но я не могу додумать цикл, при котором первые 5 останутся, а остальные удалятся.

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

Показать


С данным циклом удаляется первые 5 как раз, а мне надо наоборот
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот