Имя: Пароль:
1C
1С v8
Программное добавление данных в регистр сведений
,
0 mishgun1990
 
26.03.15
12:39
Добрый день. Возникла такая проблема, при отрабатывании этого когда, он заносит в регистр кучу информации, как будто память от старых данных не очищаются и они каждый раз добавляются.
Что в нем не так?
Заранее спасибо!!!

Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ПоступлениеТоваровУслуг.Дата КАК Дата,
                   |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Наименование,
                   |    ПоступлениеТоваровУслугТовары.Цена КАК Стоимость,
                   |    ВложенныйЗапрос.Регистратор КАК РегистраторПоступления,
                   |    ПоступлениеТоваровУслуг.Ссылка КАК Объект
                   |ИЗ
                   |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары,
                   |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг,
                   |    (ВЫБРАТЬ
                   |        ЦеныНоменклатуры.Регистратор КАК Регистратор
                   |    ИЗ
                   |        РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры) КАК ВложенныйЗапрос
                   |ГДЕ
                   |    ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка";
        
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.РегистраторПоступления);
        НаборЗаписей.Прочитать();
        НовЗапись = НаборЗаписей.Добавить();
        НовЗапись.Период = ВыборкаДетальныеЗаписи.Дата;
        НовЗапись.Номенклатура = ВыборкаДетальныеЗаписи.Наименование;
        НовЗапись.Цена =  ВыборкаДетальныеЗаписи.Стоимость;
        НовЗапись.ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Розничная");
        НовЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("RUB");
        НаборЗаписей.Записать(ЛОЖЬ);
    КонецЦикла;
    ВыборкаДетальныеЗаписи = "";
1 Остап Сулейманович
 
26.03.15
12:41
(0) "как будто память от старых данных не очищаются и они каждый раз добавляются."
А как они должны себя вести при вот этом :
НаборЗаписей.Записать(ЛОЖЬ);?
2 rphosts
 
26.03.15
12:51
если тебе старые записи мешают - между
        НаборЗаписей.Прочитать();
и
        НовЗапись = НаборЗаписей.Добавить();

нужно вставить
НаборЗаписей.Очистить();
3 mishgun1990
 
26.03.15
12:54
Остап Сулейманович
Я наверное не совсем корректно выразился, он данные запроса не очищает, а постоянно гоняет их при каждом вызове и добавляет в регистр.
4 Остап Сулейманович
 
26.03.15
12:58
(3) Так он и не должен очищать. Вот здесь :
НаборЗаписей.Записать(ЛОЖЬ);
параметр метода "ЛОЖЬ" означает не замещать существующие записи. Поставь ИСТИНА. Йес?
5 mishgun1990
 
26.03.15
13:05
Не так. Если я беру один документ, выполняю запрос и он берет из него данные.
Беру второй, совершенно другой, и тоже выполняю запрос.
Так вот он этим запросом данные и из первого документа берет тоже, хотя мне нужно чтобы данные брались только из текущего.

А код вообще верный?
Можете строчку отбор пояснить?
Заранее спасибо!!!
6 Остап Сулейманович
 
26.03.15
13:12
(5) Ну вы блин умеете объяснить...

У тебя набор создается/читается/заполняется для каждой записи одного документа. То есть сколько строк - столько наборов.

Создание набора вынеси перед циклом

Примерно так :

РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
//НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.РегистраторПоступления);

//Отбирать записи у которых регистратор - текущий документ
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
НаборЗаписей.Прочитать();
//Почистить старые записи
НаборЗаписей.Очистить();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    НовЗапись = НаборЗаписей.Добавить();
    ....
КонецЦикла;

НаборЗаписей.Записать(Истина); //Ну что б уже наверняка
7 mishgun1990
 
26.03.15
13:35
Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
Ошибка SDBL:
Таблица или поле Fld1044INTO не содержится в разделе FROM

Вот такая ошибка появилась
8 D_E_S_131
 
26.03.15
13:39
Запрос у ТС полнейшее %авно. Собственно, саму запись в РС не имеет смысл проверять.
Выбираются данные из 3-х таблиц, но условие накладывается только на одну из них. Никаких соединений в запросе нет вообще. Как "такое" может давать вообще результат?
9 D_E_S_131
 
26.03.15
13:40
mishgun1990, ты бы хоть в консоли запросов для начала посмотрел на свой результат.
10 mishgun1990
 
26.03.15
13:58
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ПоступлениеТоваровУслуг.Дата КАК Дата,
                   |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Наименование,
                   |    ПоступлениеТоваровУслугТовары.Цена КАК Стоимость
                   |ИЗ
                   |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                   |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка
                   |ГДЕ
                   |    ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка";           
                        
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
    НаборЗаписей.Прочитать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        НовЗапись = НаборЗаписей.Добавить();
        НовЗапись.Период = ВыборкаДетальныеЗаписи.Дата;
        НовЗапись.Номенклатура = ВыборкаДетальныеЗаписи.Наименование;
        НовЗапись.Цена =  ВыборкаДетальныеЗаписи.Стоимость;
        НовЗапись.ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Розничная");
        НовЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("RUB");
        НаборЗаписей.Записать(ЛОЖЬ);
    КонецЦикла;
    ВыборкаДетальныеЗаписи = "";

Ошибка та же, дело в чем то в другом
11 mishgun1990
 
26.03.15
14:17
Вопрос снят, во всём разобрался, всем спасибо за участие и помощь.
Форум класс)))!!!