//************************************
Процедура ПечатьПоКатегориям()
Перем Запрос,ТекстЗапроса, Таб;
Времяначало= ТекущееВремя();
СписокТоваров=СоздатьОбъект("СписокЗначений");
СписокКлиентов=СоздатьОбъект("СписокЗначений");
СС=СоздатьОбъект("СписокЗначений");
ФормированиеСписка(СписокТоваров,"Номенклатура","КатегорииТоваров",ВыбТовар,КатТоваров,МФВыбТовары,МФКатТоваров);
ФормированиеСписка(СписокКлиентов,"Контрагенты","КатегорииКонтрагентов",ВыбКлиент,КатКлиентов,МФВыбКлиенты,МФКатКлиентов);
Запрос = СоздатьОбъект("Запрос");
ТекстПеременных =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Фирма = Регистр.ПартииТоваров.Фирма;
|Товар = Регистр.ПартииТоваров.Товар;
|Контрагент= Регистр.ПартииТоваров.Контрагент;
|ТекДокумент = Регистр.ПартииТоваров.ТекущийДокумент;
|Вес = Регистр.ПартииТоваров.Товар.Вес;
|Нетто = Регистр.ПартииТоваров.Товар.Нетто;
|Категория = Регистр.ПартииТоваров.Товар.КатегорияДляГруппировки;
|Количество = Регистр.ПартииТоваров.ОстатокТовара;
|Оборот = Регистр.ПартииТоваров.Оборот;
|";
ТекстФункций = "
|Функция КолРасход = Расход(Количество);
|Функция Сумма = Сумма(Оборот);
|Функция ВесРасход = Сумма(Запрос.КолРасход * Вес + Количество - Количество);
|Функция НеттоРасход = Сумма(Запрос.КолРасход * Нетто + Количество - Количество);
|";
ТекстГруппировок = "
|Группировка Категория без групп упорядочить по Категория.Наименование;
|";
ТекстУсловий = "
|Условие(Фирма = ВыбФирма);
|Условие(Товар в СписокТоваров);
|Условие(Контрагент в СписокКлиентов) ;
|Условие(ПустоеЗначение(Контрагент)=0);
|"//}}ЗАПРОС
;
ТекстЗапроса = ТекстПеременных+РазделительСтрок+ТекстФункций+РазделительСтрок+ТекстГруппировок+РазделительСтрок+ТекстУсловий;
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("проба");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
// посщитаем кол-во клиентов
Запрос.ВНачалоВыборки();
Пока Запрос.Группировка(1) = 1 Цикл
Док=Запрос.ТекДокумент;
Если Док.Вид()="РасходнаяНакладная" Тогда
Если Док.ВидОперации=0 Тогда
КонецЕсли;
КонецЕсли;
Если Док.Вид()="ПриходнаяНакладная" Тогда
Если Док.ВидОперации=1 Тогда
КонецЕсли;
КонецЕсли;
Таб.ВывестиСекцию("КатегорияТовара");
КонецЦикла;
// Заполнение полей "Итого"
Таб.ВывестиСекцию("Итого");
// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать по категории товара", "");
КонецПроцедуры
//****************************************************************
Все. Исключила не нужные документы.(Сумма(Оборот) когда ((Оборот>0) и (ТекДокумент.Вид() = ""РасходнаяНакладная"")или(Оборот<0) и (ТекДокумент.Вид() = ""ПриходнаяНакладная"")) Единственное хотелось бы чтобы быстрее формировался. Можно ли что-то подправить?
Запрос = СоздатьОбъект("Запрос");
ТекстПеременных =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Фирма = Регистр.ПартииТоваров.Фирма;
|Товар = Регистр.ПартииТоваров.Товар;
|Контрагент= Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Контрагент,Регистр.ПартииТоваров.ТекущийДокумент.ПриходнаяНакладная.Контрагент;
|ТекДокумент = Регистр.ПартииТоваров.ТекущийДокумент;
|Вес = Регистр.ПартииТоваров.Товар.Вес;
|Нетто = Регистр.ПартииТоваров.Товар.Нетто;
|Категория = Регистр.ПартииТоваров.Товар.КатегорияДляГруппировки;
|Количество = Регистр.ПартииТоваров.ОстатокТовара;
|Оборот = Регистр.ПартииТоваров.Оборот;
|";
ТекстГруппировок = "
|Группировка Категория без групп упорядочить по Категория.Наименование;
|";
ТекстФункций = "
|Функция КолРасход = Расход(Количество);
|Функция Сумма = Сумма(Оборот) когда ((Оборот>0) и (ТекДокумент.Вид() = ""РасходнаяНакладная"")или(Оборот<0) и (ТекДокумент.Вид() = ""ПриходнаяНакладная""));
|Функция ВесРасход = Сумма(Запрос.КолРасход * Вес + Количество - Количество);
|Функция НеттоРасход = Сумма(Запрос.КолРасход * Нетто + Количество - Количество);
|";
ТекстУсловий = "
|Условие(Фирма = ВыбФирма);
|Условие(ПустоеЗначение(Контрагент)=0);
|Условие(Товар в СписокТоваров);
|Условие(Контрагент в СписокКлиентов);
А попробуйте вставить условие в запрос, только по ПН и РН, тогда другие доки вообще не попадут в запрос и не нужно будет условие в функции, что вы добавили.
Ну и по Виду операции, тоже можно добавить условие, чтобы возвраты не попадали в запрос вообще.
Если я не укажу Оборот>0 или Оборот<0 тогда вытягиваются возвраты. Вы имеете в виду
|Оборот = Регистр.ПартииТоваров.Оборот; исправить?
Если вам не тяжело можете привести пример.
igmig65 @ Сегодня, 7:03
,
если база sql, используйте прямые запросы, например, через библиотечку 1cpp. Будет быстрее в разы
//Добавьте условие
|Условие((ТекДокумент.Вид() = ""РасходнаяНакладная"") или (ТекДокумент.Вид() = ""ПриходнаяНакладная""));
//Измените функцию:
|Функция Сумма = Сумма(Оборот) когда (Оборот<>0);
//Перед формированием текста запроса добавьте в список нужные коды операций, исключите те которые ниже:
СписКодыОпераций=СоздатьОбъект("СписокЗначений");
СписКодыОпераций.ДобавитьЗначение(ПродажаКупленногоТовара);
СписКодыОпераций.ДобавитьЗначение(ПродажаКупленногоПереданногоТовара);
СписКодыОпераций.ДобавитьЗначение(РозничнаяПродажаКупленногоТовара);
СписКодыОпераций.ДобавитьЗначение(ВозвратТовараОтПокупателя);
СписКодыОпераций.ДобавитьЗначение(ВозвратКупленногоПереданногоТовара);
СписКодыОпераций.ДобавитьЗначение(ВозвратРозничныйКупленногоТовара);
СписКодыОпераций.ДобавитьЗначение(ПродажаПринятогоТовара);
СписКодыОпераций.ДобавитьЗначение(ПродажаПринятогоПереданногоТовара);
СписКодыОпераций.ДобавитьЗначение(РозничнаяПродажаПринятогоТовара);
СписКодыОпераций.ДобавитьЗначение(ВозвратПринятогоТовараОтПокупателя);
СписКодыОпераций.ДобавитьЗначение(ВозвратПринятогоПереданногоТовара);
СписКодыОпераций.ДобавитьЗначение(ПродажаУслуги);
СписКодыОпераций.ДобавитьЗначение(СторноПродажаУслуги);
//Добавьте переменную;
|КодОперации=Регистр.ПартииТоваров.КодОперации;
//Также условие
|Условие (КодОперации В СписКодыОпераций);
Да не разложит. 1sqlite - старается попасть, а срр - нифига.
sava1 @ Сегодня, 17:51
,
А это как запрос напишите.
Насчет оптимальной выборки из регистров..нуу.. доводилось переписывать черные запросы к регистрам на прямые. И всегда работало быстрее, - и чем больший период попадал в выборку, тем существеннее было различие по времени
1.Регистр.ПартииТоваров.Фирма пусто ! Используйте Фирма = Регистр.ПартииТоваров.ТекущийДокумент.Фирма если изменить вытягивает не понятные данные
2.Добавила через КодОперации все отлично работает быстрее прежнего приблизительно на 00:00;17, но Контрагент нужно указать через нужные документы иначе суммы не верны.
Запрос = СоздатьОбъект("Запрос");
ТекстПеременных =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Фирма = Регистр.ПартииТоваров.Фирма;
|Товар = Регистр.ПартииТоваров.Товар;
|Категория = Регистр.ПартииТоваров.Товар.КатегорияДляГруппировки;
|Вес = Регистр.ПартииТоваров.Товар.Вес;
|Нетто = Регистр.ПартииТоваров.Товар.Нетто;
|ТекДокумент = Регистр.ПартииТоваров.ТекущийДокумент;
|Контрагент= Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Контрагент,Регистр.ПартииТоваров.ТекущийДокумент.ПриходнаяНакладная.Контрагент;
|Количество = Регистр.ПартииТоваров.ОстатокТовара;
|Оборот = Регистр.ПартииТоваров.Оборот;
|КодОперации= Регистр.ПартииТоваров.КодОперации;
|";
ТекстГруппировок = "
|Группировка Категория без групп упорядочить по Категория.Наименование;
|";
ТекстФункций = "
|Функция КолРасход = Расход(Количество);
|Функция Сумма = Сумма(Оборот);
|Функция ВесРасход = Сумма(Запрос.КолРасход * Вес + Количество - Количество);
|Функция НеттоРасход = Сумма(Запрос.КолРасход * Нетто + Количество - Количество);
|";
ТекстУсловий = "
|Условие (Фирма = ВыбФирма);
|Условие (ПустоеЗначение(Контрагент)=0);
// |Условие (Оборот<>0);
|Условие (КодОперации В СписКодыОпераций);
|Условие (Товар в СписокТоваров);
|Условие (Контрагент в СписокКлиентов);
|"//}}ЗАПРОС
;
inna.innainna84
Извините, что влезаю в Ваше обсуждение. Чтобы Вы правильно обращались с данными регистров,
нужно знать, что в торговле, при включенном механизме фин. учета, в регистрах, ведущих суммовой
учет (в т.ч. и регистре "Партии товаров"), на каждое движение формируются две записи: одна со
значением "Фирма" (в регистре) равном зтому значению в документе и в валюте фин. учета; вторая
со значением "Фирма" равным Пустому значению справочника "Фирмы" и в валюте управленческого учета.
Какими бы ни были Ваши требования к отчету, во внутреннюю переменную запроса "Фирма" нужно выбирать
данные из регистра (а не документа - документ же в обеих случаях один и тот же) и, естественно указывать
|Условие (Фирма = ВыбФирма);
, где "ВыбФирма" или конкретная фирма или пустое значение типа "Справочник.Фирмы" иначеSerg_XX @ 14.11.16, 15:09
,
Sharzem @ 14.11.16, 0:25
,
Я посмотрела, что пишет в регистры партии товара,
1)записи дублирует фирма-пусто и фирма с данными
2)контрагент и поставщик сюда записывает только поставщика который поставлял проданный товар в этой накладной. он не записывает контрагента в этом документе. Вот почему у меня не получалось правильно сформировать данные
Срабатывало только так:
|Контрагент= Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Контрагент,Регистр.ПартииТоваров.ТекущийДокумент.ПриходнаяНакладная.Контрагент;
3)Если уж так придираться мне вообще не стоило брать из регистра партии данные для отчета,
Возникла идея Дописать и откоректировать Регистр ОборотПродаж
1) в расходной, поставить условие , что вид документа=0 тогда данные из возврата поставщику сюда не подтянутся.
2) в приходной, поставить условие , что вид документа=1 тогда данные из возврата покупателя сюда не подтянутся.
3)Провести все документы за нужный период.
inna.innainna84 @ Сегодня, 1:52
,
Инна, не лезьте туда, плиз...
Я бы Вам порекомендовал это сделать еще в предыдущей теме, но там все настолько запущено, что ппц.
Используйте то что имеете. Не лезьте в наследие авантюризма по регистру "Обороты продаж" дабы не породить еще больше проблем.
Пройдет время, изучите конфигурацию, наберетесь опыта и только тогда будете корректировать, Вам пока еще рановато.
По добавлению данных в регистр Вам нужно заключение, это смогут сделать только специалисты (по результатам полного анализа), все остальное породит только новые грабли.
ЗЫ: Мы с Вами когда-то по этому поводу уже общались. Форум Вам реально в Вашей ситуации не поможет.
Да я согласна с вами опыта у меня нет. Коректировать регистр мне поможет знакомый специалист по 1с. (Правда к нему очень трудно достучатся). Все что я делаю я сначала тестирую на копии. Спасибо огромное вам за поучения. Sharzem @ Сегодня, 15:41
,
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua