внешний отчёт по списанию с ценой и суммой ТИС 9.2

Новая тема
"Помогите пожалуйста с внешним отчётом,
это выгрузка актов списаний в ексель из 1с, дело в том что не выводится цена и сумма.

// Предопределенная процедура
Процедура ПриОткрытии(ФлагВосстановленияНастройки)
Если ФлагВосстановленияНастройки = 0 Тогда
ВидРазделителя = 1;
ВидЕдиницы = 1;
ПоГруппам = 1;
ДатаНачала = глЗначениеПоУмолчанию("ОсновнаяДатаНачалаОтчетов");
Если ПустоеЗначение(ДатаНачала) = 1 Тогда
ДатаНачала = НачМесяца(ДатаКонца);
КонецЕсли;
КонецЕсли;
Если глФлагРасшифровки = 1 Тогда
Обновить = глОбновить;
// восстанавливаем настройки из списка
ДатаНачала = глРасшифровка.Получить("ДатаНачала");
ДатаКонца = глРасшифровка.Получить("ДатаКонца");
ВыбКонтр = глРасшифровка.Получить("ВыбКонтр");
Если Обновить <> 0 Тогда
Таб = глТаблица;
КонецЕсли;
Иначе
Обновить = 0;
КонецЕсли;
КонецПроцедуры // ПриОткрытии()
Процедура Сформировать()
Док=СоздатьОбъект("Документ");
Док.УстановитьФильтр(1,0,0,2,1,1);
Если ВыбФирма.Выбран()=1 Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,"Фирма",ВыбФирма);
ИначеЕсли ВыбСклад.Выбран()=1 Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,"Склад",ВыбСклад);
ИначеЕсли ВыбПроект.Выбран()=1 Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,"Проект",ВыбПроект);
Иначе
Док.ВыбратьДокументы(ДатаНачала,ДатаКонца);
КонецЕсли;
Загол="""";
Если ВыбФирма.Выбран()=1 Тогда
Загол=Загол + "По фирме "+ВыбФирма.Наименование+". ";
КонецЕсли;
Если ВыбСклад.Выбран()=1 Тогда
Загол=Загол + "По складу "+ВыбСклад.Наименование+". ";
КонецЕсли;
Если ВыбПроект.Выбран()=1 Тогда
Загол=Загол + "По трактору "+ВыбСклад.Наименование+". ";
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ВывестиСекцию("Шапка");
Счетчик=1;
ИтогСумма=0;
Пока Док.ПолучитьДокумент()=1 Цикл
Если Док.Вид()<>"СписаниеТМЦ" Тогда
Продолжить;
КонецЕсли;
РегПартии=СоздатьОбъект("Регистр.ПартииНаличие");
Если (ВыбФирма.Выбран()=1) и (Док.Фирма<>ВыбФирма.ТекущийЭлемент()) Тогда
Продолжить;
ИначеЕсли (ВыбСклад.Выбран()=1) и (Док.Склад<>ВыбСклад.ТекущийЭлемент()) Тогда
Продолжить;
ИначеЕсли (ВыбПроект.Выбран()=1) и (Док.Проект<>ВыбПроект.ТекущийЭлемент()) Тогда
Продолжить;
ИначеЕсли (ДокТрактор=1) и (ПустоеЗначение(Док.Проект)=1) Тогда
Продолжить;
КонецЕсли;
Таб.ВывестиСекцию("Строка");
Если Док.Вид()="СписаниеТМЦ" Тогда
Если Док.Проведен()=1 Тогда
ИтогСумма=0;
РегПартии.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());
Пока РегПартии.ПолучитьДвижение()=1 Цикл
Если РегПартии.КодОперации=глКО.Списание Тогда
ИтогСумма=ИтогСумма+РегПартии.СуммаРуб;
КонецЕсли;
КонецЦикла;
Иначе
ИтогСумма=0;
КонецЕсли;
Иначе
ИтогСумма = глСуммаДокументаВЖурнале(Док.ТекущийДокумент(), "число");
КонецЕсли;
КонецЦикла;
Таб.ВывестиСекцию("Итого");
Состояние("Отчет сформирован. Печать...");
Таб.Опции(0, 0, 3, 0, "Реестр документов");
Таб.ТолькоПросмотр(1);
Таб.Показать("Реестр документов","""");
КонецПроцедуры
Процедура ПечатьСписания()
Док=СоздатьОбъект("Документ");
Док.УстановитьФильтр(1,0,0,2,1,1);
Если ВыбФирма.Выбран()=1 Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,"Фирма",ВыбФирма);
ИначеЕсли ВыбСклад.Выбран()=1 Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,"Склад",ВыбСклад);
ИначеЕсли ВыбПроект.Выбран()=1 Тогда
Док.ВыбратьПоЗначению(ДатаНачала,ДатаКонца,"Проект",ВыбПроект);
Иначе
Док.ВыбратьДокументы(ДатаНачала,ДатаКонца);
КонецЕсли;
Загол="""";
Если ВыбФирма.Выбран()=1 Тогда
Загол=Загол + "По фирме "+ВыбФирма.Наименование+". ";
КонецЕсли;
Если ВыбСклад.Выбран()=1 Тогда
Загол=Загол + "По складу "+ВыбСклад.Наименование+". ";
КонецЕсли;
Если ВыбПроект.Выбран()=1 Тогда
Загол=Загол + "По трактору "+ВыбСклад.Наименование+". ";
КонецЕсли;
Проект=СоздатьОбъект("ТаблицаЗначений");
Проект.НоваяКолонка("Док", "Документ.СписаниеТМЦ");
Проект.НоваяКолонка("Трактор", "Строка");
Пока Док.ПолучитьДокумент()=1 Цикл
Если Док.Вид()<>"СписаниеТМЦ" Тогда
Продолжить;
КонецЕсли;
Если (ВыбФирма.Выбран()=1) и (Док.Фирма<>ВыбФирма.ТекущийЭлемент()) Тогда
Продолжить;
ИначеЕсли (ВыбСклад.Выбран()=1) и (Док.Склад<>ВыбСклад.ТекущийЭлемент()) Тогда
Продолжить;
ИначеЕсли (ВыбПроект.Выбран()=1) и (Док.Проект<>ВыбПроект.ТекущийЭлемент()) Тогда
Продолжить;
ИначеЕсли (ДокТрактор=1) и (ПустоеЗначение(Док.Проект)=1) Тогда
Продолжить;
КонецЕсли;
Проект.НоваяСтрока();
Проект.Док=Док.ТекущийДокумент();
Проект.Трактор=Док.Проект.Наименование;
КонецЦикла;
Проект.Сортировать("Трактор, Док");
Счетчик=1;
ПечСумма=0;
Если ВЭксель=1 Тогда
ВыбФ=""""; ВыбКат="""";
Зн=ФС.ВыбратьФайл(1,ВыбФ,ВыбКат,"Сохранить файл как...","Файлы Excel|*.xls","xls",10);
Если ВыбФ="""" Тогда СтатусВозврата(0); Возврат; КонецЕсли;
_Ч=0;_м=0;_с=0;_сч1=0;
ТекущееВремя(_ч,_м,_с);
маскаФайл="~"+ДатаГод(ТекущаяДата())+ДатаМесяц(ТекущаяДата())+ДатаЧисло(ТекущаяДата())+_
маска=КаталогВременныхФайлов()+маскафайл;
ИмяФФ = ВыбКат + ВыбФ;
Файлы=СоздатьОбъект("ТаблицаЗначений");
Файлы.НоваяКолонка("Файл", "Строка");
Файлы.НоваяКолонка("ИмяЛиста", "Строка");
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Списания");
Проект.ВыбратьСтроки();
КолвоВременныхФайлов=0;
СтарыйПроект=ПолучитьПустоеЗначение("Справочник.Проекты");
Пока Проект.ПолучитьСтроку()=1 Цикл
Док.НайтиДокумент(Проект.Док);
Если (СтарыйПроект<>Док.Проект) и (ВЭксель=1) Тогда
КолвоВременныхФайлов=КолвоВременныхФайлов+1;
Таб.Записать(Маска+КолвоВременныхФайлов+".xls",1);
Файлы.НоваяСтрока();
Файлы.Файл=Маска+КолвоВременныхФайлов+".xls";
Если ПустоеЗначение(СтарыйПроект)=1 Тогда
Файлы.ИмяЛиста="Без трактора";
Иначе
Файлы.ИмяЛиста=СокрЛП(СтарыйПроект.Наименование);
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Списания");
КонецЕсли;
// выводим табличную часть
НомСтроки = 0;
СуммаИтог=0;
Таб.ВывестиСекцию("Заголовок");
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
НомСтроки = НомСтроки + 1;
Таб.ВывестиСекцию("Строка");
СуммаИтог=СуммаИтог+Док.Сумма;
КонецЦикла;
Таб.ВывестиСекцию("Итого");
СтарыйПроект=Док.Проект;
Счетчик = Счетчик + 1;
КонецЦикла;
Если ВЭксель=1 Тогда
КолвоВременныхФайлов=КолвоВременныхФайлов+1;
Таб.Записать(Маска+КолвоВременныхФайлов+".xls",1);
Файлы.НоваяСтрока();
Файлы.Файл=Маска+КолвоВременныхФайлов+".xls";
Если ПустоеЗначение(СтарыйПроект)=1 Тогда
Файлы.ИмяЛиста="Без трактора";
Иначе
Файлы.ИмяЛиста=СокрЛП(СтарыйПроект.Наименование);
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Списания");
КонецЕсли;
//ChDir "C:\"
//Workbooks.Open Filename:="C:\q.xls"
//Workbooks.Open Filename:="C:\~2008922125281.xls"
//Cells.Select
//Selection.Copy
//Windows("Книга1").Activate
//ActiveSheet.Paste
Если ВЭксель=1 Тогда
Если КолвоВременныхФайлов=0 Тогда
Таб.Записать(Маска+"1.xls",1);
КонецЕсли;
Эксель=СоздатьОбъект("Excel.Application");
РабочаяКнига = Эксель.Workbooks.Add();
РабочаяКнига.Activate();
// Удалить все листы, оставить один
Колво = РабочаяКнига.WorkSheets.Count;
Для I = 1 По Колво-1 Цикл
//РабочаяКнига.WorkSheets(I).Select();
Эксель.Application.DisplayAlerts = 0;
РабочаяКнига.WorkSheets(I).Delete();
Эксель.Application.DisplayAlerts = 1;
КонецЦикла;
Файлы.ВыбратьСтроки();
Пока Файлы.ПолучитьСтроку()=1 Цикл
Если Файлы.НомерСтроки=Файлы.КоличествоСтрок() Тогда
Продолжить;
КонецЕсли;
РабочаяКнига.WorkSheets().Add();
КонецЦикла;
// Изменение названий ярлычкой листов рабочей книги
Файлы.ВыбратьСтроки();
Пока Файлы.ПолучитьСтроку()=1 Цикл
РабочаяКнига.WorkSheets(Файлы.НомерСтроки).Name = Файлы.ИмяЛиста;
КонецЦикла;
// Копируем содержимое листов книг в созданную книгу
Эксель.Application.DisplayAlerts = 0;
Файлы.ВыбратьСтроки();
Пока Файлы.ПолучитьСтроку()=1 Цикл
Сч=Файлы.НомерСтроки;
Книга2=Эксель.Workbooks.Open(маска+Сч+".xls");
Книга2.ActiveSheet.Select();
Эксель.Cells.Select();
Эксель.Selection.Copy();
РабочаяКнига.WorkSheets(Сч).Paste();
Книга2.Close();
КонецЦикла;
Эксель.Application.DisplayAlerts = 1;
Файлы.ВыбратьСтроки();
Пока Файлы.ПолучитьСтроку()=1 Цикл
Эксель.Sheets(Файлы.ИмяЛиста).Select();
Эксель.Range("A1").Select();
КонецЦикла;
// Спозиционируемся в рабочей книге на 1-й лист
Файлы.ПолучитьСтрокуПоНомеру(1);
Эксель.Sheets(Файлы.ИмяЛиста).Select();
Эксель.DisplayAlerts=0;
Эксель.ActiveWorkbook.SaveAs(ИмяФФ,-4143);
Эксель.DisplayAlerts=1;
Эксель.Visible=1;
Для й=1 по КолвоВременныхФайлов Цикл
Попытка
ФС.УдалитьФайл(Маска+й+".xls");
Исключение КонецПопытки;
КонецЦикла;
Эксель = 0;
Иначе
Состояние("Отчет сформирован. Печать...");
Таб.Опции(0, 0, 0, 0, "Списания");
Таб.ТолькоПросмотр(1);
Таб.Показать("Списания","""");
КонецЕсли;
КонецПроцедуры
ДатаНачала=РабочаяДата();
ДатаКонца=РабочаяДата();

"
"Макет бы увидеть, может там форматирование сумм для Excel-я непонятное и при Таб.Записать(Маска+КолвоВременныхФайлов+".xls",1); он их теряет."
я отправил вам обработку, форматирование для экселя здесь не при чём, он их и в обычную печатную форму не выводит. тут просто движения по регистрам и не получается цену вывести.
"Да, я получил.
Не совсем понял пару моментов.
Обрабатываются документы "Списание ТМЦ", формируются печатные формы на основе макета "Списания", выносятся в Excel, при этом в алгоритме есть такие места:
1. СуммаНДСИтог=СуммаНДСИтог+Док.СуммаНДС;
В типовой в документе "Списание ТМЦ" нет реквизита СуммаНДС и нет реквизита УчитыватьНДС и СуммаВклНДС. И даже в вашем макете "Списание" нет места, куда данные сведения могли бы быть выведены. Так зачем в алгоритме как то собираются данные по НДС? В общем, я пока закомментарил это место, чтобы посмотреть потерю данных о сумме и цене.
2. В макете "Списания" некорректно обращение сделано к сведениям о руководителе и бухгалтере. Почему то через переменную Докум в то время, когда в цикле оперируют переменной Док.
3. По получению суммы по строке и цены. Вы пытаетесь взять эти сведения из реквизитов документа Цена и Сумма, на самом деле данные реквизиты используются только при списаниях с розничного склада и равны 0 для всех остальных ситуаций. Поэтому определять данные значения нужно просматривая движения регистра Партии, которые данный документ сформировал. При этом есть два подхода - собрать сумму с учетом НДС или без него. Это вы сами решайте как вам надо, но, по идее, правильно - без НДС. Чтобы все заработало, нужно в вашем алгоритме сделать так:
- В самом верху процедуры ПечатьСписания() добавляем:
Процедура ПечатьСписания()
    РегПартии=СоздатьОбъект("Регистр.ПартииНаличие");
- в цикле вычисления сумм вместо ваших:
    СуммаИтог=СуммаИтог+Док.Сумма;
    СуммаНДСИтог=СуммаНДСИтог+Док.СуммаНДС
перед Таб.ВывестиСекцию("Строка");
пишем:
СуммаПоСтроке=0;
КоличествоПоСтроке=0;
Если Док.Проведен()=1 Тогда
    РегПартии.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());
    Пока РегПартии.ПолучитьДвижение()=1 Цикл
         Если РегПартии.НомерСтроки()=Док.НомерСтроки Тогда
              СуммаПоСтроке=СуммаПоСтроке+РегПартии.СуммаБезНДС;
              КоличествоПоСтроке=КоличествоПоСтроке+РегПартии.Количество;
         КонецЕсли;
    КонецЦикла;
КонецЕсли;
СуммаИтог=СуммаИтог+СуммаПоСтроке;

- в шаблоне "Списания" меняем формулу в колонке Сумма с глФрм(Док.Сумма) на глФрм(СуммаПоСтроке)
- в шаблоне "Списания" меняем формулу в колонке Цена с глФрм(Док.Цена) на глФрм(?(КоличествоПоСтроке=0,СуммаПоСтроке,Окр(СуммаПоСтроке*Док.Коэффициент/КоличествоПоСтроке,2)))

Количество, в принципе, можно было брать не по регистру, а прямо из реквизита строки документа.
Вот что вышло: http://zalil.ru/29906216;"
Спасибо.
отправь пожалуйста обработку мне на почту, а то с zalil я не могу её скачать
ещё один маленький вопросик, а в макете таблица,  как вывести цену документа??
ведь она есть, для ни надо никаких движений так ведь??
Макет "Таблица" в вашей обработке показывает сведения о документе целиком. Понятие "цена" для документа в целом - это нечто такое, что понять я не могу, поэтому, будем думать, что вы имели ввиду итоговую сумму по документу. Цена - свойство товара все таки.
Для токумента "Списание ТМЦ", как уже было сказано выше, суммы в реквизитах документа не фиксируются никак и определяются при проведении, поэтому, само собой, снова нужно перебирать движения документа по регистру "ПартииНаличие" и по ним посчитать сумму.
помоги пожалуйста, что-то не получается итоговую сумму документа вывести
Отправил
Спасибо!
Читают тему
(гостей: 1)

Быстрый переход