Имя: Пароль:
1C
1С v8
Помогите добавить строки регистра в цикле
0 GreenDay1986
 
18.06.12
10:34
Здравствуйте, делаю обработку по переоценке ОС. Программно создаю бухоперацию, добавляю к ней регистр параметрыАмортизацииОСБУ.
http://s45.radikal.ru/i107/1206/6d/469e032e6a6e.jpg
Операция создается, а вот с регистром проблема. В цикле пытаюсь добавлять строки и записывать значения, но как понимаю строка добавляется 1 раз и запись значений пытается пройти в ту же строку. В результате чего появляется ошибка http://i014.radikal.ru/1206/63/33dd94bf99bb.jpg.
Конфа БП 8.2   Код
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |ОС.Код КАК Код,
    |Рег.ИнвентарныйНомер КАК ИнвентарныйНомер
    |ИЗ Справочник.ОсновныеСредства КАК ОС
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(&ДатаСреза) КАК Рег
    |ПО ОС.Код = Рег.ОсновноеСредство.Код
    |ГДЕ ОС.Код = &Код";
    Запрос.УстановитьПараметр("ДатаСреза",ДатаВвода);
    Запрос.УстановитьПараметр("Код",Код);
    Рез = Запрос.Выполнить().Выбрать();
   
    Пока Рез.Следующий() Цикл
сли ЗначениеЗаполнено(СпрСсылка)  тогда        
Если переоценка >0 тогда
НоваяСтрока=докОперация.ТаблицаРегистровСведений.Добавить();
   НоваяСтрока.Имя="ПараметрыАмортизацииОСБухгалтерскийУчет";
   НоваяСтрока.Представление="ПараметрыАмортизацииОСБухгалтерскийУчет";
   
   РегистрБУ = РегистрыСведений.ПараметрыАмортизацииОСБухгалтерскийУчет.СоздатьНаборЗаписей();
   РегистрБУ.Отбор.Регистратор.Установить(ДокОперацияСсылка);
   
       
   НоваяПроводка = РегистрБУ.Добавить();
   НоваяПроводка.Период=ДатаВвода;
   НоваяПроводка.Организация=Справочники.Организации.НайтиПоКоду("000000002");
   НоваяПроводка.ОсновноеСредство = СпрСсылка.Ссылка;
   КонецЕсли;
КонецЕсли;
КонецЦикла;

РегХозрасчетный.Записать();   // Вставить содержимое обработчика.
РегистрБУ.Записать();
докОперация.Записать()

Подскажите пожалуйста что неправильно делаю. Заранее благодарен
1 andrewks
 
18.06.12
10:36
создание набора записей вынеси за цикл
2 Deniskind
 
18.06.12
10:59
(0) Если запрос вернет больше, чем одну запись, то получится, что у вас создастся более одной строки с параметрами регистратор = ДокОперацияСсылка, Период = ДатаВвода, Организация = Справочники.Организации.НайтиПоКоду("000000002") и ОсновноеСредство = СпрСсылка.Ссылка. А это ключевые поля регистра. Может быть дело в том, что где-то встретилось ОС с одинаковым кодом?
3 GreenDay1986
 
18.06.12
11:41
(1) вынес, теперь не ругается но добавляет только одну запись - последнюю в файле. То есть создает новую строку и в цикле записывает в нее значение до последнего. Необходимо чтобы создавал каждый раз и записывал а создает один раз и записывает последнюю
(2) с одинаковым кодом нет. В операцию в цикле все записывается, несколько ОС.
4 mkanaev
 
18.06.12
11:44
у тебя в каждой записи поддерживается уникальность по ключу?
5 Buster007
 
18.06.12
11:45
и это тоже вынес РегистрБУ.Отбор.Регистратор.Установить(ДокОперацияСсылка);?
6 GreenDay1986
 
18.06.12
11:51
(4) не понял немного. У всех ОС разные коды. Это создается операция
http://i061.radikal.ru/1206/68/b087440843b0.jpg
это регистр http://s45.radikal.ru/i107/1206/6d/469e032e6a6e.jpg в операции добавляется несколько строк, в регистр несколько добавить не могу
(5)тоже вынес
7 GreenDay1986
 
18.06.12
11:59
так и остается одна запись, как запись в цикле добавить хз чтото :(
8 Oleg_Kag
 
18.06.12
12:01
|ГДЕ ОС.Код = &Код";
У Вас несколько ОС с одним и тем же кодом?
9 GreenDay1986
 
18.06.12
12:04
(8) нет, это для загрузки из экселя, своеобразный поиск.
Код=Excel.ActiveSheet.Cells(стр,1).Value; затем после запроса
Запрос.УстановитьПараметр("Код",Код);
10 GreenDay1986
 
18.06.12
12:06
В общем нужно добавлять для каждого найденного основного средства строку, у меня получается что строка добавляется только один раз и записывается в нее последнее значение найденное в цикле
11 Buster007
 
18.06.12
12:07
(10) стоит прочитать про метод Записать()
12 GreenDay1986
 
18.06.12
12:11
(11) РегистрБУ.Записать() внес в цикл. результат тот же. У "НоваяПроводка" такого метода нет.
13 GreenDay1986
 
18.06.12
12:17
Собственно в цикле
НоваяПроводка = РегистрБУ.Добавить();
   НоваяПроводка.Период=ДатаВвода;
   НоваяПроводка.Осн1овноеСредство = СпрСсылка.Ссылка;
   РегистрБУ.Записать();

тоже самое выдает. Наверное какими то другими методами регистры двигать надо :(
14 Buster007
 
18.06.12
12:23
(12) мдя.
Записать (Write)
Синтаксис:

Записать(<Замещать>)
Параметры:

<Замещать> (необязательный)

Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям
Значение по умолчанию: Истина
Описание:

Записывает набор записей в базу данных. В зависимости от переданного параметра, может быть выполнено добавление записей или их замещение.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Для регистров сведений, подчиненных регистратору, при вызове с параметром <Замещать> равным Ложь после записи в информационную базу набор записей очищается (удаляются записи из набора).
Пример:

НаборКурсов.Записать();

У тебя вызывается данный код в цикле. Дальше думай.
15 GreenDay1986
 
18.06.12
12:32
(14) спасибо добрый человек, программирую недавно отсюда затупочки :)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший