Имя: Пароль:
1C
1C 7.7
v7: Как обойти таблицу значений, полученную из запроса
,
0 AnisaL
 
30.11.21
17:48
Здравствуйте!
Подскажите пожалуйста, когда пытаешься обратиться к полю таблицы значений выдает ошибку:
ДатаРег = Формат(Уч.ДатаРег, "ДДДММГГГГ");
{C:\USERS\USER\DESKTOP\ИНВЕНТАРНАЯ КАРТОЧКА.ERT(99)}: Поле агрегатного объекта не обнаружено (ДатаРег)
Вот запрос:
  ТекстЗапроса =
  "//{{ЗАПРОС(Сформировать)
  |ТекущийУчасток = Справочник.Участки.ТекущийЭлемент;
  |ДатаРег = Справочник.Участки.ДатаРег;
  |//}}ЗАПРОС";
  // Если ошибка в запросе, то выход из процедуры
  
  Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
      Возврат;
  КонецЕсли;
  Рез=Запрос.Выполнить(ТекстЗапроса);
  Уч = СоздатьОбъект("ТаблицаЗначений");
  Запрос.Выгрузить(Уч);
  КС=Уч.КоличествоСтрок();
  Если КС = 0 Тогда
      гСообщить("Данных по Участкам не найдено!","!");
      Возврат;
  КонецЕсли;
  
  Уч.ВыбратьСтроки();
  
  Счетчик = Число(Начало);
  Конец1 = Число(Конец);   // (Уч.ПолУчитьСтроку() = 1)
  Пока  Счетчик <= Конец1  Цикл
      Уч.ПолучитьСтрокуПоНомеру(Счетчик);    
      ДатаРег = Формат(Уч.ДатаРег, "ДДДММГГГГ");
      Счетчик = Счетчик + 1;
  КонецЦикла;
1 AnisaL
 
30.11.21
17:53
Как правильно надо обратиться к полю таблицы?
2 Харлампий Дымба
 
30.11.21
17:54
Запрос.Выгрузить(Уч,1);
3 Харлампий Дымба
 
30.11.21
17:56
А где группировка в запросе?
Столько людей учат 7.7, я прям приободрён)
4 AnisaL
 
30.11.21
17:58
(3) а разве нужна группировка?
5 AnisaL
 
30.11.21
18:03
(3) а как выбрать все участки из справочника? А то такой запрос только один элемент выбрал
6 acanta
 
30.11.21
18:06
Группировка все без групп.
Выгрузить(тз, 0,0)
7 AnisaL
 
30.11.21
18:11
(6) так опять ошибку выдает Поле агрегатного объекта не обнаружено (ДатаРег)
8 Ёпрст
 
30.11.21
18:15
(7)

Запрос.Выгрузить(Уч);
уч.ВыбратьСтроку()//посмотри для начала глазками, что там есть то хоть в твоей ТЗ. Дальше, думай..
9 AnisaL
 
30.11.21
18:22
(8) так вообще диалог ввода строки выдает
10 Харлампий Дымба
 
30.11.21
18:23
(4) ну без группировки ты получишь просто последний элемент.
А без (2) - вообще ничего не получишь.
11 Харлампий Дымба
 
30.11.21
18:26
(9) Не ввода, а выбора. А если бы ты прочитал и понял, что такое группировка, и какие параметры есть у функции "Выгрузить", то у тебя бы в этом диалоге выбора строки были бы результаты запроса. Вернее они и сейчас там есть, только твой результат - пустота.
12 Харлампий Дымба
 
30.11.21
18:31
Кароч, добавь в запрос  |Группировка ТекущийУчасток без групп

Запрос.Выгрузить(Уч,1);

а Уч.ВыбратьСтроки() можно убрать - она нужна для Уч.ПолучитьСтроку(), ты же используешь Уч.ПолучитьСтрокуПоНомеру();
13 Ёпрст
 
30.11.21
18:35
(0) на вот, занимайся  




ТекстЗапроса =
  "
  |ТекущийУчасток = Справочник.Участки.ТекущийЭлемент;
  |ДатаРег = Справочник.Участки.ДатаРег;
  |Группировка ТекущийУчасток Без Групп;
  |";
  
  Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
      Возврат;
  КонецЕсли;
  Пока  Запрос.Группировка(1) =1   Цикл
      ДатаРег = Формат(Запрос.ДатаРег, "ДДДММГГГГ");
      Сообщить(ДатаРег);
  КонецЦикла;

14 AnisaL
 
30.11.21
18:38
(10) добавила группировку: |Группировка ТекущийУчасток, все получилось спасибо!
15 AnisaL
 
30.11.21
18:39
(12) добавила группировку: |Группировка ТекущийУчасток, получилось и без групп, благодарю
16 AnisaL
 
01.12.21
07:58
(12) а как сделать сортировку по полю Код? Вот как я написала, так не сортирует
ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
    |ТекущийУчасток = Справочник.Участки.ТекущийЭлемент;
    |ДатаРег = Справочник.Участки.ДатаРег;
    |Код = Справочник.Участки.Код;
    |Группировка ТекущийУчасток упорядочить по ТекущийУчасток.Код;
    |//}}ЗАПРОС";
17 Chai Nic
 
01.12.21
08:21
Никогда не употребляй эту гадость. Есть же прямые запросы..
18 AnisaL
 
01.12.21
08:52
(17) а в моем случае, как сделать сортировку по Коду?
19 brenli
 
01.12.21
09:06
(18) Как вариант выгрузить в ТЗ и отсортировать.
20 brenli
 
01.12.21
09:08
Запрос.Выгрузить(ТЗ,0,0);
ТЗ.Сортировать("Код+")
21 brenli
 
01.12.21
09:16
(16) Вообще по синтаксису правильно.
Проверять почему не работает упорядочивание некогда, просто предположения.
Поле код строковое?
Нет пробелов в поле код?
Возможно причина в наличии пробелов.

Если сделаешь как в (20) и сортировать не будет, можно попробовать пробежать циклом по таблице и переприсвоить коды без пробелов ТЗ.Код = СокрЛП(ТЗ.Код);
И уже после этого попробовать отсортировать как в (20)
22 Ёпрст
 
01.12.21
09:20
(21) в клюшках поле code всегда строка , независимо от указания число/строка в метаданных.
Поэтому сортировка будет как строка всегда. И пробелы там не при чем.
23 AnisaL
 
01.12.21
09:38
(21) Поле код строковое; вот 2 значения: 1 и 2, он вперед выводит почему-то 2, пробела нет
24 AnisaL
 
01.12.21
09:39
(20) хорошо, попробую ТЗ сортировать
25 AnisaL
 
01.12.21
10:12
(20) Запрос.Выгрузить(Уч, 1);
  Уч.Сортировать("Код+");
Вот так написала, не сортирует. Вот так если пишу Запрос.Выгрузить(ТЗ,0,0); то не могу потом функцией Уч.ПолучитьСтрокуПоНомеру(Счетчик);   получить строку
26 brenli
 
01.12.21
10:12
(22) Сорян забыл)
27 Bigbro
 
01.12.21
10:13
так если выгрузить в ТЗ а получать потом из Уч - то конечно не получит.
28 AnisaL
 
01.12.21
10:13
(25) а мне именно надо функцией Уч.ПолучитьСтрокуПоНомеру(Счетчик); получать строку, так как нужен счетчик
29 AnisaL
 
01.12.21
10:14
(27) вообще-то я в Уч выгружаю
30 Злопчинский
 
01.12.21
10:14
(25) мозг включать надо, ане моторные навыки нажатия на клавиши.
после получения ТЗ из запроса, перед ее какой-бы то ни было обработкой вставь код:
//ОТЛАДКА
ТЗ.ВыбратьСтроку(,);
31 Злопчинский
 
01.12.21
10:15
(28)
ТЗ.ВыбратьСтроку();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
  Чтото = ТЗ.КакойтоРеквизит;
  // а если нужен счетчик/порядковый номер то
  МойСчетчикПоПорядку = ТЗ.НомерСтроки;
КонецЦикла;
32 Злопчинский
 
01.12.21
10:18
(25) "Вот так написала, не сортирует."
все сортирует. просто твои представления о том что должно получиться не совпадают с мнением платформы или не то/не туда смотришь...
33 Злопчинский
 
01.12.21
10:21
(29) "не могу" - платформа таких ошибок не дает. приводи дословные сообщения копипастом, а то поток сознания трудно контролировать...
(29) "вообще-то я в Уч выгружаю" - хз куда тыт ам выгружаешь. у тебя в коде приведенном в (25) выгрузить(ТЗ...), Выгрузить(Уя...)... - что где используется - хз...
34 AnisaL
 
01.12.21
10:25
(30) Спасибо! Помогло
35 Злопчинский
 
01.12.21
10:36
(34) Внезапно, да?
вставка отладочного оператора, который никак не изменяет данные - помогает... Волшебство! Светлая сторона силы! Хоть бы сказала в чем ошиблась...
36 AnisaL
 
01.12.21
10:37
(35) могу код прислать как получилось
37 AnisaL
 
01.12.21
10:38
(35)
  Уч = СоздатьОбъект("ТаблицаЗначений");
  Запрос.Выгрузить(Уч, 1);
  
  //ОТЛАДКА

    Уч.ВыбратьСтроку(,);
    
  Уч.Сортировать("Код+");
  
      Уч.ВыбратьСтроку(,);
      
  КС=Уч.КоличествоСтрок();
  Если КС = 0 Тогда
      гСообщить("Данных по Участкам не найдено!","!");
      Возврат;
  КонецЕсли;
  
  Уч.ВыбратьСтроки();
  
  Счетчик = Число(Начало);
  Конец1 = Число(Конец);   // (Уч.ПолУчитьСтроку() = 1)
Пока  Счетчик <= Конец1  Цикл
    Попытка
    Уч.ПолучитьСтрокуПоНомеру(Счетчик);
    Исключение
    Сообщить("Участки кончились на номере по счетчику: " + Счетчик);
    Прервать
    КонецПопытки;
38 AnisaL
 
01.12.21
10:39
(35) я так и не поняла в чем была ошибка (
39 1Сергей
 
01.12.21
10:41
(37) и счетчик нигде не изменяется? чудиса какие-то
40 Злопчинский
 
01.12.21
10:43
(38) ну, тут давно на мисте выяснили в чем. обычно - в прокладке. той что между стулом и компьютером ;-) Без обид ;-)
41 Bigbro
 
01.12.21
10:44
и правда чудеса.
42 AnisaL
 
01.12.21
10:44
(39) там просто код длинный, не хочу весь показывать
43 AnisaL
 
01.12.21
10:45
(40) а я и не спорю, главное, что вы есть, чтобы помочь
44 Злопчинский
 
01.12.21
10:45
(39) не код, а бред какой-то...
45 Харлампий Дымба
 
01.12.21
11:01
(17) Тут гуру пытаются ребёнка на трёхколесный велосипед усадить, а ты говоришь, что разгон до сотни должен быть максимум 3 секунды)
46 АгентБезопасной Нацио
 
01.12.21
11:34
(45) прелесть прямых запросов не только в том, что они работают быстро, но и в том, что они _прямые_, в отличие от кривых черных...
47 brenli
 
01.12.21
11:35
(37) Можешь так

Уч.ВыбратьСтроки();
Пока Уч.ПолучитьСтроку()=1 Цикл
...

//А вместо Уч.ПолучитьСтрокуПоНомеру(Счетчик); пиши сразу из какой колонки и что хочешь получить. Например так
Сообщить(Уч.<ИмяКолонки>);

Если Уч.НомерСтроки = Номер1 Тогда
   Прервать;
КонецЕсли;
...
КонецЦикла;
48 Злопчинский
 
01.12.21
11:55
а если надо из ТЗ выбрать не все строки а только диапазон ОТ ДО
ТЗ.ВыбратьСтроки();
ТЗ.ПолучитьСтрокуПоНомеру(Макс(1,НачалоДиапазона-1)); // тут учесть дополнительно что начало диапазона м.б. первая строка
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Если ТЗ.НомерСтроки = КонецДиапазона Тогда Прервать; КонецЕсли;
//тут пишем много кода обработки строк в диапазоне
КонецЦикла;
.
никакого криминала в использовать цикла с ПолучитьСтрокуПоНомеру() нет, если остальной код вменяемый...
49 Харлампий Дымба
 
01.12.21
12:27
к 49) Интересно. Никогда не использовал ТЗ.ПолучитьСтрокуПоНомеру() и ТЗ.ПолучитьСтроку() совместно - буду знать.
1)
Для Счетчик = НачалоДиапазона по КонецДиапазона Цикл
  ТЗ.ПолучитьСтрокуПоНомеру(Счетчик );
2)
ТЗ.Выгрузить(ТЗ,НачалоДиапазона,КонецДиапазона);//если ТЗ будет больше не нужна
3)
ТЗ.Выгрузить(ТЗ1,НачалоДиапазона,КонецДиапазона);//если ТЗ будет еще нужна
4)
ТЗ.КоличествоСтрок(КонецДиапазона);//если НачалоДиапазона=1 и не вызывалось ТЗ.Сортировать()
50 Злопчинский
 
01.12.21
13:13
(49) ТЗ.ПолучитьСтрокуПоНомеру можно и внутри цикла по ТЗ.ПолучитьСтроку(), иногда это полезно.
2 + 2 = 3.9999999999999999999999999999999...