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

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

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

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

Можно конечно замутить фоновое задание с опросом с клиента и отображение прогресса. Но в данном случае это вообще ... ни к чему.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. lmnlmn 68 03.03.23 19:25 Сейчас в теме
(1) Чтоб удалить что-то из регистра сведений надо записать пустой набор записей с нужным отбором. Вооружившись этой информацией попробуйте разобраться что надо изменить в вашей программе для получения нужного результата. Подсказка: все что для этого надо в вашей программе есть, но надо расставить по своим местам и убрать лишнее.
4. G_117874606564250923862 03.03.23 19:58 Сейчас в теме
(2) Я наверно плохо сформулировал или не понял
Если после НаборЗаписей.Прочитать(); поставить Сообщить( НаборЗаписей.Количество());
то он напишет 110, 1, 1 а по идее должен писать 110,111,112, каждый раз запоминать что прочитано.
И уже второй цикл на удаление.
18. lmnlmn 68 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 68 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 94 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)
да,по заданию обязательно, а посоветовали как это реализовать тут
Оставьте свое сообщение
Вакансии
Программист
Санкт-Петербург
зарплата от 180 000 руб. до 240 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата от 130 000 руб. до 170 000 руб.
Полный день

Программист 1C
Санкт-Петербург
зарплата от 140 000 руб. до 200 000 руб.
Полный день