Имя: Пароль:
1C
1C 7.7
v7: Периодический реквизит, который создается документом
0 userMR3
 
27.01.14
22:16
Выгружаю из другой базы цену, если она создана вручную, то все переносится нормально, если создана документом, то не переносит вообще, хотя значения в цикле видит. Как сделать запись без документа?

    ПериодРекв = СоздатьОбъект("Периодический");
    ПериодРекв.ИспользоватьОбъект(ИмяРекв, ТекЭлемент);
    
    ПериодРекв_ОЛЕ = БазаИсточник.CreateObject("Периодический");
    ПериодРекв_ОЛЕ.ИспользоватьОбъект(ИмяРекв, ТекЭлемент_ОЛЕ);
    ПериодРекв_ОЛЕ.ОбратныйПорядок(1);
    ПериодРекв_ОЛЕ.ВыбратьЗначения();
    Пока ПериодРекв_ОЛЕ.ПолучитьЗначение() = 1 Цикл
        ПериодРекв.Значение = ПериодРекв_ОЛЕ.Значение;    
        ПериодРекв.ДатаЗнач = ПериодРекв_ОЛЕ.ДатаЗнач;
        //Сообщить(" рекв " + ИмяРекв +" - " + СокрЛП(ПериодРекв_ОЛЕ.Значение) +  " :" + СокрЛП(ПериодРекв_ОЛЕ.ДатаЗнач));
        ПериодРекв.Записать();
    КонецЦикла;
1 userMR3
 
27.01.14
22:17
Галочки Изменяется документами и Ручное изменение стоят.
2 userMR3
 
27.01.14
22:55
Должно же работать, что не так.
3 КонецЦикла
 
27.01.14
23:10
Насколько помню синтаксис другой
Установить...

Продам СП (цы)
4 userMR3
 
27.01.14
23:20
(3) Тоже самое, значения, которые внесены вручную перекидываются, а созданные документами - нет.
5 КонецЦикла
 
27.01.14
23:24
Ой, что-то я вообще не так прочитал...
Документ известен? Можно ВыбратьПоДоКументу()
Вот не помню уже, ОЛЕ давно не юзал
6 userMR3
 
27.01.14
23:27
(5) Документ известен в источнике, но его не будет в приемнике.
В цикле значения созданные документом фигурируют, но запись не проходит.
7 userMR3
 
27.01.14
23:33
Нужно перенести всю историю реквизита.
8 kot275
 
27.01.14
23:36
ПериодРекв.Установить(ПериодРекв_ОЛЕ.ДатаЗнач, ПериодРекв_ОЛЕ.Значение);
ПериодРекв.Записать();


Как-то так должно быть в цикле.
9 userMR3
 
27.01.14
23:40
ПериодРекв_ОЛЕ = БазаИсточник.CreateObject("Периодический");
    ПериодРекв_ОЛЕ.ИспользоватьОбъект("ЦенаПокупки", СпрТовары_ОЛЕ.ТекущийЭлемент());
    ПериодРекв_ОЛЕ.ОбратныйПорядок(1);
    ПериодРекв_ОЛЕ.ВыбратьЗначения();
    Пока ПериодРекв_ОЛЕ.ПолучитьЗначение() = 1 Цикл
        СпрТовары.ЦенаПокупки.Установить(ПериодРекв_ОЛЕ.ДатаЗнач,ПериодРекв_ОЛЕ.Значение);
        //СпрТовары.Записать();
    КонецЦикла;  

Я даже так пробовал, не создает запись.
10 kot275
 
27.01.14
23:43
(9)Так не будет,  //СпрТовары.Записать(); раскоментируй.
11 GANR
 
27.01.14
23:44
(0) 7.7? Она еще здесь? Сотрите ее!!!
12 userMR3
 
27.01.14
23:46
(10) Да уже пробовал, просто уже всю мисту перекопал, там писали, что установить() записывает без записать().
13 acanta
 
27.01.14
23:47
ТОлько УстановитьРеквизитСправочника в модуле документа без Записать() если мне не изменяет..
14 kot275
 
27.01.14
23:50
(10)Хм. А у тебя справочник цены подчинен справочнику товары? Может надо родителя привязывать?
15 Voronve
 
27.01.14
23:52
Установить(<?>,);
Синтаксис:
Установить(<Дата>,<Значение>)
Назначение:
Установить значение периодического реквизита справочника на заданную дату.
Параметры:
<Дата> - выражение со значением требуемой даты;
<Значение> - выражение, содержащее устанавливаемое значение периодического реквизита справочника.
Замечание:
Метод  можно использовать только для периодических реквизитов справочника и если для справочника еще не применялся метод ИспользоватьДату. Метод  можно использовать только для объектов-справочников, созданных функцией СоздатьОбъект.


"... и если для справочника еще не применялся метод ИспользоватьДату ..."
16 userMR3
 
27.01.14
23:53
МДАААА я нашел причину, дело не в том, что там документ фигурирует в истории, а в том 2 записи с одной датой и из двух он берет последнюю...
Как теперь быть?
17 Voronve
 
27.01.14
23:54
Устанавливать документом.
18 userMR3
 
27.01.14
23:54
Нельзя в приемник кидать эти документы.
19 Voronve
 
27.01.14
23:55
в ручную одно значение на одну дату
20 userMR3
 
27.01.14
23:57
(19) Не понял.
21 kot275
 
27.01.14
23:58
(20)Период у тебя день.
22 userMR3
 
28.01.14
00:01
(21) Это меняется где-то?
23 Voronve
 
28.01.14
00:01
(20) Ты тащищь из обмена несколько значений на одну дату. В базе приемнике, нельзя установить несколько значений на одну дату без документа. Так как ты "Нельзя в приемник кидать эти документы" - то вариант только один, записывать значение периодики вручную. Если пишешь ручками периодику - то одно значение в один день.
Цены поставщиков хранить в периодическом реквизите можно, если поставка в один день от одного поставщика ...
24 userMR3
 
28.01.14
00:07
Как мне поймать этот момент, когда на одну дату есть более одной записи?
25 kot275
 
28.01.14
00:09
(24)Лучше при выгрузке, через ТЗ.
26 Voronve
 
28.01.14
00:10
Не использовать СпрТовары.ЦенаПокупки.Установить(). Создавать объект периодический в базеприемнике, связывать с полем объекта и через выборку вперде ...
27 Torquader
 
28.01.14
00:16
А значение у нас какого типа ?
А то вы их так шустро из одной базы в другую переносите.
28 Voronve
 
28.01.14
00:17
число у него
29 Torquader
 
28.01.14
00:18
(28) Хотя, цена должна быть числом, если не накосячили.
30 Torquader
 
28.01.14
00:18
Кстати, при выборе периодического рекомендуется явно проставить даты, а то без них не всегда выбирает.
31 userMR3
 
28.01.14
00:25
Сделал так, вроде нормально работает, слегка пришлось исказить информацию, но не думаю, что критично

    ПерваяДата = "";
    
    ПериодРекв = СоздатьОбъект("Периодический");
    ПериодРекв.ИспользоватьОбъект(ИмяРекв, ТекЭлемент);
    
    ПериодРекв_ОЛЕ = БазаИсточник.CreateObject("Периодический");
    ПериодРекв_ОЛЕ.ИспользоватьОбъект(ИмяРекв, ТекЭлемент_ОЛЕ);
    ПериодРекв_ОЛЕ.ОбратныйПорядок(1);
    ПериодРекв_ОЛЕ.ВыбратьЗначения();
    
    Пока ПериодРекв_ОЛЕ.ПолучитьЗначение() = 1 Цикл
        
        Если ПустоеЗначение(ПериодРекв_ОЛЕ.Значение) = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        Если ПерваяДата = ПериодРекв_ОЛЕ.ДатаЗнач Тогда
            ПериодРекв.ДатаЗнач = ПериодРекв_ОЛЕ.ДатаЗнач - 1;
        Иначе
            ПериодРекв.ДатаЗнач = ПериодРекв_ОЛЕ.ДатаЗнач;    
        КонецЕсли;

        ПериодРекв.Значение = ПериодРекв_ОЛЕ.Значение;    
        ПериодРекв.Записать();
        ПерваяДата = ПериодРекв_ОЛЕ.ДатаЗнач;
    КонецЦикла;
32 userMR3
 
28.01.14
00:27
(29) Да число.
(30) Не понял.
33 userMR3
 
28.01.14
00:29
Короче там создают номенклатуру с пустой ценой, потом поступлением цена встает, думаю должно нормально работать.
34 acanta
 
28.01.14
00:30
ПериодРекв_ОЛЕ.ВыбратьЗначения(ДатаС,ДатаПо)
Если у мужа с женой было сегодня два раза, то один раз считается за вчера, а почему не за завтра?
А нулевую цену зачем тащить в приемник?
Может получиться что те вчера по 5, а сегодня бесплатно..
35 userMR3
 
28.01.14
00:35
(34) Это реплика на (31)?
36 acanta
 
28.01.14
00:39
(34)скорее на (33), номенклатуру создали рабочей датой с нулевой ценой за сегодня, а приход к примеру вчерашний и встанет она на вчера. Если в конфе нет обработки записи периодических реквизитов - периодика часто бывает забита такими нулями.
37 userMR3
 
28.01.14
00:42
(36) Да, так и есть, в (31) эти нули отсекутся, условие с датой лучше уберу.
38 Torquader
 
30.01.14
15:45
(36) Иногда нули тоже оправданы - если мы хотим явно сказать, что с сегодняшнего момента это значение не задано, так как иначе останется прошлое значение.