Добавление в набор записей по циклу

1. G_117874606564250923862 03.03.23 18:30 Сейчас в теме
Нужно удалить все подчинённые элементы из регистра сведений. В данном случае удалить ручки, бумагу и тд из справочника канцтовары. Проблема в том что первый цикл удаляет только одно значение, при этом в ходе цикла остальные записываются, но заменяются или удаляются. Я думаю это из за того что прочитать удаляет прошлые записи из набора. Как можно изменить, что бы он сохранял все вписанное?

А еще как из строчки "| ИЗ Справочник.канцтовары";" "канцтовары" заменить на объект.строчка (переменная на клиенте)?

 
&НаСервере
Процедура ОчиститьНаСервере1()
	Запрос = Новый Запрос;
	Запрос.Текст =                   
	"Выбрать Ссылка, Наименование
	| ИЗ Справочник.канцтовары";
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл     
		СсылкаНаЭлемент = Выборка.Ссылка;
		НаборЗаписей = РегистрыСведений.Ценыноменклатуры.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.Номенклатура.Установить(СсылкаНаЭлемент);
		НаборЗаписей.Прочитать();
	КонецЦикла;
	для а = 1 по НаборЗаписей.Количество() цикл
		НаборЗаписей.Удалить(0);
		Объект.колво = НаборЗаписей.Количество();
	конеццикла;
	НаборЗаписей.Записать();
КонецПроцедуры 
 
Показать
По теме из базы знаний
Найденные решения
25. spacecraft 04.03.23 13:14 Сейчас в теме
(24) нельзя в одну и туже корзинку (в данном случае) класть все подряд. Можно положить и очистить сразу же. Вот как и в приведенном примере, не считая сколько положили, сразу очистить.
По поводу прогресс бара. Прогресс бар не будет работать в принципе внутри цикла на сервере. Отображение на клиенте будет только по возвращению на клиент.

Можно конечно замутить фоновое задание с опросом с клиента и отображение прогресса. Но в данном случае это вообще ... ни к чему.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. lmnlmn 69 03.03.23 19:25 Сейчас в теме
(1) Чтоб удалить что-то из регистра сведений надо записать пустой набор записей с нужным отбором. Вооружившись этой информацией попробуйте разобраться что надо изменить в вашей программе для получения нужного результата. Подсказка: все что для этого надо в вашей программе есть, но надо расставить по своим местам и убрать лишнее.
4. G_117874606564250923862 03.03.23 19:58 Сейчас в теме
(2) Я наверно плохо сформулировал или не понял
Если после НаборЗаписей.Прочитать(); поставить Сообщить( НаборЗаписей.Количество());
то он напишет 110, 1, 1 а по идее должен писать 110,111,112, каждый раз запоминать что прочитано.
И уже второй цикл на удаление.
18. lmnlmn 69 03.03.23 23:38 Сейчас в теме
(4)
а по идее должен
Боюсь вас огорчить, хоть в 1С и бывают глюки, но платформа вам ничего не должна и делает ровно то что вы запрограммировали. Да, я не понимаю вашу задачу. Сформулируйте что надо-то?

P.S. затея с прогресс-баром с таким подходом весьма жухлая и, если это не учебное задание, то при приме на работу даже с рабочим прогресс-баром вы пролетите как фанера над Парижем.
user1863362; karamazoff; +2 Ответить
21. G_117874606564250923862 04.03.23 10:36 Сейчас в теме
(18)
Есть справочник канцтовары в нем записи бумага, карандаш, ручка.
И регистр независимый периодический с записями цены и номенклатуры.
Нажав на кнопку в внешней обработке должны удалиться все записи с бумагой, карандашами, ручками в регистре.
Но он удаляет только ручки, то есть последнюю запись в справочнике канцтоваров. И если ручек нет в регистре то и он не удалит ничего.

Насчет прогресс бара мне просто советовали
"Получить массив данных обработки. Вызывать в цикле очистку на сервере по порциям. По счетчику отображать состояние." Я вот и сделал очистку по циклу.
22. spacecraft 04.03.23 11:30 Сейчас в теме
(21) попробуйте сами пройти по коду и представить, что получается.
Первый цикл:
Взяли корзинку, положили 3 бумаги.
Взяли новую корзинку, положили 5 карандашей.
Взяли новую корзинку, положили 6 ручек.
Конец цикл

