Имя: Пароль:
1C
 
Отбор+изменение набора записей регистра накопления - как быть?
0 Тим
 
15.03.11
21:51
Мое почтение!

Коллеги, только начинаю разбираться с 1С8.
Возникла задача изменить подмножество записей регистра накопления(Р1), на основании данных другого регистра(Р2).
Поскольку язык запросов 8.1 не поддерживает аналог SQL-инструкции
UPDATE, пока нашёл единственный алгоритм действий - запросом к регистру
Р1 получаю набор записей для изменения  - СоздатьНаборЗаписей(),
причём без какого либо отбора, т.к. регистраторов несколько.
Выгружаю в таблицу значений.
В цикле обхода таблицы значений вызываю запрос к Р2 с параметрами. Если результат запроса непустой, то исправляю запись.
Затем загружаю исправленную таблицу, вызываю Записать().
Пробую этот метод - пустой результат. В документации написано-
Прочитать() Описание: Считывает записи из базы данных по
установленному отбору. А если нет ограничения? Пробую
Отбор.Регистратор.Использование = Ложь; - безуспешно,
"Значение данного реквизита изменять нельзя!".
1 amiko
 
15.03.11
22:05
Разве регистр накопления можно "оторвать" от регистратора?

НаборЗаписей = РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей();

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

// обработка набора записей
// ...

НаборЗаписей.Записать();
2 Тим
 
15.03.11
22:12
Если несколько регистраторов - как быть?
Только ещё один внешний цикл - сначала перебор регистраторов,
а потом внутри перебор по их движениям?
Может, есть вообще совсем иной способ править записи регистра накопления?
3 amiko
 
15.03.11
22:17
Если смотреть типовые механизмы и следовать им, то порядок действий как раз такой:
1. Сначала запрос к регистру для выборка всех записей с
   |УПОРЯДОЧИТЬ ПО
   |    Регистратор,
   |    НомерСтроки
2. Затем выбрать из запроса:
ВыборкаРегистраторов = Запрос.Выполнить().Выбрать();
НаборЗаписей = РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей();
Пока ВыборкаРегистраторов.СледующийПоЗначениюПоля("Регистратор") Цикл
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаРегистраторов.Регистратор);
// выполнить преобразования
НаборЗаписей.Записать(Истина, Ложь, Истина, Ложь);
НаборЗаписей.Очистить();
КонецЦикла;

Как-то так. Тут надо понимать саму задачу.
4 Тим
 
15.03.11
22:25
Похоже, только так и остаётся действовать.
amiko, благодарен за участие!

Впрочем, если есть другие мнения... :)
5 hhhh
 
15.03.11
22:26
(0) тут жестко, только по регистраторам.
6 Тим
 
15.03.11
22:29
(5) - спасибо за подтверждение