Запрос ко всем документам и последующее удаление определенных документов.
Здравствуйте, дорогие форумчане! Передо мной стоит задача создание внешней обработки с одной лишь кнопкой, при нажатии на которую произойдет следующее:
Обработка через запрос обратится ко всем документам. В каждом документе будут удалены все, кроме 5-и первых элементов в документе за месяц. То есть, как пример, у меня есть Документ АвансовыйОтчет. В этом документе очень много элементов. И они добавляются уже 8 месяцев. В каждом месяце добавлялось порядка 1000 элементов. Так вот при нажатии на кнопку мне надо, чтобы обработка в документе АвансовыйОтчет разделила элементы по месяцам и в каждом месяце удалила все, кроме первых 5 добавленных в этот месяц.
Пока что, я додумался обратиться только ко всем метаданным документов через запрос, но не смог дать границу времени, то есть каждый месяц. Пока для наглядности я оставил ТекущаяДата. На руках у меня есть щас этот код:
Обработка через запрос обратится ко всем документам. В каждом документе будут удалены все, кроме 5-и первых элементов в документе за месяц. То есть, как пример, у меня есть Документ АвансовыйОтчет. В этом документе очень много элементов. И они добавляются уже 8 месяцев. В каждом месяце добавлялось порядка 1000 элементов. Так вот при нажатии на кнопку мне надо, чтобы обработка в документе АвансовыйОтчет разделила элементы по месяцам и в каждом месяце удалила все, кроме первых 5 добавленных в этот месяц.
Пока что, я додумался обратиться только ко всем метаданным документов через запрос, но не смог дать границу времени, то есть каждый месяц. Пока для наглядности я оставил ТекущаяДата. На руках у меня есть щас этот код:
Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
|ГДЕ
| "+ИмяДокумента+".Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата";
НачальнаяДата = ТекущаяДата();
КонечнаяДата = ТекущаяДата();
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("НачальнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить();
ВыборкаДокументов = Результат.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
ВыборкаДокументов.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
КонецЦикла;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Удаление данных с отбором и построением дерева ссылок в базах 1С 8.1-8.3 УТ 10.3./11, БП 2/3, ЗУП 2.5/3, КА 1.1/2, УНФ 1.6/3.0
- Альтернативный контроль помеченных и быстрое удаление средствами SQL
- Модуль "Интеграция с 1С:Документооборот 2.1 и 3.0" для УПП/КА/УТ 10.3/БГУ 1.0/ЗБУ 1.0. 1С-Совместимо
- Оригиналы документов
- Проверка документов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ВЫБРАТЬ
ОтпускаОрганизаций.Ссылка,
НАЧАЛОПЕРИОДА(ОтпускаОрганизаций.Дата, МЕСЯЦ) КАК ТекМесяц,
ОтпускаОрганизаций.Дата КАК Дата
ИЗ
Документ.ОтпускаОрганизаций КАК ОтпускаОрганизаций
ГДЕ
ОтпускаОрганизаций.Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
УПОРЯДОЧИТЬ ПО
Дата
ИТОГИ ПО
ТекМесяц
Показать
(2)Здравствуйте!
1) Вы же в данном запросе обращаетесь к одному документу.
2) Вы в запросе не определяете МЕЖДУ &НачальнаяДата И &КонечнаяДата, как период за месяц, с момента добавления элементов. ("В принципе моя проблема и заключается в этом".
3) Так же в запросе нет условия о том, чтобы обработка выбирала только первые пять элементов.
1) Вы же в данном запросе обращаетесь к одному документу.
2) Вы в запросе не определяете МЕЖДУ &НачальнаяДата И &КонечнаяДата, как период за месяц, с момента добавления элементов. ("В принципе моя проблема и заключается в этом".
3) Так же в запросе нет условия о том, чтобы обработка выбирала только первые пять элементов.
(3)
Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
|ГДЕ
| "+ИмяДокумента+".Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата";
НачальнаяДата = ТекущаяДата();
КонечнаяДата = ТекущаяДата();
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("НачальнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить().Выгрузить();
Нужные = 0;
Пока Для Каждого Стр из Результат Цикл
Нужные = Нужные+1;
Если Нужные < 5 Тогда
Стр.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
Иначе
Прервать;
КонецЦикла;
КонецЦикла;
Показать
(4)Здравствуйте. А разве в запросе
будут выбираться все документы? И ещё НачальнаяДата И конецнаяДата, разве, должны оставаться Текищими? Ведь в таком случае у меня не будет деления элементов на периоды (месяца). Я думал записать это как-то в виде цикла 1 по 12. Чтобы разделить на месяца, но не знаю как я могу то логически записать.
"ВЫБРАТЬ
| Ссылка
будут выбираться все документы? И ещё НачальнаяДата И конецнаяДата, разве, должны оставаться Текищими? Ведь в таком случае у меня не будет деления элементов на периоды (месяца). Я думал записать это как-то в виде цикла 1 по 12. Чтобы разделить на месяца, но не знаю как я могу то логически записать.
Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ТаблицаДокументов.Ссылка КАК Ссылка,
| НАЧАЛОПЕРИОДА(ТаблицаДокументов.Дата, МЕСЯЦ) КАК ТекМесяц,
| 1 КАК ИтогДокумент,
| ТаблицаДокументов.Дата КАК Дата
|ПОМЕСТИТЬ Свод
|ИЗ
| Документ."+ИмяДокумента+" КАК ТаблицаДокументов
|ГДЕ
| ТаблицаДокументов.Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
| И НЕ ТаблицаДокументов.ПометкаУдаления
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Свод1.Ссылка КАК Ссылка
|ИЗ
| Свод КАК Свод1
| ЛЕВОЕ СОЕДИНЕНИЕ Свод КАК Свод2
| ПО Свод1.ТекМесяц = Свод2.ТекМесяц
| И Свод1.Дата >= Свод2.Дата
|
|СГРУППИРОВАТЬ ПО
| Свод1.Ссылка,
| Свод1.ТекМесяц,
| Свод1.Дата
|
|ИМЕЮЩИЕ
| СУММА(Свод2.ИтогДокумент) > 5";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("НачальнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить();
ВыборкаДокументов = Результат.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
ВыборкаДокументов.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
КонецЦикла;
КонецЦикла;
Таки ответ был нужен? Вот с отбором 5 документов в запросе
И лучше в текст запроса сразу вставить имеющийся документ, а потом через СтрЗаменить изменять.
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ТаблицаДокументов.Ссылка КАК Ссылка,
| НАЧАЛОПЕРИОДА(ТаблицаДокументов.Дата, МЕСЯЦ) КАК ТекМесяц,
| 1 КАК ИтогДокумент,
| ТаблицаДокументов.Дата КАК Дата
|ПОМЕСТИТЬ Свод
|ИЗ
| Документ."+ИмяДокумента+" КАК ТаблицаДокументов
|ГДЕ
| ТаблицаДокументов.Дата МЕЖДУ &НачальнаяДата И &КонечнаяДата
| И НЕ ТаблицаДокументов.ПометкаУдаления
|;
|
|////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Свод1.Ссылка КАК Ссылка
|ИЗ
| Свод КАК Свод1
| ЛЕВОЕ СОЕДИНЕНИЕ Свод КАК Свод2
| ПО Свод1.ТекМесяц = Свод2.ТекМесяц
| И Свод1.Дата >= Свод2.Дата
|
|СГРУППИРОВАТЬ ПО
| Свод1.Ссылка,
| Свод1.ТекМесяц,
| Свод1.Дата
|
|ИМЕЮЩИЕ
| СУММА(Свод2.ИтогДокумент) > 5";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("НачальнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить();
ВыборкаДокументов = Результат.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
ВыборкаДокументов.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
КонецЦикла;
КонецЦикла;
Таки ответ был нужен? Вот с отбором 5 документов в запросе
И лучше в текст запроса сразу вставить имеющийся документ, а потом через СтрЗаменить изменять.
(6) Извините, что отвечаю поздно. Я проверил Ваш запрос, но он не работает. При этом не выдает ошибок. Я сам доработал и сделал чуток полегче, без Сводов. Получилось следующее, но я не могу додумать цикл, при котором первые 5 останутся, а остальные удалятся.
С данным циклом удаляется первые 5 как раз, а мне надо наоборот
Для Каждого МетоданноеДокументы Из Метаданные.Документы Цикл
ИмяДокумента = МетоданноеДокументы.Имя;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 5
| "+ИмяДокумента+".Ссылка
|ИЗ
| Документ."+ИмяДокумента+" КАК "+ИмяДокумента+"
| УПОРЯДОЧИТЬ ПО
| Дата
|ИТОГИ ПО
| Дата ПЕРИОДАМИ(МЕСЯЦ, &НачальнаяДата, &КонечнаяДата)";
НачальнаяДата = Дата(2000,1,1);
КонечнаяДата = Дата(2030,1,1);
Запрос.УстановитьПараметр("НачальнаяДата",НачальнаяДата);
Запрос.УстановитьПараметр("КонечнаяДата",КонечнаяДата);
Результат = Запрос.Выполнить();
ВыборкаДокументов = Результат.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
ВыборкаДокументов.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ПомеченныеНаУдаление = НайтиПомеченныеНаУдаление();
УстановитьМонопольныйРежим(Истина);
УдалитьОбъекты(ПомеченныеНаУдаление, Истина);
КонецЦикла;
КонецЦикла;
ПоказатьС данным циклом удаляется первые 5 как раз, а мне надо наоборот
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот