Версия для печати темы (https://pro1c.org.ua/index.php?s=6f8277b9a83e27c3e28a25986b585be5&showtopic=23434)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Создание собственного отчета

Автор: r1p88@mail.ru 27.05.15, 14:26

Добрый день. Есть задача создать простой отчет по продажам, но так как я не работал с 7-кой, то возникают небольшие трудности. Хотел попросить помощи у форумчан.
Отчет должен состоять из таких колонок:Менеджер, Контрагент, Артикул товара, Наименование товара, Отпускная цена, отгружено.
Создаю отчет через конструктор отчетов, но в итоге, когда формирую отчет у меня он пустой.
Вот код отчета:

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Менеджер = Регистр.ПартииТоваров.Контрагент.Менеджер;
    |Наименование = Регистр.ПартииТоваров.Контрагент.Наименование;
    |Артикул = Регистр.ПартииТоваров.Товар.Артикул;
    |Наименование1 = Регистр.ПартииТоваров.Товар.Наименование;
    |Группировка Менеджер;
    |Группировка Наименование;
    |Группировка Артикул;
    |Группировка Наименование1;
    |Условие(Менеджер=ВыбМенеджер);
    |Условие(Наименование1 в ВыбТовар);
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей Менеджер
        
        Пока Запрос.Группировка(2) = 1 Цикл
            // Заполнение полей Наименование
            
            Пока Запрос.Группировка(3) = 1 Цикл
                // Заполнение полей Артикул
            
                Пока Запрос.Группировка(4) = 1 Цикл  
                    Если Запрос.ЭтоГруппа() = 1 Тогда
                    // Заполнение полей Наименование1
                    Таб.ВывестиСекцию("Менеджер");
                    Таб.ВывестиСекцию("Наименование");
                    Таб.ВывестиСекцию("Артикул");
                    Таб.ВывестиСекцию("Наименование1");
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры


Макет выглядит таким образом:

Что я делаю не так? Почему в отчете нет данных?

Автор: sava1 27.05.15, 14:29

|Условие(Наименование1 в ВыбТовар); -> |Условие(Наименование1 в ВыбТовар.Наименование);

Автор: r1p88@mail.ru 27.05.15, 14:31

Цитата(sava1 @ 27.05.15, 15:29) *
|Условие(Наименование1 в ВыбТовар); -> |Условие(Наименование1 в ВыбТовар.Наименование);

На это я тоже обратил внимание. Но это не помогло.

Автор: sava1 27.05.15, 14:36

там лучше наоборот - в запросе брать товар, а не наименование
И ,кажется, при выборке из регистров нужна функция

Автор: r1p88@mail.ru 27.05.15, 14:47

Почитал информацию, таки да, нужна функция, осталось понять как её написать

Автор: sava1 27.05.15, 14:50

типо так

        Запрос = СоздатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Период с {НачМесяца(датадок)} по {Мин(КонМесяца(ДатаДок),ПолучитьДатуТА())};
        |Без Итогов;  
        |Поб = Регистр."+ИмяРег+".ПОб;
        |Рахунок = Регистр."+ИмяРег+".Рахунок;
        |ТМЦ = Регистр."+ИмяРег+".ТМЦ;
        |Партія = Регистр."+ИмяРег+".Партія;
        |Кількість = Регистр."+ИмяРег+".Кількість;
        |Сума = Регистр."+ИмяРег+".Сума;
        |Функция КЗ = НачОст(Кількість);
        |Функция КП = Приход(Кількість);
        |Функция КК = КонОст(Кількість);
        |Функция СЗ = НачОст(Сума);
        |Функция СП = Приход(Сума);
        |Функция СК = КонОст(Сума);
        |Группировка Партія;
        |Группировка ТМЦ без групп;
        |Условие(Поб = Побл);
        |Условие(Рахунок.Код = РахунокТМЦ.Код);

Автор: r1p88@mail.ru 27.05.15, 15:25

Добавил уже у себя функцию в запросе. Всё равно чистый отчет....

Автор: Домовик 27.05.15, 19:33

самое первое - попробуйте закомментировать для начала ВывестиСекцию(), и поставить Сообщить(Запрос.Менеджер) и тп. Это покажет, работает запрос или нет.
Так как в таблице могут тоже быть ошибки, или просто не заданы формулы в секциях.

То что, вы согнали скопом во внутреннюю группировку вывод четырех секций покажет некрасивый очень результат все равно.

Зачем вам условие во внутренней группировке на ЭтоГРуппа() ?

Автор: igmig65 28.05.15, 10:45

Ну во первых, если это ТИС, то отпускную цену из регистра вы не вытянете просто так, так как там нет такого ресурса, вы можете вытянуть оборот и кол-во, и рассчитать цену, и опять же не ясно какая нужна детализация, по каждой строке документа? или все свернуть по товарной позиции, если да, то о отпускной цене тут говорить нет смысла, есть только средняя цена, поэтому лучше вытягивать оборот по товару и кол-во списанное, соответственно рассчитать среднюю цену, но уж никак не без итогов..как выше написали, иначе функции зачем вставлять. Потом Менеджер, если отбор по 1 менеджеру, то зачем нужна колонка, потом развернуть по контрагентам, потом по товарам, ну типа так:

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Менеджер = Регистр.ПартииТоваров.Контрагент.Менеджер;
    |Контрагент= Регистр.ПартииТоваров.Контрагент;
    |Товар= Регистр.ПартииТоваров.Товар;
    |КвоОтгр = Регистр.ПартииТоваров.ОстатокТовара;
    |СумОтгр = Регистр.ПартииТоваров.Оборот;
    |Функция КвоСум = Расход(КвоОтгр);
    |Функция СумСум = Расход(СумОтгр);
    |Группировка Контрагент Упорядочить по Контрагент.Наименование без Групп;
    |Группировка Товар Упорядочить по Товар.Наименование без Групп;
    |Условие(Менеджер=ВыбМенеджер);
    |Условие(Товар в ВыбТовар);
    |"//}}ЗАПРОС
;
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    
    Пока Запрос.Группировка(1) = 1 Цикл
          Сообщить(Запрос.Контрагент);
          Пока Запрос.Группировка(2) = 1 Цикл
               Сообщить(""+Запрос.Товар.Наименование+"/"+Запрос.Товар.Артикул+"/"+Запрос.КвоСум+"/"+Запрос.СумСум);
          КонецЦикла;
    КонецЦикла;
  
КонецПроцедуры


если выдаст лог, то вставляйте вывод в таблицу

Автор: Sharzem 28.05.15, 13:42

Мда... Вообщето правильней было б формировать по оборотному регистру, если такой имеется... Хотя и по регистру остатков тоже реально вытянуть нужную информацию, в т.ч. и розничные цены типа:

ТекДок = Регистр.ПартииТоваров.ТекущийДокумент;
и
Условие(Когда ТекДок.Вид = "Расходная накладная")

...хотя, инфы недостаточно.

Какой это регистр оборотный или остатков ?
В регистре Остатков в реквизитах вполне реально могут храниться виды движений: приход, расход или возврат, со ссылкой в ресурс, например Обороты...
Решений вопроса немеряное количество, вплоть до выборки циклом документов, с последующей выгрузкой табличной части в таблицу значений, вложением этой таблицы значений в последующую Таблицу значений и добавлением этого "добра" в список значений по символьному представлению "Иванов", "Петров", "Сидоров" с последующей передачей в запрос как скопом так и по отдельности, все зависит от того какой приходный документ выкурить ): 44000000.gif

Автор, может больше раскажете что у Вас там за зверюка или заскриньте содержимое регистра из конфигуратора дабы не флудить ?

Автор: r1p88@mail.ru 28.05.15, 15:37

Вот фото регистра. По тому примеру, что мне раньше скинули, сделал. Отчет выводит, НО, записей очень мало.

Автор: Sharzem 29.05.15, 10:46

Уже ближе. Еще раз, это точно регистр остатков ? И заодно расшифруйте что такое "КодОперации" и какие значения там хранятся.
В конечном результате Вам что нужно вытянуть только обороты или еще нужно получить сумму закупки, сумму продажи и процент дохода ?
Чет у меня не выходит угадывать.

Автор: vadim007 29.05.15, 12:15

Цитата(r1p88@mail.ru @ 27.05.15, 14:26) *
Есть задача создать простой отчет по продажам

Отчет по продажам - это не простой отчет.
Судя по регистрам - у вас конфигурация ТиС. В ней есть подобный отчет, чувствую, вы взяли его за основу.
В свое время добавлял в него Менеджеров, каковыми были просто авторы документов.

Автор: Домовик 29.05.15, 12:26

КодОперации- вероятно код хоз. операции для обмена Торговля-БухУчет( В комплексной там тоже от регистров проводки делаются по хоз операциям).
к задаче это не имеет отношения.
Не грузите товарища. Пусть хоть что-то выведет, а когда выведет и разберется, добавит, изменит, нарастит, что нужно.

Автор: vadim007 29.05.15, 12:44

Фрагмент из упомянутого мною отчета:

КодыОперацийПродажи=СоздатьОбъект("СписокЗначений");
    Если (РежимВидПродажи=1) И (РежимЧейТовар=1) Тогда  // все продажи, все товары
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаКупленногоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(РозничнаяПродажаКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратКупленногоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратРозничныйКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(РозничнаяПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаУслуги);
        КодыОперацийПродажи.ДобавитьЗначение(СторноПродажаУслуги);
    ИначеЕсли (РежимВидПродажи=1) И (РежимЧейТовар=2) Тогда   // все продажи, собственные товары
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаКупленногоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(РозничнаяПродажаКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратКупленногоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратРозничныйКупленногоТовара);
    ИначеЕсли (РежимВидПродажи=1) И (РежимЧейТовар=3) Тогда   // все продажи, комиссионные товары
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(РозничнаяПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоПереданногоТовара);
    ИначеЕсли (РежимВидПродажи=1) И (РежимЧейТовар=4) Тогда   // все продажи, услуги
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаУслуги);
        КодыОперацийПродажи.ДобавитьЗначение(СторноПродажаУслуги);
    ИначеЕсли (РежимВидПродажи=2) И (РежимЧейТовар=1) Тогда  // оптом, все товары
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаКупленногоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратКупленногоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоПереданногоТовара);
    ИначеЕсли (РежимВидПродажи=2) И (РежимЧейТовар=2) Тогда  // оптом, собственные товары
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратКупленногоПереданногоТовара);
    ИначеЕсли (РежимВидПродажи=2) И (РежимЧейТовар=3) Тогда  // оптом, комиссионные товары
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаПринятогоПереданногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоТовараОтПокупателя);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратПринятогоПереданногоТовара);
    ИначеЕсли (РежимВидПродажи=2) И (РежимЧейТовар=4) Тогда  // оптом, услуги
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаУслуги);
        КодыОперацийПродажи.ДобавитьЗначение(СторноПродажаУслуги);
    ИначеЕсли (РежимВидПродажи=3) И (РежимЧейТовар=1) Тогда  // в розницу, все товары
        КодыОперацийПродажи.ДобавитьЗначение(РозничнаяПродажаКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(РозничнаяПродажаПринятогоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратРозничныйКупленногоТовара);
    ИначеЕсли (РежимВидПродажи=3) И (РежимЧейТовар=2) Тогда  // в розницу, собственные товары
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратРозничныйКупленногоТовара);
        КодыОперацийПродажи.ДобавитьЗначение(ВозвратРозничныйКупленногоТовара);
    ИначеЕсли (РежимВидПродажи=3) И (РежимЧейТовар=3) Тогда  // в розницу, комиссионные товары
        КодыОперацийПродажи.ДобавитьЗначение(РозничнаяПродажаПринятогоТовара);
    ИначеЕсли (РежимВидПродажи=3) И (РежимЧейТовар=4) Тогда  // в розницу, услуги
        КодыОперацийПродажи.ДобавитьЗначение(ПродажаУслуги);
        КодыОперацийПродажи.ДобавитьЗначение(СторноПродажаУслуги);
    КонецЕсли;


ТекстЗапроса=ТекстЗапроса+"
        |Функция РасхОстатокТовара=Расход(ОстатокТовара);
        |Функция ПрихОстатокТовара=Приход(ОстатокТовара);
        |Функция РасхСтоимость=Расход(Стоимость);
        |Функция ПрихСтоимость=Приход(Стоимость);
        |Функция ОборотТовара=Сумма(Оборот);
        |Функция ПрибыльТовара=Сумма(Прибыль);
        |Функция ПрихНДС=Приход(НДС);
        |Функция РасхНДС=Расход(НДС);        
        |Функция НДСрасходаТовара=Сумма(НДСрасхода);
        |Условие (Фирма=ВыбФирма);
        |Условие (КодОперации В КодыОперацийПродажи);
        |Условие (Товар.ВидТовара <> Перечисление.ВидыТоваров.Услуга);
        |";

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua