Запрет Резервирование товара в УТ 10.3

1. user817897 2 22.02.19 10:23 Сейчас в теме
Всем привет.
Ситуация такая. Мне нужно чтобы товар не резервировался если в карточке номенклатуре стоит галочка не резервировать.
Создал галочку в номенклатуре.
Теперь где-то нужно сделать чтобы не резервировался товар в котором стоит галочка эта. Вопрос,может кто знает где и как это сделать,я так понимаю в ФормаВыбораПараметровАвторезервирования?
Может кто так делал уже,как быть в ситуации?
По теме из базы знаний
Найденные решения
56. wau8824ru 22 27.02.19 06:10 Сейчас в теме
(55)
ОК,короч хз, директор хочет чтобы через ОК, а мне проще через кн

Вы же в курсе что кнопка ОК - Это сначало Записать потом Провести.
Если нужно по кнопке ОК - то попробуйте ПерезЗаписью() формы документа в конце пробежаться по товарам и
		Если ЗначениеЗаполнено(Строка.Размещение) Тогда
			ЗаполнРазмещение.Добавить("Заполнено");
		КонецЕсли;

Где ЗаполнРазмещение - СписокЗначений, после чего
Если ЗаполнРазмещение.Количество()=0 Тогда
	ЭтотОбъект.Дата = ТекущаяДата();
	ДействияФормыДействиеЗаполнитьИПровести(Неопределено);
КонецЕсли;

(54)
у нас заявка может формироваться сегодня.а резерв бывает через день

Вот о чём и речь, удобнее если для резерва нужно ввести документ РезервированиеТовара, который можно хоть 25 раз перепровести и всё что угодно делать со строками в нём, а при проведении его можно и получить() объект заказ на основании которого он создан, и его отредактировать нужные реквизиты.
user817897; +1 Ответить
17. alalexmix 25 22.02.19 12:17 Сейчас в теме
Пожалуйста, читайте, то, что написано, требуется в запросах поставить фильтр по добавленному признаку, НО

если решить Вашим способом, то вставка в одном месте, где устанавливается параметр запросов "МассивНоменклатуры", а именно результат

// - Было
//ЗапросСвободныйОстаток.УстановитьПараметр("МассивНоменклатуры",       МассивНоменклатуры);

// - Стало
МассивНоменклатурыДляРезерва = Новый Массив;
	Для каждого ЭлементМассива Из МассивНоменклатуры Цикл
		Если ЗначениеЗаполнено(ЭлементМассива) И ЭлементМассива._НеРезирвировать Тогда
			// пропустим
			Продолжить;
		КонецЕсли;
		МассивНоменклатурыДляРезерва.Добавить(ЭлементМассива);
	КонецЦикла;
	ЗапросСвободныйОстаток.УстановитьПараметр("МассивНоменклатуры",       МассивНоменклатурыДляРезерва);
Показать

Важно!!! то, что описано, это пример - и может работать только для документов, которые обращаются к данной процедуре, т.е. надо проверить (протестировать) - для всех документов, которые включены в механизм "резервирования и размещения" и если нет то реализуем по подобию
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. dchumak 42 22.02.19 10:54 Сейчас в теме
Самый простой способ: скорректировать обработку проведения, там поставить фильтр по реквизиту "Не резервировать". Тогда движения по резерву не создадутся.
Но, однако, может быть "непонятка" у менеджеров - как так, товар поставили резервировать, заполнили склад в ТЧ товары, а товар не зарезервировался?

Правильно нужно дорабатывать форму документов и резервирования.
1) товары, которые не нужно резервировать и у них стоит флажок отмечать отдельно
2) в резервировании товара не давать заполнять колонку "Размещение", если стоит флажок не резервировать.
5. user817897 2 22.02.19 11:09 Сейчас в теме
(2)ну да,надо будет учитывать это,чтобы не заполнялось
6. user817897 2 22.02.19 11:09 Сейчас в теме
(5)я не могу понять просто,где изменять конфигурацию в документе каком?!
38. dchumak 42 25.02.19 03:09 Сейчас в теме
(6)
в документе каком?!

В обработке проведения документа (в модуле документа) и в форме документа.
15. user817897 2 22.02.19 11:42 Сейчас в теме
(2)Менеджеры уже будут заранее предупреждены то эти позиции товаров ни под кого резервироваться не будут, так как они в производстве ещё и вечером для всех будет накомплектовано.
Подскажите пожалуйста,куда код вставить? и как правильно оформить,ниже прикрепил код
39. dchumak 42 25.02.19 03:11 Сейчас в теме
(15)
не вариант.
Пришел новый менеджер и объясняй все по-новому.
Должно быть выделение таких вот "нерезервируемых" позиций. А для этого надо какие-нибудь отметки ставить в таблице товаров, наподобие значка "Сверх заказа" в реализации товаров и услуг в УТ11.
40. user817897 2 25.02.19 08:52 Сейчас в теме
(39)
хорошо,как вариант подсвечивать буду их жирным. спасибо
3. alalexmix 25 22.02.19 11:05 Сейчас в теме
Если не изменять конфигурацию, то не заполнять соответствующие колонки в таб. частях документов, которые отвечают за резервирование и размещение

Например: Резервирование товаров под заказ на складе и размещение в заказах

При оформлении заказа покупателя товары можно зарезервировать под этот заказ из текущего свободного остатка на любом из складов (оптовом или розничном) или разместить в других заказах - заказах поставщикам, внутренних заказах. Склад для резервирования или заказ для размещения указывается в табличной части в колонке «Размещение», таким образом, по одному заказу покупателя товар может быть зарезервирован на нескольких складах и размещен в нескольких заказах.
-----------
Есди изменять конфигурацию - кнопка "Заполнить и провести" - автоматическое "резервирование" и "размещение", то например

в запросах процедуры "Заказ_ЗаполнитьТабличныеЧастиВозможнымРазмещением" сделать (прописать код) фильтр по галочке "не резервировать" карточки номенклатуры (как товар, так и тара) ,

т.е. не будет выполняться заполнение соответсвующей колонки, которая отвечает за резервирование и размещение
4. user817897 2 22.02.19 11:08 Сейчас в теме
(3)я вас понял. но не нашёл такую процедуру: "Заказ_ЗаполнитьТабличныеЧастиВозможнымРазмещением"
в форме: ФормаВыбораПараметровАвторезервирования.
9. user817897 2 22.02.19 11:14 Сейчас в теме
(3)нашёл через в общем модуле управление заказами, сейчас попробую там нахимичить)))
7. alalexmix 25 22.02.19 11:13 Сейчас в теме
В помощь - пройдитесь по отладчику - из формы "ФормаВыбораПараметровАвторезервирования", когда форма закрывается
35. alalexmix 25 22.02.19 17:12 Сейчас в теме
36. user817897 2 22.02.19 17:23 Сейчас в теме
(35)я понял, но мне нужна кнопка ОК из документа ЗаказаПокупателя.
37. alalexmix 25 22.02.19 18:53 Сейчас в теме
(36) Если кнопка "ОК" самого документа "Заказ покупателя", то это стандартная кнопка, у которой нет заданного программистом обработчика, а есть стандартные (платформенные) обработчики событий, такие как "ПередЗаписью", "ОбработкаПроведения" (если документ имеет свойство "Проведения"), "ПриЗаписи" в модуле объекта (документа) и похожие обработчики в модуле формы документа - которые необходимо определить, либо в модуле документа, либо в модуле формы документа.
41. user817897 2 25.02.19 08:52 Сейчас в теме
(37)
ок,спасибо большое,я понял. буду пробовать)
8. alalexmix 25 22.02.19 11:13 Сейчас в теме
Возможно у меня релиз УТ 10.3 - старый
10. alalexmix 25 22.02.19 11:14 Сейчас в теме
11. user817897 2 22.02.19 11:15 Сейчас в теме
(10) спасибо огромное,очень помогли,но пока ещё не сделал я там ничего)))
(10.3.19.4) у меня
12. user817897 2 22.02.19 11:16 Сейчас в теме
(10)
Процедура Заказ_ЗаполнитьТабличныеЧастиВозможнымРазмещением(Параметры, Товары, ВозвратнаяТара) Экспорт
	Авторезервирование = Параметры.Авторезервирование;
	Авторазмещение     = Параметры.Авторазмещение;
	
	Если НЕ Авторезервирование И НЕ Авторазмещение Тогда
		Возврат;
	КонецЕсли;
	
    Заказ = Параметры.Заказ;
	ЗаказСсылка = Заказ.Ссылка;
	ЕстьСкладЗаказчик = Ложь;
	ЕстьПредпочтительноеРазмещение = Ложь;
	ЕстьМассивСтатусовПартий = Ложь;
    МассивСтатусовПартий = Новый Массив;
    ЗаполнятьСуммы = ложь;
	СкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойСклад");
    СтратегияАвторезервирования = Параметры.СтратегияАвторезервированияПоЗаказам;
	ОбособленныйУчет = Параметры.Свойство("ОбособленныйУчет") И Параметры.ОбособленныйУчет;

    Если НЕ ЗначениеЗаполнено(СтратегияАвторезервирования) Тогда
		СтратегияАвторезервирования = Перечисления.СтратегииАвторезервированияНоменклатуры.СначалаВЗаказахПоставщикамПотомНаСкладах;
	КонецЕсли;
	
	ЗапросСвободныйОстаток = Новый Запрос;

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

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

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

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

		КонецЦикла; 
	КонецЦикла;

	Если Параметры.РезервироватьПоСериям Тогда
		ЗаполнитьПоСериям(Заказ, Товары,ИмяРеквизитаРазмещение,Параметры.Свойство("РезервированиеТоваров"));
	КонецЕсли;
КонецПроцедуры
Показать
13. user817897 2 22.02.19 11:18 Сейчас в теме
(10)
Если Номенклатура.НеРезервировать = Истина Тогда
.....не резервировать
КонецЕсли;
такую конструкцию не подскажите куда вставить?
16. user817897 2 22.02.19 11:53 Сейчас в теме
(10)я так понимаю это нужно вставлять после:

// Вычислим по каждой строке количества, которые можно разместить
Для Каждого Строка Из Таблица Цикл
?
Если ставить туда,то условие моё какое-то не правильно))) надо чтобы товар не резервировался,а он у меня всё равно в резерв падает)))
чёт надо придумать)
14. user817897 2 22.02.19 11:30 Сейчас в теме
Если Стр.Номенклатура.НеРезервировать = Истина Тогда
флРезервированиеТоваров = ложь;
КонецЕсли;
Так?
17. alalexmix 25 22.02.19 12:17 Сейчас в теме
Пожалуйста, читайте, то, что написано, требуется в запросах поставить фильтр по добавленному признаку, НО

если решить Вашим способом, то вставка в одном месте, где устанавливается параметр запросов "МассивНоменклатуры", а именно результат

// - Было
//ЗапросСвободныйОстаток.УстановитьПараметр("МассивНоменклатуры",       МассивНоменклатуры);

// - Стало
МассивНоменклатурыДляРезерва = Новый Массив;
	Для каждого ЭлементМассива Из МассивНоменклатуры Цикл
		Если ЗначениеЗаполнено(ЭлементМассива) И ЭлементМассива._НеРезирвировать Тогда
			// пропустим
			Продолжить;
		КонецЕсли;
		МассивНоменклатурыДляРезерва.Добавить(ЭлементМассива);
	КонецЦикла;
	ЗапросСвободныйОстаток.УстановитьПараметр("МассивНоменклатуры",       МассивНоменклатурыДляРезерва);
Показать

