![]() |
![]() |
![]() |
|
Как в регистре сведений сделать отбор для списка значений? | ☑ | ||
---|---|---|---|---|
0
Domovoi
23.05.11
✎
15:56
|
Есть регистр сведений переодический. Измерения Номенклатура. Нужно установить отбор номенклатуры входящей в список СПНоменклатура. Как это сделать не запросом?
Пытаюсь сделать НаборЗаписей.Отбор.Номенклатура.ВидСравнения = ВидСравнения.ВСписке; выдает ошибку что недопустимый вид сравнения. |
|||
1
chelentano
23.05.11
✎
15:57
|
(0) читать надо. отбор для набора записей только на "Равно"
|
|||
2
Живой Ископаемый
23.05.11
✎
15:58
|
почему не запросом?
|
|||
3
Живой Ископаемый
23.05.11
✎
15:59
|
Почему бы не поставить условие: только левой рукой, и только мышью, не трогая клавиатуры?
|
|||
4
Domovoi
23.05.11
✎
16:02
|
(2)Интересно.
И во-вторых, запросом придется лопатить весь регистр. (3)Сарказм? |
|||
5
Живой Ископаемый
23.05.11
✎
16:06
|
2(4) точно
"И во-вторых, запросом придется лопатить весь регистр. " - э... раскройте тему, а я таки подскажу способ в ответ |
|||
6
Domovoi
23.05.11
✎
16:10
|
(5)Насколько я знаю, запросом выбираем из регистра все что нужно оставить без изменения, выгружаем результат запроса в набор записсей и добавляем туда то что собираемся изменить и записываем набор записей. А хотелось бы сделать отбор по списку номенклатуры, думаю так было бы быстрее.
|
|||
7
Domovoi
23.05.11
✎
16:12
|
+(6)Получается в списке к примеру 5 записей, а данный алгоритмом колбасит несколько секунд, а должен как бы мгновенно.
|
|||
9
Живой Ископаемый
23.05.11
✎
16:13
|
"Насколько я знаю, запросом выбираем из регистра все что нужно оставить без изменения, выгружаем результат запроса в набор записсей и добавляем туда то что собираемся изменить и записываем набор записей."- ничего не понятно зачем вы это делаете, впрочем плевать...
Можно сделать через ПостроительЗапроса к списку. для Списка можно устанавливать отборы и не только на равентсво. |
|||
10
Reset
23.05.11
✎
16:13
|
(6) (7) Проблема в алгоритмописателе.
|
|||
11
Domovoi
23.05.11
✎
16:15
|
(8)Что не так? Скажите как проще, хочу научиться.
(9)Не понял. |
|||
12
Reset
23.05.11
✎
16:15
|
К (0). Нельзя установить отбор по списку. Тебе придется или переписывать весь регистр целиком, как в (6) (что является бредом), либо писать итерациями по одной номенклатуре.
|
|||
13
Reset
23.05.11
✎
16:16
|
(9) Он не хочет получить данные по списку, он их хочет по списку изменить %-)
|
|||
14
Живой Ископаемый
23.05.11
✎
16:17
|
2(13) я уже понял что он хочет ересь а все потому что неправильно мыслит.. дальше вникать не хочу.. если ему сильно нужно - пусть грызет (9) если это хоть как-то подходит.. если нет - начит нет
|
|||
15
Domovoi
23.05.11
✎
16:22
|
(14)Наоборот хочу вникать.
Задача бональная. Есть список номенклатуры, ей установлен статус на опеределенную дату надо эти данные загнать в регистр. Измерения регистра - Номенклатура, Значение - Статус. Регистр периодический. Как надо сделать тогда? (12)писать итерациями по одной номенклатуре - это как? |
|||
16
Живой Ископаемый
23.05.11
✎
16:24
|
все равно писать итерациями.
|
|||
17
Reset
23.05.11
✎
16:26
|
(15) "Для каждого номенклатура из список номенклатуры"
|
|||
18
Живой Ископаемый
23.05.11
✎
16:26
|
потому что для периодического независимого РС набор записей - это одна запись, которая определяется уникальным сочетанием всех измерений (в твоем случае Номенклатура и Период)
|
|||
19
Domovoi
23.05.11
✎
16:28
|
(16)Это вот так?
НаборЗаписей = РегистрыСведений.СтатустностьНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Период.Установить(ДатаОтбора); Для каждого ТекСтрока Из СписокНоменклатуры Цикл НаборЗаписей.Отбор.Номенклатура.Установить(ТекСтрока.Номенклатура); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Период = ДатаОтбора; НоваяЗапись.Номенклатура = ТекСтрока.Номенклатура; НоваяЗапись.СтатусНоменклатуры = ТекСтрока.СтатусНоменклатуры; НаборЗаписей.Записать(); КонецЦикла; |
|||
20
Живой Ископаемый
23.05.11
✎
16:32
|
очевидно, что да.
|
|||
21
Domovoi
23.05.11
✎
16:38
|
(20)Точно? Так очень долго.
|
|||
22
rozer76
23.05.11
✎
16:38
|
(19) может "НаборЗаписей.Записать()" после цикла?
|
|||
23
lxs
23.05.11
✎
16:39
|
(22) не "может".. сам подумай почему.
|
|||
24
rozer76
23.05.11
✎
16:40
|
(23) да.. сорри не увидел "НаборЗаписей.Отбор.Номенклатура.Установить(ТекСтрока.Номенклатура)"
|
|||
25
Живой Ископаемый
23.05.11
✎
16:40
|
2(21) читай буквари, мне казалось ты уже это прошел
|
|||
26
Domovoi
23.05.11
✎
16:42
|
(22)Да вроде пробовал не получилось, хотя странно вроде должно работать.
(25)Не, ты что) Мне б за годика 2 еще пройти) |
|||
27
Domovoi
23.05.11
✎
16:45
|
(22)Сейчас вроде сработало. Но все равно долго очень.
|
|||
28
Живой Ископаемый
23.05.11
✎
16:45
|
(26)регистр сведений независимый - стало быть в твоем наборе записей может быть максимум одна запись. понятно почему
|
|||
29
Domovoi
23.05.11
✎
16:46
|
Что я не так делаю?
|
|||
30
Domovoi
23.05.11
✎
16:46
|
(28)Почему одна? Не понятно, я же много туда их записываю, когда из запроса выгружаю.
|
|||
31
Живой Ископаемый
23.05.11
✎
16:49
|
а, стоп... ересь сказал. :)
|
|||
32
Reset
23.05.11
✎
16:52
|
(19) После
НаборЗаписей.Записать(); добавь НаборЗаписей.Очистить(); |
|||
33
Reset
23.05.11
✎
16:53
|
Ну или НаборЗаписей.Удалить(НоваяЗапись) - по вкусу
|
|||
34
Reset
23.05.11
✎
16:54
|
А вообще для приведенного примера набор не нужен, через менеджер записи все можно делать
|
|||
35
Domovoi
23.05.11
✎
16:58
|
+(27)Я ошибся. Не перезапустил обработку. Не сработало если после цикла. А должно сработать?
|
|||
36
Domovoi
23.05.11
✎
17:00
|
Так все же как надо писать?
|
|||
37
Domovoi
23.05.11
✎
17:02
|
Через запрос 55700 записей в списке обработало за 20 сек. Через итерации, если наборЗаписей.Записать() в цикле то счет на минут идет. Если НаборЗаписей.Записать() вне цикла, то ошибка, можетя не так чтото делаю. Какой еще вариант есть?
|
|||
38
Domovoi
23.05.11
✎
17:09
|
(34)Та же петрушка что и с набором записей. Очень долго.
|
|||
39
Domovoi
23.05.11
✎
17:12
|
Ну не подсказываете, скажите хоть что почитать. А то через запрос говорите фигня, а как надо делать - молчите.
|
|||
40
73
23.05.11
✎
17:12
|
А если отбор только по ДатаОтбора использовать?
|
|||
41
lxs
23.05.11
✎
17:14
|
(37) "Если НаборЗаписей.Записать() вне цикла, то ошибка" - ты хоть немного соображаешь, что делаешь?
И кстати, в (34) тебе дали дельный совет. |
|||
42
Reset
23.05.11
✎
17:14
|
а) Либо ты что-то не так делаешь, но умалчиваешь.
б) Если Количество номенклатур в твоем списке достаточно велико, то оно вполне может отрабатывать долго в) Ты умолчал о каком-то упрощающем условии. Например, в таблице СписокНоменклатуры заведомо полный список на дату ДатаОтбора. Тогда в наборе вооще не надо устанавливать отбор по номенклатуре. г) Хз. |
|||
43
Reset
23.05.11
✎
17:18
|
Попробуй (код не проверен, безошибочность работы НЕ ГАРАНТИРУЮ, в т.ч. синтаксическую)
Запись=РегистрыСведений.СтатустностьНоменклатуры.СоздатьМенеджерЗаписи(); СписокНоменклатуры.Колонки.Добавить("Период"); // для выпендрежа с ЗаполнитьЗначенияСвойств СписокНоменклатуры.ЗаполнитьЗначения(ДатаОтбора,"Период"); // Для каждого Строка из СписокНоменклатуры цикл ЗаполнитьЗначенияСвойств(Запись,Строка); Запись.Записать(); КонецЦикла; Если будет работать медленно, тогда нужно менять смысл темы на "Как оптимизировать запись в РС", указав сопутствующую информацию для размышления (коей сейчас явно недостаточно) |
|||
44
Domovoi
23.05.11
✎
17:18
|
(40)И что получится?
(41)Что то дельность его не видна только. (42)а)Зачем мне умалчивать? Я не вас тут собрался подсикать на незнании, а мне самому надо узнать и научится, да и сделать побыстрее, смысл мне тянуть кота за хвост? б)НУ я не спорю, просто сказали что способ через запрос не правильный был, вот я и хочу научится правильному. в)Я все сказал, список произвольный, но на одну дату, но элементы не все могут быть на эту дату. г)Вот и я хз. |
|||
45
Reset
23.05.11
✎
17:19
|
(44) Я имел в виду умалчивать неосознанно, а не злоумышленно.
|
|||
46
Domovoi
23.05.11
✎
17:30
|
(43)Долго.
|
|||
47
73
23.05.11
✎
17:30
|
(44) В регистре(до записи) могут быть другие элементы на эту же дату?
|
|||
48
Reset
23.05.11
✎
17:32
|
(47) Исходя из (44), пункт в, могут :)
|
|||
49
Domovoi
23.05.11
✎
17:34
|
(47)Да. В регистре может быть все) Я делаю обработку для изменения статустность номенклатуру на выбранную дату. Т.е. накидываю список номенклатуры ставлю дату и выбираю какой статус поставить, нажимаю применить, должны изменится или добавиться записи имеющие номенклатуру из списка и период равый выбранной дате.
|
|||
50
73
23.05.11
✎
17:34
|
(47)+
(48) Исправлюсь: В регистре(до записи) могут быть записи по другой номенклатуре на эту же дату? |
|||
51
Domovoi
23.05.11
✎
17:35
|
(50)Да
|
|||
52
73
23.05.11
✎
17:36
|
Статус - тип какой?
|
|||
53
Domovoi
23.05.11
✎
17:37
|
(52)Перечисления, но думаю это не важно.
|
|||
54
Reset
23.05.11
✎
17:39
|
Тогда, возможно, нужно исходить из соотношения количества изменяемых записей за день к количеству неизменяемых.
Если количество вторых сравнимо с первыми, тогда быстрее будет писать сразу весь набор за день (читаем набор - меняем нужные строки - пишем). Кроме того, если количество записей в твоей таблице изменений велико (55700 - это что?), такой вариант будет быстрее в любом случае. Сколько записей в регистре за день в среднем? Сколько строк в списокНоменклатуры в среднем? |
|||
55
Domovoi
23.05.11
✎
17:45
|
(54)Это номенклатура, завели и забыли) Изменения происходят, статус показывает: снят с производства, в производстве, акция, распродажа. Меняется он редко. Через запрос, в любом случае 20 сек делает, а через другие методы при небольшом колве в списке номенклатуры делается быстрее, ну при большом - очень долго. Вот я и хотел найти способ универсальный, а так получается нужно наверно два способа использовать в зависимости от количества изменяемых записей.
|
|||
56
73
23.05.11
✎
17:48
|
(55) Еще вопрос:
В регистре(до записи) могут быть записи по номенклатуре из списка на эту же дату? |
|||
57
Domovoi
23.05.11
✎
17:49
|
(56)Могут. К примеру был один статус. решили что он ошибочен и надо заменить.
|
|||
58
Domovoi
23.05.11
✎
17:57
|
(9)Вот эту мысль все-таки не понял. Что мне делать с построителем запроса?
|
|||
59
73
23.05.11
✎
17:57
|
НаборЗаписей = РегистрыСведений.СтатустностьНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ДатаОтбора); НаборЗаписей.Прочитать(); ТЗ = НаборЗаписей.Выгрузить(); //удалить по списку ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ); НовыйОтбор = ПостроительЗапроса.Отбор.Добавить("Номенклатура"); НовыйОтбор.ВидСравнения = ВидСравнения.НЕВСписке; // нужный вид сравнения НовыйОтбор.Значение = СписокНоменклатуры; НовыйОтбор.Использование = Истина; Результат = ПостроительЗапроса.Результат; // отобранные строки типа РезультатЗапроса ТЗ = Результат.Выгрузить(); НаборЗаписей.Загрузить(ТЗ); //добавить новые Для каждого ТекСтрока Из СписокНоменклатуры Цикл НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Период = ДатаОтбора; НоваяЗапись.Номенклатура = ТекСтрока.Номенклатура; НоваяЗапись.СтатусНоменклатуры = ТекСтрока.СтатусНоменклатуры; КонецЦикла; //записать 1 раз НаборЗаписей.Записать(); |
|||
60
Reset
23.05.11
✎
18:00
|
(55) Примерно так. Только запрос не нужен опять же, НаборЗаписей.Прочитать() ничуть не хуже :)
|
|||
61
Domovoi
23.05.11
✎
18:01
|
(59)Спасибо.Правда я через запрос, тоже самое делаю,только проверю что быстрее. На будущее буду знать.
(60)Всмысле? А что мы получим через Прочитать? |
|||
62
73
23.05.11
✎
18:02
|
(59) Только СписокНоменклатуры проверь в отборе построителя.
Там список значений нужен. А у тебя похоже - таблица значений... |
|||
63
Reset
23.05.11
✎
18:03
|
(61) Получим то, что есть сейчас в регистре (что ты, видимо, запросом делаешь). См пример в (59) :)
|
|||
64
Domovoi
23.05.11
✎
18:05
|
(63)Запросом я получаю, записи из регитра, которые не буду менять.
|
|||
65
Domovoi
23.05.11
✎
18:18
|
(59)При большом количестве изменяемых записей, получается очень долго. Но есть промежуток где этот метод выгоднее остальных, но это надо уже исследовать.
Вообщем опыта набрался, всем спасибо, если есть еще методы напишите, буду рад узнать. |
|||
66
Reset
23.05.11
✎
18:28
|
(64) Тогда кстати вариант развить идею и получать запросом сразу готовую к записи таблицу: В запрос передаем ТаблицуИзменений, там помещаем ее во временную таблицу, которую соединяем (полным соединением по номенклатуре)со срезом на заданный период, по ГДЕ фильтруем чтобы состояние было различно в таблицах и возвращаем 1) состояние из временной в приоритете 2) состояние из регистра, если во временной значение NULL
Полученную таблицу заносим в пустой набор и пишем. Все, ушел пить пиво по поводу ДР) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |