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