|   |   | 
| 
 | 1c 8 как из регистра накопления выбрать первые записи дающие итог больше чем Х | ☑ | ||
|---|---|---|---|---|
| 0
    
        kvrkvr 16.04.13✎ 16:58 | 
        Как из регистра накопления выбрать первые записи дающие итог больше или равно чем определённое значение? 
  Задача получить последние движения регистра партии с итогом больще или равно чем N. Или надо в цикле повторять запрос? | |||
| 1
    
        zladenuw 16.04.13✎ 17:13 | 
        вложенный запрос с твоим условием     | |||
| 2
    
        Classic 16.04.13✎ 17:14 | 
        ИМЕЮЩИЕ     | |||
| 3
    
        kvrkvr 16.04.13✎ 19:01 | 
        А чуть подробнее?
  Типовое отраслевое решение "Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" Разработка: "1С-Рарус" Локализация: "АБИ Украина" (4.1.07.01) Это корректировка проведения документа "ЗакрытиеСмены", корректируестя набор записей регистра Партии. Документ - это свёртка чеков за день. Возвраты собираются в отдельный документ. Если есть остаток на какой - либо партии, то на нё и возвращается (на последнюю). А вот если нет, тогда возвращается на специальный документ прихода, задаётся константой. Называется партия нулевых остатков. Требуется выбрать в обратном порядке меньше момента времени текущего документа движения чтобы рапределить движение возврата на партии по которым продавалось через кассу. Вот код из модуля: В обработке проведения вызов, после формирования набора записей: // проведем партии товаров Отказ=НЕ ПровестиПоПартиям(Режим,Ссылка) ИЛИ Отказ; // --> + Рубцов в конфу Начало, откорректируем Проведение по партиям, распределим партию отрицательных остатков на продажи по Другим закрытиям кассовой смены Если ЭтотОбъект.СуммаДокумента < 0 Тогда ОткорректируемПроведениеПоПартиям(Отказ); КонецЕсли; // --> - Рубцов в конфу Конец, откорректируем Проведение по партиям, распределим партию отрицательных остатков на продажи по Другим закрытиям кассовой смены Ну и сама процедура: // --> + Рубцов в конфу Начало, откорректируем Проведение по партиям, распределим партию отрицательных остатков на продажи по Другим закрытиям кассовой смены Процедура ОткорректируемПроведениеПоПартиям(Отказ) // НЗНов = РегистрыНакопления.ПартииТоваровКомпании.СоздатьтекНЗПартии(); текНЗПартии = ЭтотОбъект.Движения.ПартииТоваровКомпании; Если текНЗПартии.Количество() = 0 Тогда Возврат; КонецЕсли; ПартНулОст = Константы.ПартияТоваровОтрицательныхОстатков.Получить(); ТЗЗап = текНЗПартии.Выгрузить(); МасСтрокНеПартНулОст = Новый Массив; МасСтрокПартНулОст = Новый Массив; Для Каждого ТекСтрТЗЗап Из ТЗЗап Цикл Если ТекСтрТЗЗап.Партия = ПартНулОст Тогда МасСтрокПартНулОст.Добавить(ТекСтрТЗЗап); Иначе МасСтрокНеПартНулОст.Добавить(ТекСтрТЗЗап); КонецЕсли; КонецЦикла; ТЗЗапНов = ТЗЗап.Скопировать(МасСтрокНеПартНулОст); ТЗЗапНулОст = ТЗЗап.Скопировать(МасСтрокПартНулОст); // ФункРубц.ПечатьТЗ(ТЗЗапНулОст, "ТЗЗапНулОст"); Для Каждого тсТЗЗапНулОст Из ТЗЗапНулОст Цикл ОбработкаПрерыванияПользователя(); ТекКВоРаспределить = - тсТЗЗапНулОст.Количество; // НачМомВрем = ТекущаяДата(); // Для ии = 1 По 5000 Цикл ЗапрРубц = Новый Запрос; ЗапрРубц.Текст = "ВЫБРАТЬ //| ПартииТоваровКомпании.МоментВремени КАК МоментВремени, //| ПартииТоваровКомпании.Регистратор, | ПартииТоваровКомпании.Партия, | ПартииТоваровКомпании.Количество, | ПартииТоваровКомпании.СуммаУпр // | ПартииТоваровКомпании.ВидДвижения |ИЗ | РегистрНакопления.ПартииТоваровКомпании КАК ПартииТоваровКомпании |ГДЕ | ПартииТоваровКомпании.Период <= &КонДата | И ПартииТоваровКомпании.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) | И ПартииТоваровКомпании.Регистратор ССЫЛКА Документ.ЗакрытиеСмены | И ПартииТоваровКомпании.Номенклатура = &Номенклатура | И ПартииТоваровКомпании.Количество > 0 | |УПОРЯДОЧИТЬ ПО | МоментВремени УБЫВ"; // ЗапрРубц.УстановитьПараметр("НачДата",'20000101'); ЗапрРубц.УстановитьПараметр("КонДата",КонецДня(ЭтотОбъект.Дата)); ЗапрРубц.УстановитьПараметр("Номенклатура",тсТЗЗапНулОст.Номенклатура); ВыбРубц = ЗапрРубц.Выполнить().Выбрать(); Пока ВыбРубц.Следующий() Цикл ОбработкаПрерыванияПользователя(); Если ТекКВоРаспределить <= 0 Тогда прервать; КонецЕсли; тсТЗЗапНов = ТЗЗапНов.Добавить(); ЗаполнитьЗначенияСвойств(тсТЗЗапНов, тсТЗЗапНулОст); КвоЗап = Мин(ТекКВоРаспределить,ВыбРубц.Количество); ТекКВоРаспределить = ТекКВоРаспределить - КвоЗап; СумЗап = КвоЗап*ВыбРубц.СуммаУпр/ВыбРубц.Количество; тсТЗЗапНов.Партия = ВыбРубц.Партия; тсТЗЗапНов.Количество = -КвоЗап; тсТЗЗапНов.Сумма = -СумЗап; тсТЗЗапНов.СуммаУпр = -СумЗап; тсТЗЗапНов.СуммаНДС = -СумЗап/6; КонецЦикла; Если ТекКВоРаспределить > 0 Тогда Сообщить("Попытка вернуть "+тсТЗЗапНулОст.Номенклатура+" больше чем их было вообще продано!",СтатусСообщения.ОченьВажное); Отказ = Истина; возврат; тсТЗЗапНов = ТЗЗапНов.Добавить(); ЗаполнитьЗначенияСвойств(тсТЗЗапНов, тсТЗЗапНулОст); тсТЗЗапНов.Количество = -ТекКВоРаспределить; КонецЕсли; КонецЦикла; // ФункРубц.ПечатьТЗ(ТЗЗапНов, "ТЗЗапНов"); текНЗПартии.Загрузить(ТЗЗапНов); текНЗПартии.ОбменДанными.Загрузка = Истина; текНЗПартии.Записать(); КонецПроцедуры // --> - Рубцов в конфу Конец , откорректируем Проведение по партиям, распределим партию отрицательных остатков на продажи по Другим закрытиям кассовой смены | |||
| 4
    
        Rovan гуру 16.04.13✎ 21:09 | 
        (+2) ПЕРВЫЕ... УПОРЯДОЧИТЬ ПО     | |||
| 5
    
        mistеr 16.04.13✎ 21:14 | 
        (0) Надо в цикле обходить выборку и считать итог.
  Или на СКД сделать, она умеет считать сумму с накоплением. | |||
| 6
    
        milan 16.04.13✎ 21:25 | 
        (5) а потом как советуют специалисты - первые и упорядочить по     | |||
| 7
    
        mistеr 16.04.13✎ 21:31 | 
        (6) Зачем еще "потом"? Сразу нельзя?     | |||
| 8
    
        kvrkvr 17.04.13✎ 10:47 | 
        Я чего - то не понимаю? Это не отчет, как делать на СКД? Это происходит при проведении документа. То есть СКД задать програмно? Ладно всем спасибо, идею я понял, но меня и так утсроит, у меня обычно не так много продаж по одному товару (супермаркет запчастей, инструмента для авто и т.п.), запускал в цикле запрос по несколько тысяч раз, разница когда все продажи получаю или только первую запись на 10%. Да и спрошу директора, по идее возвраты возможны только по продажам за последние 2 недели.     | |||
| 9
    
        Лирик 17.04.13✎ 10:54 | 
        (8) Покажу принцип, с условиями связи разберешься. Работает 100% делал 100 раз
  ВЫБРАТЬ ДвиженияДенежныхСредств.Сумма, СУММА(ЕСТЬNULL(ДвиженияДенежныхСредств1.Сумма, 0)) КАК СуммаНакопления, ДвиженияДенежныхСредств.Регистратор ИЗ РегистрНакопления.ДвиженияДенежныхСредств КАК ДвиженияДенежныхСредств ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияДенежныхСредств КАК ДвиженияДенежныхСредств1 ПО ДвиженияДенежныхСредств.Период < ДвиженияДенежныхСредств1.Период ГДЕ ЕСТЬNULL(ДвиженияДенежныхСредств1.Сумма, 0) <= &НужнаяСумма СГРУППИРОВАТЬ ПО ДвиженияДенежныхСредств.Регистратор, ДвиженияДенежныхСредств.Сумма | |||
| 10
    
        mistеr 17.04.13✎ 11:30 | 
        (8) >запускал в цикле запрос по несколько тысяч раз
  Значит, идею не понял. | |||
| 11
    
        kvrkvr 17.04.13✎ 14:36 | 
        Лирику  - спасибо! Да, это то, что надо. Хотя у меня реально быстрее работает просто выборка последних за полгода, но это вероятно потому, что продаж по одной номенклатуре не так уж и много.     | |||
| 12
    
        kvrkvr 17.04.13✎ 14:41 | 
        В общем Лирику спасибо ещё раз, тему можно закрывать. Честно говоря даже как-то забыл, что возможно условие связи со знаком " < "!     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |