8.х Заказ покупателя

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Pro_user 200, 14 май 2013.

  1. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Добрый день!
    Как в 1с ут 10.3 сделать ,чтобы когда нет товара на складе заказ покупателя проводился оперативно и свободный остаток товара уходил в минус?
    Заранее спасибо!
  2. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    разрешить превышение остатков на складе. в доп правах пользователя.

    только оно коснется всех документов....
  3. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Пробовал!!Но размещение не даёт выставить, пишет нет товара на складе !!!
  4. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    логично.....тебе нужны резервы в минус ?

    если нет. то не заполняй размещение. иначе в остатках поплывешь
  5. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Нет мне надо чтобы свободный остаток шёл в минус, как в реализации!!!
  6. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    в модуле регистра накопления товары в резерве ищи процедуру КонтрольСвободныхОстатков_Заказ_КорректировкаЗаказа_Резервирование()
    в ней ведётся контроль резерва по свободному остатку.
  7. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Код:
    Если СвободныйОстаток < КоличествоРезервируемое Тогда
    УправлениеЗапасами.СообщитьОНедостаткеТовара(КоличествоРезервируемое	  // Требуемое количество товара
    , Макс(0, СвободныйОстаток)								 // Свободное количество товара
    , КоличествоВРезерве									    // Количество товара в резерве
    , КоличествоКПередаче									   // Количество товара к передаче
    , 0														 // Количество товара к получению
    , Отказ
    , Заголовок
    , СокрЛП(Выборка.Склад)						 // Склад (представление)
    ,													 // Заказ поставщику (представление)
    , Выборка.НоменклатураПредставление			 // Номенклатура (представление)
    , ?(ИмяТабличнойЧасти <> "ВозвратнаяТара", " "+Выборка.ХарактеристикаНоменклатурыПредставление, "") // Характеристика (представление)
    , ?(УчитыватьСерии, " "+Выборка.СерияНоменклатурыПредставление, "")				   // Серия номенклатуры (представление)
    ,													 // Качество товара (представление)
    , Выборка.ЕдиницаХраненияОстатковПредставление  // Единица хранения остатков (представление)
    , "Свободного остатка для резервирования "
    );
    КонецЕсли;
    КонецЕсли;
    

    Что надо изменить чтобы Документ оперативно проводился и размещение выставлялось и товар уходил в минус?
  8. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    закомментировать этот кусок (без последнего КонецЕсли)
  9. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Спасибо!!Но он размещение Не выставляет!!!Что делать помогите?
  10. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    что значит не выставляет размещение ?
  11. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Код:
       
    //Если СвободныйОстаток < КоличествоРезервируемое Тогда
    // УправлениеЗапасами.СообщитьОНедостаткеТовара(КоличествоРезервируемое	  // Требуемое количество товара
    // , Макс(0, СвободныйОстаток)								 // Свободное количество товара
    // , КоличествоВРезерве									    // Количество товара в резерве
    // , КоличествоКПередаче									   // Количество товара к передаче
    // , 0														 // Количество товара к получению
    // , Отказ
    // , Заголовок
    // , СокрЛП(Выборка.Склад)						 // Склад (представление)
    // ,													 // Заказ поставщику (представление)
    // , Выборка.НоменклатураПредставление			 // Номенклатура (представление)
    // , ?(ИмяТабличнойЧасти <> "ВозвратнаяТара", " "+Выборка.ХарактеристикаНоменклатурыПредставление, "") // Характеристика (представление)
    // , ?(УчитыватьСерии, " "+Выборка.СерияНоменклатурыПредставление, "")				   // Серия номенклатуры (представление)
    // ,													 // Качество товара (представление)
    // , Выборка.ЕдиницаХраненияОстатковПредставление  // Единица хранения остатков (представление)
    // , "Свободного остатка для резервирования "
    // );
    //КонецЕсли;
    
    Я закоментировал!!!Но к примеру на складе товара 10 шт , а в заказ нужно 100!!При заполнить и провестион 10 шт отделяет от 100 и пишет к ним размещение, но остальные 90 без размещения остаются !!!!Может что-то не так я сделал!!А вот свободный остаток уходит в минус!!!
  12. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    логично..на складе то их нет :)
  13. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    И что делать?Может можно чтобы после набивания поступления автоматически записывалось размещение?
  14. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    ищи в регистре накопления РазмещениеЗаказовПокупателей в модуле объекта процедуру КонтрольОстатков_Заказ_КорректировкаЗаказа_Резервирование()

    по моему она корректирует количество до остатка
  15. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    Что менять в коде?

    Код:
    Процедура КонтрольОстатков_Заказ_КорректировкаЗаказа_Резервирование(ДокументОбъект)
    Если ИмяДокумента = "РезервированиеТоваров" ИЛИ ИмяДокумента="РазмещениеЗаказа" Тогда
    ИмяРеквизитаРазмещение = "НовоеРазмещение";
    Иначе
    ИмяРеквизитаРазмещение = "Размещение";
    КонецЕсли;
    // Текст вложенного запроса, ограничивающего номенклатуру при получении остатков
    ТекстЗапросаСписокНоменклатуры = "
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Номенклатура
    |ИЗ
    | Документ." + ИмяТаблицы +"
    |ГДЕ Ссылка = &ДокументСсылка";
    //Запрос для получения списка заказов, используемых в документе
    ТекстЗапросаЗаказыПоставщику = "ВЫБРАТЬ РАЗЛИЧНЫЕ %ПОЛЕ_Размещение% КАК Размещение
    |ИЗ Документ."+ИмяТаблицы+"
    |ГДЕ Ссылка = &ДокументСсылка
    | //УСЛОВИЕ_РазмещениеСсылка
    |";
    Если ИмяТабличнойЧасти = "ВозвратнаяТара" Тогда
    ТекстЗапросаЗаказыПоставщику = СтрЗаменить(ТекстЗапросаЗаказыПоставщику,"//УСЛОВИЕ_ДокРазмещениеСсылка","И (%ПОЛЕ_Размещение% ССЫЛКА Документ.ВнутреннийЗаказ ИЛИ %ПОЛЕ_Размещение% ССЫЛКА Документ.ЗаказПоставщику)");
    Иначе
    ТекстЗапросаЗаказыПоставщику = СтрЗаменить(ТекстЗапросаЗаказыПоставщику,"//УСЛОВИЕ_ДокРазмещениеСсылка","И (%ПОЛЕ_Размещение% ССЫЛКА Документ.ВнутреннийЗаказ ИЛИ %ПОЛЕ_Размещение% ССЫЛКА Документ.ЗаказПоставщику)");
    КонецЕсли;
    ТекстЗапросаЗаказыПоставщику = СтрЗаменить(ТекстЗапросаЗаказыПоставщику,"%ПОЛЕ_Размещение%",ИмяРеквизитаРазмещение);
    ЗапросЗаказыПоставщику = новый Запрос;
    ЗапросЗаказыПоставщику.УстановитьПараметр("ДокументСсылка",		  ДокументОбъект.Ссылка);
    ЗапросЗаказыПоставщику.Текст = ТекстЗапросаЗаказыПоставщику;
    СписокЗаказовПоставщику = ЗапросЗаказыПоставщику.Выполнить().Выгрузить().ВыгрузитьКолонку("Размещение");
    Запрос = Новый Запрос;
    // Установим параметры запроса
    ЗаполнитьОбщиеПараметрыЗапроса(Запрос, ДокументОбъект);
    Запрос.УстановитьПараметр("СписокЗаказовПоставщику", СписокЗаказовПоставщику);
    МассивПустыхСсылок = ОбщегоНазначения.МассивПустыхЗначений(МетаданныеДокумента.ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяРеквизитаРазмещение].Тип);
    Запрос.УстановитьПараметр("МассивПустыхСсылок", МассивПустыхСсылок);
    Если ИмяДокумента = "КорректировкаЗаказаПокупателя" Тогда
    Запрос.УстановитьПараметр("ЗаказПокупателя", ДокументОбъект.ЗаказПокупателя);
    ИначеЕсли  ИмяДокумента = "КорректировкаВнутреннегоЗаказа" Тогда
    Запрос.УстановитьПараметр("ЗаказПокупателя", ДокументОбъект.ВнутреннийЗаказ);
    ИначеЕсли  ИмяДокумента = "РезервированиеТоваров" или ИмяДокумента = "РазмещениеЗаказа" Тогда
    Запрос.УстановитьПараметр("ЗаказПокупателя", ДокументОбъект.Заказ);
    Иначе
    Запрос.УстановитьПараметр("ЗаказПокупателя", ДокументОбъект.Ссылка);
    КонецЕсли;
    ТекстЗапроса = "
    |ВЫБРАТЬ // Запрос, контролирующий остатки на складах
    | ВложенныйЗапрос.ДокНоменклатура											 КАК Номенклатура,
    | ВложенныйЗапрос.ДокНоменклатура.Представление							   КАК НоменклатураПредставление,
    | ВложенныйЗапрос.ДокРазмещение											   КАК Размещение,
    | ВложенныйЗапрос.ДокНоменклатура.ЕдиницаХраненияОстатков.Представление	   КАК ЕдиницаХраненияОстатковПредставление,
    | ВложенныйЗапрос.ДокХарактеристикаНоменклатуры							   КАК ХарактеристикаНоменклатуры,
    | ВложенныйЗапрос.ДокХарактеристикаНоменклатуры.Представление				 КАК ХарактеристикаНоменклатурыПредставление,
    | ЕСТЬNULL(СУММА(ВложенныйЗапрос.ДокКоличество), 0)						 КАК ДокументКоличество,
    | ЕСТЬNULL(МАКСИМУМ(ВложенныйЗапрос.ОстКоличество), 0)					    КАК ОстатокКоличество,
    | ЕСТЬNULL(МАКСИМУМ(ВложенныйЗапрос.ОстКоличествоРазмещено), 0)			   КАК ОстатокКоличествоРазмещено,
    | ЕСТЬNULL(МАКСИМУМ(ВложенныйЗапрос.ОстКоличествоРазмещеноПоЗаказу), 0)	   КАК ОстатокКоличествоРазмещеноПоЗаказу
    |
    |ИЗ (ВЫБРАТЬ
    | Док.Номенклатура											    КАК ДокНоменклатура,
    | %ПОЛЕ_Док_Размещение%										   КАК ДокРазмещение,
    | %ПОЛЕ_Док_Характеристика%									   КАК ДокХарактеристикаНоменклатуры,
    | %ПОЛЕ_Док_Количество%										   КАК ДокКоличество,
    | МАКСИМУМ(Остатки.КоличествоОстаток)							 КАК ОстКоличество,
    | МАКСИМУМ(ОстаткиРазмещенные.КоличествоОстаток)				  КАК ОстКоличествоРазмещено,
    | МАКСИМУМ(ОстаткиРазмещенныеПоЗаказу.КоличествоОстаток)		  КАК ОстКоличествоРазмещеноПоЗаказу
    |ИЗ
    | Документ." + ИмяТаблицы + "									 КАК Док
    //заказано в заказе поставщику, внутреннем заказе
    |ЛЕВОЕ СОЕДИНЕНИЕ
    | (
    | ВЫБРАТЬ Номенклатура,
    |  ХарактеристикаНоменклатуры,
    |  ЗаказПоставщику,
    |  КоличествоОстаток
    | ИЗ
    |  РегистрНакопления.ЗаказыПоставщикам.Остатки(,ЗаказПоставщику в (&СписокЗаказовПоставщику)
    |  И СтатусПартии В(&СтатусПартии) И %ВыборкаПоНоменклатуре%)
    | ОБЪЕДИНИТЬ ВСЕ
    | ВЫБРАТЬ Номенклатура,
    |  ХарактеристикаНоменклатуры,
    |  ВнутреннийЗаказ,
    |  КоличествоОстаток
    | ИЗ
    |  РегистрНакопления.ВнутренниеЗаказы.Остатки(,ВнутреннийЗаказ в (&СписокЗаказовПоставщику)
    |  И СтатусПартии В (&СтатусПартии) И %ВыборкаПоНоменклатуре%)
    | )															 КАК Остатки
    |ПО
    | Док.Номенклатура		 = Остатки.Номенклатура
    | И %ПОЛЕ_Док_Размещение%  = Остатки.ЗаказПоставщику
    | //СОЕДИНЕНИЕ_Характеристика_Остатки
    //размещение выполненное в заказе поставщику, внутреннем - в целом по всем заказам покупателей (для определения доступного для размещения остатка)
    |ЛЕВОЕ СОЕДИНЕНИЕ
    | РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки(,ЗаказПоставщику в (&СписокЗаказовПоставщику)
    | И ТоварТара = &ТоварТара И %ВыборкаПоНоменклатуре%
    |)															  КАК ОстаткиРазмещенные
    |ПО
    | Док.Номенклатура	 = ОстаткиРазмещенные.Номенклатура
    | И %ПОЛЕ_Док_Размещение%  = ОстаткиРазмещенные.ЗаказПоставщику
    | //СОЕДИНЕНИЕ_Характеристика_Размещение
    |
    //размещение выполненное в заказе поставщику, внутреннем - по текущему заказу покупателя (для определения доступного для снятия остатка)
    |ЛЕВОЕ СОЕДИНЕНИЕ
    | РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки(,ЗаказПоставщику в (&СписокЗаказовПоставщику)
    | И ЗаказПокупателя = &ЗаказПокупателя
    |   И ТоварТара = &ТоварТара И %ВыборкаПоНоменклатуре%
    |)															  КАК ОстаткиРазмещенныеПоЗаказу
    |ПО
    | Док.Номенклатура		 = ОстаткиРазмещенныеПоЗаказу.Номенклатура
    | И %ПОЛЕ_Док_Размещение%  = ОстаткиРазмещенныеПоЗаказу.ЗаказПоставщику
    | //СОЕДИНЕНИЕ_Характеристика_РазмещениеПоЗаказу
    |ГДЕ
    | Док.Ссылка  =  &ДокументСсылка
    | И Не Док.Номенклатура.Комплект
    | //УСЛОВИЕ_ДокРазмещениеСсылка
    | И %ПОЛЕ_Док_Размещение% НЕ В (&МассивПустыхСсылок)
    |
    |СГРУППИРОВАТЬ ПО
    |
    | Док.Номенклатура,
    | %ПОЛЕ_Док_Размещение%,
    | %ПОЛЕ_Док_Характеристика%
    |) КАК ВложенныйЗапрос
    |
    |СГРУППИРОВАТЬ ПО
    |
    | ВложенныйЗапрос.ДокНоменклатура,
    | ВложенныйЗапрос.ДокРазмещение,
    | ВложенныйЗапрос.ДокХарактеристикаНоменклатуры
    |ИМЕЮЩИЕ (ЕСТЬNULL(МАКСИМУМ(ВложенныйЗапрос.ОстКоличество), 0) - ЕСТЬNULL(МАКСИМУМ(ВложенныйЗапрос.ОстКоличествоРазмещено), 0) < ЕСТЬNULL(СУММА(ВложенныйЗапрос.ДокКоличество), 0))
    |ИЛИ (ЕСТЬNULL(СУММА(ВложенныйЗапрос.ДокКоличество), 0)<0 И (-1)*ЕСТЬNULL(СУММА(ВложенныйЗапрос.ДокКоличество), 0)>ЕСТЬNULL(МАКСИМУМ(ВложенныйЗапрос.ОстКоличествоРазмещеноПоЗаказу), 0))
    |";
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ВыборкаПоНоменклатуре%","Номенклатура В ("+ТекстЗапросаСписокНоменклатуры+")");
    Если ИмяТабличнойЧасти = "ВозвратнаяТара" Тогда
    //нет серии, характеристики, единицы измерения и коэффициента
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"//УСЛОВИЕ_ДокРазмещениеСсылка","И (%ПОЛЕ_Док_Размещение% ССЫЛКА Документ.ВнутреннийЗаказ ИЛИ %ПОЛЕ_Док_Размещение% ССЫЛКА Документ.ЗаказПоставщику)");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_Док_Количество%","Сумма(Док.Количество)");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_Док_Характеристика%","&ПустаяХарактеристика");
    Иначе
    //есть характеристика, единица измерения и коэффициент.
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"//УСЛОВИЕ_ДокРазмещениеСсылка","И (%ПОЛЕ_Док_Размещение% ССЫЛКА Документ.ВнутреннийЗаказ ИЛИ %ПОЛЕ_Док_Размещение% ССЫЛКА Документ.ЗаказПоставщику)");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_Док_Количество%","Сумма(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15,3)))");
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_Док_Характеристика%","Док.ХарактеристикаНоменклатуры");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"//СОЕДИНЕНИЕ_Характеристика_РазмещениеПоЗаказу","И Док.ХарактеристикаНоменклатуры  = ОстаткиРазмещенныеПоЗаказу.ХарактеристикаНоменклатуры");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"//СОЕДИНЕНИЕ_Характеристика_Размещение","И Док.ХарактеристикаНоменклатуры  = ОстаткиРазмещенные.ХарактеристикаНоменклатуры");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"//СОЕДИНЕНИЕ_Характеристика_Остатки","И Док.ХарактеристикаНоменклатуры  = Остатки.ХарактеристикаНоменклатуры");
    КонецЕсли;
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_Док_Размещение%","Док."+ИмяРеквизитаРазмещение);
    Запрос.Текст = ТекстЗапроса;
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка.ДокументКоличество>0 Тогда
    ДоступныйОстаток = Выборка.ОстатокКоличество - Выборка.ОстатокКоличествоРазмещено;
    СтрокаСообщения = "Остатка " + 
    УправлениеЗапасами.ПредставлениеНоменклатуры(Выборка.НоменклатураПредставление,
    Выборка.ХарактеристикаНоменклатурыПредставление) +
    ", заказанного по документу " + (Выборка.Размещение) + " недостаточно для размещения.";
    ДокументКоличество = Выборка.ДокументКоличество;
    Иначе   //актуально для корректировок - происходит снятие размещения
    ДоступныйОстаток = Выборка.ОстатокКоличествоРазмещеноПоЗаказу;
    СтрокаСообщения = "Остатка " +
    УправлениеЗапасами.ПредставлениеНоменклатуры(Выборка.НоменклатураПредставление,
    Выборка.ХарактеристикаНоменклатурыПредставление) +
    ", размещенного по документу " + (Выборка.Размещение) + " недостаточно для снятия размещения.";
    ДокументКоличество = -Выборка.ДокументКоличество;
    КонецЕсли;
    УправлениеЗапасами.ОшибкаНетОстатка(СтрокаСообщения, ДоступныйОстаток, ДокументКоличество,
    Выборка.ЕдиницаХраненияОстатковПредставление, Отказ, Заголовок);
    КонецЦикла;
    КонецПроцедуры
    
  16. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    не. не то..ошибся я :)

    отладчиком пройдись..да посмотри где у тебя в регистр размещенные заказы пишется.... там и увидишь где срезается количество по остатку
  17. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26
    А что надо,может модуль заказ покупателя!!

    Код:
    Процедура Заказ_ЗаполнитьТабличныеЧастиВозможнымРазмещением(Параметры, Товары, ВозвратнаяТара) Экспорт
    Авторезервирование = Параметры.Авторезервирование;
    Авторазмещение	 = Параметры.Авторазмещение;
    
    Если НЕ Авторезервирование И НЕ Авторазмещение Тогда
    Возврат;
    КонецЕсли;
    
    Заказ = Параметры.Заказ;
    ЗаказСсылка = Заказ.Ссылка;
    ЕстьСкладЗаказчик = Ложь;
    ЕстьПредпочтительноеРазмещение = Ложь;
    ЕстьМассивСтатусовПартий = Ложь;
    МассивСтатусовПартий = Новый Массив;
    ЗаполнятьСуммы = ложь;
    СкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойСклад");
    СтратегияАвторезервирования = Параметры.СтратегияАвторезервированияПоЗаказам;
    ОбособленныйУчет = Параметры.Свойство("ОбособленныйУчет") И Параметры.ОбособленныйУчет;
    Если НЕ ЗначениеЗаполнено(СтратегияАвторезервирования) Тогда
    СтратегияАвторезервирования = Перечисления.СтратегииАвторезервированияНоменклатуры.СначалаВЗаказахПоставщикамПотомНаСкладах;
    КонецЕсли;
    
    ЗапросСвободныйОстаток = Новый Запрос;
    Если ТипЗнч(ЗаказСсылка)=Тип("ДокументСсылка.ЗаказПокупателя") Тогда
    СкладГруппа = Заказ.СкладГруппа;
    ЗапросСвободныйОстаток.УстановитьПараметр("ПредпочтительноеРазмещение", ?(ТипЗнч(СкладГруппа) = Тип("СправочникСсылка.Склады"), СкладГруппа, СкладПоУмолчанию));
    ЕстьПредпочтительноеРазмещение = Истина;
    ЗапросСвободныйОстаток.УстановитьПараметр("СкладЗаказчик", Неопределено);
    Если ЗначениеЗаполнено(СкладГруппа)
    И ТипЗнч(СкладГруппа) = Тип("СправочникСсылка.ГруппыДоступностиСкладов") Тогда
    ГруппаДоступностиСкладов = СкладГруппа;
    Иначе
    ГруппаДоступностиСкладов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ГруппаДоступностиСкладов");
    КонецЕсли;
    ЗаполнятьСуммы = истина;
    ДатаОтгрузки = Заказ.ДатаОтгрузки;
    ИначеЕсли ТипЗнч(ЗаказСсылка)=Тип("ДокументСсылка.ВнутреннийЗаказ") Тогда
    Если Заказ.ВидЗаказа = Перечисления.ВидыВнутреннегоЗаказа.НаСклад Тогда
    ЗапросСвободныйОстаток.УстановитьПараметр("СкладЗаказчик", Заказ.Заказчик);
    ЗапросСвободныйОстаток.УстановитьПараметр("ПредпочтительноеРазмещение", Неопределено);
    ЕстьСкладЗаказчик = Истина;
    Иначе
    ЗапросСвободныйОстаток.УстановитьПараметр("СкладЗаказчик", Неопределено);
    ЗапросСвободныйОстаток.УстановитьПараметр("ПредпочтительноеРазмещение", Неопределено);
    КонецЕсли;
    ГруппаДоступностиСкладов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ГруппаДоступностиСкладов");
    МассивСтатусовПартий.Добавить( Перечисления.СтатусыПартийТоваров.Купленный);
    МассивСтатусовПартий.Добавить( Перечисления.СтатусыПартийТоваров.ВозвратнаяТара);
    ЕстьМассивСтатусовПартий = истина;
    ДатаОтгрузки = Заказ.ДатаОтгрузки;
    Иначе
    Возврат;
    КонецЕсли;
    ЗапросСвободныйОстаток.УстановитьПараметр("ДатаОтгрузки", ?(НЕ ЗначениеЗаполнено(ДатаОтгрузки), Заказ.Дата, ДатаОтгрузки));
    ЗапросСвободныйОстаток.УстановитьПараметр("ДокументСсылка", Заказ);
    ЗапросСвободныйОстаток.УстановитьПараметр("Организация",    Заказ.Организация);
    ЗапросСвободныйОстаток.УстановитьПараметр( "СтатусПартии",  МассивСтатусовПартий);
    флРезервированиеТоваров = ложь;
    Если Параметры.Свойство("РезервированиеТоваров") Тогда
    ЗаполнятьСуммы = ложь;
    флРезервированиеТоваров = истина;
    ИмяРеквизитаРазмещение = "НовоеРазмещение";
    Если ТипЗнч(ЗаказСсылка) = Тип("ДокументСсылка.ВнутреннийЗаказ") Тогда
    ТекстЗапросаПоНоменклатуре = "
    | ВЫБРАТЬ
    |  РегистрВнутренниеЗаказыОстатки.Номенклатура
    | ИЗ
    |  РегистрНакопления.ВнутренниеЗаказы.Остатки(, ВнутреннийЗаказ = &СсылкаЗаказ
    |  ) КАК РегистрВнутренниеЗаказыОстатки";
    ИначеЕсли ТипЗнч(ЗаказСсылка)=Тип("ДокументСсылка.ЗаказПокупателя") Тогда
    ТекстЗапросаПоНоменклатуре = "
    | ВЫБРАТЬ
    |  РегистрЗаказыПокупателейОстатки.Номенклатура
    | ИЗ
    |  РегистрНакопления.ЗаказыПокупателей.Остатки(, ЗаказПокупателя = &СсылкаЗаказ
    |  ) КАК РегистрЗаказыПокупателейОстатки
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    | ВЫБРАТЬ
    | КомплектующиеНоменклатуры.Комплектующая
    | ИЗ
    |  РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
    |ГДЕ
    | КомплектующиеНоменклатуры.Номенклатура В(
    | ВЫБРАТЬ
    |  РегистрЗаказыПокупателейОстатки.Номенклатура
    | ИЗ
    |  РегистрНакопления.ЗаказыПокупателей.Остатки(, ЗаказПокупателя = &СсылкаЗаказ
    |  ) КАК РегистрЗаказыПокупателейОстатки)
    |";
    КонецЕсли;
    ЗапросСписокНоменклатуры = новый Запрос;
    ЗапросСписокНоменклатуры.Текст = ТекстЗапросаПоНоменклатуре;
    ЗапросСписокНоменклатуры.УстановитьПараметр("СсылкаЗаказ",Заказ);
    Результат = ЗапросСписокНоменклатуры.Выполнить();
    Если Результат.Пустой() Тогда
    Возврат;
    КонецЕсли;
    Выборка = Результат.Выбрать();
    МассивНоменклатуры = новый Массив;
    Пока Выборка.Следующий() цикл
    МассивНоменклатуры.Добавить(Выборка.Номенклатура);
    КонецЦикла;
    
    Иначе
    ИмяРеквизитаРазмещение = "Размещение";
    КопияТовары = Товары.Выгрузить();
    КопияТовары.Свернуть("Номенклатура",);
    КопияВозвратнаяТара = ВозвратнаяТара.Выгрузить();
    КопияВозвратнаяТара.Свернуть("Номенклатура",);
    // Сформируем массив номенклатуры по товарам и таре для фильтров запросов.
    МассивНоменклатуры = КопияТовары.ВыгрузитьКолонку("Номенклатура");
    МассивНоменклатурыТара = КопияВозвратнаяТара.ВыгрузитьКолонку("Номенклатура");
    Для Каждого ЭлементТара Из МассивНоменклатурыТара Цикл
    МассивНоменклатуры.Добавить(ЭлементТара);
    КонецЦикла;
    КонецЕсли;
    
    ТекстФильтраПоСкладам = "
    |(
    | ВЫБРАТЬ
    |  ГруппыДоступности.Склад
    | ИЗ
    |  РегистрСведений.СоставГруппДоступностиСкладов КАК ГруппыДоступности
    | ГДЕ ГруппыДоступности.ГруппаДоступности = &ГруппаДоступностиСкладов)";
    
    
    ЗапросСвободныйОстаток.УстановитьПараметр("МассивНоменклатуры",	   МассивНоменклатуры);
    ЗапросСвободныйОстаток.УстановитьПараметр("ГруппаДоступностиСкладов", ГруппаДоступностиСкладов);
    ЗапросСвободныйОстаток.УстановитьПараметр( "Новый",	   Справочники.Качество.Новый);
    Если Авторезервирование Тогда
    УсловиеСклад = "";
    Если ЗначениеЗаполнено(ГруппаДоступностиСкладов) Тогда
    УсловиеСклад = " Склад В" + ТекстФильтраПоСкладам;
    Если ЕстьПредпочтительноеРазмещение Тогда
    УсловиеСклад = УсловиеСклад+" ИЛИ Склад = &ПредпочтительноеРазмещение";
    КонецЕсли;
    КонецЕсли;
    Если ЕстьСкладЗаказчик Тогда
    Если УсловиеСклад = "" Тогда
    УсловиеСклад = "Склад <> &СкладЗаказчик";
    Иначе
    УсловиеСклад = "("+УсловиеСклад+") И Склад <> &СкладЗаказчик"
    КонецЕсли;
    КонецЕсли;
    
    ЗапросСвободныйОстаток.Текст =
    "ВЫБРАТЬ
    | ТоварыНаСкладахОстатки.Номенклатура,
    | ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    | ТоварыНаСкладахОстатки.Склад					  КАК Размещение,
    | NULL											  КАК ТоварТара,
    | NULL											  КАК ДоговорКонтрагента,
    | NULL											  КАК СтатусПартии,
    | ТоварыНаСкладахОстатки.КоличествоОстаток		  КАК Количество,
    | ТоварыОрганизацийОстатки.КоличествоОстаток	    КАК ОстатокПоОрганизации,
    | ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток  КАК КоличествоРазмещенное,
    | ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток КАК КоличествоКПередаче,
    | 1												 КАК СортировкаРазмещение,"
    +?(ЕстьПредпочтительноеРазмещение, "
    | ВЫБОР
    |  КОГДА ТоварыНаСкладахОстатки.Склад = &ПредпочтительноеРазмещение ТОГДА
    |   0
    |  ИНАЧЕ
    |   1
    | КОНЕЦ"
    ,"0")+"			  КАК СортировкаСклад,
    | NULL											  КАК ДатаПоступления
    |ИЗ
    | РегистрНакопления.ТоварыНаСкладах.Остатки(,
    |  Номенклатура В (&МассивНоменклатуры) И Качество = &Новый
    |" + ?(УсловиеСклад<>""," И ("+УсловиеСклад+")","") + ") КАК ТоварыНаСкладахОстатки
    
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |   РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(, Номенклатура В (&МассивНоменклатуры)) КАК ТоварыВРезервеНаСкладахОстатки
    |ПО ТоварыНаСкладахОстатки.Номенклатура				 = ТоварыВРезервеНаСкладахОстатки.Номенклатура
    |   И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры
    |   И ТоварыНаСкладахОстатки.Склад					  = ТоварыВРезервеНаСкладахОстатки.Склад
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |   РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(, Номенклатура В (&МассивНоменклатуры) И Качество = &Новый ) КАК ТоварыКПередачеСоСкладовОстатки
    |ПО ТоварыНаСкладахОстатки.Номенклатура				 = ТоварыКПередачеСоСкладовОстатки.Номенклатура
    |   И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = ТоварыКПередачеСоСкладовОстатки.ХарактеристикаНоменклатуры
    |   И ТоварыНаСкладахОстатки.Склад					  = ТоварыКПередачеСоСкладовОстатки.Склад
    |ЛЕВОЕ СОЕДИНЕНИЕ
    | РегистрНакопления.ТоварыОрганизаций.Остатки(, Организация = &Организация И Комиссионер = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) И Номенклатура В (&МассивНоменклатуры) И Качество = &Новый) КАК ТоварыОрганизацийОстатки
    |ПО   ТоварыНаСкладахОстатки.Номенклатура			   = ТоварыОрганизацийОстатки.Номенклатура
    |   И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = ТоварыОрганизацийОстатки.ХарактеристикаНоменклатуры
    |";
    КонецЕсли;
    Если Авторезервирование И Авторазмещение Тогда
    ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст +
    "
    |ОБЪЕДИНИТЬ ВСЕ
    |";
    КонецЕсли;
    Если Авторазмещение Тогда
    УсловиеСклад = "";
    Если ЗначениеЗаполнено(ГруппаДоступностиСкладов) Тогда
    УсловиеСклад = " ЗаказПоставщику.Склад В" + ТекстФильтраПоСкладам;
    Если ЕстьПредпочтительноеРазмещение Тогда
    УсловиеСклад = УсловиеСклад+" ИЛИ ЗаказПоставщику.Склад = &ПредпочтительноеРазмещение";
    КонецЕсли;
    КонецЕсли;
    Если ЕстьСкладЗаказчик Тогда
    Если УсловиеСклад = "" Тогда
    УсловиеСклад = "ЗаказПоставщику.Склад <> &СкладЗаказчик";
    Иначе
    УсловиеСклад = "("+УсловиеСклад+") И ЗаказПоставщику.Склад <> &СкладЗаказчик"
    КонецЕсли;
    КонецЕсли;
    ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст +
    "ВЫБРАТЬ
    | ЗаказыПоставщикамОстатки.Номенклатура,
    | ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры,
    | ЗаказыПоставщикамОстатки.ЗаказПоставщику				 КАК Размещение,
    | ОстаткиРазмещенных.ТоварТара,
    | ЗаказыПоставщикамОстатки.ДоговорКонтрагента,
    | ЗаказыПоставщикамОстатки.СтатусПартии,
    | ЗаказыПоставщикамОстатки.КоличествоОстаток			   КАК Количество,
    | ЗаказыПоставщикамОстатки.КоличествоОстаток			   КАК ОстатокПоОрганизации,
    | ОстаткиРазмещенных.КоличествоОстаток					 КАК КоличествоРазмещенное,
    | 0													    КАК КоличествоКПередаче,
    | 0													    КАК СортировкаРазмещение,"+
    ?(ЕстьПредпочтительноеРазмещение,"
    | ВЫБОР
    |  КОГДА ЗаказыПоставщикамОстатки.ЗаказПоставщику.Склад = &ПредпочтительноеРазмещение ТОГДА
    |   0
    |  ИНАЧЕ
    |   1
    | КОНЕЦ","0")+"										    КАК СортировкаСклад,
    | ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления КАК ДатаПоступления
    |ИЗ
    | РегистрНакопления.ЗаказыПоставщикам.Остатки(,
    |  ЗаказПоставщику.ДатаПоступления <= &ДатаОтгрузки
    |  И ЗаказПоставщику.Организация = &Организация
    |  И Номенклатура В (&МассивНоменклатуры)
    |" + ?(УсловиеСклад<>""," И ("+УсловиеСклад+")","") + "
    |" + ?(ЕстьМассивСтатусовПартий," И СтатусПартии В (&СтатусПартии)","")+"
    |	   ) КАК ЗаказыПоставщикамОстатки
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |   РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки(, Номенклатура В (&МассивНоменклатуры)) КАК ОстаткиРазмещенных
    |ПО ЗаказыПоставщикамОстатки.Номенклатура				 = ОстаткиРазмещенных.Номенклатура
    |   И ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры = ОстаткиРазмещенных.ХарактеристикаНоменклатуры
    |   И ЗаказыПоставщикамОстатки.ЗаказПоставщику		    = ОстаткиРазмещенных.ЗаказПоставщику
    |";
    КонецЕсли;
    Если Авторезервирование И Авторазмещение Тогда
    Если СтратегияАвторезервирования = Перечисления.СтратегииАвторезервированияНоменклатуры.СначалаВЗаказахПоставщикамПотомНаСкладах Тогда
    // Стратегия авторезервирования: Сначала в заказах поставщикам потом на складах
    ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст + "
    |УПОРЯДОЧИТЬ ПО				 // Определяет стратегию авторезервирования и авторазмещения
    | СортировкаРазмещение,	   // Сначала в заказах, потом на складах
    | СортировкаСклад,		    // Сначала предпочтительный склад, затем остальные
    | ДатаПоступления УБЫВ,	   // В порядке убывания дат отгрузки
    | Размещение УБЫВ			 // Заказы в обратном порядке";
    Иначе
    // Стратегия авторезервирования: Сначала на складах потом в заказах поставщикам
    ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст + "
    |УПОРЯДОЧИТЬ ПО				 // Определяет стратегию авторезервирования и авторазмещения
    | СортировкаРазмещение УБЫВ,  // Сначала на складах, потом в заказах
    | СортировкаСклад,		    // Сначала предпочтительный склад, затем остальные
    | ДатаПоступления,		    // По порядку возрастания дат отгрузки
    | Размещение				  // По порядку следования заказов";
    КонецЕсли;
    ИначеЕсли Авторезервирование Тогда
    ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст + "
    |УПОРЯДОЧИТЬ ПО				 // Определяет стратегию авторезервирования и авторазмещения
    | СортировкаСклад			 // Сначала предпочтительный склад, затем остальные ";
    ИначеЕсли Авторазмещение Тогда
    ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст + "
    |УПОРЯДОЧИТЬ ПО				 // Определяет стратегию авторезервирования и авторазмещения
    | СортировкаСклад,		    // Сначала предпочтительный склад поступления по заказу поставщику, затем остальные
    | ДатаПоступления УБЫВ,	   // В порядке убывания дат отгрузки
    | Размещение УБЫВ			 // В порядке убывания дат заказов";
    КонецЕсли;
    Таблица = ЗапросСвободныйОстаток.Выполнить().Выгрузить();
    
    // Получим права пользователя на превышение остатков по организации.
    ПраваНаПревышениеОстатковПоОрганизации = УправлениеДопПравамиПользователей.РазрешеноПревышениеОстаткаТоваровОрганизации(Заказ.Организация);
    
    
    // Вычислим по каждой строке количества, которые можно разместить
    Для Каждого Строка Из Таблица Цикл
    
    Количество		    = ?(Строка.Количество = NULL, 0, Строка.Количество);
    КоличествоРазмещенное = ?(Строка.КоличествоРазмещенное = NULL, 0, Макс(Строка.КоличествоРазмещенное,0));
    КоличествоКПередаче   = ?(Строка.КоличествоКПередаче = NULL, 0, Макс(Строка.КоличествоКПередаче,0));
    ОстатокПоОрганизации  = ?(Строка.ОстатокПоОрганизации = NULL, 0, Макс(Строка.ОстатокПоОрганизации,0));
    
    //для тары остатков в регистре ТоварыОрганизаций быть не может
    ЭтоТара = ВозвратнаяТара.Найти(Строка.Номенклатура,"Номенклатура")<>неопределено;
    Если ПраваНаПревышениеОстатковПоОрганизации или ЭтоТара Тогда
    Строка.Количество = Количество - КоличествоРазмещенное - КоличествоКПередаче;
    Иначе
    Строка.Количество = Мин(Количество - КоличествоРазмещенное - КоличествоКПередаче, ОстатокПоОрганизации);
    КонецЕсли;
    
    КонецЦикла;
    
    Сч = 0;
    Пока Сч < Таблица.Количество() Цикл
    СтрокаТаблицы = Таблица.Получить(Сч);
    Если СтрокаТаблицы.Количество <= 0 Тогда
    Таблица.Удалить(СтрокаТаблицы);
    Иначе
    Сч = Сч + 1;
    КонецЕсли;
    КонецЦикла;
    ПустаяХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
    // Вычтем из найденных остатков количество, размещение по которому явно указано
    // в табличных частях документа. Для этого последовательно обойдем табличные части
    // Товары и Возвратная тара.
    Для Сч = 0 По 1 Цикл
    Если Сч = 0 Тогда
    ТабличнаяЧасть = Товары;
    ЭтоТовары = Истина;
    Иначе
    ТабличнаяЧасть = ВозвратнаяТара;
    ЭтоТовары = Ложь;
    КонецЕсли;
    Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
    // Если количество меньше и равно нулю, пропускаем строку.
    Если СтрокаТЧ.Количество <= 0 Тогда
    Продолжить;
    КонецЕсли;
    // Сначала обходим все строки с размещением и если размещение не указано, пропускаем строку.
    Если НЕ ЗначениеЗаполнено(СтрокаТЧ[ИмяРеквизитаРазмещение]) Тогда
    Продолжить;
    КонецЕсли;
    // Если не указано авторазмещение в заказах, то пропускаем все строки, в которых указан заказ.
    Если НЕ Авторазмещение И ТипЗнч(СтрокаТЧ[ИмяРеквизитаРазмещение]) <> Тип("СправочникСсылка.Склады") Тогда
    Продолжить;
    КонецЕсли;
    // Если не указано авторезервирование на складах, то пропускаем все строки, в которых указан склад.
    Если НЕ Авторезервирование И ТипЗнч(СтрокаТЧ[ИмяРеквизитаРазмещение]) = Тип("СправочникСсылка.Склады") Тогда
    Продолжить;
    КонецЕсли;
    СтруктураПоиска = Новый Структура;
    СтруктураПоиска.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
    СтруктураПоиска.Вставить("Размещение", СтрокаТЧ[ИмяРеквизитаРазмещение]);
    Если ЭтоТовары Тогда
    СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры", СтрокаТЧ.ХарактеристикаНоменклатуры);
    Иначе
    СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры", ПустаяХарактеристикаНоменклатуры);
    КонецЕсли;
    НайденныеСтроки = Таблица.НайтиСтроки(СтруктураПоиска);
    // Погашаем количество в таблице. Пересчитаем количество в ТЧ в единицы хранения.
    Если ЭтоТовары Тогда
    // Пересчитаем количество в ТЧ в единицы хранения.
    КоличествоОсталосьПогасить = СтрокаТЧ.Количество * СтрокаТЧ.Коэффициент
    / СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент;
    Иначе
    КоличествоОсталосьПогасить = СтрокаТЧ.Количество;
    КонецЕсли;
    Для Каждого Строка Из НайденныеСтроки Цикл
    Если КоличествоОсталосьПогасить <= 0 Тогда
    Прервать;
    КонецЕсли;
    Если Строка.Количество <= 0 Тогда
    Продолжить;
    КонецЕсли;
    // Если это остаток из заказа, то дополнительно проверяем на тару/товар
    Если ТипЗнч(Строка.Размещение)=Тип("ДокументСсылка.ЗаказПоставщику") Тогда
    Если ЭтоТовары И Строка.ТоварТара <> Перечисления.ТоварТара.Товар Тогда
    Продолжить;
    ИначеЕсли НЕ ЭтоТовары И Строка.ТоварТара <> Перечисления.ТоварТара.Тара Тогда
    Продолжить;
    КонецЕсли;
    КонецЕсли;
    Если Строка.Количество >= КоличествоОсталосьПогасить Тогда
    КоэффСписания = КоличествоОсталосьПогасить/Строка.Количество;
    Иначе
    // Это ошибка: списываемое количество не должно быть больше остатка.
    // Такой документ не проведется оперативно.
    КоэффСписания = 1;
    КонецЕсли;
    СписанноеКоличество = Окр(Строка.Количество * КоэффСписания, 3, РежимОкругления.Окр15как20);
    КоличествоОсталосьПогасить = КоличествоОсталосьПогасить - СписанноеКоличество;
    Строка.Количество = Строка.Количество - СписанноеКоличество;
    КонецЦикла;
    Если КоличествоОсталосьПогасить > 0 Тогда
    // Значит в документе неверно задано размещение. Заполнять не будем
    Возврат;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    // Заполним массив, хранящий две таблицы значений, соответствующих авторазмещению товаров и тары
    МассивТаблицСтрок = Новый Массив(2);
    Для Сч = 0 По 1 Цикл
    Если Сч = 0 Тогда
    ТабличнаяЧасть = Товары;
    ЭтоТовары = Истина;
    Иначе
    ТабличнаяЧасть = ВозвратнаяТара;
    ЭтоТовары = Ложь;
    КонецЕсли;
    ТаблицаТЧ = ТабличнаяЧасть.Выгрузить();
    ТаблицаТЧ.Колонки.Добавить("КоличествоЕдиницХранения");
    МассивТаблицСтрок[Сч] = ТабличнаяЧасть.Выгрузить();
    МассивТаблицСтрок[Сч].Очистить();
    МассивТаблицСтрок[Сч].Колонки.Добавить("ИндексИсходнойСтроки");
    Для Каждого СтрокаТЧ Из ТаблицаТЧ Цикл
    Если СтрокаТЧ.Количество <= 0 Тогда
    Продолжить;
    КонецЕсли;
    Если ЗначениеЗаполнено(СтрокаТЧ[ИмяРеквизитаРазмещение]) Тогда
    Продолжить;
    КонецЕсли;
    Если флРезервированиеТоваров Тогда
    Если ЗначениеЗаполнено(СтрокаТЧ.ИсходноеРазмещение) Тогда
    //нет смысла указывать одинаковыми исходное и новое размещение
    Если СтрокаТЧ.ИсходноеРазмещение = СтрокаТЧ.НовоеРазмещение Тогда
    Продолжить;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    СтруктураПоиска = Новый Структура;
    СтруктураПоиска.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
    Если ЭтоТовары Тогда
    // Пересчитаем в единицы хранения
    СтрокаТЧ.КоличествоЕдиницХранения = СтрокаТЧ.Количество * СтрокаТЧ.Коэффициент
    / СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент;
    СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры", СтрокаТЧ.ХарактеристикаНоменклатуры);
    Иначе
    СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры", ПустаяХарактеристикаНоменклатуры);
    СтрокаТЧ.КоличествоЕдиницХранения = СтрокаТЧ.Количество;
    КонецЕсли;
    НайденныеСтроки = Таблица.НайтиСтроки(СтруктураПоиска);
    // Погашаем количество в таблице
    КоличествоОсталосьПогасить = СтрокаТЧ.КоличествоЕдиницХранения;
    Если ЗаполнятьСуммы Тогда
    СуммаОсталосьПогасить	  = СтрокаТЧ.Сумма;
    КонецЕсли;
    // Погашаем количество в таблице, записывая размещение
    Для Каждого Строка Из НайденныеСтроки Цикл
    Если КоличествоОсталосьПогасить <= 0 Тогда
    Прервать;
    КонецЕсли;
    Если Строка.Количество <= 0 Тогда
    Продолжить;
    КонецЕсли;
    // Если это остаток по заказу поставщику, отберем товар и тару
    Если ТипЗнч(Строка.Размещение)=Тип("ДокументСсылка.ЗаказПоставщику") Тогда
    Если ЭтоТовары И Строка.ТоварТара = Перечисления.ТоварТара.Тара  Тогда
    Продолжить;
    ИначеЕсли ЭтоТовары И Строка.СтатусПартии = Перечисления.СтатусыПартийТоваров.ВозвратнаяТара Тогда
    Продолжить;
    ИначеЕсли НЕ ЭтоТовары И Строка.ТоварТара = Перечисления.ТоварТара.Товар Тогда
    Продолжить;
    ИначеЕсли НЕ ЭтоТовары И Строка.СтатусПартии = Перечисления.СтатусыПартийТоваров.Купленный Тогда
    Продолжить;
    КонецЕсли;
    ИначеЕсли не ЭтоТовары и ОбособленныйУчет И ТипЗнч(Строка.Размещение)=Тип("СправочникСсылка.Склады") Тогда
    //авторезервирование тары под заказ с обособленным учетом не выполняется
    Продолжить;
    КонецЕсли;
    Если Строка.Количество >= КоличествоОсталосьПогасить Тогда
    КоэффСписания = КоличествоОсталосьПогасить / Строка.Количество;
    Иначе
    КоэффСписания = 1;
    КонецЕсли;
    СписанноеКоличество = Окр(Строка.Количество * КоэффСписания, 3, РежимОкругления.Окр15как20);
    Если ЭтоТовары Тогда
    СписанноеКоличествоВДок = Окр( (Строка.Количество * СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / СтрокаТЧ.ЕдиницаИзмерения.Коэффициент)
    * КоэффСписания, 3, РежимОкругления.Окр15как20);
    Иначе
    СписанноеКоличествоВДок = Окр( Строка.Количество * КоэффСписания, 3, РежимОкругления.Окр15как20);
    КонецЕсли;
    // Добавляем строку с данными о размещенном количестве
    НоваяСтрока = МассивТаблицСтрок[Сч].Добавить();
    НоваяСтрока.ИндексИсходнойСтроки = ТаблицаТЧ.Индекс(СтрокаТЧ);
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
    НоваяСтрока[ИмяРеквизитаРазмещение]  = Строка.Размещение;
    НоваяСтрока.Количество  = СписанноеКоличествоВДок;
    
    КоэффПогашения = СписанноеКоличество / КоличествоОсталосьПогасить;
    КоличествоОсталосьПогасить = КоличествоОсталосьПогасить - СписанноеКоличество;
    Если ЗаполнятьСуммы Тогда
    НоваяСтрока.Сумма				    = Окр(СуммаОсталосьПогасить * КоэффПогашения, 2 ,1);
    СуммаОсталосьПогасить = СуммаОсталосьПогасить - НоваяСтрока.Сумма;
    КонецЕсли;
    // Уменьшаем количество в исходной строке
    СтрокаТЧ.Количество = СтрокаТЧ.Количество - СписанноеКоличествоВДок;
    // Уменьшаем количество в строке остатков
    Строка.Количество   = Строка.Количество - СписанноеКоличество;
    КонецЦикла;
    Если КоличествоОсталосьПогасить > 0 Тогда
    // Добавляем строку с данными о размещенном количестве
    НоваяСтрока = МассивТаблицСтрок[Сч].Добавить();
    НоваяСтрока.ИндексИсходнойСтроки = ТаблицаТЧ.Индекс(СтрокаТЧ);
    
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
    Если ЭтоТовары Тогда
    НоваяСтрока.Количество = Окр( (КоличествоОсталосьПогасить * СтрокаТЧ.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / СтрокаТЧ.ЕдиницаИзмерения.Коэффициент), 3, РежимОкругления.Окр15как20);
    Иначе
    НоваяСтрока.Количество = КоличествоОсталосьПогасить;
    КонецЕсли;
    Если ЗаполнятьСуммы Тогда
    НоваяСтрока.Сумма				    = Окр(СуммаОсталосьПогасить, 2, 1);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    // Изменяем табличную часть
    Для Сч = 0 По 1 Цикл
    Если Сч = 0 Тогда
    ТабличнаяЧасть = Товары;
    ЭтоТовары = Истина;
    Иначе
    ТабличнаяЧасть = ВозвратнаяТара;
    ЭтоТовары = Ложь;
    КонецЕсли;
    ТекИндексИсходнойСтроки = Неопределено;
    Для Каждого Строка Из МассивТаблицСтрок[Сч] Цикл
    Если Строка.Количество <= 0 Тогда
    Продолжить;
    КонецЕсли;
    
    // Если строка с таким индексом уже обрабатывалась, то добавляем новую
    Если ТекИндексИсходнойСтроки = Строка.ИндексИсходнойСтроки Тогда
    Стр = ТабличнаяЧасть[Строка.ИндексИсходнойСтроки];
    РедактируемаяСтрока = ТабличнаяЧасть.Добавить();
    РедактируемаяСтрока.Номенклатура = Стр.Номенклатура;
    Если флРезервированиеТоваров Тогда
    РедактируемаяСтрока.ИсходноеРазмещение = Стр.ИсходноеРазмещение;
    КонецЕсли;
    
    Если ЭтоТовары Тогда
    РедактируемаяСтрока.ХарактеристикаНоменклатуры = Стр.ХарактеристикаНоменклатуры;
    Если ЗаполнятьСуммы Тогда
    РедактируемаяСтрока.СтавкаНДС = Стр.СтавкаНДС;
    КонецЕсли;
    КонецЕсли;
    Иначе
    РедактируемаяСтрока = ТабличнаяЧасть[Строка.ИндексИсходнойСтроки];
    КонецЕсли;
    РедактируемаяСтрока[ИмяРеквизитаРазмещение] = Строка[ИмяРеквизитаРазмещение];
    Если РедактируемаяСтрока.Количество = Строка.Количество Тогда
    Продолжить;
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(РедактируемаяСтрока, Строка);
    Если ЭтоТовары Тогда
    ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(РедактируемаяСтрока, Заказ);
    КонецЕсли;
    
    Если ЗаполнятьСуммы Тогда
    Если ЭтоТовары Тогда
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(РедактируемаяСтрока, Заказ);
    Иначе
    РедактируемаяСтрока.Цена = ?(РедактируемаяСтрока.Количество <> 0, РедактируемаяСтрока.Сумма/РедактируемаяСтрока.Количество, 0);
    КонецЕсли;
    КонецЕсли;
    
    ТекИндексИсходнойСтроки = Строка.ИндексИсходнойСтроки;
    КонецЦикла;
    КонецЦикла;
    Если Параметры.РезервироватьПоСериям Тогда
    ЗаполнитьПоСериям(Заказ, Товары,ИмяРеквизитаРазмещение,Параметры.Свойство("РезервированиеТоваров"));
    КонецЕсли;
    КонецПроцедуры
    
  18. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    ты тут решил всю конфу по частям выложить... на те парни..разбирайтесь :))
  19. TopicStarter Overlay
    Pro_user 200
    Offline

    Pro_user 200 Опытный в 1С

    Регистрация:
    5 янв 2013
    Сообщения:
    63
    Симпатии:
    0
    Баллы:
    26

Поделиться этой страницей