Имя: Пароль:
1C
1С v8
Помогите с обработкой
,
0 Klesk
 
07.08.12
17:51
Суть такая, перебираю документы перемещения, и получаю минусовой остаток по организации на дату/время текущего документа
"ВЫБРАТЬ
   |    ТоварыОрганизацийОстатки.Номенклатура.Ссылка КАК Номенклатура,
   |    ТоварыОрганизацийОстатки.Склад КАК Склад,
   |    ТоварыОрганизацийОстатки.Организация КАК Организация,
   |    ТоварыОрганизацийОстатки.ВидЗапасов КАК ВидЗапасов,
   |    ТоварыОрганизацийОстатки.НомерГТД КАК НомерГтд,
   |    ТоварыОрганизацийОстатки.КоличествоОстаток КАК МинусовойОстаток
   |ИЗ
   |    РегистрНакопления.ТоварыОрганизаций.Остатки(&НаДату, ) КАК ТоварыОрганизацийОстатки
   |ГДЕ
   |    ТоварыОрганизацийОстатки.КоличествоОстаток < 0
   |
   |УПОРЯДОЧИТЬ ПО
   |    Организация,
   |    Склад"    ;



Затем исправляю остатки создавая документ "Перемещение товаров между организациями", его дата, это дата перемещения минус одна секунда, беру следующее перемещение где &НаДату это его дата/время, исправляю.

Первый документ создается нормально, но второй получает те же отрицательные остатки, хотя должны быть погашены первым ,соответственно не может провести,
Если из второго не проведенного дока проверяю штат. средствами, то никакого отриц остатка по товару в нем нет.
в чем ошибка?
1 Klesk
 
08.08.12
19:05
Вот полный поток сознания:

&НаСервере
Функция ПолучитьПоложительныеОстатки(НаДату,СписокНоменклатуры)
   Запрос = Новый Запрос;
   Запрос.Текст =
   
   "ВЫБРАТЬ
   |    ТоварыОрганизацийОстатки.Номенклатура.Ссылка КАК Номенклатура,
   |    ТоварыОрганизацийОстатки.Склад КАК Склад,
   |    ТоварыОрганизацийОстатки.Организация КАК Организация,
   |    ТоварыОрганизацийОстатки.ВидЗапасов КАК ВидЗапасов,
   |    ТоварыОрганизацийОстатки.НомерГТД КАК НомерГтд,
   |    ТоварыОрганизацийОстатки.КоличествоОстаток КАК Остаток
   |ИЗ
   |    РегистрНакопления.ТоварыОрганизаций.Остатки(&НаДату, ) КАК ТоварыОрганизацийОстатки
   |ГДЕ
   |    ТоварыОрганизацийОстатки.КоличествоОстаток > 0
   |    И ТоварыОрганизацийОстатки.Номенклатура.Ссылка В(&СписокНоменклатуры)
   |
   |УПОРЯДОЧИТЬ ПО
   |    Организация,
   |    Склад,
   |    Номенклатура,
   |    ВидЗапасов"    ;
   Запрос.УстановитьПараметр("НаДату", НаДату);
   Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
   Результат = Запрос.Выполнить();
   Выгрузка= Результат.Выгрузить();        
   Возврат Выгрузка;
   
КонецФункции



&НаСервере
Функция ПолучитьОтрицательныеОстатки(НаДату);
   Запрос = Новый Запрос;
   Запрос.Текст =
   
   "ВЫБРАТЬ
   |    ТоварыОрганизацийОстатки.Номенклатура.Ссылка КАК Номенклатура,
   |    ТоварыОрганизацийОстатки.Склад КАК Склад,
   |    ТоварыОрганизацийОстатки.Организация КАК Организация,
   |    ТоварыОрганизацийОстатки.ВидЗапасов КАК ВидЗапасов,
   |    ТоварыОрганизацийОстатки.НомерГТД КАК НомерГтд,
   |    ТоварыОрганизацийОстатки.КоличествоОстаток КАК МинусовойОстаток
   |ИЗ
   |    РегистрНакопления.ТоварыОрганизаций.Остатки(&НаДату, ) КАК ТоварыОрганизацийОстатки
   |ГДЕ
   |    ТоварыОрганизацийОстатки.КоличествоОстаток < 0
   |
   |УПОРЯДОЧИТЬ ПО
   |    Организация,
   |    Склад"    ;
   Запрос.УстановитьПараметр("НаДату", НаДату);
   
   Результат = Запрос.Выполнить();
   Выгрузка= Результат.Выгрузить();    
   Возврат Выгрузка;
КонецФункции

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


помогите разобраться
2 Klesk
 
08.08.12
19:07
помогите разобраться, пожалуйста
3 Адимр
 
08.08.12
19:35
А попробуй в начале выборки прводить этот следующий документ а потом остатки по нему получать:

           Док=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
           Док.Записать(РежимЗаписиДокумента.ОтменаПроведения);
           Док.Записать(РежимЗаписиДокумента.Проведение);
4 Адимр
 
08.08.12
19:43
И нет ли у тебя того что у документов дата одинаковая?
В качестве момента времени можно саму ссылку на документ использовать так не будет косяков если у двух доков одинаковое время попадется.
5 Адимр
 
08.08.12
19:51
а нет ошибся с моментом у тебя все нормально ссылка на документ есть.
6 sergeev-ag-1977
 
08.08.12
20:07
А что непонятного. Ты получил результат - застолбил. И теперь его обходишь.
7 sergeev-ag-1977
 
08.08.12
20:07
Нужно сделал документ, новый запрос до тех пор пока запрос пустой не выйдет.
8 Klesk
 
08.08.12
20:59
почему то не работает,
меня сильно вот это смущает,

//Новый док    
ДатаНовДок=ВыборкаДетальныеЗаписи.Дата-1;

это правильно?
9 Адимр
 
08.08.12
22:13
да минус 1 секунда вроде нормально по другому никак.
10 Klesk
 
09.08.12
01:19
Вообщем допер, всем спс