Небольшая оптимизация расчета себестоимости в УПП (партионный учет)

09.07.20

Учетные задачи - Производство готовой продукции (работ, услуг)

Доработка позволяет снизить время проведения документа Расчет себестоимости в конфигурации УПП, в нашем случае - на порядок.

Скачать исходный код

Наименование Файл Версия Размер
Небольшая оптимизация расчета себестоимости в УПП (партионный учет):
.zip 7,45Kb
2
.zip 7,45Kb 2 Скачать

Провел небольшую оптимизацию в расчете себестоимости. Конфигурация УПП версия 1.3.106.2

На скриншоте видно, что в нашем случае (БУ 20, 23 счета) при расчете себестоимости более 90% занимает вызов функции выборки результата запроса НайтиСледующий(СтруктураПоиска) в процедуре РаспределитьЗатратыИзНезавершенногоПроизводстваНаВыпускПродукции.

 

Замер производительности

 

Доработка оптимизирует алгоритм распределения - вместо обхода с поиском по двум таблицам, создает один запрос объединяющий две таблицы. При этом сам алгоритм никак не меняется.

Как использовать.

1. В Форме документа Расчет себестоимости добавить флажок для типового проведения, который можно включить, только интерактивно. Имя реквизита: НеОптимизироватьРасчет

2. В модуле формы документа Расчет себестоимости в процедуре ПередЗаписью добавить значение реквизита в Дополнительные свойства

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

3. В процедуру РаспределитьЗатратыИзНезавершенногоПроизводстваНаВыпускПродукции общего модуля ПроцедурыРасчетаСебестоимостиВыпуска  в начало добавить

Если (НЕ СтруктураШапкиДокумента.Свойство("ОптимизироватьРасчет"))
	ИЛИ (СтруктураШапкиДокумента.Свойство("ОптимизироватьРасчет") И СтруктураШапкиДокумента.ОптимизироватьРасчет) Тогда
	
	РаспределитьЗатратыИзНезавершенногоПроизводстваНаВыпускПродукции_ОптимизированныйРасчет(
		СтруктураШапкиДокумента,
		РезультатЗапросаПоНезавершенномуПроизводству,
		РезультатЗапросаПоЗатратамНаВыпуск,
		НомерПередела,
		РасчетКосвенныхЗатрат,
		РасчетЗатратВстречногоВыпуска,
		НаборЗаписейНезавершенноеПроизводство,
		НаборЗаписейЗатратыНаВыпуск,
		РегистрБухгалтерииНаборЗаписей
		);
	Возврат;
	
КонецЕсли;

4. В общий модуль ПроцедурыРасчетаСебестоимостиВыпуска добавить две процедуры:

  • РаспределитьЗатратыИзНезавершенногоПроизводстваНаВыпускПродукции_ОптимизированныйРасчет()
  • СравнитьЗначенияСтруктурыИСтрокиТЗ()

Код:

 

 

