////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
//
Перем ТекСтрокаВТаблице; // текущая строка в таблице значений МФ
// используются для стандартного механизма кнопок "Обновить" и "Настройка"
Перем Таб,тзтранз;
Перем Обновить;
Перем Расшифровка;
// переменные предназначены для механизма универсальных группировок отчета
Перем СписокГруппировок;
Перем КоличествоГруппировок;
Перем НомерГруппировкиПоТМЦ;
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
//******************************************************************************
// Процедура ОбновитьСпГруппировок(спРазворачиватьПо)
Процедура ОбновитьСпГруппировок(сп)
Перем Сч,спТекЗначение,ПредставлениеГрупп;
если сп.ТекущаяСтрока() > 0 тогда
сп.ПолучитьЗначение(сп.ТекущаяСтрока(),спТекЗначение);
КонецЕсли ;
сп.УдалитьВсе();
сп.ДобавитьЗначение("НЕРАЗВОРАЧИВАТЬ" ,"<Не разворачивать> ");
сп.ДобавитьЗначение("Год" ,"Период Год");
сп.ДобавитьЗначение("Квартал","Период Квартал");
сп.ДобавитьЗначение("Месяц" ,"Период Месяц");
сп.ДобавитьЗначение("Неделя" ,"Период Неделя");
Для Сч=1 По Группировки.РазмерСписка() Цикл
Если Группировки.Пометка(Сч)=1 Тогда
ТекстГрупп = Группировки.ПолучитьЗначение(Сч,ПредставлениеГрупп);
сп.ДобавитьЗначение(ТекстГрупп, ПредставлениеГрупп );
КонецЕсли;
КонецЦикла;
Если сп.ТекущаяСтрока( сп.НайтиЗначение(спТекЗначение)) = 0 тогда
сп.ТекущаяСтрока( 1);
КонецЕсли;
КонецПроцедуры
//******************************************************************************
// ВыбратьПоФильтру()
//
// Параметры:
// Нет
//
// Описание:
// Открывает обработку отбора элементов по произвольному фильтру
//
Процедура ВыбратьПоФильтру()
Перем ВидЗначенияПодбора;
ВидЗначенияПодбора=СокрЛП(ТаблицаМФ.Вид);
Если ПустоеЗначение(ВидЗначенияПодбора)=1 Тогда
Возврат;
КонецЕсли;
СписокПараметров=СоздатьОбъект("СписокЗначений");
СписокПараметров.ДобавитьЗначение("", "ИмяВызвавшейФормы");
СписокПараметров.ДобавитьЗначение(ТаблицаМФ.Тип, "Тип");
СписокПараметров.ДобавитьЗначение(ВидЗначенияПодбора,"Вид");
СписокПараметров.ДобавитьЗначение(СписокЭлементовМФ, "Объекты");
ТаблицаМФ.ФлВкл=2;
ОткрытьФорму("Обработка.ПодборОбъектов#",СписокПараметров);
КонецПроцедуры // ВыбратьПоФильтру
//******************************************************************************
// ПерерисовкаНазванийЗакладок
//
// Параметры:
// Нет
//
// Описание:
// Добавляет "(!)" в заголовок закладки с множественным фильтром, когда этот фильтр задан
//
Функция ПерерисовкаНазванийЗакладок()
Форма.Закладки.УстановитьЗначение(2,?(глМножественныйФильтрЗадан(ТаблицаМФ)=1,"(!) ","")+"Множественный фильтр");
КонецФункции // ПерерисовкаНазванийЗакладок
//******************************************************************************
// УправлениеДиалогом()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Управление доступностью элементов диалога.
//
Процедура УправлениеДиалогом()
Если Форма.Закладки.ТекущаяСтрока() = 1 Тогда
Если (ВыбСвойствоТМЦ. Выбран()=1)
или (ВыбСвойствоПоставщика.Выбран()=1)
или (ВыбСвойствоПокупателя.Выбран()=1)
Тогда
ДопСлой = "ВыбСвойства,";
Иначе
ДопСлой = "";
КонецЕсли;
Форма.ИспользоватьСлой(ДопСлой+"Шапка,Подвал,Основной1,Основной2,Разделитель"+СокрЛП(ВидРазделителя));
Иначе
Форма.ИспользоватьСлой("Шапка,МФ,Подвал");
КонецЕсли;
КонецПроцедуры //УправлениеДиалогом()
//******************************************************************************
// РасшифровкаОбновить(Обновить)
//
// Параметры:
// Обновить = 1 - нажата кнопка "Обновить"
// 2 - нажата кнопка "Настройка"
//
// Возвращаемое значение:
// Расшифровка (список значений)
//
// Вызывается из формул элементов диалога:
// из таблицы, кнопки "Обновить" и "Настройка"
//
// Описание:
// функция для стандартного механизма кнопок ""Обновить" и "Настройка""
// помещает значение параметра в список Расшифровка и возвращает этот список
//
Функция РасшифровкаОбновить(Обновить)
Расшифровка.Установить("Обновить", Обновить);
Возврат Расшифровка;
КонецФункции //РасшифровкаОбновить()
//******************************************************************************
// ИзменениеПорядкаГрупп(НаправлениеСдвига)
//
// Параметры:
// НаправлениеСдвига = -1 - вниз
// 1 - вверх
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
// кнопки "вверх" и "вниз" рядом со списком группировок
//
// Описание:
// Процедура производит сдвиг текущей группировки в общем
// списке группировок на "НаправлениеСдвига" позиций
//
Процедура ИзменениеПорядкаГрупп(НаправлениеСдвига)
ТекСтр = Группировки.ТекущаяСтрока();
ПослСдвигСтр = Группировки.РазмерСписка();
Если не((НаправлениеСдвига = 1) и (ТекСтр = ПослСдвигСтр)) Тогда
Группировки.СдвинутьЗначение(НаправлениеСдвига, ТекСтр);
КонецЕсли;
КонецПроцедуры // ИзменениеПорядкаГрупп()
//******************************************************************************
// УстановитьГруппировкиЗапроса(ТекстЗапроса, ТекстЗагол)
//
// Параметры: ТекстЗапроса - переданный по ссылке текст запроса
// ТекстЗагол - переданный по ссылке текст заголовка
//
// Возвращаемое значение:
// Нет
//
// Описание:
// Дополняет строку запроса и заголовка в соответствии с выбранными группировками.
//
Процедура УстановитьГруппировкиЗапроса(ТекстЗапроса, ТекстЗагол)
НомерГруппировкиПоТМЦ = 9999;
СписокГруппировок = СоздатьОбъект("СписокЗначений");
Для Сч=1 По Группировки.РазмерСписка() Цикл
Если Группировки.Пометка(Сч)=1 Тогда
ПредставлениеГрупп="";
ТекстГрупп = Группировки.ПолучитьЗначение(Сч,ПредставлениеГрупп);
Если (ТекстГрупп = "Поставщик") или (ТекстГрупп = "Покупатель") или
((ТекстГрупп = "Номенклатура") и (ПоГруппам = 0)) Тогда
ТекстБезГрупп = " без групп";
Иначе
ТекстБезГрупп = "";
КонецЕсли;
Если СокрЛП(спСортироватьПо.ПолучитьЗначение(спСортироватьПо.ТекущаяСтрока())) <>"" тогда
Если (ТекстГрупп = "Документ") ИЛИ
(ТекстГрупп = "КредДок") ИЛИ
(ТекстГрупп = "Месяц")тогда
УпорядочитьПо = "";
Иначе
УпорядочитьПо = " Упорядочить по "+ СокрЛП(спСортироватьПо.ПолучитьЗначение(спСортироватьПо.ТекущаяСтрока()))+" ";
КонецЕсли;
Иначе
УпорядочитьПо = "";
КонецЕсли;
// ТекстЗапроса = ТекстЗапроса + "Группировка "+ТекстГрупп+ТекстБезГрупп+";";
ТекстЗапроса = ТекстЗапроса + "Группировка "+ТекстГрупп+УпорядочитьПо+ТекстБезГрупп+";";
ТекстЗагол = ТекстЗагол + ?(ТекстЗагол="",""," / ")+ПредставлениеГрупп;
СписокГруппировок.ДобавитьЗначение(ТекстГрупп,ПредставлениеГрупп);
Если ТекстГрупп = "Номенклатура" Тогда
НомерГруппировкиПоТМЦ = СписокГруппировок.РазмерСписка();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры // УстановитьГруппировкиЗапроса()
//******************************************************************************
//если установлена галочка транзит
Процедура ПечатьСтрокиТ(Запрос,Ном,НазваниеСекции,ПечТекстСтроки,ТекРасшифровка = "")
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ДЗ=Запрос.ТекДок;
Если ПустоеЗначение(ДЗ)=0 Тогда
Док=СоздатьОбъект("Документ");
Док.ВыбратьПодчиненныедокументы(,,ДЗ);
Если Док.ПолучитьДокумент()=1 Тогда
А=Док.Вид();
КонецЕсли;
КонецЕсли;
ПечЕд = "";
Если (Ном >= НомерГруппировкиПоТМЦ) Тогда
Если Запрос.ЭтоГруппа("Номенклатура") = 0 Тогда
ПечЕд = ?(ВидЕдиницы=1,Запрос.Номенклатура.ОсновнаяЕдиница,Запрос.Номенклатура.БазоваяЕдиница);
// БАВ 10,08,06
// ПечКол = глФРМКоличество(Запрос.СуммаКоличество - Запрос.СуммаКоличествоВ,ПечЕд);
ПечКол = глФРМКоличество(Запрос.СуммаКоличество,ПечЕд);
ПечКолВозврат = глФРМКоличество(Запрос.СуммаКоличествоВ,ПечЕд);
печКонОстПартииКолво = глФРМКоличество(Запрос.КонОстПартииКолво,ПечЕд);
Иначе
// если не в базовых единицах, то не имеет смысла количество
// БАВ 10,08,06
// ПечКол = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.СуммаКоличество - Запрос.СуммаКоличествоВ,ПечЕд));
ПечКол = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.СуммаКоличество,ПечЕд));
ПечКолВозврат = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.СуммаКоличествоВ,ПечЕд));
печКонОстПартииКолво = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.КонОстПартииКолво,ПечЕд));
КонецЕсли;
Иначе
ПечКол = "";
КонецЕсли;
ПечКол = Запрос.СуммаКоличество;
ПечКолВозврат = Запрос.СуммаКоличествоВ;
печКонОстПартииКолво = Запрос.КонОстПартииКолво;
Себест = Запрос.СуммаСебест;
СебестВозврат = Запрос.СуммаСебестВ;
ПродСт = Запрос.СуммаПродСт;
ПродСтВозврат = Запрос.СуммаПродСтВ;
Профит = ПродСт - ПродСтВозврат - (Себест - СебестВозврат);
// печОстатокКол = Запрос.КонОстКолво;
КонОстПартииСуммаРуб = Запрос.КонОстПартииСуммаРуб;
ЗнакПрофит = ?(ПродСт<0,-1,1);
ПрофитПроц = ?(Себест = 0, 0,Профит/Себест);
КонОстПродажнаяСуммаРуб = КонОстПартииСуммаРуб*(1+ПрофитПроц);
ПечСебест = глФРМ(Себест,"");
ПечСебестВозврат = глФРМ(СебестВозврат,"");
ПечПродСт = глФРМ(ПродСт,"");
ПечПродСтВозврат = глФРМ(ПродСтВозврат,"");
ПечПрофит = глФРМ(Профит,"");
ПечПрофитПроц = ?(Себест = 0, "",СокрЛ(Формат(ЗнакПрофит*Профит/Себест*100,"Ч12.2")+"%"));
// печОстатокКол = ОстатокКол;
// печОстатокСумма = глФРМ(ОстатокСумма,"");
печКонОстПартииСуммаРуб = глФРМ(КонОстПартииСуммаРуб,"");
печКонОстПродажнаяСуммаРуб= глФРМ(КонОстПродажнаяСуммаРуб,"");
//Если печОстатокКол <> печКонОстПартииКолво тогда
// Коэфф = печОстатокКол / печКонОстПартииКолво ;
// печКонОстПартииКолво = печОстатокКол;
// печКонОстПартииСуммаРуб = глФРМ(КонОстПартииСуммаРуб*Коэфф,"");
// печКонОстПродажнаяСуммаРуб= глФРМ(КонОстПродажнаяСуммаРуб*Коэфф,"");
//КонецЕсли;
//сООБЩИТЬ(НазваниеСекции);
//Lord
Если (ТолькоГруппы=1) и (Ном = НомерГруппировкиПоТМЦ) Тогда
Если (Запрос.ЭтоГруппа("Номенклатура") = 1) и (Запрос.Номенклатура.Уровень() = 1) тогда
// Если (ПечКол <> "") Или (ПечЕд <> "") Тогда Возврат; КонецЕсли;
Таб.ВывестиСекцию(НазваниеСекции);
КонецЕсли;
Иначе
Таб.ВывестиСекцию(НазваниеСекции);
КонецЕсли;
глОживить(1);
КонецПроцедуры
// ПечатьСтроки(Запрос,Ном,НазваниеСекции,ПечТекстСтроки,ТекРасшифровка)
//
// Параметры:
// Запрос - объект "Запрос", на основании которого строится отчет
// Ном - Номер группировки запроса (Число)
// НазваниеСекции - название секции, которую следует использовать (Строка)
// ПечТекстСтроки - текстовое представление текущей строки
// ТекРасшифровка - расшифровка текущей строки
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Производит вывод в печатную форму одной строки запроса.
//
Процедура ПечатьСтроки(Запрос,Ном,НазваниеСекции,ПечТекстСтроки,ТекРасшифровка = "")
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ДЗ=Запрос.ТекДок;
Если ПустоеЗначение(ДЗ)=0 Тогда
Док=СоздатьОбъект("Документ");
Док.ВыбратьПодчиненныедокументы(,,ДЗ);
Если Док.ПолучитьДокумент()=1 Тогда
А=Док.Вид();
КонецЕсли;
КонецЕсли;
ПечЕд = "";
Если (Ном >= НомерГруппировкиПоТМЦ) Тогда
Если Запрос.ЭтоГруппа("Номенклатура") = 0 Тогда
ПечЕд = ?(ВидЕдиницы=1,Запрос.Номенклатура.ОсновнаяЕдиница,Запрос.Номенклатура.БазоваяЕдиница);
// БАВ 10,08,06
// ПечКол = глФРМКоличество(Запрос.СуммаКоличество - Запрос.СуммаКоличествоВ,ПечЕд);
ПечКол = глФРМКоличество(Запрос.СуммаКоличество,ПечЕд);
ПечКолВозврат = глФРМКоличество(Запрос.СуммаКоличествоВ,ПечЕд);
печКонОстПартииКолво = глФРМКоличество(Запрос.КонОстПартииКолво,ПечЕд);
Иначе
// если не в базовых единицах, то не имеет смысла количество
// БАВ 10,08,06
// ПечКол = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.СуммаКоличество - Запрос.СуммаКоличествоВ,ПечЕд));
ПечКол = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.СуммаКоличество,ПечЕд));
ПечКолВозврат = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.СуммаКоличествоВ,ПечЕд));
печКонОстПартииКолво = ?(ВидЕдиницы=1,"",глФРМКоличество(Запрос.КонОстПартииКолво,ПечЕд));
КонецЕсли;
Иначе
ПечКол = "";
КонецЕсли;
ПечКол = Запрос.СуммаКоличество;
ПечКолВозврат = Запрос.СуммаКоличествоВ;
печКонОстПартииКолво = Запрос.КонОстПартииКолво;
Себест = Запрос.СуммаСебест;
СебестВозврат = Запрос.СуммаСебестВ;
ПродСт = Запрос.СуммаПродСт;
ПродСтВозврат = Запрос.СуммаПродСтВ;
Профит = ПродСт - ПродСтВозврат - (Себест - СебестВозврат);
// печОстатокКол = Запрос.КонОстКолво;
КонОстПартииСуммаРуб = Запрос.КонОстПартииСуммаРуб;
ЗнакПрофит = ?(ПродСт<0,-1,1);
ПрофитПроц = ?(Себест = 0, 0,Профит/Себест);
КонОстПродажнаяСуммаРуб = КонОстПартииСуммаРуб*(1+ПрофитПроц);
ПечСебест = глФРМ(Себест,"");
ПечСебестВозврат = глФРМ(СебестВозврат,"");
ПечПродСт = глФРМ(ПродСт,"");
ПечПродСтВозврат = глФРМ(ПродСтВозврат,"");
ПечПрофит = глФРМ(Профит,"");
ПечПрофитПроц = ?(Себест = 0, "",СокрЛ(Формат(ЗнакПрофит*Профит/Себест*100,"Ч12.2")+"%"));
// печОстатокКол = ОстатокКол;
// печОстатокСумма = глФРМ(ОстатокСумма,"");
печКонОстПартииСуммаРуб = глФРМ(КонОстПартииСуммаРуб,"");
печКонОстПродажнаяСуммаРуб= глФРМ(КонОстПродажнаяСуммаРуб,"");
//Если печОстатокКол <> печКонОстПартииКолво тогда
// Коэфф = печОстатокКол / печКонОстПартииКолво ;
// печКонОстПартииКолво = печОстатокКол;
// печКонОстПартииСуммаРуб = глФРМ(КонОстПартииСуммаРуб*Коэфф,"");
// печКонОстПродажнаяСуммаРуб= глФРМ(КонОстПродажнаяСуммаРуб*Коэфф,"");
//КонецЕсли;
//сООБЩИТЬ(НазваниеСекции);
//Lord
Если (ТолькоГруппы=1) и (Ном = НомерГруппировкиПоТМЦ) Тогда
Если (Запрос.ЭтоГруппа("Номенклатура") = 1) и (Запрос.Номенклатура.Уровень() = 1) тогда
// Если (ПечКол <> "") Или (ПечЕд <> "") Тогда Возврат; КонецЕсли;
Таб.ВывестиСекцию(НазваниеСекции);
КонецЕсли;
Иначе
Таб.ВывестиСекцию(НазваниеСекции);
КонецЕсли;
глОживить(1);
КонецПроцедуры //ПечатьСтроки()
//******************************************************************************
// ВывестиГруппировку(Запрос,Ном)
//
// Параметры:
// Запрос - объект "Запрос"
// Ном - номер выводимой группировки
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
//
// Описание:
// Выводит в печатную форму одну группировку запроса. Если
// Есть нижележащие группировки, они выводятся также с использованием рекурсивного
// вызова этой же процедуры.
//
Процедура ВывестиГруппировку(Запрос,Ном)
Если Ном <= КоличествоГруппировок Тогда
НазваниеГруппировки = СписокГруппировок.ПолучитьЗначение(Ном);
Пока Запрос.Группировка(Ном) = 1 Цикл
Если НазваниеГруппировки = "Документ" Тогда
НазваниеСекции="Документ";
// БАВ ИначеЕсли Запрос.ЭтоГруппа(НазваниеГруппировки) = 1 Тогда
ИначеЕсли Ном < КоличествоГруппировок Тогда
НазваниеСекции="Строка"+СокрЛП(Ном)+"Г";
Иначе
НазваниеСекции="Строка"+Ном;
КонецЕсли;
ПечТекстСтроки = Запрос.ПолучитьАтрибут(НазваниеГруппировки);
Расшифровка = ПечТекстСтроки;
Если НазваниеГруппировки = "Документ" Тогда
ПечТекстСтроки = ""+глНазваниеДокументаВЖурнале(ПечТекстСтроки)+" № "+ПечТекстСтроки.НомерДок;
ИначеЕсли НазваниеГруппировки = "Номенклатура" Тогда
ПечТекстСтроки = "" + ПечТекстСтроки + ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(Запрос.Номенклатура.Артикул), "")
КонецЕсли;
ПечТекстСтроки = ?(ПустоеЗначение(ПечТекстСтроки)=1,глПредставлениеПустогоЗначения(НазваниеГруппировки),ПечТекстСтроки);
Если (НазваниеГруппировки="Номенклатура") и (Транзит=1) и (СОКРЛП(Запрос.Фирма)="ИП Демина Галина Алексеевна") Тогда
ПечатьСтрокиТ(Запрос,Ном,НазваниеСекции,ПечТекстСтроки,Расшифровка);
КонецЕсли;
Для нГрп = 1 по Ном-1 Цикл
ПечТекстСтроки = " "+ПечТекстСтроки;
КонецЦикла;
//Если НазваниеГруппировки = "Номенклатура" Тогда
// Если (ТолькоГруппы = 0 ) или (Запрос.Номенклатура.Уровень() = 1) тогда
// ПечатьСтроки(Запрос,Ном,НазваниеСекции,ПечТекстСтроки,Расшифровка);
// КонецЕсли;
//Иначе
ПечатьСтроки(Запрос,Ном,НазваниеСекции,ПечТекстСтроки,Расшифровка);
//КонецЕсли;
// если есть более детальная группировка - выведем ее
Если КоличествоГруппировок > Ном Тогда
ВывестиГруппировку(Запрос,Ном+1);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры // ВывестиГруппировку()
//******************************************************************************
// Сформировать(ЗакрытьДиалог=0)
//
// Параметры:
// ЗакрытьДиалог - флаг того, что после формирования отчета надо закрыть диалог
//
// Возвращаемое значение:
// Нет
//
// Вызывается из формул элементов диалога:
// кнопки "Сформировать" и "ОК"
//
// Описание:
// Запускает отчет.
//
Процедура Сформировать(ЗакрытьДиалог=0)
Перем Запрос, ТекстЗапроса;
Если глПроверкаДаты(ДатаНачала,ДатаКонца)=0 Тогда
Возврат;
КонецЕсли;
Если (ТипЗначенияСтр(Таб) <> "Таблица") ИЛИ (Обновить = 0) Тогда
Таб = СоздатьОбъект("Таблица");
Иначе
Таб.Очистить();
КонецЕсли;
Таб.ИсходнаяТаблица( "АнализПродаж" );
// Здесь формируется отчет, который использует регистры, критичные к
// последовательности проведения документов
// поэтому сравним установленные даты периода формируемого отчета с ГП
// Если глПроверкаАктуальностиОтчета(ДатаНачала,ДатаКонца,Последовательность.ОсновнаяПоследовательность)=0 Тогда
// Возврат;
// КонецЕсли;
Расшифровка = СоздатьОбъект("СписокЗначений");
Расшифровка.Установить("Отчет", "АнализПродаж");
// все настройки помещаем в список
Расшифровка.Установить("ДатаНачала", ДатаНачала);
Расшифровка.Установить("ДатаКонца", ДатаКонца);
Расшифровка.Установить("ВыбРазделитель1",ВыбРазделитель1);
Расшифровка.Установить("ВыбРазделитель2",ВыбРазделитель2);
Расшифровка.Установить("ВыбРазделитель3",ВыбРазделитель3);
Расшифровка.Установить("ВидРазделителя",ВидРазделителя);
Расшифровка.Установить("ВыбТМЦ", ВыбТМЦ);
Расшифровка.Установить("ВыбПокупатель", ВыбПокупатель);
Расшифровка.Установить("ВыбПоставщик", ВыбПоставщик);
Расшифровка.Установить("Группировки", Группировки);
Расшифровка.Установить("ВидЕдиницы", ВидЕдиницы);
Расшифровка.Установить("ПоГруппам", ПоГруппам);
Расшифровка.Установить("ВыбСвойствоТМЦ", ВыбСвойствоТМЦ);
Расшифровка.Установить("ВыбСвойствоПокупателя", ВыбСвойствоПокупателя);
Расшифровка.Установить("ВыбСвойствоПоставщика", ВыбСвойствоПоставщика);
глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); // записываем изменения если они были
// запомним МФ только если он задан
Если глМножественныйФильтрЗадан(ТаблицаМФ) = 1 Тогда
Расшифровка.Установить("ТаблицаМФ", ТаблицаМФ);
КонецЕсли;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНачала по ДатаКонца;
|Фирма = Регистр.Продажи.Фирма,
|Регистр.ОстаткиТМЦ.Фирма,
|Регистр.ПартииНаличие.Фирма;
|МОЛ = Регистр.ПартииНаличие.Мол;
|УпрАналитика = Регистр.Продажи.Фирма.УпрАналитика;
|ЮрЛицо = Регистр.Продажи.Фирма.ЮрЛицо;
|Покупатель = Регистр.Продажи.Покупатель;
|СвойствоПок = Регистр.Продажи.Покупатель.ОсновноеСвойство.ЗначениеСвойства;
|Номенклатура = Регистр.Продажи.Номенклатура,
|Регистр.ОстаткиТМЦ.Номенклатура,
|Регистр.ПартииНаличие.Партия.Владелец,
|Регистр.ПартииНаличие.Номенклатура;
|СвойствоТМЦ = Регистр.Продажи.Номенклатура.ОсновноеСвойство.ЗначениеСвойства,
|Регистр.ОстаткиТМЦ.Номенклатура.ОсновноеСвойство.ЗначениеСвойства,
|Регистр.ПартииНаличие.Номенклатура.ОсновноеСвойство.ЗначениеСвойства;
|Поставщик = Регистр.Продажи.Поставщик,
|Регистр.ПартииНаличие.Партия.Поставщик;
|ТекДок= Регистр.партииналичие.текущийдокумент,
| Регистр.продажи.текущийдокумент;
|СвойствоПост = Регистр.Продажи.Поставщик.ОсновноеСвойство.ЗначениеСвойства;
|";
ЕстьАвтор = 0;
ЕстьПроект = 0;
ЕстьПроизводитель= 0;
НомСтроки = 0;
НомКолонки = 0;
// Проверка на необходимость включения в запрос переменной "Автор"
// Сначала проверим, есть ли множественный фильтр по автору.
Если ТаблицаМФ.НайтиЗначение("Автор", НомСтроки, НомКолонки) = 1 Тогда
Если ТаблицаМФ.ПолучитьЗначение(НомСтроки, "ФлВкл") = 2 Тогда
ЕстьАвтор = 1;
КонецЕсли;
КонецЕсли;
// Если фильтра нет, то возможно есть группировка
Если ЕстьАвтор = 0 Тогда
НомСтроки = Группировки.НайтиЗначение("Автор");
Если НомСтроки > 0 Тогда
Если Группировки.Пометка(НомСтроки)=1 Тогда
ЕстьАвтор = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Проверка на необходимость включения в запрос переменной "Производитель"
// Сначала проверим, есть ли множественный фильтр по Производитель\ю.
Если ТаблицаМФ.НайтиЗначение("ПроизводительТМЦ", НомСтроки, НомКолонки) = 1 Тогда
Если ТаблицаМФ.ПолучитьЗначение(НомСтроки, "ФлВкл") = 2 Тогда
ЕстьПроизводитель = 1;
КонецЕсли;
КонецЕсли;
// Если фильтра нет, то возможно есть группировка
Если ЕстьАвтор = 0 Тогда
НомСтроки = Группировки.НайтиЗначение("ПроизводительТМЦ");
Если НомСтроки > 0 Тогда
Если Группировки.Пометка(НомСтроки)=1 Тогда
ЕстьПроизводитель = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Проверка на необходимость включения в запрос переменной "Проект"
НомСтроки = 0;
НомКолонки = 0;
Если ТаблицаМФ.НайтиЗначение("Проект", НомСтроки, НомКолонки) = 1 Тогда
Если ТаблицаМФ.ПолучитьЗначение(НомСтроки, "ФлВкл") = 2 Тогда
ЕстьПроект = 1;
КонецЕсли;
КонецЕсли;
Если ЕстьПроект = 0 Тогда
НомСтроки = Группировки.НайтиЗначение("Проект");
Если НомСтроки > 0 Тогда
Если Группировки.Пометка(НомСтроки)=1 Тогда
ЕстьПроект = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЕстьАвтор=1 Тогда
ТекстЗапроса = ТекстЗапроса +
"
|Автор = Регистр.Продажи.ТекущийДокумент.Автор;";
КонецЕсли;
Если ЕстьПроект=1 Тогда
ТекстЗапроса = ТекстЗапроса +
"
// |Проект = Регистр.Продажи.ТекущийДокумент.Проект;";
|Проект = Регистр.Продажи.ТекущийДокумент.Реализация.Договор.Проект,
|Регистр.Продажи.ТекущийДокумент.ВозвратОтПокупателя.Договор.Проект,
|Регистр.ПартииНаличие.ТекущийДокумент.Реализация.Договор.Проект,
|Регистр.ПартииНаличие.ТекущийДокумент.ВозвратОтПокупателя.Договор.Проект;";
КонецЕсли;
Если ЕстьПроизводитель=1 Тогда
ТекстЗапроса = ТекстЗапроса +
"
|ПроизводительТМЦ = Регистр.Продажи.Номенклатура.Родитель.Производитель,Регистр.Продажи.Номенклатура.Производитель,
|Регистр.ОстаткиТМЦ.Номенклатура.Родитель.Производитель,Регистр.ОстаткиТМЦ.Номенклатура.Производитель,
|Регистр.ПартииНаличие.Номенклатура.Родитель.Производитель,Регистр.ПартииНаличие.Номенклатура.Производитель;
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса +
"
|Себест = Регистр.Продажи.Себестоимость;
|Количество = Регистр.Продажи.Количество;
|ПродСт = Регистр.Продажи.ПродСтоимость;
|СебестВ = Регистр.Продажи.СебестоимостьВ;
|КоличествоВ = Регистр.Продажи.КоличествоВ;
|ПродСтВ = Регистр.Продажи.ПродСтоимостьВ;
// БАВ
|ОстКолво = Регистр.ОстаткиТМЦ.Количество;
// |ОстЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод;
//
|ПартииКолво = Регистр.ПартииНаличие.Количество;
|ПартииСуммаРуб = Регистр.ПартииНаличие.СуммаРуб;
//
|Функция СуммаСебест = Сумма(Себест);
|Функция СуммаКоличество = Сумма(Количество);
|Функция СуммаПродСт = Сумма(ПродСт);
|Функция СуммаСебестВ = Сумма(СебестВ);
|Функция СуммаКоличествоВ = Сумма(КоличествоВ);
|Функция СуммаПродСтВ = Сумма(ПродСтВ);
//
|Функция КонОстПартииКолво = КонОст(ПартииКолво);
|Функция КонОстПартииСуммаРуб = КонОст(ПартииСуммаРуб);";
// Если ВыбСклад.Выбран() = 1 Тогда
// ТекстЗапроса = ТекстЗапроса +"
// |Функция КонОстКолво = КонОст(ОстКолво) когда (Склад = ВыбСклад);";
//
// КонецЕсли;
Загол="";
НетОш = 1; // нет ошибок при наложении фильтров
Если ВидРазделителя = 1 Тогда
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",ВыбРазделитель1,"ВыбРазделитель1",ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",,,ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",,,ТекстЗапроса,Загол);
ИначеЕсли ВидРазделителя = 2 Тогда
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",ВыбРазделитель2,"ВыбРазделитель2",ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",,,ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",,,ТекстЗапроса,Загол);
ИначеЕсли ВидРазделителя = 3 Тогда
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",ВыбРазделитель3,"ВыбРазделитель3",ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",,,ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",,,ТекстЗапроса,Загол);
КонецЕсли;
//Если ВыбСклад.Выбран()=1 Тогда
// Загол = Загол+" Остатки по складу: "+ВыбСклад+".";
//
//КонецЕсли;
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "МОЛ",ВыбСклад, "ВыбСклад",ТекстЗапроса,Загол,"СвойстваНоменклатуры");
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",ВыбТМЦ, "ВыбТМЦ",ТекстЗапроса,Загол,"СвойстваНоменклатуры");
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Поставщик", ВыбПоставщик, "ВыбПоставщик",ТекстЗапроса,Загол,"СвойстваКонтрагентов");
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Покупатель", ВыбПокупатель, "ВыбПокупатель",ТекстЗапроса,Загол,"СвойстваКонтрагентов");
Если (ВыбСвойствоТМЦ.Выбран() = 1) Тогда
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "СвойствоТМЦ", ВыбСвойствоТМЦ, "ВыбСвойствоТМЦ", ТекстЗапроса,Загол);
КонецЕсли;
Если (ВыбСвойствоПоставщика.Выбран() = 1) Тогда
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "СвойствоПост",ВыбСвойствоПоставщика,"ВыбСвойствоПоставщика",ТекстЗапроса,Загол);
КонецЕсли;
Если (ВыбСвойствоПокупателя.Выбран() = 1) Тогда
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "СвойствоПок", ВыбСвойствоПокупателя,"ВыбСвойствоПокупателя",ТекстЗапроса,Загол);
КонецЕсли;
Если НетОш = 0 Тогда
Возврат;
КонецЕсли;
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Автор", , ,ТекстЗапроса,Загол,"Автор");
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Проект", , ,ТекстЗапроса,Загол,"Проект");
ПечЗаголовок = "Общий Анализ продаж ("+глДоллары.Наименование+")";
ПечЗаголовокСтолбца = "";
УстановитьГруппировкиЗапроса(ТекстЗапроса, ПечЗаголовокСтолбца);
КоличествоГруппировок = СписокГруппировок.РазмерСписка();
Если КоличествоГруппировок > 5 Тогда
Предупреждение("Нельзя сделать больше 5 группировок!",60);
Возврат;
КонецЕсли;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
ТЗТранз=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(Тзтранз,,);
ТЗТранз.выбратьстроку();
глЧислоСтрок = 0;
Таб.ВывестиСекцию("Кнопки");
НачПовт = Таб.ВысотаСекции("Кнопки");
Таб.ВывестиСекцию("Шапка");
НачПовт = НачПовт + Таб.ВысотаСекции("Шапка");
Таб.ВывестиСекцию("ЗаголовокТаблицы");
КонПовт = НачПовт + Таб.ВысотаСекции("ЗаголовокТаблицы");
Таб.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);
глОживить(1);
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0, "АнализПродаж", "АнализПродаж");
// ВЫВОД ГРУППИРОВОК ЗАПРОСА
ВывестиГруппировку(Запрос,1);
ПечатьСтроки(Запрос,0,"Всего","Всего:");
Таб.ОбластьПечати(3);
// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Если глПолучитьПолномочие("РазрешитьРедактированиеТаблиц") = 0 Тогда
Таб.Защита(1);
КонецЕсли;
Таб.Показать("Анализ продаж", "");
Если (Обновить = 2)ИЛИ(ЗакрытьДиалог=1) Тогда
СтрокаДействийФормы = "#Закрыть";
КонецЕсли;
Если Вэксель=1 Тогда
ФВ=КаталогПользователя()+"report_"+ДатаЧисло(ТекущаяДата());
Таб.Записать(ФВ,1);
Предупреждение("Прайс будет сохранен под именем "+СОКРЛП(ФВ));
КонецЕсли
КонецПроцедуры // Сформировать()
////////////////////////////////////////////////////////////////////////////////
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ
//
//******************************************************************************
// Предопределенная процедура
//
Процедура ПриОткрытии(ФлагВосстановленияНастройки)
// тип вид переменная название
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Номенклатура", "Номенклатура", "По номенклатуре");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Контрагенты", "Поставщик", "По поставщикам");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Контрагенты", "Покупатель", "По покупателям");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","ЗначенияСвойств", "Номенклатура", "По свойствам номенклатуры");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","ЗначенияСвойств", "Поставщик", "По свойствам поставщиков");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","ЗначенияСвойств", "Покупатель", "По свойствам покупателей");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Пользователи", "Автор", "По авторам документов");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Проекты", "Проект", "По проектам");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","Фирмы", "Фирма", "По фирмам");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","СвоиЮрЛица", "ЮрЛицо", "По юр. лицам");
глДобавитьВТаблицуМФ(ТаблицаМФ,"Справочник","УпрАналитика", "УпрАналитика", "По упр. аналитике");
Если ФлагВосстановленияНастройки = 0 Тогда
ВидРазделителя = 1;
ВидЕдиницы = 1;
ПоГруппам = 1;
ДатаНачала = глЗначениеПоУмолчанию("ОсновнаяДатаНачалаОтчетов");
Если ПустоеЗначение(ДатаНачала) = 1 Тогда
ДатаНачала = НачМесяца(ДатаКонца);
КонецЕсли;
КонецЕсли;
Если глФлагРасшифровки = 1 Тогда
Обновить = глОбновить;
// восстанавливаем настройки из списка
ДатаНачала = глРасшифровка.Получить("ДатаНачала");
ДатаКонца = глРасшифровка.Получить("ДатаКонца");
ВидРазделителя = глРасшифровка.Получить("ВидРазделителя");
ВыбРазделитель1 = глРасшифровка.Получить("ВыбРазделитель1");
ВыбРазделитель2 = глРасшифровка.Получить("ВыбРазделитель2");
ВыбРазделитель3 = глРасшифровка.Получить("ВыбРазделитель3");
ВыбПокупатель = глРасшифровка.Получить("ВыбПокупатель");
ВыбПоставщик = глРасшифровка.Получить("ВыбПоставщик");
ВыбТМЦ = глРасшифровка.Получить("ВыбТМЦ");
ВыбСвойствоТМЦ = глРасшифровка.Получить("ВыбСвойствоТМЦ");
ВыбСвойствоПокупателя = глРасшифровка.Получить("ВыбСвойствоПокупателя");
ВыбСвойствоПоставщика = глРасшифровка.Получить("ВыбСвойствоПоставщика");
глРасшифровка.Получить("Группировки").Выгрузить(Группировки);
ВидЕдиницы = глРасшифровка.Получить("ВидЕдиницы");
ПоГруппам = глРасшифровка.Получить("ПоГруппам");
Если ТипЗначенияСтр(глРасшифровка.Получить("ТаблицаМФ"))="ТаблицаЗначений" Тогда
ТаблицаМФ.Загрузить(глРасшифровка.Получить("ТаблицаМФ"));
КонецЕсли;
Если Обновить <> 0 Тогда
Таб = глТаблица;
КонецЕсли;
Если Обновить <> 2 Тогда
Сформировать();
СтатусВозврата(0);
Возврат;
КонецЕсли;
Иначе
Обновить = 0;
КонецЕсли;
ПерерисовкаНазванийЗакладок();
ТаблицаМФ.ВидимостьКолонки("Тип",0);
ТаблицаМФ.ВидимостьКолонки("Вид",0);
ТаблицаМФ.ВидимостьКолонки("СписокЭлементов",0);
ТаблицаМФ.ВидимостьКолонки("ТипМФ",0);
ТаблицаМФ.ВидимостьКолонки("ИмяПеременной",0);
ТаблицаМФ.ВыводитьПиктограммы("ФлВкл");
УправлениеДиалогом();
КонецПроцедуры // ПриОткрытии()
//******************************************************************************
// Предопределенная процедура.
//
Процедура ПриЗакрытии()
// записываем изменения если они были
глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст);
КонецПроцедуры // ПриЗакрытии()
//******************************************************************************
// Предопределенная процедура.
Процедура ВводНового()
// эта предопределенная процедура выполняется при восстановлении настройки
ПерерисовкаНазванийЗакладок();
УправлениеДиалогом();
ТаблицаМФ.ВыводитьПиктограммы("ФлВкл");
КонецПроцедуры // ВводНового()
//******************************************************************************
// Предопределенная процедура
//
Процедура ПриВыбореЗакладки(Номер,Значение)
// закладки
Если Номер=1 Тогда
глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); // записываем изменения если они были
КонецЕсли;
УправлениеДиалогом();
ПерерисовкаНазванийЗакладок();
КонецПроцедуры // ПриВыбореЗакладки
//******************************************************************************
// Предопределенная процедура
//
Процедура ОбработкаПодбора(Значение)
Если (СписокЭлементовМФ.НайтиЗначение(Значение)=0) Тогда
Представление=""+Значение;
Если ТипЗначенияСтр(Значение)="Справочник" Тогда
Если СокрЛП(Метаданные.Справочник(Значение.Вид()).Владелец) <> "Метаданные" Тогда
Представление=Представление+" ("+Значение.Владелец+")";
КонецЕсли;
КонецЕсли;
СписокЭлементовМФ.ДобавитьЗначение(Значение,Представление);
ТаблицаМФ.ФлВкл=2;
КонецЕсли;
КонецПроцедуры // ОбработкаПодбора
////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
//
ДатаНачала = НачМесяца(ПолучитьДатуТА());
ДатаКонца = ПолучитьДатуТА();
// инициализация переменных множественного фильтра
ТипМФ.УдалитьВсе();
ТипМФ.ДобавитьЗначение("одно из");
ТипМФ.ДобавитьЗначение("все кроме");
ТаблицаМФ.УдалитьСтроки();
Пока ТаблицаМФ.КоличествоКолонок()>0 Цикл
ТаблицаМФ.УдалитьКолонку(1);
КонецЦикла;
ТаблицаМФ.НоваяКолонка("Тип");
ТаблицаМФ.НоваяКолонка("Вид");
ТаблицаМФ.НоваяКолонка("ИмяПеременной");
ТаблицаМФ.НоваяКолонка("СписокЭлементов"); // список элементов, по которым производим фильтрацию
ТаблицаМФ.НоваяКолонка("ТипМФ"); // текущая строка списка ТипМФ
ТаблицаМФ.НоваяКолонка("ФлВкл","Число",1,,"Вкл",5,,); // фильтр включен ("1" или "0")
ТаблицаМФ.НоваяКолонка("Представление",,,,"Вид фильтра:");
ТаблицаМФ.ВыводитьПиктограммы("ФлВкл");
ТекСтрокаВТаблице="";
// Инициализируем закладки
Форма.ИспользоватьЗакладки(1);
Форма.Закладки.ДобавитьЗначение(1,"Основная");
Форма.Закладки.ДобавитьЗначение(2,"Множественный фильтр");
Форма.Закладки.ТекущаяСтрока(1);
Группировки.ДобавитьЗначение("Фирма", "Фирма");
Группировки.ДобавитьЗначение("СвойствоПок", "Свойство покупателя");
Группировки.ДобавитьЗначение("Покупатель", "Покупатель");
Группировки.ДобавитьЗначение("СвойствоПост","Свойство поставщика");
Группировки.ДобавитьЗначение("Поставщик", "Поставщик");
Группировки.ДобавитьЗначение("СвойствоТМЦ", "Свойство номенклатуры");
Группировки.ДобавитьЗначение("Номенклатура","Номенклатура");
Группировки.ДобавитьЗначение("ПроизводительТМЦ","Производитель номенклатуры");
Группировки.ДобавитьЗначение("Автор", "Авторы документов");
Группировки.ДобавитьЗначение("Проект", "Проекты");
Группировки.ДобавитьЗначение("Месяц", "Период Месяц");
Группировки.ДобавитьЗначение("День", "Период День");
Группировки.ДобавитьЗначение("Документ", "Документы движения");
Группировки. Пометка(6,1);
ОбновитьСпГруппировок(спРазворачиватьПо);
спСортироватьПо.ДобавитьЗначение("","< не сортировть>");
спСортироватьПо.ДобавитьЗначение("СуммаКоличество" ,"Количество продаж");
спСортироватьПо.ДобавитьЗначение("СуммаПродСт" ,"Сумма продаж");
спСортироватьПо.ДобавитьЗначение("СуммаКоличествоВ" ,"Количество возврата");
спСортироватьПо.ДобавитьЗначение("СуммаПродСтВ" ,"Сумма возврата");
спСортироватьПо.ДобавитьЗначение("КонОстПартииКолво","Количество остаток");
спСортироватьПо.ДобавитьЗначение("КонОстПартииСуммаРуб" ,"Сумма остаток");
//