Не работает отбор по подразделению во внешнем отчете

Новая тема
"во внешнем отчете не работает отбор по подразделению. то есть когда в самой 1С Предприятие выбираешь какое-нибудь подразделение, он должен выводить отчет только по выбранному подразделению, а выводит все равно по всем.
вот код в конфигурации:
Процедура КнопкаСформироватьНажатие(Кнопка)
 
  струслном="""";
  Если ЗначениеЗаполнено(ВыбКонтрагент) Тогда
     Если ТипЗнч(ВыбКонтрагент) = Тип("СписокЗначений") Тогда
        струслном = "Субконто1 В (&ВыбКонтрагент)";
     ИначеЕсли ВыбКонтрагент.ЭтоГруппа Тогда
        струслном = "Субконто1 В ИЕРАРХИИ (&ВыбКонтрагент)";
     Иначе
        струслном = "Субконто1 = &ВыбКонтрагент";        
     КонецЕсли;
  КонецЕсли;  
  струсл = """";
  Если ЗначениеЗаполнено(ВыбПодразделение) Тогда
     Если струсл="""" Тогда
        струсл = "Субконто2.Подразделение = &ВыбПодразделение";
     Иначе
        струсл = струсл+  "И Субконто2.Подразделение = &ВыбПодразделение";
     КонецЕсли;  
  КонецЕсли;  
 
  Запрос = Новый Запрос("ВЫБРАТЬ
  |   ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
  |   МАКСИМУМ(ЕстьNULL(ХозрасчетныйОстатки.Субконто3.Дата,&ПустаяДата)) КАК ДатаВозникновенияДолга,
  |   СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК СуммаОстаток,
  |   ВЫБОР
  |      КОГДА ХозрасчетныйОстатки.Субконто2 ССЫЛКА Справочник.ДоговорыКонтрагентов
  |         ТОГДА ВЫБОР
  |               КОГДА ХозрасчетныйОстатки.Субконто2 = &ПустойДоговор
  |                  ТОГДА &ПустоеПодр
  |               ИНАЧЕ ХозрасчетныйОстатки.Субконто2.Подразделение
  |            КОНЕЦ
  |      ИНАЧЕ &Бухгалтерия
  |   КОНЕЦ КАК Субконто2Подразделение,
  |   ХозрасчетныйОстатки.Счет
  |ИЗ
  |   РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов), , ) КАК ХозрасчетныйОстатки
  |
  |СГРУППИРОВАТЬ ПО
  |   ХозрасчетныйОстатки.Субконто1,
  |   ХозрасчетныйОстатки.Счет,
  |   ВЫБОР
  |      КОГДА ХозрасчетныйОстатки.Субконто2 ССЫЛКА Справочник.ДоговорыКонтрагентов
  |         ТОГДА ВЫБОР
  |               КОГДА ХозрасчетныйОстатки.Субконто2 = &ПустойДоговор
  |                  ТОГДА &ПустоеПодр
  |               ИНАЧЕ ХозрасчетныйОстатки.Субконто2.Подразделение
  |            КОНЕЦ
  |      ИНАЧЕ &Бухгалтерия
  |   КОНЕЦ
  |
  |УПОРЯДОЧИТЬ ПО
  |   Субконто2Подразделение,
  |   Контрагент,
  |   ДатаВозникновенияДолга
  |ИТОГИ
  |   СУММА(СуммаОстаток)
  |ПО
  |   Субконто2Подразделение,
  |   Контрагент");
 
  Запрос.УстановитьПараметр("ДатаКон",КонецДня(ВыбДатаКон));
  СписокСчетов = новый СписокЗначений;
  СписокСчетов2= новый СписокЗначений;
  для каждого стр из ТЗСчетов Цикл
     если стр.ФлИспользования Тогда
        СписокСчетов.Добавить(стр.Счет);
        ВидыСубконтоСчета = стр.Счет.ВидыСубконто;
        Если  ВидыСубконтоСчета.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРасчетовСКонтрагентами,"ВидСубконто")=Неопределено Тогда            
           СписокСчетов2.Добавить(стр.Счет);
        КонецЕсли;
     КонецЕсли;  
  КонецЦикла;  
 
  Запрос.УстановитьПараметр("Бухгалтерия",Справочники.ПодразделенияОрганизаций.НайтиПоКоду("4"));
  Запрос.УстановитьПараметр("ПустоеПодр",Справочники.ПодразделенияОрганизаций.ПустаяСсылка());
  Запрос.УстановитьПараметр("ПустойДоговор",Справочники.ДоговорыКонтрагентов.ПустаяСсылка());  
  Запрос.УстановитьПараметр("ПустаяДата",Дата('00010101'));  
 
  Запрос.УстановитьПараметр("СписокСчетов",СписокСчетов);
 
 
  Если ЗначениеЗаполнено(ВыбКонтрагент) Тогда
     Запрос.УстановитьПараметр("ВыбКонтрагент",ВыбКонтрагент);
  КонецЕсли;
 
  Если ЗначениеЗаполнено(ВыбПодразделение) Тогда
     Запрос.УстановитьПараметр("ВыбПодразделение",ВыбПодразделение);  
  КонецЕсли;  
     
  //сделаем дополнительный запрос
  //сумма обборота по счетам
  ЗапросДоп = новый Запрос("ВЫБРАТЬ
  |   ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
  |   ХозрасчетныйОбороты.Счет КАК Счет,
  |   ХозрасчетныйОбороты.Регистратор.Дата КАК РегистраторДата,
  |   ХозрасчетныйОбороты.Регистратор КАК Регистратор,
  |   ХозрасчетныйОбороты.СуммаОборот КАК Сумма
  |ИЗ
  |   РегистрБухгалтерии.Хозрасчетный.Обороты(, &ДатаКон, Регистратор, Счет В (&СписокСчетов), , , , ) КАК ХозрасчетныйОбороты
  |
  |УПОРЯДОЧИТЬ ПО
  |   Субконто1,
  |   РегистраторДата УБЫВ");
 
  ЗапросДоп.УстановитьПараметр("ДатаКон", КонецДня(ВыбДатаКон));
  ЗапросДоп.УстановитьПараметр("СписокСчетов", СписокСчетов2);
  ТЗДоп = ЗапросДоп.Выполнить().Выгрузить();
 
  Таб = Новый ТабличныйДокумент;
  Таб.ТолькоПросмотр = Истина;
  таб.ОтображатьЗаголовки = ложь;
  таб.ОтображатьСетку = ложь;
  Макет = ПолучитьМакет("Долги");
  ОблЗ = макет.ПолучитьОбласть("Заголовок");
  ОблЗ.Параметры.ДатаКон = Формат(ВыбДатаКон,"ДФ=dd.MM.yyyy");
 
  ОблШ =  Макет.ПолучитьОбласть("Шапка");
  ОблПодразделение = Макет.ПолучитьОбласть("Подразделение");
  ОблИтПодразделение = Макет.ПолучитьОбласть("ИтогоПодразделение");
  ОблКонтр = Макет.ПолучитьОбласть("Контрагент");
  ОблИтог = Макет.ПолучитьОбласть("Всего");
  Обл6201 =  Макет.ПолучитьОбласть("Для6201");
  Обл6202 =  Макет.ПолучитьОбласть("Для6202");
 
  выбПодр = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
  Состояние("Заполнение выходной таблицы...");
  Таб.Вывести(ОблЗ);
  Таб.Вывести(ОблШ);
 
  ИтНамДолжны = 0; итМыДолжны = 0;
  ПодрНамДолжны = 0; ПодрМыДолжны = 0;
 
  ТЗКонтр = новый ТаблицаЗначений;
  ТЗКонтр.Колонки.Добавить("Контрагент");
  ТЗКонтр.Колонки.Добавить("СуммаОстаток");
  ТЗКонтр.Колонки.Добавить("ДатаДолга");
  ТЗКонтр.Колонки.Добавить("Счет");
  ТЗКонтр.Колонки.Добавить("Порядок");
  ИтогоПоРазделу1 = 0;
  ИтогоПоРазделу2 = 0;
  ИтогоПоРазделу3 = 0;
  ИтогоПоРазделу4 = 0;
  ИтогоПоРазделу5 = 0;

  Пока выбПодр.Следующий() Цикл
     НеБыло6201 = 1;
     НеБыло6202 = 1;
     НеБыло6203 = 1;
     НеБыло6204 = 1;
     НеБыло6205 = 1;
     ИтНамДолжны = 0; итМыДолжны = 0;
     Если выбПодр.СуммаОстаток=0 Тогда
        продолжить;
     КонецЕсли;
     ОблПодразделение.Параметры.ПодразделениеПредставление = СокрЛП(выбподр.Субконто2Подразделение.Наименование);
     ОблПодразделение.Параметры.Подразделение = выбподр.Субконто2Подразделение;
     таб.Вывести(ОблПодразделение);
     таб.НачатьГруппуСтрок("Подразделение");
     ТЗКонтр.Очистить();
     выбКонтр = выбПодр.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
     Пока выбКонтр.Следующий() Цикл
        Если выбКонтр.СуммаОстаток=0 Тогда
           продолжить;
        КонецЕсли;
       
        выб = выбКонтр.Выбрать();
        Если (сокрЛП(выбКонтр.Контрагент)<>"""") Тогда
           СуммаДолга=0;
            стр = ТЗКонтр.Добавить();
           стр.Контрагент =  выбКонтр.Контрагент;
           стр.СуммаОстаток =  выбКонтр.СуммаОстаток;      
        Иначе
           Пока выб.Следующий() Цикл
              Если СокрЛП(выб.Контрагент)<>"""" Тогда
                 прервать;
              КонецЕсли;
              стр = ТЗКонтр.Добавить();
              стр.Контрагент =  выб.Контрагент;
              стр.счет = выб.счет;
              Если СокрЛП(выб.счет)="76.09" Тогда
                 стр.СуммаОстаток = -выб.СуммаОстаток;
                 Иначе
                 стр.СуммаОстаток = выб.СуммаОстаток;
              КонецЕсли;
           КонецЦикла;
        КонецЕсли;
        суммаПоКонтрагенту = выбКонтр.СуммаОстаток;
        //найдем дату возникновения долга  
        МаксДата  = Дата('00010101');  
        МаксСумма = 0;
        Пока выб.Следующий() Цикл
           Если модуль(выб.СуммаОстаток)>= модуль(МаксСумма) Тогда
              МаксСумма = модуль(выб.СуммаОстаток);
              стр.Счет = Выб.Счет;
           КонецЕсли;
        //должны быть одного знака
           Если СписокСчетов2.НайтиПоЗначению(выб.Счет)<>неопределено Тогда
              Отб = новый Структура;
              Отб.Вставить("Счет",выб.Счет);
              Отб.Вставить("Субконто1",выб.Контрагент);
              строки = ТЗДоп.НайтиСтроки(Отб);
              для каждого стрДоп Из строки Цикл
                 Если суммаПоКонтрагенту*стрДоп.Сумма>0  Тогда
                    МаксДата = стрДоп.РегистраторДата;
                    прервать;
                 КонецЕсли;  
              КонецЦикла;  
              прервать;
           Иначе
              Если суммаПоКонтрагенту*выб.СуммаОстаток>0  Тогда
                 МаксДата = Макс(МаксДата,выб.ДатаВозникновенияДолга);
              КонецЕсли;  
           КонецЕсли;  
        КонецЦикла;  
        Если Формат(МаксДата,"ДФ=dd.MM.yy;") = "31.12.07" Тогда
           МаксДата = Дата('00010101');
        КонецЕсли;  
        стр.ДатаДолга = МаксДата;
     КонецЦикла;  
     ТЗКонтр.Сортировать("Счет Возр,ДатаДолга Возр");
     //   Если СокрЛП(выбподр.Субконто2Подразделение.Наименование)="Производство спец. технологического оборудования" Тогда
     СтрокаСчетов="62.01,76.06,62.02,76.06,60.01,76.05,76.09,60.21,60.02,76.02,60.32";
     РаскидатьПоСчетам(ТЗКонтр,СтрокаСчетов);
     ТЗКонтр.Сортировать("Порядок");
     //   КонецЕсли;
     для каждого стр из ТЗКонтр Цикл
        Если стр.СуммаОстаток>0 Тогда
           //нам должны
           ОблКонтр.Параметры.ВсегоМыДолжны = 0;
           ОблКонтр.Параметры.ВсегоНамДолжны = стр.СуммаОстаток;
           ИтНамДолжны = ИтНамДолжны + стр.СуммаОстаток;
           ПодрНамДолжны = ПодрНамДолжны + стр.СуммаОстаток;            
        ИначеЕсли стр.СуммаОстаток<0 Тогда
           //мы должны
           ОблКонтр.Параметры.ВсегоМыДолжны = -стр.СуммаОстаток;
           ОблКонтр.Параметры.ВсегоНамДолжны = 0;
           ИтМыДолжны = ИтМыДолжны - стр.СуммаОстаток;
           ПодрМыДолжны = ПодрМыДолжны - стр.СуммаОстаток;  
        КонецЕсли;
       
         Если (НеБыло6201=1) и (Найти("62.01,76.06",СокрЛП(стр.счет))<>0) Тогда
           НеБыло6201=0;
           Обл6201.Параметры.ЗаголовокРасчетов = "Расчеты с покупателями и заказчиками за отгруженную продукцию";
           Таб.Вывести(Обл6201);        
        КонецЕсли;
        Если (НеБыло6202=1) и ((СокрЛП(стр.счет)="62.02") или ((СокрЛП(стр.счет) = "76.06")и (стр.СуммаОстаток<0)))  Тогда
           НеБыло6201=0;
           НеБыло6202=0;
           Обл6201.Параметры.ЗаголовокРасчетов = "Авансы полученные от покупателей";
           Таб.Вывести(Обл6201);
        КонецЕсли;
        Если  (НеБыло6203=1) и ((Найти ("60.01,76.09,60.21",СокрЛП(стр.счет))<>0) или ((СокрЛП(стр.счет) = "76.05") и (стр.СуммаОстаток<0))) Тогда
           НеБыло6201=0;
           НеБыло6202=0;
           НеБыло6203=0;
           Обл6201.Параметры.ЗаголовокРасчетов = "Задолженность перед поставщиками и подрядчиками";
           Таб.Вывести(Обл6201);
        КонецЕсли;
        Если (НеБыло6204=1) и ((Найти("60.02",СокрЛП(стр.счет))<>0) или ((СокрЛП(стр.счет) = "76.05") и (стр.СуммаОстаток>0))) Тогда
           НеБыло6201=0;
           НеБыло6202=0;
           НеБыло6203=0;
           НеБыло6204=0;
           Обл6201.Параметры.ЗаголовокРасчетов = "Авансы выданные";
           Таб.Вывести(Обл6201);
        КонецЕсли;
        Если (НеБыло6205=1) и (Найти("76.02",СокрЛП(стр.счет))<>0) Тогда
           НеБыло6201=0;
           НеБыло6202=0;
           НеБыло6203=0;
           НеБыло6204=0;
           НеБыло6205=0;
           Обл6201.Параметры.ЗаголовокРасчетов = "Расчеты по претензиям";
           Таб.Вывести(Обл6201);        
        КонецЕсли;
     
        Если Небыло6201=0 Тогда
           Если Небыло6202=0 Тогда
              Если Небыло6203=0 Тогда
                 Если Небыло6204=0 Тогда
                    Если Небыло6205=0 Тогда
                       ИтогоПоРазделу5=ИтогоПоРазделу5+модуль(стр.СуммаОстаток);  
                    Иначе
                       ИтогоПоРазделу4=ИтогоПоРазделу4+модуль(стр.СуммаОстаток);
                    КонецЕсли;
                 Иначе
                    ИтогоПоРазделу3=ИтогоПоРазделу3+модуль(стр.СуммаОстаток);
                 КонецЕсли;
              Иначе
                 ИтогоПоРазделу2=ИтогоПоРазделу2+модуль(стр.СуммаОстаток);
              КонецЕсли;
           Иначе
              ИтогоПоРазделу1=ИтогоПоРазделу1+модуль(стр.СуммаОстаток);
           КонецЕсли;
        Иначе
           Сообщить("Пустой счет");
        КонецЕсли;
        ОблКонтр.Параметры.КонтрагентПредставление = СокрЛП(стр.Контрагент.Наименование);
        ОблКонтр.Параметры.Контрагент = стр.Контрагент;
        ОблКонтр.Параметры.счет = стр.счет;
        ОблКонтр.Параметры.ДатаДолга = Формат(стр.ДатаДолга,"ДФ=dd.MM.yy; ДП='  .  .  '");
        таб.Вывести(ОблКонтр);
     КонецЦикла;  
     таб.ЗакончитьГруппуСтрок();
     ОблИтПодразделение.Параметры.ПодразделениеПредставление = СокрЛП(выбподр.Субконто2Подразделение.Наименование);
     ОблИтПодразделение.Параметры.МыДолжны = ИтМыДолжны;
     ОблИтПодразделение.Параметры.НамДолжны = ИтНамДолжны;
     таб.Вывести(ОблИтПодразделение);
     сумма1=ИтогоПоРазделу1+ИтогоПоРазделу4+ИтогоПоРазделу5;
     сумма2=ИтогоПоРазделу2+ИтогоПоРазделу3;
     //сообщить("ИтогоПоРазделу1+ИтогоПоРазделу4="+сумма1);
     //сообщить("ИтогоПоРазделу2+ИтогоПоРазделу3="+сумма2);
     //сообщить("Подразделение="+СокрЛП(выбподр.Субконто2Подразделение.Наименование));
  КонецЦикла;  

  Обл6202.Параметры.ЗаголовокРасчетов = "Итого: расчеты с покупателями и заказчиками за отгруженную продукцию";
  Обл6202.Параметры.ИтогПоРазделуК = ИтогоПоРазделу1;
  Обл6202.Параметры.ИтогПоРазделуД = 0;
  Таб.Вывести(Обл6202);
  Обл6202.Параметры.ЗаголовокРасчетов = "Итого: авансы полученные от покупателей";
  Обл6202.Параметры.ИтогПоРазделуД = ИтогоПоРазделу2;
  Обл6202.Параметры.ИтогПоРазделуК = 0;
  Таб.Вывести(Обл6202);
  Обл6202.Параметры.ЗаголовокРасчетов = "Итого: задолженность перед поставщиками и подрядчиками";
  Обл6202.Параметры.ИтогПоРазделуД = ИтогоПоРазделу3;
  Обл6202.Параметры.ИтогПоРазделуК = 0;
  Таб.Вывести(Обл6202);
  Обл6202.Параметры.ЗаголовокРасчетов = "Итого: авансы выданные";
  Обл6202.Параметры.ИтогПоРазделуК = ИтогоПоРазделу4;
  Обл6202.Параметры.ИтогПоРазделуД = 0;
  Таб.Вывести(Обл6202);  
  Обл6202.Параметры.ЗаголовокРасчетов = "Итого: Расчеты по претензиям";
  Обл6202.Параметры.ИтогПоРазделуК = ИтогоПоРазделу5;
  Обл6202.Параметры.ИтогПоРазделуД = 0;
  Таб.Вывести(Обл6202);
 
  ОблИтог.Параметры.ВсегоМыДолжны = ПодрМыДолжны;
  ОблИтог.Параметры.ВсегоНамДолжны = ПодрНамДолжны;
  таб.Вывести(ОблИтог);
  Таб.Показать();
 
КонецПроцедуры;




Я так понимаю строка струсл должна, при том или ином условии быть добавлена в текст запроса.
Но она дальше вообще нигде не фигурирует. Либо не хватает какого то цикла, который отфильтровывал бы ненужные подразделения. Если не сложно приведите пример исправления."
"Да уж - интересный запрос. Мне особенно понравилось условие:
|   ВЫБОР
|      КОГДА ХозрасчетныйОстатки.Субконто2 ССЫЛКА Справочник.ДоговорыКонтрагентов
|         ТОГДА ВЫБОР
|               КОГДА ХозрасчетныйОстатки.Субконто2 = &ПустойДоговор
|                  ТОГДА &ПустоеПодр
|               ИНАЧЕ ХозрасчетныйОстатки.Субконто2.Подразделение
|            КОНЕЦ
|      ИНАЧЕ &Бухгалтерия
|   КОНЕЦ КАК Субконто2Подразделение
Не понятно, что у вас за конфигурация и является ли она доработаной, но из этого условия вытекает, что Подразделение - это реквизит справочника Договора.
+ к этому можно добавить, что и отбор по контрагенту у вас не работает, т.к. струслном не участвует в запросе, а ВыбКонтрагент не фигурирует в условиях.
Скорее всего вот эта строка:
|   РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов), , ) КАК ХозрасчетныйОстатки
должна бы выглядеть так:
|   РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов)"+?(ПустаяСтрока(струслном),""""," И "+струслном)+?(ПустаяСтрока(струсл),""""," И "+струсл)+", , ) КАК ХозрасчетныйОстатки

При этом правда не понятно, что же будет в случае когда Субконто2 есть нечто не заполненое, но попытаться можно.

Да и еще: когда ЗначениеЗаполнено(ВыбПодразделение) - струсл у вас всегда = """", так что условие Если струсл="""" Тогда явно лишнее.

p.s. КонецПроцедуры; - уберите в конце ";" - не нужна она там, а в большинстве случаев мешает."
"|   РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов)"+?(ПустаяСтрока(струслном),""""," И "+струслном)+?(ПустаяСтрока(струсл),""""," И "+струсл)+", , ) КАК ХозрасчетныйОстатки

Выдает ошибку:
{Форма.ФормаОтчета(154)}: Ошибка при вызове метода контекста (Выполнить): {(16, 86)}: Синтаксическая ошибка "И"
РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов) И <>И Субконто2.Подразделение = &ВыбПодразделение, , ) КАК ХозрасчетныйОстатки
выбПодр = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
по причине:
{(16, 86)}: Синтаксическая ошибка "И"
РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов) И <>И Субконто2.Подразделение = &ВыбПодразделение, , ) КАК ХозрасчетныйОстатки
"
" струсл = "Субконто2.Подразделение = &ВыбПодразделение";"
"если так:
струсл="Субконто2.Подразделение = &ВыбПодразделение";
Если ЗначениеЗаполнено(ВыбПодразделение) Тогда
струсл = струсл+  "И Субконто2.Подразделение = &ВыбПодразделение";
    КонецЕсли;  

то выдает ошибку:
{Форма.ФормаОтчета(155)}: Ошибка при вызове метода контекста (Выполнить): {(16, 131)}: Ожидается выражение ")"
РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов) И Субконто2.Подразделение = &ВыбПодразделениеИ <>Субконто2.Подразделение = &ВыбПодразделение, , ) КАК ХозрасчетныйОстатки
выбПодр = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
по причине:
{(16, 131)}: Ожидается выражение ")"
РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаКон, Счет В ИЕРАРХИИ (&СписокСчетов) И Субконто2.Подразделение = &ВыбПодразделениеИ <>Субконто2.Подразделение = &ВыбПодразделение, , ) КАК ХозрасчетныйОстатки
"
Спасибо большое, все получилось)))
Читают тему
(гостей: 1)

Быстрый переход