Второй цикл:
из корзинки в руках удалили содержимое.
Конец цикла

Так понятно?
23. пользователь 04.03.23 11:33
Сообщение было скрыто модератором.
...
24. G_117874606564250923862 04.03.23 13:05 Сейчас в теме
(22)
Это понятно, но не понятно как сделать что бы в туже самую корзину клали а не новую брали.
Все работает если сделать вот так
Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл 
		НаборЗаписей = РегистрыСведений.Ценыноменклатуры.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Ссылка);
		НаборЗаписей.Записать();
	КонецЦикла;
КонецПроцедуры
Показать


Но тогда прогресс бар работать не будет
25. spacecraft 04.03.23 13:14 Сейчас в теме
(24) нельзя в одну и туже корзинку (в данном случае) класть все подряд. Можно положить и очистить сразу же. Вот как и в приведенном примере, не считая сколько положили, сразу очистить.
По поводу прогресс бара. Прогресс бар не будет работать в принципе внутри цикла на сервере. Отображение на клиенте будет только по возвращению на клиент.

Можно конечно замутить фоновое задание с опросом с клиента и отображение прогресса. Но в данном случае это вообще ... ни к чему.
26. G_117874606564250923862 04.03.23 13:20 Сейчас в теме
(25)
тесть Объект.колво(переменная для прогресс бара) просто передает на клиент конечное число, а не 1.2.3.4 и тд до числа каждый раз.
Просто человек снизу сказал "То есть ты ради прогресс-бара каждый раз с клиента дергаешь сервер".
27. spacecraft 04.03.23 13:21 Сейчас в теме
(26) Объект.колво просто записывает в реквизит значения. А прогресс бар по этим данным будет обновлен только по возвращению на клиент.
28. G_117874606564250923862 04.03.23 13:26 Сейчас в теме
(25)
Можно конечно замутить фоновое задание с опросом с клиента и отображение прогресса. Но в данном случае это вообще ... ни к чему.

вот как раз обязательно нужно сделать по заданию. Попробую таким способом сделать
32. G_117874606564250923862 08.03.23 12:47 Сейчас в теме
(25)
Можно конечно замутить фоновое задание с опросом с клиента и отображение прогресса. Но в данном случае это вообще ... ни к чему.

А можно по подробнее как опрос сделать?
33. spacecraft 08.03.23 13:44 Сейчас в теме
(32) да там все тривиально.
Запускается фоновое задание, в котором в цикле (в нужно месте) создается СообщениеПользователю с нужным текстом и вызывается его метод Сообщить.
На клиенте в запускается ПодключитьОбработчикОжидания. В указанной процедуре обработчика находится фоновое задание и опрашивается методом фонового задания ПолучитьСообщенияПользователю.
34. user1863362 08.03.23 13:58 Сейчас в теме
(33)
все тривиально
Ты его сейчас наповал убил, между прочим.
35. G_117874606564250923862 08.03.23 15:33 Сейчас в теме
(33)
типо такого? Сложно с фоновыми заданиями там либо БСП либо с общим модулем примеры
&НаКлиенте
Процедура Команда1(Команда)
	ОчиститьНаСервере2();
	ПодключитьОбработчикОжидания("фоновая",1,Истина)	
КонецПроцедуры

&НаСервере
Процедура ОчиститьНаСервере2()
	ФоновыеЗадания.Выполнить("ФоновоеВыполнение.Фоновая");
	ПолучитьСообщенияПользователю(); 
КонецПроцедуры

Процедура Фоновая() экспорт
	НаборЗаписей = РегистрыСведений.ГруппаНоменклатуры.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.ВидЦен.Установить(Объект.ГруппаНоменклатуры);
	НаборЗаписей.Записать();
	цикл
		СообщениеПользователю = "нужный текст";
	КонецЦикла;
	СообщениеПользователю.Сообщить();
КонецПроцедуры
Показать
36. spacecraft 08.03.23 16:14 Сейчас в теме
(35) ничего похожего.
В качестве примера:
https://infostart.ru/public/573761/

https://infostart.ru/1c/articles/1112877/

