Kuis
17.11.2018, 12:00
есть внешний отчет вот его код
//************************************************** ************************************************** ********
Перем Периоды, Таблоид, КолФормат;
//************************************************** ************************************************** ********
Процедура ПриОткрытии()
КолФормат = "Ч-18.4";
НачДата = НачГода(ТекущаяДата());
КонДата = КонМесяца(ТекущаяДата());
КонецПроцедуры // ПриОткрытии()
//************************************************** ************************************************** ********
Процедура ПериодФормула()
ВвестиПериод(НачДата,КонДа та);
НачДата = НачМесяца(НачДата);
КонДата = КонМесяца(КонДата);
КонецПроцедуры // ПериодФормула()
//************************************************** ************************************************** ********
Процедура ОбработкаПодбора(перЭлеме� �т)
Если перЭлемент.ПометкаУдалени� �() = 0 Тогда
Если СписокНоменклатуры.НайтиЗ� �ачение(перЭлемент) = 0 Тогда
СписокНоменклатуры.Добави� �ьЗначение(перЭлемент);
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ОбработкаПодбора(перЭлеме� �т)
//************************************************** ************************************************** ********
Процедура ДобавитьФормула()
перЗначение = ПолучитьПустоеЗначение("Справочник.Номенклатура");
Если СписокНоменклатуры.Размер� �писка() > 0 Тогда
текЗначение = СписокНоменклатуры.Текуща� �Строка();
перЗначение =СписокНоменклатуры.Получи тьЗначение(текЗначение);
КонецЕсли;
ОткрытьПодбор("Справочник.Номенклатура", "ДляВыбора", перЗначение);
КонецПроцедуры // ДобавитьФормула()
//************************************************** ************************************************** ********
Процедура УдалитьФормула()
Количество = СписокНоменклатуры.Размер� �писка();
Если Количество = 0 Тогда Возврат; КонецЕсли;
ТекСтрока = СписокНоменклатуры.Текуща� �Строка();
СписокНоменклатуры.Удалит� �Значение(ТекСтрока);
Если Количество > 1 Тогда
СписокНоменклатуры.Текуща� �Строка(?(ТекСтрока=Количес� �во, ТекСтрока-1, ТекСтрока));
КонецЕсли;
КонецПроцедуры // УдалитьФормула()
//************************************************** ************************************************** ********
Процедура ОчиститьФормула()
СписокНоменклатуры.Удалит� �Все();
КонецПроцедуры // ОчиститьФормула()
//************************************************** ************************************************** ********
Процедура ОпределТаблиц()
Периоды = СоздатьОбъект("ТаблицаЗначений");
Периоды.НоваяКолонка("НачДата", "Дата");
Периоды.НоваяКолонка("КонДата", "Дата");
Периоды.НоваяКолонка("Колонка", "Строка");
Периоды.НоваяКолонка("Название", "Строка");
текДата = НачДата;
Пока текДата < КонДата Цикл
Периоды.НоваяСтрока();
Периоды.НачДата = текДата;
Периоды.КонДата = КонМесяца(текДата);
Периоды.Колонка = "Период" + СокрЛП(Периоды.НомерСтроки );
Название = ПериодСтр(Периоды.НачДата, Периоды.КонДата);
Пробел = Найти(Название, " ");
Периоды.Название = Лев(Название, Пробел-1) + РазделительСтрок + Сред(Название, Пробел+1);
текДата = ДобавитьМесяц(текДата, 1);
КонецЦикла;
Таблоид = СоздатьОбъект("ТаблицаЗначений");
Таблоид.НоваяКолонка("Номенклатура", "Справочник.Номенклатура");
Таблоид.НоваяКолонка("Количество", "Число", 18, 4);
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
Таблоид.НоваяКолонка(Перио ды.Колонка, "Число", 18, 4);
КонецЦикла;
КонецПроцедуры // ОпределТаблиц()
//************************************************** ************************************************** ********
Функция ОпределКолонки(перДата)
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
Если перДата > Периоды.КонДата Тогда
Продолжить;
КонецЕсли;
Возврат Периоды.Колонка;
КонецЦикла;
Возврат "";
КонецФункции // ОпределКолонки(перДата)
//************************************************** ************************************************** ********
Процедура ВыборкаВозвратов()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|ОбрабатыватьДокументы Проведенные;
|Период с НачДата по КонДата;
|Док = Документ.ВозвратОтПокупат� �ля.ТекущийДокумент;
|Номенклатура = Документ.ВозвратОтПокупат� �ля.Товар;
|Условие(СписокНоменклатур ы.НайтиЗначение(Номенклату ра)>0);
|Количество = Документ.ВозвратОтПокупат� �ля.Количество;
|Функция Возвращено = Сумма(Количество);
|Группировка Номенклатура Без Групп;
|Группировка Док;
|";
Если Запрос.Выполнить(ТекстЗапр оса) = 1 Тогда
Пока Запрос.Группировка("Номенклатура") = 1 Цикл
Таблоид.НоваяСтрока();
Таблоид.Номенклатура = Запрос.Номенклатура;
Таблоид.Количество = Запрос.Возвращено;
Пока Запрос.Группировка("Док") = 1 Цикл
Таблоид.УстановитьЗначени� �(Таблоид.НомерСтроки, ОпределКолонки(Запрос.Док.� �атаДок),Запрос.Возвращено);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//************************************************** ************************************************** ********
Процедура ВыборкаОтгруженных()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|ОбрабатыватьДокументы Проведенные;
|Период с НачДата по КонДата;
|Док = Документ.РасходнаяНакладн� �я.ТекущийДокумент;
|Номенклатура = Документ.РасходнаяНакладн� �я.Товар;
|Условие(СписокНоменклатур ы.НайтиЗначение(Номенклату ра)>0);
|Количество = Документ.РасходнаяНакладн� �я.Количество;
|Функция Отгружено = Сумма(Количество);
|Группировка Номенклатура Без Групп;
|Группировка Док;
|";
Если Запрос.Выполнить(ТекстЗапр оса) = 1 Тогда
Пока Запрос.Группировка("Номенклатура") = 1 Цикл
Таблоид.НоваяСтрока();
Таблоид.Номенклатура = Запрос.Номенклатура;
Таблоид.Количество = Запрос.Отгружено;
Пока Запрос.Группировка("Док") = 1 Цикл
Таблоид.УстановитьЗначени� �(Таблоид.НомерСтроки, ОпределКолонки(Запрос.Док.� �атаДок), Запрос.Отгружено);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//************************************************** ************************************************** ********
Процедура ОбработкаЗначений()
СуммаКолонки = "Количество";
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
СуммаКолонки = СуммаКолонки + "," + Периоды.Колонка;
КонецЦикла;
КонецПроцедуры
//************************************************** ************************************************** ********
Процедура ПечатьОтчета()
Печатник = СоздатьОбъект("Таблица");
Печатник.ИсходнаяТаблица("Отгружено");
_Заглавие = "Отгрузка номенклатуры по РБ " + ПериодСтр(НачДата, КонДата);
Печатник.ВывестиСекцию("Шапка|Основа");
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
_Период = Периоды.Название;
Печатник.ПрисоединитьСекц� �ю("Шапка|Период");
КонецЦикла;
Таблоид.ВыбратьСтроки();
Пока Таблоид.ПолучитьСтроку() = 1 Цикл
_Номенклатура = СокрЛП(Таблоид.Номенклатур а);
_Количество = Формат(Таблоид.Количество, КолФормат);
Печатник.ВывестиСекцию("Наименование|Основа");
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
_Количество =Таблоид.ПолучитьЗначение(� �аблоид.НомерСтроки, Периоды.Колонка);
Печатник.ПрисоединитьСекц� �ю("Наименование|Период");
КонецЦикла;
КонецЦикла;
_Колонтитул = _Заглавие;
Печатник.ПовторятьПриПеча� �иСтроки(5, 6);
Печатник.ПараметрыСтраниц� �(2, , , 7, 7, 15, 7, 7, 7, 1);
Печатник.КоличествоЭкземп� �яров(1);
Печатник.ТолькоПросмотр(1);
Печатник.Показать(_Колонти� �ул);
КонецПроцедуры // ПечатьОтчета()
//************************************************** ************************************************** ********
Процедура Сформировать()
ОчиститьОкноСообщений();
ОпределТаблиц();
ВыборкаОтгруженных();
ВыборкаВозвратов();
Если Таблоид.КоличествоСтрок() = 0 Тогда
Предупреждение("Данные не обнаружены! Попробуйте ещё раз =)");
Иначе
ОбработкаЗначений();
ПечатьОтчета();
КонецЕсли;
КонецПроцедуры // Сформировать()
//************************************************** ************************************************** ********
Как сделать чтобы из этого отчёта рисовалась диаграмма и выводила название номенклатуры и количество её?
//************************************************** ************************************************** ********
Перем Периоды, Таблоид, КолФормат;
//************************************************** ************************************************** ********
Процедура ПриОткрытии()
КолФормат = "Ч-18.4";
НачДата = НачГода(ТекущаяДата());
КонДата = КонМесяца(ТекущаяДата());
КонецПроцедуры // ПриОткрытии()
//************************************************** ************************************************** ********
Процедура ПериодФормула()
ВвестиПериод(НачДата,КонДа та);
НачДата = НачМесяца(НачДата);
КонДата = КонМесяца(КонДата);
КонецПроцедуры // ПериодФормула()
//************************************************** ************************************************** ********
Процедура ОбработкаПодбора(перЭлеме� �т)
Если перЭлемент.ПометкаУдалени� �() = 0 Тогда
Если СписокНоменклатуры.НайтиЗ� �ачение(перЭлемент) = 0 Тогда
СписокНоменклатуры.Добави� �ьЗначение(перЭлемент);
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ОбработкаПодбора(перЭлеме� �т)
//************************************************** ************************************************** ********
Процедура ДобавитьФормула()
перЗначение = ПолучитьПустоеЗначение("Справочник.Номенклатура");
Если СписокНоменклатуры.Размер� �писка() > 0 Тогда
текЗначение = СписокНоменклатуры.Текуща� �Строка();
перЗначение =СписокНоменклатуры.Получи тьЗначение(текЗначение);
КонецЕсли;
ОткрытьПодбор("Справочник.Номенклатура", "ДляВыбора", перЗначение);
КонецПроцедуры // ДобавитьФормула()
//************************************************** ************************************************** ********
Процедура УдалитьФормула()
Количество = СписокНоменклатуры.Размер� �писка();
Если Количество = 0 Тогда Возврат; КонецЕсли;
ТекСтрока = СписокНоменклатуры.Текуща� �Строка();
СписокНоменклатуры.Удалит� �Значение(ТекСтрока);
Если Количество > 1 Тогда
СписокНоменклатуры.Текуща� �Строка(?(ТекСтрока=Количес� �во, ТекСтрока-1, ТекСтрока));
КонецЕсли;
КонецПроцедуры // УдалитьФормула()
//************************************************** ************************************************** ********
Процедура ОчиститьФормула()
СписокНоменклатуры.Удалит� �Все();
КонецПроцедуры // ОчиститьФормула()
//************************************************** ************************************************** ********
Процедура ОпределТаблиц()
Периоды = СоздатьОбъект("ТаблицаЗначений");
Периоды.НоваяКолонка("НачДата", "Дата");
Периоды.НоваяКолонка("КонДата", "Дата");
Периоды.НоваяКолонка("Колонка", "Строка");
Периоды.НоваяКолонка("Название", "Строка");
текДата = НачДата;
Пока текДата < КонДата Цикл
Периоды.НоваяСтрока();
Периоды.НачДата = текДата;
Периоды.КонДата = КонМесяца(текДата);
Периоды.Колонка = "Период" + СокрЛП(Периоды.НомерСтроки );
Название = ПериодСтр(Периоды.НачДата, Периоды.КонДата);
Пробел = Найти(Название, " ");
Периоды.Название = Лев(Название, Пробел-1) + РазделительСтрок + Сред(Название, Пробел+1);
текДата = ДобавитьМесяц(текДата, 1);
КонецЦикла;
Таблоид = СоздатьОбъект("ТаблицаЗначений");
Таблоид.НоваяКолонка("Номенклатура", "Справочник.Номенклатура");
Таблоид.НоваяКолонка("Количество", "Число", 18, 4);
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
Таблоид.НоваяКолонка(Перио ды.Колонка, "Число", 18, 4);
КонецЦикла;
КонецПроцедуры // ОпределТаблиц()
//************************************************** ************************************************** ********
Функция ОпределКолонки(перДата)
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
Если перДата > Периоды.КонДата Тогда
Продолжить;
КонецЕсли;
Возврат Периоды.Колонка;
КонецЦикла;
Возврат "";
КонецФункции // ОпределКолонки(перДата)
//************************************************** ************************************************** ********
Процедура ВыборкаВозвратов()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|ОбрабатыватьДокументы Проведенные;
|Период с НачДата по КонДата;
|Док = Документ.ВозвратОтПокупат� �ля.ТекущийДокумент;
|Номенклатура = Документ.ВозвратОтПокупат� �ля.Товар;
|Условие(СписокНоменклатур ы.НайтиЗначение(Номенклату ра)>0);
|Количество = Документ.ВозвратОтПокупат� �ля.Количество;
|Функция Возвращено = Сумма(Количество);
|Группировка Номенклатура Без Групп;
|Группировка Док;
|";
Если Запрос.Выполнить(ТекстЗапр оса) = 1 Тогда
Пока Запрос.Группировка("Номенклатура") = 1 Цикл
Таблоид.НоваяСтрока();
Таблоид.Номенклатура = Запрос.Номенклатура;
Таблоид.Количество = Запрос.Возвращено;
Пока Запрос.Группировка("Док") = 1 Цикл
Таблоид.УстановитьЗначени� �(Таблоид.НомерСтроки, ОпределКолонки(Запрос.Док.� �атаДок),Запрос.Возвращено);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//************************************************** ************************************************** ********
Процедура ВыборкаОтгруженных()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|ОбрабатыватьДокументы Проведенные;
|Период с НачДата по КонДата;
|Док = Документ.РасходнаяНакладн� �я.ТекущийДокумент;
|Номенклатура = Документ.РасходнаяНакладн� �я.Товар;
|Условие(СписокНоменклатур ы.НайтиЗначение(Номенклату ра)>0);
|Количество = Документ.РасходнаяНакладн� �я.Количество;
|Функция Отгружено = Сумма(Количество);
|Группировка Номенклатура Без Групп;
|Группировка Док;
|";
Если Запрос.Выполнить(ТекстЗапр оса) = 1 Тогда
Пока Запрос.Группировка("Номенклатура") = 1 Цикл
Таблоид.НоваяСтрока();
Таблоид.Номенклатура = Запрос.Номенклатура;
Таблоид.Количество = Запрос.Отгружено;
Пока Запрос.Группировка("Док") = 1 Цикл
Таблоид.УстановитьЗначени� �(Таблоид.НомерСтроки, ОпределКолонки(Запрос.Док.� �атаДок), Запрос.Отгружено);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//************************************************** ************************************************** ********
Процедура ОбработкаЗначений()
СуммаКолонки = "Количество";
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
СуммаКолонки = СуммаКолонки + "," + Периоды.Колонка;
КонецЦикла;
КонецПроцедуры
//************************************************** ************************************************** ********
Процедура ПечатьОтчета()
Печатник = СоздатьОбъект("Таблица");
Печатник.ИсходнаяТаблица("Отгружено");
_Заглавие = "Отгрузка номенклатуры по РБ " + ПериодСтр(НачДата, КонДата);
Печатник.ВывестиСекцию("Шапка|Основа");
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
_Период = Периоды.Название;
Печатник.ПрисоединитьСекц� �ю("Шапка|Период");
КонецЦикла;
Таблоид.ВыбратьСтроки();
Пока Таблоид.ПолучитьСтроку() = 1 Цикл
_Номенклатура = СокрЛП(Таблоид.Номенклатур а);
_Количество = Формат(Таблоид.Количество, КолФормат);
Печатник.ВывестиСекцию("Наименование|Основа");
Периоды.ВыбратьСтроки();
Пока Периоды.ПолучитьСтроку() = 1 Цикл
_Количество =Таблоид.ПолучитьЗначение(� �аблоид.НомерСтроки, Периоды.Колонка);
Печатник.ПрисоединитьСекц� �ю("Наименование|Период");
КонецЦикла;
КонецЦикла;
_Колонтитул = _Заглавие;
Печатник.ПовторятьПриПеча� �иСтроки(5, 6);
Печатник.ПараметрыСтраниц� �(2, , , 7, 7, 15, 7, 7, 7, 1);
Печатник.КоличествоЭкземп� �яров(1);
Печатник.ТолькоПросмотр(1);
Печатник.Показать(_Колонти� �ул);
КонецПроцедуры // ПечатьОтчета()
//************************************************** ************************************************** ********
Процедура Сформировать()
ОчиститьОкноСообщений();
ОпределТаблиц();
ВыборкаОтгруженных();
ВыборкаВозвратов();
Если Таблоид.КоличествоСтрок() = 0 Тогда
Предупреждение("Данные не обнаружены! Попробуйте ещё раз =)");
Иначе
ОбработкаЗначений();
ПечатьОтчета();
КонецЕсли;
КонецПроцедуры // Сформировать()
//************************************************** ************************************************** ********
Как сделать чтобы из этого отчёта рисовалась диаграмма и выводила название номенклатуры и количество её?