// Процедура распределения затрат из незавершенного производства за выпуск продукции.
//
// Параметры
//  СтруктураШапкиДокумента – Структура – Реквизиты документа "Расчет себестоимости"
//	РезультатЗапросаПоНезавершенномуПроизводству - РезультатЗапроса - Результат выполнения запроса по незавершенному производству
//  РезультатЗапросаПоЗатратамНаВыпуск - РезультатЗапроса - Результат запроса по затратам на выпуск
//	НомерПередела - Число - Текущий номер передела, для которого производится расчет себестоимости
//	РасчетКосвенныхЗатрат - Булево - Признак выполнения действия "Распределение косвенных расходов"
//	РасчетЗатратВстречногоВыпуска - Булево - Признак выполнения действия "Распределение затрат встречного выпуска" 
//	НаборЗаписейНезавершенноеПроизводство - РегистрНакопленияНаборЗаписей - Набор записей регистра накопления "Незавершенное производство"
//	НаборЗаписейЗатратыНаВыпуск - РегистрНакопленияНаборЗаписей - Набор записей регистра накопления "Затраты на выпуск продукции"
//  РегистрБухгалтерииНаборЗаписей - РегистрБухгалтерииНаборЗаписей - Набор записей регистра бухгалтерии.
//
Процедура РаспределитьЗатратыИзНезавершенногоПроизводстваНаВыпускПродукции(
	СтруктураШапкиДокумента,
	РезультатЗапросаПоНезавершенномуПроизводству,
	РезультатЗапросаПоЗатратамНаВыпуск,
	НомерПередела,
	РасчетКосвенныхЗатрат,
	РасчетЗатратВстречногоВыпуска,
	НаборЗаписейНезавершенноеПроизводство,
	НаборЗаписейЗатратыНаВыпуск,
	РегистрБухгалтерииНаборЗаписей
	)
	
	// +Dmitry Fokin <dkoder.dvl@gmail.com> 2020-02-04
	
	Если (НЕ СтруктураШапкиДокумента.Свойство("ОптимизироватьРасчет"))
		ИЛИ (СтруктураШапкиДокумента.Свойство("ОптимизироватьРасчет") И СтруктураШапкиДокумента.ОптимизироватьРасчет) Тогда
		
		РаспределитьЗатратыИзНезавершенногоПроизводстваНаВыпускПродукции_ОптимизированныйРасчет(
			СтруктураШапкиДокумента,
			РезультатЗапросаПоНезавершенномуПроизводству,
			РезультатЗапросаПоЗатратамНаВыпуск,
			НомерПередела,
			РасчетКосвенныхЗатрат,
			РасчетЗатратВстречногоВыпуска,
			НаборЗаписейНезавершенноеПроизводство,
			НаборЗаписейЗатратыНаВыпуск,
			РегистрБухгалтерииНаборЗаписей
			);
		Возврат;
		
	КонецЕсли;
	
	// -Dmitry Fokin <dkoder.dvl@gmail.com> 2020-02-04
	
	КодыОперацийФиксСтоимость = Новый Соответствие;
	КодыОперацийФиксСтоимость.Вставить(Перечисления.КодыОперацийЗатратыНаВыпускПродукции.ВозвратМатериаловИзПроизводстваФикс, Истина);
	КодыОперацийФиксСтоимость.Вставить(Перечисления.КодыОперацийЗатратыНаВыпускПродукции.СписаниеНЗПФикс, Истина);
	КодыОперацийФиксСтоимость.Вставить(Перечисления.КодыОперацийЗатратыНаВыпускПродукции.КорректировкаНЗПФикс, Истина);
	
	ПостроительЗапроса = ПолучитьПостроительЗапросаПоЗатратамНаВыпуск(
		СтруктураШапкиДокумента,
		РезультатЗапросаПоЗатратамНаВыпуск
		);
	
	ВыборкаПоЗатратам = РезультатЗапросаПоНезавершенномуПроизводству.Выбрать();
	Пока ВыборкаПоЗатратам.Следующий() Цикл
		
		КоличествоЗатратНаВыпуск = ВыборкаПоЗатратам.Количество;
		
		СуммаЗатратНаВыпуск = ВыборкаПоЗатратам.Стоимость;
		Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
			СуммаЗатратНаВыпуск = СуммаЗатратНаВыпуск 
				+ ВыборкаПоЗатратам.ПостояннаяРазница
				+ ВыборкаПоЗатратам.ВременнаяРазница;
		КонецЕсли;
		
		КоличествоНЗП = ВыборкаПоЗатратам.КоличествоОстаток;
		
		СуммаНЗП = ВыборкаПоЗатратам.СтоимостьОстаток;
		Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
			ПостояннаяРазницаНЗП = ВыборкаПоЗатратам.ПостояннаяРазницаОстаток;
			ВременнаяРазницаНЗП = ВыборкаПоЗатратам.ВременнаяРазницаОстаток;
		Иначе
			ПостояннаяРазницаНЗП = 0;
			ВременнаяРазницаНЗП = 0;
		КонецЕсли;
		
		ОбщаяСуммаНЗП = СуммаНЗП + ПостояннаяРазницаНЗП + ВременнаяРазницаНЗП;
		
		// Отберем строки затрат на выпуск.
		УстановленНовыйОтбор = ПроверитьИУстановитьОтборПостроителяЗапросаПоЗатратамНаВыпуск(
			СтруктураШапкиДокумента,
			ВыборкаПоЗатратам,
			ПостроительЗапроса
			);

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

// +Dmitry Fokin <dkoder.dvl@gmail.com> 2020-02-04

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

// -Dmitry Fokin <dkoder.dvl@gmail.com> 2020-02-04

 

 

Код можно посмотреть https://github.com/dmitryfokin/upp-raschet-sebestoimosti

упп расчет себестоимости выпуска оптимизация ускорение

См. также

Переработка давальческого сырья в 1С:КА

Производство готовой продукции (работ, услуг) Бухгалтерский учет 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Платные (руб)

Учет у переработчика теперь и в КА (полные возможности в ERP). Без внесения изменений в конфигурацию.

16800 руб.

22.02.2019    61704    228    85    

168

Обмен с системой Меркурий через Web + Ветис.API для любых конфигураций (универсальная конфигурация Хамелеон Меркурий)

Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Конфигурации 1cv8 Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий(тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

104000 руб.

08.11.2017    121266    295    140    

394

АРМ Начальника производства и АРМ Рабочего цеха для 1С:УНФ. Цифровое производство малого и среднего бизнеса

Рабочее место Производство готовой продукции (работ, услуг) Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Управленческий учет Платные (руб)

Расширение для 1С:УНФ с комплектом из двух АРМ: «АРМ для начальника производства» и «АРМ для рабочего цеха». «АРМ Начальника производства» позволяет анализировать общую картину состояния заказов покупателей и наличие конечных комплектующих и сырья для производства заказанной продукции. Есть возможность направлять заказы в производственную работу (в случае, если заказанную продукцию нужно произвести), резервировать и отгружать готовую продукцию. «АРМ рабочего цеха» позволяет обычным работникам оперативно закрывать производственные задания (оформлять документы выпуска) сразу в программе 1С.

14400 руб.

15.09.2017    49396    82    41    

88

SALE! 50%

Отчет "Полный анализ себестоимости выпущенной продукции" для 1С:ERP (ЕРП), 1С:КА, 1С:ERP УХ

Производство готовой продукции (работ, услуг) Учет доходов и расходов Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Бухгалтерский учет Управленческий учет Платные (руб)

Данный отчет показывает себестоимость выпущенной продукции с разузлованием полуфабрикатов любых уровней, входящих в ее состав, до статей затрат и материалов. Отчет работает независимо от метода оценки стоимости товаров и подходит для любых производственных компаний с многопередельным производством. Отчет можно использовать как в типовой 1С:ERP, так и в отраслевых решениях на ее базе (например, 1С:ERP Управление птицеводческим предприятием и т.д.). Отчет подходит для анализа затрат на гособоронзаказы ГОЗ.

70000 35000 руб.

08.12.2021    24163    18    72    

28

SALE! 50%

Отчет "Полный анализ себестоимости реализованной продукции" для 1С:ERP (ЕРП), 1С:КА, 1С:ERP УХ

Производство готовой продукции (работ, услуг) Учет доходов и расходов Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Бухгалтерский учет Налоговый учет Платные (руб)

Данный отчет показывает себестоимость реализованной продукции в разузлованном виде, как с выделением входящих в нее полуфабрикатов любых уровней, так и свернутый до статей затрат и материалов, видов работ. Отчет работает независимо от метода оценки стоимости товаров и подходит для любых производственных компаний с многопередельным производством. Отчет можно использовать как в типовой 1С:ERP, так и в отраслевых решениях на ее базе (например, 1С:ERP Управление птицеводческим предприятием, Молокозавод и т.д.).Отчет подходит для анализа затрат на гособоронзаказы ГОЗ.

70000 35000 руб.

30.11.2022    11691    13    22    

17

АСТ: Обмен с ФГИС Меркурий из 1С

Оптовая торговля Производство готовой продукции (работ, услуг) Обмен с ГосИС Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Оптовая торговля, дистрибуция, логистика Пищевая промышленность Россия Бухгалтерский учет Платные (руб)

Автоматический обмен данными с системой ФГИС Меркурий из 1С через ВетИС API: загрузка данных по хозяйствующим субъектам, предприятиям; типов, групп, видов, наименований продукции, сопоставление данных и запись их в базу данных; создание на основании расходных документов транспортных партий, отправка на сервер, печать полученных ветеринарных свидетельств, запрос остатков складского журнала, проведение инвентаризаций, оформление производственных партий.

10000 руб.

08.12.2017    101836    234    110    

144
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user644579_pavel.vishnev 28.04.22 11:21 Сейчас в теме
Я так и не понял, если галочка стоит НеОптимизироватьРасчет счтается по прежней схеме?
2. dkoder 5 02.05.22 07:38 Сейчас в теме
(1) Да. Было сделано для сверки оптимизированного и типового расчетов.
Тут путаница из-за того, что перед записью формы НеОптимизироватьРасчет переварачивается в ОптимизироватьРасчет.
Оставьте свое сообщение