При проведении операции разукомплектации в документе Комплектация номенклатуры себестоимость исходного товара или сырья распределяется между получаемыми комплектующими согласно указанным долям. Частая практическая задача — автоматически заполнить колонку Доля на основе фиксированных цен или фиксированной стоимости побочной продукции, чтобы не рассчитывать коэффициенты вручную.
Рассмотрим, почему использование итераций и рекурсивных подборов здесь не требуется, как правильно реализовать прямой расчет долей и какие штатные учетные механизмы платформы 1С лучше использовать для подобных производственных задач.
Идея использовать рекурсивный подбор или итерационные циклы для распределения долей является избыточной. Расчет пропорций — это простая математическая задача, решаемая за один или два обхода табличной части.
Проанализируем математическую модель расчета:
СтоимостьСтроки = Цена * Количество.ОбщаяСтоимость = Сумма(СтоимостьСтроки).Разберем вариант реализации кнопки или внешней обработки для заполнения табличной части документа Комплектация номенклатуры.
Для предотвращения обнуления долей у позиций с низкой стоимостью важно учитывать разрядность реквизита Доля. Если реквизит имеет тип Число(10, 0), доли должны выражаться в целых числах (например, в пропорциях или масштабироваться на множитель 1000 или 10 000).
Посмотрим на пример логики расчета с отношением фиксированной стоимости отходов и расчетных долей:
// 1. Получаем прайсовые цены для номенклатуры из табличной части
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.Номенклатура КАК Номенклатура,
| ТЧ.Количество КАК Количество,
| ЕСТЬNULL(Цены.Цена, 0) КАК Цена
|ИЗ
| &ТаблицаКомплектующие КАК ТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаDoc, ТипЦен = &ТипЦен) КАК Цены
| ПО ТЧ.Номенклатура = Цены.Номенклатура";
// 2. Расчет расчетной стоимости и формирование долей
ОбщаяРасчетнаяСумма = 0;
Для Каждого Стр Из ТаблицаДокумента Цикл
Стр.РасчетнаяСтоимость = Стр.Цена * Стр.Количество;
ОбщаяРасчетнаяСумма = ОбщаяРасчетнаяСумма + Стр.РасчетнаяСтоимость;
КонецЦикла;
// 3. Заполнение реквизита Доля в табличной части
СуммаРаспределенныхДолей = 0;
ВсегоСтрок = ТаблицаДокумента.Количество();
Для Индекс = 0 По ВсегоСтрок - 2 Цикл
Стр = ТаблицаДокумента[Индекс];
Если ОбщаяРасчетнаяСумма > 0 Тогда
// Масштабируем долю, чтобы избежать потери точности
Стр.Доля = Цел((Стр.РасчетнаяСтоимость / ОбщаяРасчетнаяСумма) * 10000);
Иначе
Стр.Доля = 1;
КонецЕсли;
СуммаРаспределенныхДолей = СуммаРаспределенныхДолей + Стр.Доля;
КонецЦикла;
// Корректировку округления относим на последнюю или первую позицию
Если ВсегоСтрок > 0 Тогда
ТаблицаДокумента[ВсегоСтрок - 1].Доля = 10000 - СуммаРаспределенныхДолей;
КонецЕсли;
Выясним причину, почему документ Комплектация номенклатуры не всегда подходит для задач переработки (например, при очистке зерна и получении зерноотходов):
Корректировка стоимости номенклатуры пересчитает себестоимость исходного сырья по итогам месяца, фактическая себестоимость списания отходов также изменится пропорционально, и она не останется жестко фиксированной.Отчет производства за смену.Отчет производства за смену на закладке Возвратные отходы побочная продукция (зерноотходы) приходуется по фиксированной (плановой) цене. Эта сумма напрямую уменьшает затраты на выпуск, а весь остаток себестоимости относится на основной продукт (очищенное зерно).Если требуется сохранить текущую схему учета без изменения конфигурации:
Комплектация номенклатуры.ЦеныНоменклатуры для автоматической подтяжки цен.Доля и всегда компенсируйте погрешности округления на строке с основным продуктом.