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