Имя: Пароль:
1C
1С v8
Выбрать в запросе Пустые Субконто
,
0 romaku
 
16.08.11
00:11
Есть запрос.
ВЫБРАТЬ
   ОсновнойОбороты.Счет,
   ОсновнойОбороты.Субконто1,
   ОсновнойОбороты.Субконто2,
   ОсновнойОбороты.Субконто3,
   ОсновнойОбороты.Регистратор,
   ОсновнойОбороты.НомерСтроки,
   ОсновнойОбороты.СуммаОборот,
   ОсновнойОбороты.СуммаОборотДт,
   ОсновнойОбороты.СуммаОборотКт
ИЗ
   РегистрБухгалтерии.Основной.Обороты(
           &НачДата,
           &КонДата,
           Запись,
           Счет = &Счет,
           ,
           Организация = &Организация
               И Субконто1 = &Субконто1,
           ,
           ) КАК ОсновнойОбороты

Какой установить  параметр запроса &Субконто, чтобы выбрать обороты с незаполненым Субконто. Тип Субконто зависит от счета.
Понимаю, что по идее туда нужно вставлять Справочник.ПустаяСсылка(), но не понимаю как это сделать, так как счет тоже передается в запрос, а на разных счетах разные субконто и разные справочники.
1 ilkoder
 
16.08.11
00:29
Так тебе это нужно для конкретного счета или для разных (всех)?
2 romaku
 
16.08.11
00:32
(1) для разных отдельных счетов. счет выбирается на форме.
3 ilkoder
 
16.08.11
00:36
В параметрах запросах у тебя пропущен массив видов субконто. Если его заполнить в зависимости от счета, то тогда спокойно сможешь выбирать эти самые пустые субконто (погляди как в типовых документах сделано)
4 romaku
 
16.08.11
00:46
типовой нет :(
5 romaku
 
16.08.11
13:16
как от вида субконто перейти к значению пустых субконто, чтобы их выбрать?
6 romaku
 
16.08.11
13:45
УсловиеПоСубконто = "";
   Для К = 1 По СчетИз.ВидыСубконто.Количество() Цикл
       Если ЗначениеЗаполнено(ЭлементыФормы["СубконтоИз"+К].Значение) тогда
           УсловиеПоСубконто = УсловиеПоСубконто + " И Субконто"+К + " = &Субконто"+К;
           Запрос.УстановитьПараметр("Субконто"+К,
           ЭлементыФормы["СубконтоИз"+К].Значение);
           Иначе            
               УсловиеПоСубконто = УсловиеПоСубконто + " И Субконто"+К + " = &Субконто"+К;
               Запрос.УстановитьПараметр("Субконто"+К,
               Null);
       КонецЕсли
   КонецЦикла;
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ОсновнойОбороты.Счет,
   |    ОсновнойОбороты.Субконто1,
   |    ОсновнойОбороты.Субконто2,
   |    ОсновнойОбороты.Субконто3,
   |    ОсновнойОбороты.Регистратор,
   |    ОсновнойОбороты.НомерСтроки,
   |    ОсновнойОбороты.СуммаОборот,
   |    ОсновнойОбороты.СуммаОборотДт,
   |    ОсновнойОбороты.СуммаОборотКт,
   |    ОсновнойОбороты.Организация,
   |    ОсновнойОбороты.ВидКапитала,
   |    ОсновнойОбороты.План,
   |    ОсновнойОбороты.КоличествоОборотДт,
   |    ОсновнойОбороты.КоличествоОборотКт,
   |    ОсновнойОбороты.ВалютнаяСуммаОборотДт,
   |    ОсновнойОбороты.ВалютнаяСуммаОборотКт
   |
   |ИЗ
   |    РегистрБухгалтерии.Основной.Обороты(
   |            "+?(ЗначениеЗаполнено(НачПериода),"&НачДата","")+",
   |            "+?(ЗначениеЗаполнено(КонПериода),"&КонДата","")+",
   |            Запись,
   |            Счет = &Счет,
   |            ,
   |            "+?(ЗначениеЗаполнено(ЮрЛицо),"Организация = &Организация","")+ УсловиеПоСубконто +"
   |            ,
   |            ) КАК ОсновнойОбороты";
   
Что мне нужно написать цикле заполнения условий субконто, в блоке "иначе", чтобы запрос выбирал мне пустые субконто
7 unregistered
 
16.08.11
13:58
Это должно работать для основной таблицы регистра. Для виртуальной таблицы оборотов - не уверен.


ВидыСоставныхСубконто = Новый Соответсвие;
Составной = ВидыСоставныхСубконто.Получить(ЭлементыФормы["СубконтоИз"+К].Значение.Ключ);          //
Если Составной=неопределено Тогда
  Составной = ЭлементыФормы["СубконтоИз"+К].Значение.Ключ.ТипЗначения.Типы().Количество() > 1;  // Кэширование: вид субконто + признак Состовной
  ВидыСоставныхСубконто.Вставить(ЭлементыФормы["СубконтоИз"+К].Значение.Ключ,Составной);        //
КонецЕсли;                                                          //
Если Составной Тогда
  Запрос.УстановитьПараметр("Субконто"+К, Неопределено);
Иначе
  Запрос.УстановитьПараметр("Субконто"+К, Новый(ЭлементыФормы["СубконтоИз"+К].Значение.Ключ.ТипЗначения);
КонецЕсли;
8 romaku
 
16.08.11
14:03
Поле объекта не обнаружено (Ключ)
       Составной = ВидыСоставныхСубконто.Получить(ЭлементыФормы["СубконтоИз"+К].Значение.Ключ);          //
9 Axel2009
 
16.08.11
14:03
неопределено туда вставлять надо
10 unregistered
 
16.08.11
14:08
(8) Убери ".Ключ"

Я код копировал с типовой. ошибся.
Там ниже аналогичная ошибка - тоже надо убрать ".Ключ".
11 romaku
 
16.08.11
14:08
(9) в блок иначе вместо null?
Не выбирает ничего :(
12 unregistered
 
16.08.11
14:12
Для субконто составного типа должно быть Неопределено.
Для субконто ссылочного типа (не составных) значение должно быть - пустая ссылка соответствующего типа.

NULL тут быть не должно, т.к. нет ни каких соединений. откуда ему взяться? В БД значения Null не храняться.
13 romaku
 
16.08.11
14:13
(10) {Форма.Форма(55)}: Значение не является значением объектного типа (ТипЗначения)
               Составной = ЭлементыФормы["СубконтоИз"+К].Значение.ТипЗначения.Типы().Количество() > 1;  // Кэширование: вид субконто + признак Состовной
14 Axel2009
 
16.08.11
14:15
(12) значение везде должно быть неопределено. другое дело что могут записать как пустую ссылку у субконто при записи.
15 unregistered
 
16.08.11
14:16
Ой....

Замени "ЭлементыФормы["СубконтоИз"+К].Значение" на "СчетИз.ВидыСубконто[К-1].ВидСубконто"

должно быть что-то типа

Составной = СчетИз.ВидыСубконто[К-1].ВидСубконто.ТипЗначения.Типы().Количество() > 1;
16 unregistered
 
16.08.11
14:20
+ к (15) и вообще в (7) я фигню написал :))

Должно быть:

ВидыСоставныхСубконто = Новый Соответсвие;
Составной = ВидыСоставныхСубконто.Получить(СчетИз.ВидыСубконто[К-1].ВидСубконто);          //
Если Составной=неопределено Тогда
  Составной = СчетИз.ВидыСубконто[К-1].ВидСубконто.ТипЗначения.Типы().Количество() > 1;  // Кэширование: вид субконто + признак Состовной
  ВидыСоставныхСубконто.Вставить(СчетИз.ВидыСубконто[К-1].ВидСубконто,Составной);        //
КонецЕсли;                                                          //
Если Составной Тогда
  Запрос.УстановитьПараметр("Субконто"+К, Неопределено);
Иначе
  Запрос.УстановитьПараметр("Субконто"+К, Новый(СчетИз.ВидыСубконто[К-1].ВидСубконто.ТипЗначения));
КонецЕсли;


Это всё после Иначе...
17 romaku
 
16.08.11
14:34
(16)

{Форма.Форма(63)}: Тип не определен (Справочник ссылка: Юридические лица)
               Запрос.УстановитьПараметр("Субконто"+К, Новый(СчетИз.ВидыСубконто[К-1].ВидСубконто.ТипЗначения));
18 unregistered
 
16.08.11
14:38
Замени строку с ошибкой на это:

ТипСубконты = СчетИз.ВидыСубконто[К-1].ВидСубконто.ТипЗначения;
ЗначениеПараметра = ТипСубконты.ПривестиЗначение();
Запрос.УстановитьПараметр("Субконто"+К, ЗначениеПараметра);
19 romaku
 
16.08.11
14:49
(18) когда обрабатывает блок иначе, запрос выдает все записи, и с заполненными субконто, и с пустыми :(
20 Axel2009
 
16.08.11
14:51
(19) намного проще
ВЫБРАТЬ
   ОсновнойОбороты.Счет,
   ОсновнойОбороты.Субконто1,
   ОсновнойОбороты.Субконто2,
   ОсновнойОбороты.Субконто3,
   ОсновнойОбороты.Регистратор,
   ОсновнойОбороты.НомерСтроки,
   ОсновнойОбороты.СуммаОборот,
   ОсновнойОбороты.СуммаОборотДт,
   ОсновнойОбороты.СуммаОборотКт
ИЗ
   РегистрБухгалтерии.Основной.Обороты(
           &НачДата,
           &КонДата,
           Запись,
           Счет = &Счет,
           ,
           Организация = &Организация
               И Субконто1 В (&Субконто1),
           ,
           ) КАК ОсновнойОбороты
и на вход дать все пустые ссылки и неопределено. так будет намного точнее. чем все то что насоветовали тут.
21 unregistered
 
16.08.11
14:57
(19) Показывай весь код.
22 unregistered
 
16.08.11
14:58
(20) Ну если конфа не УПП, то можно, понадеявшись, что не вылетит ошибка про 256 таблиц.
23 Axel2009
 
16.08.11
15:02
(22) ага, составной тип у субконто. заполнили пустым значением какого либо из справочников. выведет?
24 Axel2009
 
16.08.11
15:03
+(23) в упп видов субконто порядка 60штук. где там 255 нашел?
25 romaku
 
16.08.11
15:08
УсловияСубконто="";
   
   Запрос = Новый Запрос;
   
   // надо выстроить условие по субконто так, что елси не заполнено, то выбирает с пустой аналитикой
   
   УсловиеПоСубконто = "";
   Для К = 1 По СчетИз.ВидыСубконто.Количество() Цикл
       Если ЗначениеЗаполнено(ЭлементыФормы["СубконтоИз"+К].Значение) тогда
           УсловиеПоСубконто = УсловиеПоСубконто + " И Субконто"+К + " В (&Субконто"+К+")";
           Запрос.УстановитьПараметр("Субконто"+К,
           ЭлементыФормы["СубконтоИз"+К].Значение);
       Иначе            
           УсловиеПоСубконто = УсловиеПоСубконто + " И Субконто"+К + " В (&Субконто"+К+")";
           Запрос.УстановитьПараметр("Субконто"+К,
           Неопределено);

       КонецЕсли;
       
       
   КонецЦикла;
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ОсновнойОбороты.Счет,
   |    ОсновнойОбороты.Субконто1,
   |    ОсновнойОбороты.Субконто2,
   |    ОсновнойОбороты.Субконто3,
   |    ОсновнойОбороты.Регистратор,
   |    ОсновнойОбороты.НомерСтроки,
   |    ОсновнойОбороты.СуммаОборот,
   |    ОсновнойОбороты.СуммаОборотДт,
   |    ОсновнойОбороты.СуммаОборотКт,
   |    ОсновнойОбороты.Организация,
   |    ОсновнойОбороты.ВидКапитала,
   |    ОсновнойОбороты.План,
   |    ОсновнойОбороты.КоличествоОборотДт,
   |    ОсновнойОбороты.КоличествоОборотКт,
   |    ОсновнойОбороты.ВалютнаяСуммаОборотДт,
   |    ОсновнойОбороты.ВалютнаяСуммаОборотКт
   |
   |ИЗ
   |    РегистрБухгалтерии.Основной.Обороты(
   |            "+?(ЗначениеЗаполнено(НачПериода),"&НачДата","")+",
   |            "+?(ЗначениеЗаполнено(КонПериода),"&КонДата","")+",
   |            Запись,
   |            Счет = &Счет,
   |            ,
   |            "+?(ЗначениеЗаполнено(ЮрЛицо),"Организация = &Организация","")+ УсловиеПоСубконто +"
   |            ,
   |            ) КАК ОсновнойОбороты";
   
   //    сообщить("Текст запроса : "+Запрос.Текст);
   Если ЗначениеЗаполнено(НачПериода) тогда
       Запрос.УстановитьПараметр("НачДата", НачПериода);
   КонецЕсли;    
   Если ЗначениеЗаполнено(КонПериода) тогда
       Запрос.УстановитьПараметр("КонДата", КонПериода);
   КонецЕсли;    
   Если ЗначениеЗаполнено(ЮрЛицо) тогда
       Запрос.УстановитьПараметр("Организация", ЮрЛицо);
   КонецЕсли;    
   
   Запрос.УстановитьПараметр("Счет", СчетИз);
   
   
   ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
   ТАблицаЗапроса.ВыбратьСтроку(); //для контроля
26 romaku
 
16.08.11
15:09
конфа самописная
27 unregistered
 
16.08.11
15:21
Сделай проще:

УсловиеПоСубконто = "";
Для К = 1 По СчетИз.ВидыСубконто.Количество() Цикл
 ЗначениеПараметра = ЭлементыФормы["СубконтоИз"+К].Значение;
 ТипСубконты = СчетИз.ВидыСубконто[К-1].ВидСубконто.ТипЗначения;
 ЗначениеПараметра = ТипСубконты.ПривестиЗначение(ЗначениеПараметра);
 УсловиеПоСубконто = УсловиеПоСубконто + " И Субконто"+К + " В (&Субконто"+К+")";
КонецЦикла;
28 unregistered
 
16.08.11
15:23
+ к (27) Забыл строку

Запрос.УстановитьПараметр("Субконто"+К, ЗначениеПараметра);
29 romaku
 
16.08.11
15:26
(27) {Форма.Форма(93)}: Ошибка при вызове метода контекста (Выполнить): {(26, 46)}: Не задано значение параметра "Субконто1"
Организация = &Организация И Субконто1 В (<<?>>&Субконто1) И Субконто2 В (&Субконто2)
   ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
30 unregistered
 
16.08.11
15:26
(29) См. (28)
31 romaku
 
16.08.11
16:01
вроде работает. буду тестировать. спасибо большое.