Проблема для меня в том что, Есть некие машины которые За один период заправлялись и маслом и соляркой,в итоге при формирование показывает по солярке все машины правильно,а по маслу выводит,и еще дублирует тех самых что и по солярке. Например всего 15 соляркой,а 4 маслом в итоге по солярке 15, а по маслу 19.
перем Таб,Расшифровка;
Перем МВО;
Процедура Сформировать()
Перем Запрос, ТекстЗапроса;
ТЗСПР = СоздатьОбъект("ТаблицаЗначений");
ТЗСПР.НоваяКолонка("МаркаМашини");
ТЗСПР.НоваяКолонка("ИмяНАвигатора");
//Создание объекта типа Запрос
Заносим в тз машины с навигатором
Спр = СоздатьОбъект("Справочник.ТранспортніЗасоби");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если Спр.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Если СокрЛП(Спр.ПоНавігатору)="" Тогда
Продолжить;
КонецЕсли;
ТЗСПР.НоваяСтрока();
ТЗСПР.МаркаМашини=СокрЛП(Спр.Склад);
ТЗСПР.ИмяНавигатора=СокрЛП(Спр.ПоНавігатору);
КонецЦикла;
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("СкладРод");
ТЗ.НоваяКолонка("Склад");
ТЗ.НоваяКолонка("МВО");
ТЗ.НоваяКолонка("НачОст");
ТЗ.НоваяКолонка("Приход");
ТЗ.НоваяКолонка("Расход","Число");
ТЗ.НоваяКолонка("КонОст");
ТЗ.НоваяКолонка("Бак");
ТЗ.НоваяКолонка("Превышение");
ТЗ.НоваяКолонка("Лимит");
ТЗ.НоваяКолонка("ПревышенЛимит");
ТЗ.НоваяКолонка("Автомобіль");
ТЗ.НоваяКолонка("Паливо");
ТЗ.НоваяКолонка("Відстань","Число");
ТЗ.НоваяКолонка("Навигатор","Число");
ТЗ.НоваяКолонка("НавигаторЛ","Число");
ТЗ.НоваяКолонка("РасходТоплива","Число");
ТЗ.НоваяКолонка("РасходТопливаФ","Число");
ТЗ4=СоздатьОбъект("ТаблицаЗначений");
ТЗ4.НоваяКолонка("СкладРод");
ТЗ4.НоваяКолонка("Склад");
ТЗ4.НоваяКолонка("МВО");
ТЗ4.НоваяКолонка("НачОст");
ТЗ4.НоваяКолонка("Приход");
ТЗ4.НоваяКолонка("Расход","Число");
ТЗ4.НоваяКолонка("КонОст");
ТЗ4.НоваяКолонка("Бак");
ТЗ4.НоваяКолонка("Превышение");
ТЗ4.НоваяКолонка("Лимит");
ТЗ4.НоваяКолонка("ПревышенЛимит");
ТЗ4.НоваяКолонка("Автомобіль");
ТЗ4.НоваяКолонка("Паливо");
ТЗ4.НоваяКолонка("Відстань","Число");
ТЗ4.НоваяКолонка("Навигатор","Число");
ТЗ4.НоваяКолонка("НавигаторЛ","Число");
ТЗ4.НоваяКолонка("РасходТоплива","Число");
ТЗ4.НоваяКолонка("РасходТопливаФ","Число");
ТЗ2 = СоздатьОбъект("ТаблицаЗначений");
ТЗ2.НоваяКолонка("Автомобіль");
ТЗ2.НоваяКолонка("Паливо");
ТЗ2.НоваяКолонка("Відстань","Число");
ТЗ2.НоваяКолонка("Навигатор","Число");
ТЗ2.НоваяКолонка("НавигаторЛ","Число");
ТЗ2.НоваяКолонка("РасходТоплива","Число");
ТЗ2.НоваяКолонка("РасходТопливаФ","Число");
Заправка=СоздатьОбъект("Справочник.Заправка");
Списочег=СоздатьОбъект("СписокЗначений");
Списочег.Удалитьвсе();
Заправка. ВыбратьЭлементы();
Пока Заправка.ПолучитьЭлемент()=1 цикл
Списочег.ДобавитьЗначение(Заправка.ТМЦ);
КонецЦикла;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|ЗапасиК = Регистр.ЗапасиК.Рахунок;
|Склад = Регистр.ЗапасиК.Склад;
|ТМЦ = Регистр.ЗапасиК.ТМЦ;
|Кількість = Регистр.ЗапасиК.Кількість;
|ТекущийДокумент = Регистр.ЗапасиК.ТекущийДокумент;
|ПОб = Регистр.ЗапасиК.ПОб;
|Рахунок = Регистр.ЗапасиК.Рахунок;
|Функция КількістьНачОст = НачОст(Кількість);
|Функция КількістьПриход = Приход(Кількість);
|Функция КількістьРасход = Расход(Кількість);
|Функция КількістьКонОст = КонОст(Кількість);
|Группировка ТМЦ без групп;
|Группировка Склад без групп;
|Условие(ПОб = глФінОблік);
|Условие(ТМЦ в Списочег);
|"//}}ЗАПРОС
;
Если ЦС=1 тогда
У="Условие(СокрЛП(Склад)=""Склад ПММ"");";
иначе
У="";
конецесли;
ТекстЗапроса=ТекстЗапроса+У;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Расшифровка.Установить("НачДата",ВыбНачПериода);
Расшифровка.Установить("КонДата",ВыбКонПериода);
Таб = СоздатьОбъект("Таблица");
// Подготовка к заполнению выходных форм данными запроса
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
// Заполнение полей Склад
//если (Запрос.КількістьНачОст<>0)или(Запрос.КількістьПриход<>0)или(Запрос.КількістьРасход<>0)или(Запрос.КількістьКонОст<>0) тогда
Расшифровка.Установить("ТМЦ",Запрос.ТМЦ);
Расшифровка.Установить("Склад",ПолучитьПустоеЗначение());
Расшифровка.Установить("Рахунок",Запрос.Рахунок);
Таб.ВывестиСекцию("ТМЦ_");
запросиг(Запрос.ТМЦ);
// таб.ВывестиСекцию("СкладГлавн");
ТЗ.УдалитьСтроки();
если ЦС=0 тогда
Пока Запрос.Группировка(2) = 1 Цикл
МВО="";
превышение=0;
если СокрЛП(Запрос.ЗначениеУпорядочивания(2))="Склад ПММ" тогда
продолжить;
иначе
ТЗ.НоваяСтрока();
ТЗ.СкладРод=Запрос.Склад.Родитель;
ТЗ.Склад=СокрЛП(Запрос.Склад);
ТЗ.МВО=Запрос.Склад.МВО;
ТЗ.НачОст=Запрос.КількістьНачОст;
ТЗ.Приход=Запрос.КількістьПриход;
ТЗ.Расход=Запрос.КількістьРасход;
ТЗ.Паливо=Запрос.ТМЦ;
ТЗ.КонОст=Запрос.КількістьКонОст;
ТЗ.Бак=Запрос.Склад.МісткістьБака;
ТЗ.Превышение=?((Запрос.КількістьКонОст-
Запрос.Склад.МісткістьБака>0)и(Запрос.Склад.МісткістьБака<>0),Запрос.КількістьКонОст-Запрос.Склад.МісткістьБака,0);
лимит=0;
датаЛ=НачМесяца(ВыбНачПериода);
Пока датаЛ<ВыбКонПериода цикл
лимит=лимит+Запрос.Склад.ЛімітНаМісяць.Получить(ДатаЛ);
датаЛ=ДобавитьМесяц(ДатаЛ,1);
КонецЦикла;
ТЗ.Лимит=лимит;
ТЗ.ПревышенЛимит=?((Запрос.КількістьРасход-лимит>0)и(лимит>0),Запрос.КількістьРасход-лимит,0);
КонецЕсли;
КонецЦикла;
Запрос2 = СоздатьОбъект("Запрос");
ТекстЗапроса2 =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|ОбрабатыватьДокументы Проведенные;
|Автомобіль = Документ.ШляховийЛист.Склад;
|ПММ1 = Документ.ШляховийЛист.ПММ1;
|КмФ = Документ.ШляховийЛист.КмФ;
|ЛФ = Документ.ШляховийЛист.ЛФ;
|Л = Документ.ШляховийЛист.Л;
|НавигаторС = Документ.ШляховийЛист.НавигаторС;
|НавигаторЛ = Документ.ШляховийЛист.НавигаторЗаправка;
|Функция ЗКмФ = Сумма(КмФ);
|Функция ЗЛФ = Сумма(ЛФ);
|Функция ЗЛ = Сумма(Л);
|Функция ЗНавигаторС = Сумма(НавигаторС);
|Функция ЗНавигаторЛ = Сумма(НавигаторЛ);
|Группировка ПММ1;
|Группировка Автомобіль без групп;
|"//}}ЗАПРОС
;
Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда
Возврат;
КонецЕсли;
Пока Запрос2.Группировка(1) = 1 Цикл
Пока Запрос2.Группировка(2) = 1 Цикл
ТЗ2.НоваяСтрока();
ТЗ2.Відстань=СокрЛП(Запрос2.ЗКмФ);
ТЗ2.РасходТоплива=СокрЛП(Запрос2.ЗЛФ);
ТЗ2.РасходТопливаФ=СокрЛП(Запрос2.ЗЛ);
ТЗ2.Навигатор=СокрЛП(Запрос2.НавигаторС);
ТЗ2.НавигаторЛ=СокрЛП(Запрос2.ЗНавигаторЛ);
ТЗ2.Автомобіль=СокрЛП(Запрос2.Автомобіль);
ТЗ2.Паливо=СокрЛП(Запрос2.ПММ1);
КонецЦикла;
КонецЦикла;
//ищу по документу и регистру марку машину если нахожу тогда присваеваю з документа значение по навигатору
ТЗ.ВыбратьСтроки();
ТЗ2.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Если ТЗ.Склад="" Тогда
Продолжить;
КонецЕсли;
к="";
Если ТЗ2.НайтиЗначение(ТЗ.Склад,к,"Автомобіль") = 1 Тогда
ТЗ2.ПолучитьСтрокуПоНомеру(к);
ТЗ2.ПолучитьЗначение(к,"Автомобіль");
ТЗ.Відстань=ТЗ2.Відстань;
ТЗ.РасходТоплива=ТЗ2.РасходТоплива;
ТЗ.Навигатор=ТЗ2.Навигатор;
ТЗ.НавигаторЛ=ТЗ2.НавигаторЛ;
ТЗ.РасходТопливаФ=ТЗ2.РасходТопливаФ;
ТЗ.Паливо=ТЗ2.Паливо;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
//Вывожу машины только с навигатором
ТЗСПР.ВыбратьСтроки();
ТЗ.ВыбратьСтроки();
Пока ТЗСПР.ПолучитьСтроку()=1 Цикл
с="";
Если ТЗ.НайтиЗначение(ТЗСПР.МаркаМашини,с,) =1 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(с);
ТЗ.ПолучитьЗначение(с,"Автомобіль");
ТЗ4.НоваяСтрока();
ТЗ4.СкладРод = ТЗ.СкладРод;
ТЗ4.Склад = ТЗ.Склад;
ТЗ4.МВО = ТЗ.МВО;
ТЗ4.НачОст = ТЗ.НачОст;
ТЗ4.Приход = ТЗ.Приход;
ТЗ4.Расход = ТЗ.Расход;
ТЗ4.КонОст = ТЗ.КонОст;
ТЗ4.Бак = ТЗ.Бак;
ТЗ4.Превышение = ТЗ.Превышение;
ТЗ4.Лимит = ТЗ.Лимит;
ТЗ4.ПревышенЛимит = ТЗ.ПревышенЛимит;
ТЗ4.Відстань = ТЗ.Відстань;
ТЗ4.Навигатор = ТЗ.Навигатор;
ТЗ4.НавигаторЛ = ТЗ.НавигаторЛ;
ТЗ4.РасходТоплива = ТЗ.РасходТоплива;
ТЗ4.РасходТопливаФ = ТЗ.РасходТопливаФ;
ТЗ4.Паливо=ТЗ.Паливо;
Сообщить(ТЗ4.Склад);
КонецЕсли;
КонецЦикла;
/////////////////////////////////////////////////////////////////////
ТЗ4.Сортировать("СкладРод,Склад,МВО,НачОст");
ТЗ1=СоздатьОбъект("ТаблицаЗначений");
ТЗ1.УдалитьСтроки();
ТЗ4.Выгрузить(ТЗ1);
ТЗ1.Свернуть("СкладРод","НачОст,Приход,Расход,КонОст,Превышение,Лимит,ПревышенЛимит,Відстань,Навигато
р");
ТЗ1.Сортировать("СкладРод");
ТЗ1.ВыбратьСтроки();
Пока ТЗ1.ПолучитьСтроку()=1 цикл
Таб.ВывестиСекцию("Склад_Группа");
ТЗ4.ВыбратьСтроки();
Пока ТЗ4.ПолучитьСтроку()=1 цикл
Если ТЗ4.СкладРод=ТЗ1.СкладРод тогда
Таб.ВывестиСекцию("Склад_");
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Таб.ВывестиСекцию("Итого");
// Вывод заполненной формы
Таб.Опции(0, 0, 6, 0);
Таб.ПараметрыСтраницы(1,,,15,10,10,10,,,1,1,);
Таб.ТолькоПросмотр(1);
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры