Имя: Пароль:
1C
1С v8
Как создать дублирующие строки в регистре сведений?
,
0 Nolan
 
24.03.15
12:50
В общем есть документ "Поступление товаров", он проводится по регистру сведений "Цены". Задача заключается в том, чтобы при проведении документа "Поступление товаров" в регистре сведений создавалось 2 строки в одной из них цена будет браться из табличной части "Товары" документа "Поступление товаров", а в другой строке цена будет браться тоже из документа "Поступление товаров" но только её нужно будет умножить на 2!
вот код
Процедура ОбработкаПроведения(Отказ, Режим)
    

    // регистр Цены
Движения.Цены.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = ТипЦены;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена;
    КонецЦикла;
    
КонецПроцедуры

что нужно изменить в коде, чтобы выполнялось задание???
1 1976vas
 
24.03.15
12:53
Добавить в регистр дополнительный ресурс.
2 Лефмихалыч
 
24.03.15
12:54
(1) только не ресурс, а измерение
3 Nolan
 
24.03.15
13:02
1976vas, Лефмихалыч, да вот в том то и дело, что по заданию ничего добавлять нельзя, потому как тогда будет выдаваться одна строка в регистре сведений, а мне нужно чтобы 2 выдавались. Мне сказали просто продублируй строки. я продублировал мне ошибка запись с такими ключевыми полями уже существует( и как быть?
4 Лефмихалыч
 
24.03.15
13:04
(3) прочти букварь. В РС не может быть дублей записей. Технологически не возможно. Вообще. Ни как. Живи с этим.
5 1976vas
 
24.03.15
13:04
(3) Тогда два движения создавай. Два набора записей.
6 1976vas
 
24.03.15
13:05
(4) Не будет дублироваться - цены же разные будут.
7 Alex S D
 
24.03.15
13:05
я так понимаю ТипЦен у этих двух строк должен отличаться, иначе бессмыслица какая-то
8 ДемонМаксвелла
 
24.03.15
13:05
ну как мне понимается это два разных типа цен, типа "основная" и "удвоенная". Так что ничего в регистре не нужно править.
9 ДемонМаксвелла
 
24.03.15
13:06
(7) солидарен с тобой , Леха
10 Alex S D
 
24.03.15
13:06
(9)))
11 Nolan
 
24.03.15
13:09
Да ребят, тип цены будет разный. когда тип цены "Цена закупки" тогда берется обычная цена. Когда тип цены "Цена продажи" тогда удваивается. Что в коде изменить?
12 1976vas
 
24.03.15
13:11
(11) А при чем здесь тогда дублирование строчек?
13 Бледно Золотистый
 
24.03.15
13:11
(11) Фигасе у вас накрутка.
14 1976vas
 
24.03.15
13:12
В коде анализируешь ТипЦены и записываешь нужную цену.
15 MiniMuk
 
24.03.15
13:13
(4) живи с этим
- ржал долго.
16 Nolan
 
24.03.15
13:14
Подробное задание: Для каждой номенклатуры создавать записи с типами цен, указанными по формулам:"Цена закупки" тогда берется обычная цена. Когда тип цены "Цена продажи" тогда удваивается.
Я наверное не совсем понял задание, но мне сказали что должно выдаваться две строки в Регистре. Получается нужно сделать если тип цены закупки то тогда одна строка выдается, а если тип цены продажи тогда другая?
17 Бледно Золотистый
 
24.03.15
13:18
(16) Сам народ запутал, прочитал и сам засомневался? Мдее. Две строки с 2-мя типами цен.
18 Nolan
 
24.03.15
13:19
Получается Если я выбираю в документе Тип цены "Цена продажи" то цена должна удвоиться. Как этот механизм реализовать в коде???
19 Nolan
 
24.03.15
13:20
БледноЗолотистый, есть такое. Совсем не опытный(((
20 1976vas
 
24.03.15
13:23
ТипЦены какой тип имеет?
21 necro
 
24.03.15
13:25
(18)
Процедура ОбработкаПроведения(Отказ, Режим)
    

    // регистр Цены

Движения.Цены.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = ТипЦены;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена * ?(ТипЦены=ЦенаПродажи,2,1);
    КонецЦикла;
    
КонецПроцедуры
22 Nolan
 
24.03.15
13:25
Справочник.ТипыЦен
23 Nolan
 
24.03.15
13:26
1976vas, Справочник.ТипыЦен
24 1976vas
 
24.03.15
13:36
(23) см. (21) а ЦенаПродажи будет Справочники.ТвойСправочник.НайтиПоКоду("Код");
25 фобка
 
24.03.15
13:37
(0) проще новый регистр создать такойже
26 1976vas
 
24.03.15
13:38
Это если не надо строки дублировать, а если надо как в (17) то в цикле еще одно движение делаешь Движение = Движения.Цены.Добавить(); и записываешь туда удвоенную цену.
27 Nolan
 
24.03.15
13:46
1976vas, нужно как в (16).  в цикле еще одно движение делаешь Движение = Движения.Цены.Добавить() это так нужно:

Процедура ОбработкаПроведения(Отказ, Режим)
    

    // регистр Цены

Движения.Цены.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = ТипЦены;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена;
КонецЦикла;

Движения.Цены.Добавить();
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = ТипЦены;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена*2;
КонецЦикла;

    
КонецПроцедуры

?
28 fisher
 
24.03.15
13:49
(27) Откуда берется тип цены? Это модуль проведения какого документа?
29 1976vas
 
24.03.15
13:49
Второй цикл убери, в одном делай, а во втором движении у тебя еще будет ТипЦены = Справочники.ТвойСправочник.НайтиПоКоду("Код");
Т.е. получится, у тебя в документе выбрана ЦенаЗакупки, а ЦенуПродажи ты вычисляешь.
30 Nolan
 
24.03.15
13:55
fisher, Тип Цены берется из Справочник.ТипыЦен. Это модуль проведения документа "Поступления товаров"
31 hhhh
 
24.03.15
13:59
(30) почему тогда один тип цены везде фигачишь? Нужно ведь два.
32 Nolan
 
24.03.15
14:04
1976vas, сделал так
Движения.Цены.Записывать = Истина;
Движения.Цены.Добавить();
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = ТипЦены;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена;
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = Справочники.ТипыЦен.НайтиПоКоду("Код");
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена*2;

КонецЦикла;

при проведении документа "поступление товаров" пишит ошибку "Период не может быть пустым. Цены: 01.01.0001...(Регистр сведений:Цены,Номер строки:1)
33 hhhh
 
24.03.15
14:06
Движения.Цены.Добавить(); два раза подряд захерачил. Одно пустое.
34 Nolan
 
24.03.15
14:09
hhhh, можешь пожалуйста исправить в коде как правильно, чтобы и тип цены разный был... потому что я уже нихрена не пойму(((
35 1976vas
 
24.03.15
14:10
До цикла убери строчку Движения.Цены.Добавить(); И код элемента справочника напиши вместо "Код"
36 fisher
 
24.03.15
14:10
Мда... Тяжелый случай. Ладно 1С вчера увидел. Голову хоть чуть-чуть включать надо. Откуда 1С догадается, какие типы цен записывать надо? Телепатическим усилием?
37 1976vas
 
24.03.15
14:13
(36) В первом случае из реквизита документа, во втором из справочника. Тип цен, наверное, реквизит документа, а не табличной части.
38 Nolan
 
24.03.15
14:15
fisher не совсем вчера) где-то недели 3 в него смотрю)))
39 Nolan
 
24.03.15
14:19
1976vas, да Тип Цен у меня реквизит документа "Поступление товаров". Код элемента справочника это у меня "Тип цен"?
40 1976vas
 
24.03.15
14:21
(39) В справочнике заведи ЦенуПродажи, скопируй код и вставь вместо "Код".
41 Nolan
 
24.03.15
14:22
О БОГИ, ДРУЗЬЯ ВСЕ ЗАРАБОТАЛО!!!! ВОТ ПРАВИЛЬНЫЙ КОД

// регистр Цены
Движения.Цены.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = ТипЦены;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена;
Движение = Движения.Цены.Добавить();
        
Движение.Период = Дата;
Движение.ТипЦены = Справочники.ТипыЦен.НайтиПоКоду("Цена продажи");
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена*2;

    КонецЦикла;

Спасибо большое всем за помощь!!!
42 Nolan
 
24.03.15
14:23
1976vas, отдельное спасибо за помощь и терпение!!!)))
43 1976vas
 
24.03.15
14:24
(42) Подожди )), у тебя не может быть код ("Цена продажи");
44 1976vas
 
24.03.15
14:25
Код так и называется Код, посмотри в справочник.
45 1976vas
 
24.03.15
14:27
Или НайтиПоКоду() замени на НайтиПоНаименованию()
46 Бледно Золотистый
 
24.03.15
14:30
(43) Очень даже может, ты недооцениваешь возможности ТСа
47 Nolan
 
24.03.15
14:31
1976vas ,справочник "Типы цен", наименование "Цена продажи",  код 000000002. теперь понимаю о чем Вы говорите) Но вот я сделал как в (41) и все работает)))
48 1976vas
 
24.03.15
14:32
(47) Посмотри регистр, что туда пишется?
49 1976vas
 
24.03.15
14:32
(46) )
50 Господин ПЖ
 
24.03.15
14:39
пятнично
51 D_E_S_131
 
24.03.15
15:12
И, Nolan, когда будешь по человечески искать ТипЦен для цены продажи, то делай это ОДИН раз ПЕРЕД циклом, а потом уже используй его при формировании записей РС.
52 Nolan
 
24.03.15
15:16
1976vas, (48) пишется цена продажи)
53 hhhh
 
24.03.15
15:18
очень хорошо. Хоть цена записалась.
54 Nolan
 
24.03.15
15:25
1976vas, а вообще-то да, все же раньше было пустое поле. а когда в код вписал "000002" тогда все работает правильно. Пишет и цену закупки и цену продажи. Спасибо!)
55 1976vas
 
24.03.15
15:27
(54) Вот так сделай (51), там и вправду надо перед циклом получить, а потом присваивать уже в цикле.
56 Nolan
 
24.03.15
15:27
D_E_S_131, хорошо, спасибо за совет! Было бы информативней увидеть то что ты говоришь на коде. Если будет время напиши как правильней! Буду благодарен)
57 Nolan
 
24.03.15
15:28
а в чем разница? так ведь тоже работает или это не правильно?
58 Nolan
 
24.03.15
15:28
1976vas, (55) а в чем разница? так ведь тоже работает или это не правильно?
59 1976vas
 
24.03.15
15:29
(57) Ты в цикле каждый раз обращаешься к справочнику, а достаточно один раз, перед циклом.
60 D_E_S_131
 
24.03.15
15:29
(57) Это "запрос в цикле", если тебе это о чем-то говорит.
61 1976vas
 
24.03.15
15:30
(59) По времени дольше происходит, на величину, равной количеству строк в ТЧ.
62 alex_shkut
 
24.03.15
15:34
(27) Возьми этот вариант, только во 2 Движении правильный тип цены поставь. И вынеси "НайтиПоКоду" перед циклом.
ТипПродажная = Справочник.ТипыЦенНоменклатуры......
Для Каждого
...
   = ТипПродажная;
...
КонецЦикла;
63 Nolan
 
24.03.15
15:42
Все понял, переделал как нужно. Если так правильней буду делать так.   alex_shkut спасибо!
64 France
 
24.03.15
15:45
(0) создать новый вид цен, и рассчитывать его как *2 от первого типа.
65 D_E_S_131
 
24.03.15
15:50
(64) Доброе утро, брат.
66 France
 
24.03.15
15:58
(65) и тебе не хворать.. зачем огород городили?))
67 1976vas
 
24.03.15
16:00
(66) Он код хотел, а просто так его не дашь же, надо чтобы человек что-то вынес.
68 France
 
24.03.15
16:01
(67) истинно говорю: у него неправильные хотения))
69 Nolan
 
24.03.15
16:02
может кому пригодиться, вот исправленный код. все работает)

Процедура ОбработкаПроведения(Отказ, Режим)

// регистр Цены
Движения.Цены.Записывать = Истина;
ТипПродажная = Справочники.ТипыЦен.НайтиПоКоду("000000002");
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.ТипЦены = ТипЦены;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена;
Движение = Движения.Цены.Добавить();
        
Движение.Период = Дата;
Движение.ТипЦены=ТипПродажная;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена= ТекСтрокаТовары.Цена*2;

    КонецЦикла;
КонецПроцедуры
70 alex_shkut
 
24.03.15
16:03
(68) Так я же кода и не дал :) только указал на ошибки. Код его.
71 France
 
24.03.15
16:05
(69) интересно: типовая? если типовая, то которая из?
72 D_E_S_131
 
24.03.15
16:08
(71) А в чем сомнения? В УТ 10.3 ПТиУ может быть регистратором для РС "ЦЕныНоменклатуры".
73 France
 
24.03.15
16:13
(72) у меня  сомнений не в верности кода..мне интересен только механизм решения задачи без доработки кода..
74 alex_shkut
 
24.03.15
16:30
(73) Внешняя обработка
75 France
 
24.03.15
16:33
(74) интересная конфа)).. поизучаю)