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