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

09.07.20

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

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

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

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Провел небольшую оптимизацию в расчете себестоимости. Конфигурация УПП версия 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

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

SALE! 50%

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

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

96600 48300 руб.

30.11.2022    33166    391    35    

50

SALE! 50%

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

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

96600 48300 руб.

08.12.2021    35388    534    77    

61

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

Разработка “Пульт управления производством для 1С:УНФ 3.0” содержит цифровые инструменты и средства для производственного и технологического программного обеспечения автоматизации производства - подсистему Технологического контроля с АРМ Контролёра, Учет рекламации, АРМ Начальника производства, АРМ Рабочего цеха

36000 руб.

22.02.2022    27224    34    4    

46

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

Продукт "Интеграция с 1С:Документооборот" позволяет использовать функции программы "1С:Документооборот 8" напрямую из учетной системы (1С:УПП; 1С:КА, 1С:УТ 10.3, 1С:БГУ 1.0, 1С:ЗБУ 1.0, 1С:УПП для Казахстана и отраслевых решений, разработанных на их основе) на платформе "1С:Предприятие 8": выполнять и ставить задачи, просматривать документы, скан-копии и прочие файлы, штрих-кодировать документы отправлять письма, вести учет рабочего времени - не входя в "1С:Документооборот 8", работая в одной программе, что значительно сокращает время и делает работу более комфортной и эффективной. Продукт прошел сертификацию 1С-Совместимо

135530 руб.

11.06.2015    62361    38    20    

49

Зарплата Производство готовой продукции (работ, услуг) Учет рабочего времени Рабочее место Бизнес-аналитик Пользователь Руководитель проекта 1С:Предприятие 8 1С:Управление торговлей 10 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Торговля и склад 7.7 Бытовые услуги, сервис Оптовая торговля, дистрибуция, логистика Электротехника и микроэлектроника Управленческий учет Платные (руб)

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

18800 руб.

01.11.2012    105934    131    1    

140

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

Расширение для 1С, которое реализует ключевые функции MES-системы прямо в вашей конфигурации. Вы получите инструменты для планирования производства, управления ресурсами, формирования заданий цехам и анализа выпуска продукции. Интеграция с 1С обеспечит сквозной учет без дублирования данных. Решение позволяет контролировать простои оборудования, потребность в материалах и качество продукции, помогая повысить эффективность производства без перехода на сложные специализированные системы.

60000 руб.

25.06.2025    5748    5    0    

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