Имя: Пароль:
1C
1С v8
"Заполнить по заказу покупателя", не объединять одинаковые товары
0 MrZLO
 
10.07.13
09:03
(1С 8.2 УТ 10.3)
Документ заказ поставщику. При заполнении по заказу покупателя одинаковая номенклатура объединяется и суммируется. Как сделать, чтобы этого не было?

// Заполняет переданную табличную часть по остаткам
//
// Параметры:
//  ТабличнаяЧасть - табличная часть.
//
Процедура ЗаполнитьТабличнуюЧастьПоОстаткам(ТабличнаяЧасть, ЗаказПокупателя = Неопределено) Экспорт

   Если ЗначениеЗаполнено(ЗаказПокупателя.ДатаОтгрузки) И ЗначениеЗаполнено(ДатаПоступления)
      И (ЗаказПокупателя.ДатаОтгрузки < ДатаПоступления) Тогда
#Если Клиент Тогда
       Предупреждение("Отгрузку по заказу покупателя необходимо осуществить раньше даты поступления по данному документу!");
#Иначе
       ОбщегоНазначения.СообщитьОбОшибке("Отгрузку по заказу покупателя необходимо осуществить раньше даты поступления по данному документу!");
#КонецЕсли
       Возврат;
   КонецЕсли;

   Если ТабличнаяЧасть = Товары Тогда
       ЭтоТовары = Истина;
   Иначе
       ЭтоТовары = Ложь;
   КонецЕсли;
   
   Если ЭтоТовары Тогда
       ТоварТара = Перечисления.ТоварТара.Товар;
   Иначе
       ТоварТара = Перечисления.ТоварТара.Тара;
   КонецЕсли;
   
   Запрос = Новый Запрос;

   Запрос.УстановитьПараметр("ТоварТара", ТоварТара);
   Запрос.УстановитьПараметр("Ссылка", Ссылка);
   Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
   Запрос.УстановитьПараметр("Контрагент", Контрагент);
   Запрос.УстановитьПараметр("ДатаОстатков", ОбщегоНазначения.ПолучитьДатуОстатков(ЭтотОбъект));

   Если ЭтоТовары Тогда
       Запрос.УстановитьПараметр("СтатусПартии", Перечисления.СтатусыПартийТоваров.Купленный);
   Иначе
       Запрос.УстановитьПараметр("СтатусПартии", Перечисления.СтатусыПартийТоваров.ВозвратнаяТара);
   КонецЕсли;

   Запрос.УстановитьПараметр("ЗаказПокупателя", ЗаказПокупателя);
   
   Запрос.Текст = "ВЫБРАТЬ
   |    ЗаказыПокупателейОстатки.Номенклатура,
   |    ЗаказыПокупателейОстатки.Номенклатура.СтавкаНДС       КАК СтавкаНДС,
   
   
   |    ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры,
   |    ЗаказыПокупателейОстатки.ЗаказПокупателя,
   |    ЗаказыПокупателейОстатки.ЕдиницаИзмерения             КАК ЕдиницаИзмерения,
   |    ЗаказыПокупателейОстатки.ЕдиницаИзмерения.Коэффициент КАК Коэффициент,
   |    ЗаказыПокупателейОстатки.СуммаУпрОстаток              КАК Сумма,
   |    ЗаказыПокупателейОстатки.КоличествоОстаток            КАК Заказано,
   |    ЗаказыПоставщикамОстатки.КоличествоОстаток            КАК ЗаказаноПоставщику,
   |    ТоварыВРезервеНаСкладах.КоличествоОстаток             КАК Зарезервировано
   |ИЗ
   |    РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОстатков, ЗаказПокупателя = &ЗаказПокупателя
   |                        И СтатусПартии = &СтатусПартии) КАК ЗаказыПокупателейОстатки
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки(&ДатаОстатков, ЗаказПокупателя = &ЗаказПокупателя
   |                        И ЗаказПоставщику <> &Ссылка
   |                        И ТоварТара = &ТоварТара) КАК ЗаказыПоставщикамОстатки
   |        ПО ЗаказыПокупателейОстатки.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура
   |         И ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры = ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ДатаОстатков, ДокументРезерва = &ЗаказПокупателя) КАК ТоварыВРезервеНаСкладах
   |        ПО ЗаказыПокупателейОстатки.Номенклатура = ТоварыВРезервеНаСкладах.Номенклатура
   |         И ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры = ТоварыВРезервеНаСкладах.ХарактеристикаНоменклатуры
   |
   |ГДЕ
   |    НЕ ЗаказыПокупателейОстатки.Номенклатура.Услуга
   |";
   
   Выборка = Запрос.Выполнить().Выбрать();

   Пока Выборка.Следующий() Цикл

       Количество = ?(Выборка.Заказано = NULL, 0, Выборка.Заказано)
                  - ?(Выборка.Зарезервировано = NULL, 0, Выборка.Зарезервировано)
                  - ?(Выборка.ЗаказаноПоставщику = NULL, 0, Выборка.ЗаказаноПоставщику);
       Если Количество > 0 Тогда
           СтрокаТабличнойЧасти = ТабличнаяЧасть.Добавить();
           СтрокаТабличнойЧасти.Номенклатура    = Выборка.Номенклатура;
           СтрокаТабличнойЧасти.Заказ             = Выборка.ЗаказПокупателя;

           Если ЭтоТовары Тогда
               СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры = Выборка.ХарактеристикаНоменклатуры;
               СтрокаТабличнойЧасти.ЕдиницаИзмерения           = Выборка.ЕдиницаИзмерения;
               СтрокаТабличнойЧасти.СтавкаНДС                  = Выборка.СтавкаНДС;
               СтрокаТабличнойЧасти.Коэффициент                = Выборка.Коэффициент;
               
               СтрокаТабличнойЧасти.Количество = Количество * Выборка.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
                                                       / Выборка.Коэффициент;
           Иначе
               СтрокаТабличнойЧасти.Количество = Количество;                                                        
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;

   // Получить нужные цены запросом
   НовыйВалютаДокумента    = ?(ЭтоТовары, ВалютаДокумента, ДоговорКонтрагента.ВалютаВзаиморасчетов);
   СтруктураКурса          = МодульВалютногоУчета.ПолучитьКурсВалюты(НовыйВалютаДокумента, Дата);
   НовыйКурсДокумента      = СтруктураКурса.Курс;
   НовыйКратностьДокумента = СтруктураКурса.Кратность;

   СтруктураЗначенийЦен = Новый Структура;
   СтруктураЗначенийЦен.Вставить("ПерезаполнитьПроцентСкидкиНаценки", Ложь);
   СтруктураЗначенийЦен.Вставить("НовыйТипЦен",                       ТипЦен);
   СтруктураЗначенийЦен.Вставить("НовыйВалютаДокумента",              НовыйВалютаДокумента);
   СтруктураЗначенийЦен.Вставить("НовыйКурсДокумента",                НовыйКурсДокумента);
   СтруктураЗначенийЦен.Вставить("НовыйКратностьДокумента",           НовыйКратностьДокумента);
   СтруктураЗначенийЦен.Вставить("ТекущийВалютаДокумента",            ВалютаДокумента);
   СтруктураЗначенийЦен.Вставить("НовыйУчитыватьНДС",                 ?(ЭтоТовары, УчитыватьНДС, Истина));
   СтруктураЗначенийЦен.Вставить("НовыйСуммаВключаетНДС",             ?(ЭтоТовары, СуммаВключаетНДС, Истина));
   СтруктураЗначенийЦен.Вставить("ЕстьСтавкаНДСВТабличнойЧасти",      ?(ЭтоТовары, Истина, Ложь));

   РезультатЗапросаЦен = Ценообразование.СформироватьЗапросПоЦенам(СтруктураЗначенийЦен,
                                                   Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатурыКонтрагентов,
                                                   ТабличнаяЧасть.ВыгрузитьКолонку("Номенклатура"),
                                                   Дата, Контрагент, ДоговорКонтрагента);

   ВыборкаРезультатЗапросаЦен = РезультатЗапросаЦен.Выбрать();

   Для каждого СтрокаТабличнойЧасти из ТабличнаяЧасть Цикл
       Если СтрокаТабличнойЧасти.Цена = 0 Тогда
           СтруктураПоиска = Новый Структура;
           СтруктураПоиска.Вставить("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
           Ценообразование.ЗаполнитьЦенуВСтрокеТабличнойЧасти(ЭтотОбъект,
                                              СтрокаТабличнойЧасти,
                                              СтруктураПоиска,
                                              ВыборкаРезультатЗапросаЦен,
                                              СтруктураЗначенийЦен,
                                              Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатурыКонтрагентов,
                                              ?(ЭтоТовары, СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры, Неопределено));
           Если ЭтоТовары Тогда
               ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект, "Приобретение");
           КонецЕсли;

           ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);

           Если ЭтоТовары Тогда
               ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
           КонецЕсли;

       КонецЕсли;
       Если ЭтоТовары Тогда
           ОбработкаТабличныхЧастей.РассчитатьПлановуюСебестоимостьВСтрокеТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект, мВалютаРегламентированногоУчета);
       КонецЕсли;
   КонецЦикла;

КонецПроцедуры // ЗаполнитьТабличнуюЧастьПоОстаткам()


я так понял сразу запрос отдает группированные товары, но тут про группировку нет ни слова...
1 Ненавижу 1С
 
гуру
10.07.13
09:05
из разных заказов покупателя суммируется что ли?
2 Ненавижу 1С
 
гуру
10.07.13
09:05
вообще конечно

Количество = ?(Выборка.Заказано = NULL, 0, Выборка.Заказано)
                  - ?(Выборка.Зарезервировано = NULL, 0, Выборка.Зарезервировано)
                  - ?(Выборка.ЗаказаноПоставщику = NULL, 0, Выборка.ЗаказаноПоставщику);

режет глаза
3 Ненавижу 1С
 
гуру
10.07.13
09:06
+(2) но это не по теме
4 Пеппи
 
10.07.13
09:07
(0) Запрос же берет данные из регистра остатков а не из табличных частей документов.
5 MrZLO
 
10.07.13
09:09
(1) если в заказе покупателя есть

товар123 - 10 шт
товар2 - 1 шт
товар123 - 20 шт.

получаем

товар123 - 30 шт
товар2 - 1 шт

а надо

товар123 - 10 шт
товар2 - 1 шт
товар123 - 20 шт.
6 Ненавижу 1С
 
гуру
10.07.13
09:11
(5) если в одном заказе, то таки да и это правильно, ибо никакой разницы система не делает в 1 и 3 строке, см (4)
7 MrZLO
 
10.07.13
09:13
(4) т.е. никак... :(
8 MrZLO
 
10.07.13
09:19
Можно тупой вопрос. Чем будет хуже брать их не из регистра, а из табличной части? У меня документ ЗаказПоставщику не движит регистр ОстатковЗаказовПокупателей
9 Ненавижу 1С
 
гуру
10.07.13
09:23
(8) надо будет отслеживать размещение заказов покупателей в разных заказах пеоставщикам
10 Serg_1960
 
10.07.13
10:21
(8) Почему не используют чтение ТЧ документа? "ПотомуЧто"(с)

Тебе нужно получить остатки заказа, а не его первоначальное состояние. А на остатки оказывают влияние другие документы (корректировка заказа покупателя, частичная отгрузка/реализация, корректировка регистров и т.д.) - их тоже нужно будет все учитывать, считывать из различных источников :(
AdBlock убивает бесплатный контент. 1Сергей