Важно!!! то, что описано, это пример - и может работать только для документов, которые обращаются к данной процедуре, т.е. надо проверить (протестировать) - для всех документов, которые включены в механизм "резервирования и размещения" и если нет то реализуем по подобию
18. user817897 2 22.02.19 12:29 Сейчас в теме
(17) сильно не ругайтесь,я в 1с совсем недавно.)
ошибка
{ОбщийМодуль.УправлениеЗаказами.Модуль(1884)}: Поле объекта не обнаружено (_НеРезирвировать)
Если ЗначениеЗаполнено(ЭлементМассива) И ЭлементМассива._НеРезирвировать Тогда
19. alalexmix 25 22.02.19 12:33 Сейчас в теме
Понятно - реквизит "_НеРезирвировать", а в вашем случае "НеРезервировать", т.е. результат
Если ЗначениеЗаполнено(ЭлементМассива) И ЭлементМассива.НеРезервировать Тогда
20. user817897 2 22.02.19 12:33 Сейчас в теме
21. user817897 2 22.02.19 12:40 Сейчас в теме
всё равно все товары кинулись в резерв(
22. alalexmix 25 22.02.19 12:42 Сейчас в теме
А в каком документе Вы оперируете?
23. user817897 2 22.02.19 12:42 Сейчас в теме
24. user817897 2 22.02.19 12:44 Сейчас в теме
(22)в цикл заходит этот,если отслеживать отладчиком
25. vynosmozga 5 22.02.19 12:44 Сейчас в теме
Может проще в модуле регистра где формируется резервирование ПриЗаписи()
26. alalexmix 25 22.02.19 12:52 Сейчас в теме
Странно, у меня все норм - не заполняется колонка "Размещение", соответственно и движения по регистру резерва не формируются по той номенклатуре, у которой стоит признак "Не резервировать"

(25) такой похожий вариант (не делать движений) описал (2), НО делать это в обработчике "ПриЗаписи()" модуля регистра ?!?!?! не буду отвечать
27. user817897 2 22.02.19 12:57 Сейчас в теме
(26)
погоди,как не заполняется,если к примеру изначально сам заполняешь в Заказе покупателя эту колонку: Размещения. Потом нажимаю кнопку Заполнить и провести(выскакивает форма: Параметра авторезервирования), ставлю там галочки,и в итоге потом смотрю анализ, в анализ они попадают что зарезервированы.
Правильно я описал процесс.или другой должен был быть?
28. user817897 2 22.02.19 13:10 Сейчас в теме
(26)я вас понял,просто нужно галочку активировать(очищать размещение перед заполнением) тогда работает)
Спасибо огромное)))
30. user817897 2 22.02.19 13:12 Сейчас в теме
(26) можно и не ставить,оно и так работает) Спасибо огромное ещё раз)))
31. user817897 2 22.02.19 13:12 Сейчас в теме
29. alalexmix 25 22.02.19 13:12 Сейчас в теме
В отчете "Анализ", в данном случае заказа покупателя в колонку "Резерв" попадают данные по формуле:
КоличествоОстаток по "Документу резерва (сам заказ)" регистра "ТоварыВРезервеНаСкладах"
+ КоличествоОстаток по "Документу резерва (сам заказ)" регистра "ТоварыКПередачеСоСкладов"
- КоличествоОстаток по "Документу резерва (сам заказ)" регистра "ТоварыКПолучениюНаСклады"

т.е. посмотри движения по описанным регистрам по колонке "Документ резерва", скорее всего уже до этого были движения.
32. alalexmix 25 22.02.19 13:13 Сейчас в теме
Пытайтесь максимально сами разобраться - придет с опытом - удачи
33. user817897 2 22.02.19 14:10 Сейчас в теме
(32)Спасибо огромное,сижу вникаю,пытаюсь разобраться)влезть в это по максимуму)))
Сейчас хочу переделать по по кнопке ОК чтобы работало в Статусе На согласовании чтобы только работало.
34. user817897 2 22.02.19 16:21 Сейчас в теме
(32)Поможете ещё немного?))не могу найти куда код вставлять по кнопке ОК,где он вообще хранится?
42. wau8824ru 22 25.02.19 10:48 Сейчас в теме
В модуле документ "Резервирование товаров" есть процедура ПередЗаписью
// Процедура вызывается перед записью документа 
//
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

	мУдалятьДвижения = НЕ ЭтоНовый();

	Если ОбменДанными.Загрузка  Тогда
		Возврат;
	КонецЕсли;

	// Проверка заполнения единицы измерения мест и количества мест
	ОбработкаТабличныхЧастей.ПриЗаписиПроверитьЕдиницуИзмеренияМест(Товары);

КонецПроцедуры // ПередЗаписью
Показать

В конец процедуры можно вставить
	N = ЭтотОбъект.Товары.Количество()-1;
	Пока N > -1 Цикл
		Стр = ЭтотОбъект.Товары.Получить(N);
		Если Стр.Номенклатура.ЗапретРезервирования Тогда
			ЭтотОбъект.Товары.Удалить(Стр);
		КонецЕсли;
		N = N-1;
	КонецЦикла;
Показать

Таким образом после того как появился запрет у номенклатуры, можно просто перепровести Резервы, это если резервы делаются из документы РезервированиеТоваров, в остальные модули документов нужно вставить тоже самое.
Если удалять строку нельзя, то можно очистить размещение
	N = ЭтотОбъект.Товары.Количество()-1;
	Пока N > -1 Цикл
		Стр = ЭтотОбъект.Товары.Получить(N);
		Если Стр.Номенклатура.ЗапретРезервирования Тогда
			ЭтотОбъект.Товары.Размещение = Неопределено; // Как то так, не проверял. 
		КонецЕсли;
		N = N-1;
	КонецЦикла;
Показать
43. user817897 2 25.02.19 14:57 Сейчас в теме
(42) очень хорошо и доступно расписано,спасибо,возьму на заметку,а как в случае если в документе Заказа покупателя сделать перед записью,такая конструкция не прокатит же?!
Надо как-то сделать чтобы при нажатии кнопки ОК в документе Заказ покупателя(я так понимаю ПередЗаписью) проставлялось в ТЧТовары в колонку Размещение основной склад,а где галочка в карточке номенклатуры стоит что не Резервировать,там не проставлять.?!
44. wau8824ru 22 25.02.19 16:27 Сейчас в теме
(43)
при нажатии кнопки ОК в документе Заказ покупателя

При нажатии кнопки ОК (Документ запишется и проведётся), при нажатии кнопки Записать (Документ запишется)
Важно что
Процедура ПередЗаписью

это процедура из модуля документа, и она отработает в любом случае перед записью документа (проведение это тоже запись).
Она должна отработать при нажатии на кнопку "ЗаполнитьИПровести", документ заполняется через общую форму
// Заполнение документа
	Форма = ПолучитьОбщуюФорму("ФормаВыбораПараметровАвторезервирования", ЭтаФорма, );

после чего если не обмен данными
    Если ОбменДанными.Загрузка  Тогда
        Возврат;
    КонецЕсли;

очистится размещения у строк где
Стр.Номенклатура.ЗапретРезервирования

ЗапретРезервирования - это реквизит номенклатуры с типом булево.
Попробуйте в модуле документа ЗаказПокупателя в процедуре ПередЗаписью()
перед КонецПроцедуры вставить код
    N = ЭтотОбъект.Товары.Количество()-1;
    Пока N > -1 Цикл
        Стр = ЭтотОбъект.Товары.Получить(N);
        Если Стр.Номенклатура.ЗапретРезервирования Тогда
            //Ошибся//ЭтотОбъект.Товары.Размещение = Неопределено; // Как то так, не проверял. 
            Стр.Размещение = Неопределено;// Так правильней, но нужно проверять.
        КонецЕсли;
        N = N-1;
    КонецЦикла;
Показать
45. wau8824ru 22 25.02.19 16:42 Сейчас в теме
(43)
проставлялось в ТЧТовары в колонку Размещение основной склад,а где галочка в карточке номенклатуры стоит что не Резервировать,там не проставлять.?!

Резервирование нужно делать кнопкой ЗаполнитьИПровести, важно что при этом Дата документа должна быть
ТекущаяДата()

Откройте справочник "Группы доступности складов", добавьте группу, обзавите её как-нибудь. В этой группе добавьте склады которые будут учавствовать в резервировании у конкретных пользователей. В правах пользователей "Основная группа доступности складов" назначить вновь созданную группу.
В Форме документа, в процедуре при открытии добавить то что выделенно 88
Если ЭтоНовый() Тогда 
		
		ИнициализироватьНовыйДокумент(ПараметрОбъектКопирования, ПараметрОснование);

		//88(
		ЭтотОбъект.СкладГруппа = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ГруппаДоступностиСкладов");
		//88)
	Иначе
		
		НастройкаПравДоступа.ОпределитьДоступностьВозможностьИзмененияДокументаПоДатеЗапр­ета(ДокументОбъект, ЭтаФорма);

	КонецЕсли;
Показать
46. wau8824ru 22 25.02.19 17:06 Сейчас в теме
(43) Нужно заставить пользователей заполнять документ нажатием на кнопку "Заполнить и провести", или проверять и менять дату с
ТекущаяДата();

при проведении документа, пойдут ли на это?
Проще всё это использовать в документе РезервированиеТоваров, чтобы при открытии если это новый документ, документ заполнялся, очищался и проводился.
47. wau8824ru 22 25.02.19 17:13 Сейчас в теме
Если не нравится форма при нажатии заполнить и провести, то приведете процедуру формы к такому виду
Процедура ДействияФормыДействиеЗаполнитьИПровести(Кнопка)

	// Заполнять с проведением можно документы с текущей датой
	Если НачалоДня(Дата) = НачалоДня(ТекущаяДата()) Тогда
		Если НЕ ЭтоНовый() Тогда

			// Если документ ранее был записан, то он будет переноситься в конец дня из-за оперативного проведения, о чем следует предупредить.
			Ответ = Вопрос("В режиме заполнения с проведением документ будет проводиться оперативно. " + Символы.ПС + "Продолжить?", РежимДиалогаВопрос.ДаНет);
			Если НЕ Ответ = КодВозвратаДиалога.Да Тогда
				Возврат;
			КонецЕсли; 
		КонецЕсли; 
	Иначе
		Предупреждение("Дата документа отличается от текущей. Оперативное проведение невозможно.
		               |Документ заполнен не будет!");
		Возврат;
	КонецЕсли; 

	// Заполнение документа
	Форма = ПолучитьОбщуюФорму("ФормаВыбораПараметровАвторезервирования", ЭтаФорма, );

	//Установим реквизиты и переменные формы.
	Форма.ФормаДокумента = ЭтаФорма;
	//Провести = Форма.ОткрытьМодально();//881
	//88(
	Провести								= Истина;
	Авторезервирование						= Истина;
	Авторазмещение							= Ложь;
	СтратегияАвторезервированияПоЗаказам	= Перечисления.СтратегииАвторезервированияНоменклатуры.СначалаНаСкладахПотомВЗаказахПоставщикам;
	ОчищатьРазмещениеПередЗаполнением		= Ложь;
	//88)
    //если форму закрыли просто крестом, 
    Если Провести=неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ОчищатьРазмещениеПередЗаполнением Тогда
		ОчиститьРазмещениеВТабличнойЧасти(Товары);
		Если мИспользоватьТару Тогда 
			ОчиститьРазмещениеВТабличнойЧасти(ВозвратнаяТара);
		КонецЕсли;
	КонецЕсли;

	ВидимостьСерии = ЭлементыФормы.Товары.Колонки.СерияНоменклатуры.Видимость;

	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("ВидимостьСерии",     ВидимостьСерии);
	СтруктураПараметров.Вставить("Авторезервирование", Авторезервирование);
	СтруктураПараметров.Вставить("Авторазмещение",     Авторазмещение);
	СтруктураПараметров.Вставить("СтратегияАвторезервированияПоЗаказам", СтратегияАвторезервированияПоЗаказам);

	// Очистим записи документа по размещению, если он был ранее проведен
	Если Проведен Тогда
		НачатьТранзакцию();

		НаборОстаткиТоваров = РегистрыНакопления.ТоварыВРезервеНаСкладах.СоздатьНаборЗаписей();
		НаборОстаткиТоваров.Отбор.Регистратор.Установить(Ссылка);
		НаборОстаткиТоваров.Записать();
		НаборЗаказыПоставщикам  = РегистрыНакопления.РазмещениеЗаказовПокупателей.СоздатьНаборЗаписей();
		НаборЗаказыПоставщикам.Отбор.Регистратор.Установить(Ссылка);
		НаборЗаказыПоставщикам.Записать();
	КонецЕсли;

	ЗаполнитьТабличныеЧастиПередПроведениемУпр(СтруктураПараметров);

	Если Проведен Тогда
		ОтменитьТранзакцию();
	КонецЕсли;

	РаботаСДиалогами.ПровестиДокументВФормеОперативно(ЭтаФорма);

КонецПроцедуры
Показать

Где закоментированное 881, то как было
//Провести = Форма.ОткрытьМодально();//881

а 88 как стало
	//88(
	Провести								= Истина;
	Авторезервирование						= Истина;
	Авторазмещение							= Ложь;
	СтратегияАвторезервированияПоЗаказам	= Перечисления.СтратегииАвторезервированияНоменклатуры.СначалаНаСкладахПотомВЗаказахПоставщикам;
	ОчищатьРазмещениеПередЗаполнением		= Ложь;
	//88)
Показать

После чего в нужной процедуре формы используя код
	Если ЭтоНовый() Тогда
		ДействияФормыДействиеЗаполнитьИПровести(Неопределено);
	КонецЕсли;

можно нажать на кнопку "Заполнить и провести" программно, где ваш "Основной склад" и заполнится, а код в процедуре модуля ПередЗаписью()
    N = ЭтотОбъект.Товары.Количество()-1;
    Пока N > -1 Цикл
        Стр = ЭтотОбъект.Товары.Получить(N);
        Если Стр.Номенклатура.ЗапретРезервирования Тогда
            Стр.Размещение = Неопределено;// Так правильней, но нужно проверять.
        КонецЕсли;
        N = N-1;
    КонецЦикла;
Показать

очистит у ненужных товаров размещение, желательно еще после очищения Свернуть() товары, если будут мешать разделившиеся позиции, но это после если будет интересно...
48. user817897 2 26.02.19 09:54 Сейчас в теме
(47) Всё очень очень круто расписываете и очень всё внятно,огромный респект,сделал как вы и написали,тоже хотел чтобы форма была не видна авторезервирования, посмотрел как я не правильно делал и понял свои ошибки.
Вы писали:
После чего в нужной процедуре формы используя код
Если ЭтоНовый() Тогда
ДействияФормыДействиеЗаполнитьИПровести(Неопределено);
КонецЕсли;


можно нажать на кнопку "Заполнить и провести" программно, где ваш "Основной склад" и заполнится
Я подвесил на отдельную кнопку этот код, ничего не происходит,оно не вызывает действие этой кнопки заполнить и провести программно. Может нужно написать не Неопределено,а что нибудь другое?
И могу ли я это подвесить на процедуру ПередЗаписью всё таки в начало?
49. wau8824ru 22 26.02.19 13:50 Сейчас в теме
(48)
Я подвесил на отдельную кнопку этот код

Код ЭтоНовый() срабатывает если объекта ещё нет в базе
Если ЭтоНовый() Тогда 

Этот код
ДействияФормыДействиеЗаполнитьИПровести(Неопределено);

и есть нажатие на кнопку "Заполнить и провести", эта кнопка доступна только в день создания документа.
Код
Процедура ДействияФормыДействиеЗаполнитьИПровести(Кнопка)

    // Заполнять с проведением можно документы с текущей датой
    Если НачалоДня(Дата) = НачалоДня(ТекущаяДата()) Тогда
        Если НЕ ЭтоНовый() Тогда

            // Если документ ранее был записан, то он будет переноситься в конец дня из-за оперативного проведения, о чем следует предупредить.
            Ответ = Вопрос("В режиме заполнения с проведением документ будет проводиться оперативно. " + Символы.ПС + "Продолжить?", РежимДиалогаВопрос.ДаНет);
            Если НЕ Ответ = КодВозвратаДиалога.Да Тогда
                Возврат;
            КонецЕсли; 
        КонецЕсли; 
    Иначе
        Предупреждение("Дата документа отличается от текущей. Оперативное проведение невозможно.
                       |Документ заполнен не будет!");
        Возврат;
    КонецЕсли; 
Показать
50. user817897 2 26.02.19 13:54 Сейчас в теме
(49) а можно всё таки подвесить эти все махинации на событие ПередЗаписью?
51. wau8824ru 22 26.02.19 14:06 Сейчас в теме
(50)
а можно всё таки подвесить эти все махинации на событие ПередЗаписью?

Не проще объяснить людям что Кнопка "Заполнить и провести" активна в день создания документа?
54. user817897 2 26.02.19 16:43 Сейчас в теме
(50)
у нас заявка может формироваться сегодня.а резерв бывает через день,через два,а то и через 3 ставиться и только в статусе: На согласовании и в статусе: Готов к отбору.
52. wau8824ru 22 26.02.19 14:08 Сейчас в теме
Можно в вашу кнопку прописать
ЭтотОбъект.Дата = ТекущаяДата();
ДействияФормыДействиеЗаполнитьИПровести(Неопределено);

Попробуйте...
53. wau8824ru 22 26.02.19 14:12 Сейчас в теме
Можно запретить делать резервы через ЗаказПокупателя (При открытии формы документа 2 строчки в конец процедуры)
ЭлементыФормы.ДействияФормы.Кнопки.ПодменюЗаполнитьИПровести.Доступность	= Ложь;
ЭлементыФормы.Товары.Колонки.Размещение.Доступность							= Ложь;

и вводить РезервированиеТоваров? где и заполнять проще. Пришел товар, ввели документ, товар зарезервировался. нет?
55. user817897 2 26.02.19 16:47 Сейчас в теме
(53) сейчас по кнопке, выше вашего текста,набросал:
Если Статус = Перечисления.СтатусЗаказа.Сформирован Тогда
Сообщить("Резерв в статусте "+ Статус + " установить нельзя");
ИначеЕсли Статус = Перечисления.СтатусЗаказа.ВОтборе Тогда
Сообщить("Установить резервы можно только в статусе 'На согласовании' и 'Готов к отбору'");
ИначеЕсли Статус= Перечисления.СтатусЗаказа.Собран Тогда
Сообщить("Установить резервы можно только в статусе 'На согласовании' и 'Готов к отбору'");
ИначеЕсли Статус = Перечисления.СтатусЗаказа.Выполнен Тогда
Сообщить("Установить резервы можно только в статусе 'На согласовании' и 'Готов к отбору'");
иначе
// Заполнять с проведением можно документы с текущей датой
Если НачалоДня(Дата) = НачалоДня(ТекущаяДата()) Тогда
Если НЕ ЭтоНовый() Тогда

Если не красивый код,извиняйте,подправлю. Поэтому даже и не знаю как правильно сделать,через кнопку Заполнить и провести или через ОК,короч хз, директор хочет чтобы через ОК, а мне проще через кнопку((
56. wau8824ru 22 27.02.19 06:10 Сейчас в теме
(55)
ОК,короч хз, директор хочет чтобы через ОК, а мне проще через кн

Вы же в курсе что кнопка ОК - Это сначало Записать потом Провести.
Если нужно по кнопке ОК - то попробуйте ПерезЗаписью() формы документа в конце пробежаться по товарам и
		Если ЗначениеЗаполнено(Строка.Размещение) Тогда
			ЗаполнРазмещение.Добавить("Заполнено");
		КонецЕсли;

Где ЗаполнРазмещение - СписокЗначений, после чего
Если ЗаполнРазмещение.Количество()=0 Тогда
	ЭтотОбъект.Дата = ТекущаяДата();
	ДействияФормыДействиеЗаполнитьИПровести(Неопределено);
КонецЕсли;

(54)
у нас заявка может формироваться сегодня.а резерв бывает через день

Вот о чём и речь, удобнее если для резерва нужно ввести документ РезервированиеТовара, который можно хоть 25 раз перепровести и всё что угодно делать со строками в нём, а при проведении его можно и получить() объект заказ на основании которого он создан, и его отредактировать нужные реквизиты.
user817897; +1 Ответить
57. user817897 2 28.02.19 10:37 Сейчас в теме
(56)Спасибо огромное,вы мне очень помогли во всём разобраться. В крут!)))
58. user817897 2 10.11.20 14:13 Сейчас в теме
Спасибо всем. Тема Закрыта.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)