PS. Если нет БСП или нельзя изменять конфигурацию, то одной обработкой не обойтись и можете забыть про фоновые задания в данном случае.
3. lmnlmn 69 03.03.23 19:29 Сейчас в теме
(1) По второй части вопроса. Либо так прямо в строке и заменить (СтрЗаменить(), СтрШаблон) на нужный справочник, либо воспользоваться объектом ПостроительЗапроса.
5. пользователь 03.03.23 20:08
Сообщение было скрыто модератором.
...
6. G_117874606564250923862 03.03.23 20:17 Сейчас в теме
(5)
У меня до этого так было
&НаСервере
Процедура ОчиститьНаСервере3()
НаборЗаписей = РегистрыСведений.Ценыноменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидЦен.Установить(Объект.ВидЦен);
НаборЗаписей.Прочитать();
НаборЗаписей.Записать();
КонецПроцедуры
Показать

Потом я добавил Удалить с циклом для прогресс бара (для задания нужно). Без НаборЗаписей.Прочитать(); вроде не работает уже и не помню.
И потом вставил запрос для того что бы группу удалять.
7. пользователь 03.03.23 20:19
Сообщение было скрыто модератором.
...
8. G_117874606564250923862 03.03.23 20:22 Сейчас в теме
(7)
Очистить удаляет все записи, а мне нужно было по одному что бы прогресс бар работал
9. пользователь 03.03.23 20:27
Сообщение было скрыто модератором.
...
10. G_117874606564250923862 03.03.23 20:29 Сейчас в теме
(9)
Он на клиенте, это внешняя обработка
11. пользователь 03.03.23 20:37
Сообщение было скрыто модератором.
...
12. G_117874606564250923862 03.03.23 20:43 Сейчас в теме
(11)
Перебираю и удаляю все записи в цикле, да
А как еще если по заданию нужен прогресс бар?
А сейчас хочу что бы он загружал записи. Добавлял или сохранял к загруженным еще записи. И потом циклом по одному удалял.
Я на 15000 записей тестил, он меньше чем за секунду удалил. Не знаю сколько в компаниях таких записей, но мне нужно просто сделать задание.
13. пользователь 03.03.23 20:50
Сообщение было скрыто модератором.
...
14. G_117874606564250923862 03.03.23 20:53 Сейчас в теме
(13)
так я тестил
для а = 1 по НаборЗаписей.Количество() -1 цикл
- 1 добавлял и 1 запись оставалась
И на клиенте у меня стоит +1 потому что когда записей становится 0 он не может на 0 делить
15. пользователь 03.03.23 20:55
Сообщение было скрыто модератором.
...
16. G_117874606564250923862 03.03.23 21:07 Сейчас в теме
(15)
С прогресс баром все в порядке(по крайней мере меня устраивает), да и вопрос был не про это
17. user1863362 03.03.23 21:09 Сейчас в теме
(12)
мне нужно просто сделать задание
Мы будем за тебя болеть!
Давай! Давай! Вперед!
19. karamazoff 96 03.03.23 23:47 Сейчас в теме
(6)Если надо все по отбору грохнуть, то прочитать() тут лишнее, никаких циклов не надо
20. Dr.HiHi 3 03.03.23 23:57 Сейчас в теме
зачем вообще прочитать??

&НаСервере
Процедура ОчиститьНаСервере1()
    Запрос = Новый Запрос;
    Запрос.Текст =                   
    "Выбрать Ссылка, Наименование
    | ИЗ Справочник.канцтовары";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл     
        НаборЗаписей = РегистрыСведений.Ценыноменклатуры.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Ссылка);
        НаборЗаписей.Записать();
    КонецЦикла;
КонецПроцедуры 
Показать


p.s. еще момент
если регистр подчинен регистратору, то отбор нужно делать по регистратору и там уже прочитать, удалить ненужные записи и записать
29. user1863362 04.03.23 15:06 Сейчас в теме
Как внезапно-то (21)
мне просто советовали
превратилось в (28)
обязательно нужно сделать
30. user1863362 04.03.23 15:22 Сейчас в теме
А, это все продолжение https://forum.infostart.ru/forum9/topic294712/...

Давай! Давай! У тебя все получится! Вперед! Вперед!
31. G_117874606564250923862 04.03.23 15:31 Сейчас в теме
(30)
да,по заданию обязательно, а посоветовали как это реализовать тут
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот