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