По теме из базы знаний
- Работа с периодическими реквизитами 1С версии 7.7 при помощи прямых запросов.
- Почему вообще работает мой запрос? или Ещё раз о планах запросов
- Как читать чужой код? Часть 3. Разбор и доработка запросов
- Решение некоторых задач с помощью "Отладчика запросов"
- Начните уже использовать хранилище запросов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) alex_gus,
В качестве примера:
Примечания:
1. Типовая "Торговля и склад".
2. Пример можно рассматривать только как шаблон. Например, здесь не обрабатываются условия: "возвратов поставщику" или "возврата от покупателя", проведенный-непроведенный документ и тд.
В качестве примера:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с Дата1 по Дата2;
|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура;
|КоличествоПриход = Документ.ПоступлениеТМЦ.Количество;
|КоличествоРасход = Документ.Реализация.Количество;
|Функция КолПриходСумма = Сумма(КоличествоПриход);
|Функция КолРасходСумма = Сумма(КоличествоРасход);
|Группировка Номенклатура без групп;
|Условие(Номенклатура в ВыбНоменклатура);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
ПоказатьПримечания:
1. Типовая "Торговля и склад".
2. Пример можно рассматривать только как шаблон. Например, здесь не обрабатываются условия: "возвратов поставщику" или "возврата от покупателя", проведенный-непроведенный документ и тд.
(6) alex_gus,
Если у вас остается желание выполнить один запрос, то можно использовать следующую конструкцию:
Если документов в вашей базе много, то, как отмечают здесь многие, вполне может оказаться, что несколько запросов (каждый для отдельного документа) будут в сумме работать быстрее, чем один.
Если у вас остается желание выполнить один запрос, то можно использовать следующую конструкцию:
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с Дата1 по Дата2;
|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура;
|Функция Счётчик = Счётчик();
|Группировка Документ;
|Условие(Номенклатура в ВыбНоменклатура);
|"//}}ЗАПРОС
ПоказатьЕсли документов в вашей базе много, то, как отмечают здесь многие, вполне может оказаться, что несколько запросов (каждый для отдельного документа) будут в сумме работать быстрее, чем один.
Вот так вот отлично работает :
Получил список документов!
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с Дата1 по Дата2;
|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура, Документ.ВозвратОтПокупателя.Номенклатура;
|ТекДок = Документ.ПоступлениеТМЦ.ТекущийДокумент, Документ.Реализация.ТекущийДокумент, Документ.ВозвратОтПокупателя.ТекущийДокумент;
|Группировка ТекДок;
|Условие(Номенклатура в СписНоменк);
|"//}}ЗАПРОС
;
ПоказатьПолучил список документов!
Ребят, спасибо за помощь! Уже все решено, список значений заполняется путем выбора Папки номенклатуры, там порядка 30 позиций, на выходе получается порядка 500-та документов, работает примерно секунд 20-30 (только поиск).
(15) alex_gus,
Как вариант:
1. Запрос. Здесь нужно проверить как использовать условие "НЕ в списке" (давно не использовал).
2. Обработка результата запроса.
Выгрузка в таблицу значений я использовал для предварительной сортировки номеров строк документа в обратном порядке, чтобы затем было легче удалять ненужные, то есть без лишних расчетов и проверок.
3. Дальше уже обработка документов и номеров строк по полученной таблице значений.
Как вариант:
1. Запрос. Здесь нужно проверить как использовать условие "НЕ в списке" (давно не использовал).
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с Дата1 по Дата2;
|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура, Документ.ВозвратОтПокупателя.Номенклатура;
|ТекДок = Документ.ПоступлениеТМЦ.ТекущийДокумент, Документ.Реализация.ТекущийДокумент, Документ.ВозвратОтПокупателя.ТекущийДокумент;
|Группировка ТекДок;
|Группировка СтрокаДокумента;
|Условие (НЕ(Номенклатура в СписНоменк));
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Показать2. Обработка результата запроса.
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ);
ТЗ.Сортировать("ТекДок, СтрокаДокумента-");
3. Дальше уже обработка документов и номеров строк по полученной таблице значений.
Если все равно в конце концов надо обрабатывать документы, то какой смысл громоздить запросы один на другой? Получили в первом список документов - и вперед обрабатывать один за другим по этому списку, все равно в каждом нужно удалить хоть одну строку.
(18) Cooler,
Если в оставляемом списке номенклатуры есть группы справочника, то предлагаемый мною алгоритм реализуется проще и нагляднее.
То alex_gus:
Чем вас не устраивает группировка "СтрокаДокумента", в результате которой вы сразу получаете номер строки, которую затем можно удалить?
Если в оставляемом списке номенклатуры есть группы справочника, то предлагаемый мною алгоритм реализуется проще и нагляднее.
То alex_gus:
Чем вас не устраивает группировка "СтрокаДокумента", в результате которой вы сразу получаете номер строки, которую затем можно удалить?
(20) l_user, может я что до конца не понял что хочет получить автор, но чем не устраивает вариант с Номенклатурой.
По-моему получаем то что надо, документы и номенклатуру только ту что в списке.
Код |
---|
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с Дата1 по Дата2;
|Номенклатура = Документ.Реализация.Номенклатура, Документ.ПоступлениеТМЦ.Номенклатура;
|Функция Счётчик = Счётчик();
|Группировка Документ;
|Группировка Номенклатура;
|Условие(Номенклатура в ВыбНоменклатура);
|"//}}ЗАПРОС
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Пока Группировка(1)=1 Цикл
Пока Группиировка(2)Цикл
КонецЦикла (по номенклатуре)
КонецЦикла (по документам)
Показать полностью |
По-моему получаем то что надо, документы и номенклатуру только ту что в списке.
(21) ivsher,
Я попытаюсь объяснить так, как понял я.
Автору нужно убрать из табличных частей документов те строки, в которых находится номенклатура, не входящая в оставляемый список номенклатуры.
В вашем запросе имеется только лишь группировка по "Документам" и, внутри дополнительную группировку по "Номенклатуре". То есть получается, что идет "обход" по документам и номенклатуре из этих документов. При этом выбираются только документы и номенклатура, входящие в список оставляемой номенклатуры.
Для удаления строк из документов данный запрос неинформативен.
l_user, может я что до конца не понял что хочет получить автор, но чем не устраивает вариант с Номенклатурой.
Я попытаюсь объяснить так, как понял я.
Автору нужно убрать из табличных частей документов те строки, в которых находится номенклатура, не входящая в оставляемый список номенклатуры.
В вашем запросе имеется только лишь группировка по "Документам" и, внутри дополнительную группировку по "Номенклатуре". То есть получается, что идет "обход" по документам и номенклатуре из этих документов. При этом выбираются только документы и номенклатура, входящие в список оставляемой номенклатуры.
Для удаления строк из документов данный запрос неинформативен.
(24) l_user, что-то не то на выходе получили, получили как раз те документы в которых вообще не встречается номенклатура из Списка значений, а должны получить список документов где встречается в ТЧ номенклатура из списка значений и удалить те строки из этих документов которые не входят в список значений.
С этим разобрался, ввел дополнительное условие. теперь на выходе из запроса, номера строк в документах, которые мне надо удалить. Вот только как теперь в цикле обработать документы не пойму.
Прикрепленные файлы:
(26) alex_gus,
Например, но проверять и проверять(!):
Например, но проверять и проверять(!):
Процедура ОбработкаТЗ(ТЗ)
ТЗ.ВыбратьСтроки();
ТекущийДокумент = ПолучитьПустоеЗначение("Документ");
Док = СоздатьОбъект("Документ");
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Если ТЗ.ТекДок.Выбран()=0 Тогда Продолжить; КонецЕсли;
Если ТЗ.ТекДок<> ТекущийДокумент Тогда
Если Док.Выбран()>0 Тогда
Док.Записать();
Если Док.Проведен()=1 Тогда
Док.Провести();
КонецЕсли;
КонецЕсли;
ТекущийДокумент = ТЗ.ТекДок;
Док.НайтиДокумент(текущийДокумент);
КонецЕсли;
Док.УдалитьСтроку(ТЗ.СтрокаДокумента);
КонецЦикла;
Если Док.Выбран()>0 Тогда
Док.Записать();
Если Док.Проведен()=1 Тогда
Док.Провести();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот