| 
    
            
         
         | 
    
  | 
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 
 | 
         
        В общем Лирику спасибо ещё раз, тему можно закрывать. Честно говоря даже как-то забыл, что возможно условие связи со знаком " < "!     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |