Имя: Пароль:
1C
1С v8
Установка отбора на несколько значений
, ,
0 yusose
 
21.04.14
12:09
Доброго времени суток! Нужно установить отбор по нескольким возможным значениям одного измерения, а именно: есть регистр сведений, непериодический, независимый. Нужно сделать отбор по значению измерения:

НаборЗаписей.Отбор.ВидУчетаВремени.Установить(ЗНАЧЕНИЯ);

Где Значения-это несколько значений Перечислений, либо одно НЕ Значение Перечисления)) Как поняла, отбор может использоваться только для одного значения, как можно установить отбор по нескольким значениям?

Заранее спасибо всем откликнувшимся!
1 Maxus43
 
21.04.14
12:11
нельзя, отбор набора записей - только на равенство
2 yusose
 
21.04.14
12:11
(1) а чем можно заменить?
3 Maxus43
 
21.04.14
12:21
(2) смотря зачем надо.
Если просто прочитать данные - Запрос
4 yusose
 
21.04.14
12:32
(3) новый не хотелось бы создавать, а в имеющийся не могу вклиниться, чтоб аккуратно)) нужно не удалять строки регистра по одному типу документа. По умолчанию удаляются все пересекающиеся по периоду действия строки, вне зависимости от вида учета времени.
5 Wobland
 
21.04.14
12:35
создать набор, прочитать набор, изменить набор, записать набор
6 Maxus43
 
21.04.14
12:36
(4) простите, но миелофон у меня сломался, телапатия отказала, и задачу вашу я не понял.

Что за регистр? ГрафикРаботПоВидамВремени чтоль?

Короче данные пишутся по каждой записи скорей всего (все измерения = Основной Отбор), надо менять алгоритм табеля.

Это если я правильно протелепатил
7 Maxus43
 
21.04.14
12:37
технически для такого регистра "По умолчанию удаляются все пересекающиеся по периоду действия строки" - не имеет силу закона, это тупо в коде сделано
8 yusose
 
21.04.14
12:41
(6) все правильно) данные да, для каждой записи

не могу сообразить, где менять алгоритм табеля? (я всего месяц как... стажер...) нужно, чтобы "По умолчанию удаляются все пересекающиеся по периоду действия строки" работало нормально, но не задевало новый документ.
9 Maxus43
 
21.04.14
13:01
(8) о, миелофон снова в строю!
там алгоритм примерно такой - всё что указано в табеле на каждого сотрудника по периоду - заполняется новыми записями, не разбираясь "а что там было раньше".
Перед записью очередной записи в регистре придётся "разобраться", т.е. прочитать значение менеджера регистра, куда собирается писать табель.
В регистре нет признака каким документом были сделаны движения, есть только реквизит "Документ", можно на него смотреть и принимать решение записывать или нет новую запись.
10 yusose
 
21.04.14
13:13
(9) Есть реквизит документ, и НОВЫЙ вид учета времени, по значению которого я и пытаюсь сделать отбор... т.е. наоборот, чтобы это значение в отбор не попадало...

А вот так сильно криво будет? :

               Для Сч = 1 По 4 Цикл
                        Если Сч = 1 Тогда
                          НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоВечернимЧасам);
            ИначеЕсли Сч = 2 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоДням);
            ИначеЕсли Сч = 3 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоНочнымЧасам);
            ИначеЕсли Сч = 4 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоЧасам);
            КонецЕсли;
                КонецЦикла;

И еще, подскажите, чем пользуетесь для вставки кода в форум?
11 yusose
 
21.04.14
13:13
он, оказывается, сам вставляется))) не знала)
12 yusose
 
21.04.14
13:14
правда криво как-то...
13 yusose
 
21.04.14
13:20
вот, полностью:

        НаборЗаписей.Отбор.План.Установить(Истина);
        НаборЗаписей.Отбор.ГрафикРаботы.Установить(ВыборкаЗапроса.Сотрудник);
        НаборЗаписей.Отбор.Месяц.Установить(ВыборкаЗапроса.ПериодРегистрации);
        
        Для Сч = 1 По 4 Цикл
            Если Сч = 1 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоВечернимЧасам);
            ИначеЕсли Сч = 2 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоДням);
            ИначеЕсли Сч = 3 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоНочнымЧасам);
            ИначеЕсли Сч = 4 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоЧасам);
            КонецЕсли;
        
        НаборЗаписей.Очистить();
        НаборЗаписей.Записать();
        
        КонецЦикла;
14 yusose
 
21.04.14
13:21
это все в цикле на каждого сотрудника
15 Maxus43
 
21.04.14
13:23
>>И еще, подскажите, чем пользуетесь для вставки кода в форум?
ничем, так и пиши.

Я не понимаю зачем какие-то отборы... там есть код:
                    НаборГрафикиРаботыПоВидамВремени.Загрузить(ТаблицаНабора);
                    НаборГрафикиРаботыПоВидамВремени.Записать();

в самом примитивном варианте (долгий и некультурный, но работать будет) надо тебе до Загрузить(); обойти таблицу ТаблицаНабора и на каждую запись по измерениям проверить "а что там было до записи", посомтреть реквизит "Документ". И удалить эти строки из таблицы, чтобы записывалось что надо.

(13) этот код Удалит записи же, а надо как я понял - не удалять записи, сделанные определённым документом
16 yusose
 
21.04.14
13:33
(15) там нет этого кода... все работает в процедуре
УдалитьЗаписиЗаПериодДокумента(), она как раз работает по отборам, мои добавленные строки в данном случае будут
        Для Сч = 1 По 4 Цикл
            Если Сч = 1 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоВечернимЧасам);
            ИначеЕсли Сч = 2 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоДням);
            ИначеЕсли Сч = 3 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоНочнымЧасам);
            ИначеЕсли Сч = 4 Тогда
                НаборЗаписей.Отбор.ВидУчетаВремени.Установить(Перечисления.ВидыУчетаВремени.ПоЧасам);
            КонецЕсли;
КонецЦикла;
17 yusose
 
21.04.14
13:34
а остальное все стандартное

все это в цикле на каждого сотрудника документа
18 yusose
 
21.04.14
13:34
т.е. отбор был, и именно в этом отборе он проверяет...
19 Maxus43
 
21.04.14
13:35
(16) а что должен сделать этот код?
20 yusose
 
21.04.14
13:48
(19) он делает отбор по 4 из 5-ти (пятый созданный мной) значениям)))
21 yusose
 
21.04.14
13:49
т.е. пятое значение не попадает в отбор, и, соответсвенно, не перезаписывается... правильно? вот только не знаю, в данном случае цикл, наверное, сильно замедляет работу?
22 Maxus43
 
21.04.14
13:56
(21) нет, он делает только отбор Перечисления.ВидыУчетаВремени.ПоЧасам и удаляет только эти записи, остальные не трогает
23 yusose
 
21.04.14
14:02
(22) НаборЗаписей.Очистить();
        НаборЗаписей.Записать();
это же тоже в цикле для сч=1 по 4? значит, каждый очищает и удаляет?
24 yusose
 
21.04.14
14:03
(13) вот здесь
25 yusose
 
21.04.14
14:03
полный текст
26 Maxus43
 
21.04.14
14:05
(24) тогда да, но я не совсем понимаю как это относится к задаче (4)(8)... не удаляет только по отбору, которого нет в цикле
27 yusose
 
21.04.14
14:10
(26) именно это мне и нужно, чтобы при новом виде учета времени запись не удалялась. Раз уж отбор нельзя сделать по нескольким значениям... А как с быстродействием в данном случае?
28 Maxus43
 
21.04.14
14:17
(27) терпимо впринципе.
Тут заковыка в том, что "удалить" запись он может не только в этой процедуре, поверх старой он может положить новую, там где и идёт запись в регистр
29 yusose
 
21.04.14
14:19
(28) нуу... вообщем-то, запись остается, как факт) спасибо большое за подробные ответы! :)
2 + 2 = 3.9999999999999999999999999999999...