8.х Создание Отчетов (FAQ)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Greck, 18 янв 2007.

  1. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Так как не всегда есть книга под рукой и в инете книги по 1С не валяются везде, думаю тут постить вопросы по Созданию отчетов, возможно со временем прилепить эту тему в заглавие чтобы все "новички" могли сразу найти ответы на самые распространенные вопросы :)

    Вот и первый вопрос:

    Основную часть Отчета сделал с помощью конструктора, но не нашел в нем как же сделать фильтр? Например как мне сделать так чтобы при открытии формы в элемент формы полевыбора выгружались данные из справочника? и потом я выбрав необходимый элемент в поле выбора, по нему отфильтрую данные отчета...то есть допустим отчет Продажи, у товара есть единицы измерения: шт,кг,л - эти единицы хранятся в справочнике "ЕдиницыИзмерения", как мне сделать так чтобы в полеввода я выбрал "шт" и после нажатия на кнопку сформировать - отобразились только те строки у которых ЕдиницаИзмерения - "шт"?
  2. taramaz
    Offline

    taramaz

    Регистрация:
    21 ноя 2006
    Сообщения:
    28
    Симпатии:
    0
    Баллы:
    1
    Запрос.Текст =
    "ВЫБРАТЬ
    | Остатки.Номенклатура КАК Номенклатура,
    | Остатки.Номенклатура.Представление,
    | Остатки.Склад,
    | СУММА(Остатки.Себестоимость) КАК Сумма,
    | Остатки.Период КАК Период,
    | Остатки.Регистратор,
    | Остатки.Регистратор.Представление,
    | Остатки.ВидДвижения,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Количество
    |ИЗ
    | РегистрНакопления.Остатки КАК Остатки,
    | РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |
    |ГДЕ
    | Остатки.Период МЕЖДУ &НачДата И &КоДата И
    | Остатки.Номенклатура = &Номенклатура И Остатки.Склад=&Склад

    |
    |СГРУППИРОВАТЬ ПО
    | Остатки.Номенклатура,
    | Остатки.Регистратор,
    | Остатки.ВидДвижения,
    | Остатки.Период,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Количество,
    | Остатки.Склад
    |
    |УПОРЯДОЧИТЬ ПО
    | Номенклатура,
    | Период

    |
    |ИТОГИ СУММА(Сумма) ПО
    | Номенклатура ИЕРАРХИЯ";

    Запрос.УстановитьПараметр("КоДата", КоДата);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("НачДата", НачДата);
    Запрос.УстановитьПараметр("Склад", Склад);



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

    Если Склад.Код=0 тогда
    Сообщить("Выберите склад!");
    Иначе

    СуммаОборота=0;
    Макет = ПолучитьМакет("Взаиморасчёты");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Остатки.Номенклатура КАК Номенклатура,
    | Остатки.Номенклатура.Представление,
    | Остатки.Склад,
    | СУММА(Остатки.Себестоимость) КАК Сумма,
    | Остатки.Период КАК Период,
    | Остатки.Регистратор,
    | Остатки.Регистратор.Представление,
    | Остатки.ВидДвижения,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Количество
    |ИЗ
    | РегистрНакопления.Остатки КАК Остатки,
    | РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |
    |ГДЕ
    | Остатки.Период МЕЖДУ &НачДата И &КоДата И
    | Остатки.Номенклатура = &Номенклатура И Остатки.Склад=&Склад
    |
    |СГРУППИРОВАТЬ ПО
    | Остатки.Номенклатура,
    | Остатки.Регистратор,
    | Остатки.ВидДвижения,
    | Остатки.Период,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Количество,
    | Остатки.Склад
    |
    |УПОРЯДОЧИТЬ ПО
    | Номенклатура,
    | Период

    |
    |ИТОГИ СУММА(Сумма) ПО
    | Номенклатура ИЕРАРХИЯ";

    Запрос.УстановитьПараметр("КоДата", КоДата);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("НачДата", НачДата);
    Запрос.УстановитьПараметр("Склад", Склад);


    Если Номенклатура.Код=0 и склад.Код<>0 тогда
    Запрос.Текст =
    "ВЫБРАТЬ
    | Остатки.Номенклатура КАК Номенклатура,
    | Остатки.Номенклатура.Представление,
    | СУММА(Остатки.Себестоимость) КАК Сумма,
    | Остатки.Период КАК Период,
    | Остатки.Регистратор,
    | Остатки.Регистратор.Представление,
    | Остатки.ВидДвижения,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Количество
    |ИЗ
    | РегистрНакопления.Остатки КАК Остатки,
    | РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |
    |ГДЕ
    | Остатки.Период МЕЖДУ &НачДата И &КоДата И Остатки.Склад=&Склад
    |
    |СГРУППИРОВАТЬ ПО
    | Остатки.Номенклатура,
    | Остатки.Регистратор,
    | Остатки.ВидДвижения,
    | Остатки.Период,
    | Остатки.Количество,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Склад
    |УПОРЯДОЧИТЬ ПО
    | Номенклатура,
    | Период

    |
    |ИТОГИ СУММА(Сумма) ПО
    | Номенклатура ИЕРАРХИЯ";

    КонецЕсли;

    Если Номенклатура.ЭтоГруппа =1 и Склад.Код<>0 тогда

    Запрос.Текст =
    "ВЫБРАТЬ
    | Остатки.Номенклатура КАК Номенклатура,
    | Остатки.Номенклатура.Представление,
    | СУММА(Остатки.Себестоимость) КАК Сумма,
    | Остатки.Период КАК Период,
    | Остатки.Регистратор,
    | Остатки.Регистратор.Представление,
    | Остатки.ВидДвижения,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Количество
    |ИЗ
    | РегистрНакопления.Остатки КАК Остатки,
    | РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |
    |ГДЕ
    | Остатки.Период МЕЖДУ &НачДата И &КоДата И
    | Остатки.Номенклатура.Родитель = &Номенклатура И Остатки.Склад=&Склад
    |
    |СГРУППИРОВАТЬ ПО
    | Остатки.Номенклатура,
    | Остатки.Регистратор,
    | Остатки.ВидДвижения,
    | Остатки.Период,
    | Остатки.Количество,
    | ОстаткиОстатки.СебестоимостьОстаток,
    | Остатки.Склад
    |
    |УПОРЯДОЧИТЬ ПО
    | Номенклатура,
    | Период

    |
    |ИТОГИ СУММА(Сумма) ПО
    | Номенклатура ИЕРАРХИЯ";
    КонецЕсли;


    Результат = Запрос.Выполнить();
  3. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Ты хочешь сказать что для каждого варианта выбора Фильтра - формируешь разные запросы? :unsure:
  4. ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Просто в текст запроса нужно вклинить условие, например:

    ТекстЗапроса="Выбрать * Из РегистрНакопления.ОстаткиТМЦ.Остатки ";
    Если НЕ Склад.Пустая() И НЕ Номенклатура.Пустая() Тогда
    ТекстЗапроса=ТекстЗапроса+" ГДЕ Склад=&Склад И Номенклатура=&Номенклатура";
    ИначеЕсли НЕ Склад.Пустая() Тогда
    ТекстЗапроса=ТекстЗапроса+" ГДЕ Склад=&Склад";
    ИначеЕсли НЕ Номенклатура.Пустая() Тогда
    ТекстЗапроса=ТекстЗапроса+" ГДЕ Номенклатура=&Номенклатура";
    КонецЕсли;
    ТекстЗапроса=ТекстЗапроса+" ИТОГИ СУММА(КоличествоОстаток) ПО ОБЩИЕ"
    Если НЕ Склад.Пустая() И НЕ Номенклатура.Пустая() Тогда
    Запрос.УстановитьПараметр("Склад",Склад);
    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    ИначеЕсли НЕ Склад.Пустая() Тогда
    Запрос.УстановитьПараметр("Склад",Склад);
    ИначеЕсли НЕ Номенклатура.Пустая() Тогда
    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    КонецЕсли;
    Запрос.Текст=ТекстЗапроса;
  5. ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Можно еще проще:
    Если НЕ Склад.Пустая() И НЕ Номенклатура.Пустая() Тогда
    СтруктураОстатков=Новый Структура("Склад,Номенклатура",Склад,Номенклатура);
    ИначеЕсли НЕ Склад.Пустая() Тогда
    СтруктураОстатков=Новый Структура("Склад",Склад);
    ИначеЕсли НЕ Номенклатура.Пустая() Тогда
    СтруктураОстатков=Новый Структура("Номенклатура",Номенклатура);
    КонецЕсли;
    ТаблицаОстатков=РегистрНакопления.ОстаткиТМЦ.Остатки(Дата,СтруктураОстатков,"Номенклатура","Количество")
  6. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Этот вариант уже покрасивее, а может сделать один запрос вообще и в него передавать разные параметры? Просто обычно у программистов не хватает знания языка запросов... и они наверное такое чудят.. языком запроса можно сделать так что если параметр равен=пусто то тогда выбрать все :) Щас только нужно найти как case в 1С делается. Ну и еще один вопрос открыт, как в полевыбора загрузить справочник?
  7. ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Что-то я не понял вопроса. Если тебе нужно в поле выбрать значение из справочника, то на этапе конфигурирования нужно этому полю присвоить соответствующий тип, а перед выполнением запроса в качестве параметра устанавливаешь значение из этого поля.
  8. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    У меня есть полевыбора на форме я хочу чтобы в него загружались все элементы справочника и из них я мог выбрать то по которому в дальнейщем отфильтрую запрос... так вот выбрать в качестве данных СправочникСсылка.СистемыНалогооблажения я не могу, там его в списке нет... есть только (скриншот во вложеннии). Я сделал реквизит отчета ФильтрСистемаНалогооблажения и у него тип данных СправочникСсылка.СистемыНалогооблажения и потом выбираю его в своем полеввода... но все равно в полле ввода не загружается ничего из справочника...

    Вложения:

    • otchet.JPG
      otchet.JPG
      Размер файла:
      26,4 КБ
      Просмотров:
      101
  9. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Доброго времени суток всем форумчанам :unsure:
    В ходе разбирательства с построителем отчетов я для себя сделал вывод, что лучше сделать все "руками". И поэтому могу описать для последователей свой Курс Молодого Бойца в борьбе с системой отчетности платформы 1С 8.0. И так начнем...
    Для создания нового отчета в кофигураторе добавим новый элемент(рис1)


    Отчет и назовем его (рис2)

    .

    Далее на закладке "Данные"(рис3)

    ,

    создал реквизиты, значения которых буду использовать как фильтра в своем новом отчете. На закладке "Формы" (рис4)


    создал новую форму, и разместил на ней элементы фильтров и табличноеполе (рис5)


    . Далее в свойствах кнопки "Сформировать"(рис6)

    рис1.JPG

    , в описании действия "КнопкаСформироватьНажатие" разработал программый код:

    Код:
    Процедура КнопкаСформироватьНажатие(Кнопка)
    Запрос = Новый Запрос; 
    Запрос.Текст = "ВЫБРАТЬ
    |    Организации.ДатаРегистрации,
    |    Организации.ДатаЛиквидации,
    |    Организации.СистемаНалогооблажения,
    |    РеквизитыОрганизацийСрезПоследних.НазваниеОрганизации,
    |    РеквизитыОрганизацийСрезПоследних.ЮридическийАдрес,
    |    РеквизитыОрганизацийСрезПоследних.НомерСвидетельства,
    |    РеквизитыОрганизацийСрезПоследних.Район
    |    
    |ИЗ
    |    РегистрСведений.РеквизитыОрганизаций.СрезПоследних КАК РеквизитыОрганизацийСрезПоследних
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации
    |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СистемыНалогооблажения КАК СистемыНалогооблажения
    |            ПО Организации.СистемаНалогооблажения = СистемыНалогооблажения.Ссылка
    |        ПО РеквизитыОрганизацийСрезПоследних.СтруктурнаяЕдиница = Организации.Ссылка
    |ГДЕ
    |    Организации.ЭтоГруппа = ""ложь""
    |    И Организации.ТипОрганизации.Порядок = 0";
    
    Если НЕ ЗначениеНеЗаполнено(ЭлементыФормы.ФильтрДатаЛиквидации.Значение) Тогда
    Запрос.Текст = Запрос.Текст + " И Организации.ДатаЛиквидации >= &ДатаЛиквидации";
    Запрос.УстановитьПараметр("ДатаЛиквидации", ФильтрДатаЛиквидации);
    КонецЕсли;
    
    
    Если НЕ ЗначениеНеЗаполнено(ЭлементыФормы.ФильтрДатаРегистрации.Значение) Тогда
    Запрос.Текст = Запрос.Текст + " И Организации.ДатаРегистрации >= &ДатаРегистрации";
    Запрос.УстановитьПараметр("ДатаРегистрации", ФильтрДатаРегистрации);
    КонецЕсли;
    
    Если НЕ ЗначениеНеЗаполнено(ЭлементыФормы.ФильтрРайоны.Значение) Тогда
    Запрос.Текст = Запрос.Текст + " И РеквизитыОрганизацийСрезПоследних.Район = &Район";
    Запрос.УстановитьПараметр("Район", ФильтрРайоны);
    КонецЕсли;
    
    
    Если НЕ ЗначениеНеЗаполнено(ЭлементыФормы.ФильтрСистемаНалогооблажения.Значение) Тогда
    Запрос.Текст = Запрос.Текст + " И Организации.СистемаНалогооблажения = &СНО";
    Запрос.УстановитьПараметр("СНО", ФильтрСистемаНалогооблажения);
    КонецЕсли;
    
    
    Результат = Запрос.Выполнить();
    ТабДок = ЭлементыФормы.ТабличноеПоле1;
    ТабДок.Значение = Результат.Выгрузить();
    ТабДок.СоздатьКолонки();
    
    
    КонецПроцедуры
    

    И в завершении добавил созданный отчет в основной интерфейс конфигурации(рис7)

    рис2.JPG

    . Вот такой простой способ создания простого отчета "ручками" :) Надеюсь кому-то пригодится :)

    Вложения:

    • рис3.JPG
      рис3.JPG
      Размер файла:
      29,9 КБ
      Просмотров:
      146
    • рис4.JPG
      рис4.JPG
      Размер файла:
      25,9 КБ
      Просмотров:
      144
    • рис5.JPG
      рис5.JPG
      Размер файла:
      28,9 КБ
      Просмотров:
      159
    • рис6.JPG
      рис6.JPG
      Размер файла:
      32,6 КБ
      Просмотров:
      152
    • рис7.JPG
      рис7.JPG
      Размер файла:
      27 КБ
      Просмотров:
      153
  10. sergey
    Offline

    sergey Курильщик

    Регистрация:
    13 апр 2006
    Сообщения:
    365
    Симпатии:
    0
    Баллы:
    26
    "СистемаНалогооблАжения" в данных - это сильно =)
    В тему!

    А в остальном, спасибо, как раз сейчас с построением отчетов в 8-ке разбираюсь.

Поделиться этой страницей