Как изменить значение одного поля регистра сведений

1. !luchik! 2 18.07.16 14:13 Сейчас в теме
Здравствуйте. Подскажите, плиз... Есть регистр сведений "ДвижениеКатушек". В нем поменяли тип одного измерения "Номер" с числового на строковый. Теперь надо по всему этому регистру пройти и исправить значения 1 на 001, 2 на 002 и т.д.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. НовенькийЯ 18.07.16 14:23 Сейчас в теме
Запросом тянешь весь регистр, т.е. все записи со всеми полями.
Результат выгружаешь в ТЗ
Бегаешь по ТЗ и в поле Номер присваиваешь нужное тебе значение.
Далее всю эту ТЗ передаешь в РС
Все, быстро и сердито :-)
3. !luchik! 2 18.07.16 15:49 Сейчас в теме
(2) НовенькийЯ, я так делала, но на этапе "записать" выходила ошибка "недостаточно памяти". А сейчас, решила для ответа точно посмотреть текст ошибки, а у меня все прошло хорошо :0 Видимо, требовалось перезагрузить компьютер и все. Проблема была не там, где я ее искала.
Спасибо за отклик!
4. !luchik! 2 18.07.16 15:59 Сейчас в теме
(2) НовенькийЯ, А нет, там просто я с частью регистра на копии попробовала. А когда загрузила рабочую базу потестить, так же написал: "недостаточно памяти". А можно как-нибудь по частям исправить?
5. !luchik! 2 18.07.16 16:04 Сейчас в теме
вот так делала:
  Запрос= Новый запрос;
  запрос.Текст =
  "ВЫБРАТЬ
  |	ДвижениеКатушек.Период,
  |	ДвижениеКатушек.Ключ,
  |	ДвижениеКатушек.Серия,
  |	ДвижениеКатушек.Номер,
  |	ДвижениеКатушек.Сотрудник,
  |	ДвижениеКатушек.Маршрут,
  |	ДвижениеКатушек.НомерПриход,
  |	ДвижениеКатушек.НомерВыручка,
  |	ДвижениеКатушек.НомерВозврат,
  |	ДвижениеКатушек.НомерНедостача,
  |	ДвижениеКатушек.НомерСписано,
  |	ДвижениеКатушек.КоличествоПриход,
  |	ДвижениеКатушек.КоличествоВыручка,
  |	ДвижениеКатушек.КоличествоВозврат,
  |	ДвижениеКатушек.КоличествоНедостача,
  |	ДвижениеКатушек.КоличествоСписано,
  |	ДвижениеКатушек.СуммаПриход,
  |	ДвижениеКатушек.СуммаВыручка,
  |	ДвижениеКатушек.СуммаВозврат,
  |	ДвижениеКатушек.СуммаНедостача,
  |	ДвижениеКатушек.СуммаСписано
  |ИЗ
  |	РегистрСведений.ДвижениеКатушек КАК ДвижениеКатушек"
  ;
  ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
  
  НаборЗаписей = РегистрыСведений.ДвижениеКатушек.СоздатьНаборЗаписей();
  НаборЗаписей.Загрузить(ТаблицаРезультат);
  Для Каждого Запись Из НаборЗаписей Цикл 
	  Если СтрДлина(СокрЛП(Запись.Номер))=2 тогда  
		  Запись.Номер = "0"+СокрЛП(Запись.Номер);
	  ИначеЕсли СтрДлина(СокрЛП(Запись.Номер))=1 тогда 
		  Запись.Номер = "00"+СокрЛП(Запись.Номер);
	  КонецЕсли;	
 КонецЦикла;   
 Сообщить("Запись");
 НаборЗаписей.Записать();  
 Сообщить("Всё");
Показать
6. НовенькийЯ 18.07.16 16:28 Сейчас в теме
Как вариант попробуй писать построчно в транзакциях, скажем по 10К строк на транзакцию, получится немного дольше, но тогда памяти точно хватит.
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
НачатьТранзакцию();
НомерПП=0;
НаборЗаписей = РегистрыСведений.ДвижениеКатушек.СоздатьНаборЗаписей();
Для Каждого СтрокаРез из ТаблицаРезультат Цикл
НомерПП=НомерПП+1;
Если НомерПП%10000=0 тогда
	НаборЗаписей.Записать(Ложь);
	НаборЗаписей=РегистрыСведений.ДвижениеКатушек.СоздатьНаборЗаписей();
	ЗафиксироватьТранзакцию();
	НачатьТранзакцию();
КонецЕсли;
Запись=НаборЗаписей.Добавить();
ЗаполнитьЗначениеСвойств(Запись,СтрокаРез );
Если СтрДлина(СокрЛП(Запись.Номер))=2 тогда
Запись.Номер = "0"+СокрЛП(Запись.Номер);
ИначеЕсли СтрДлина(СокрЛП(Запись.Номер))=1 тогда
Запись.Номер = "00"+СокрЛП(Запись.Номер);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Показать


Как то так попробуй
9. !luchik! 2 18.07.16 16:55 Сейчас в теме
(6) и выдает ошибку: {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(154,1)}: Процедура или функция с указанным именем не определена (ЗаполнитьЗначениеСвойств)
7. НовенькийЯ 18.07.16 16:34 Сейчас в теме
перед последней строкой забыл добавить еще одну строку, должно быть так:
*****
КонецЦикла;
НаборЗаписей.Записать(Ложь);//****************
ЗафиксироватьТранзакцию();
8. !luchik! 2 18.07.16 16:54 Сейчас в теме
Что-то я запуталась в этом:
Для Каждого СтрокаРез из ТаблицаРезультат Цикл
НомерПП=НомерПП+1;
Если НомерПП%10000=0 тогда
НаборЗаписей.Записать(Ложь);
НаборЗаписей=РегистрыСведений.ДвижениеКатушек.СоздатьНаборЗаписей();
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
10. antz 18.07.16 17:16 Сейчас в теме
ЗаполнитьЗначенияСвойств

Оператор % возвращает остаток от деления.
11. НовенькийЯ 18.07.16 18:26 Сейчас в теме
Ага, точно, ошибся одной букАвкАй :-)
А код довольно таки простой, сначала в набор добавляем 10К записей, а потом набор записываем, при этом все делаем в транзакции, что б по шустрее работало.
12. ranelio 18.07.16 20:43 Сейчас в теме
А старые записи кто удалять будет? ))
На самом деле всё гораздо проще:
	Набор = РегистрыСведений.ДвижениеКатушек.СоздатьНаборЗаписей();
	Набор.Прочитать();
	Для каждого Запись Из Набор Цикл
		Запись.Номер = Формат(Число(Запись.Номер),"ЧЦ=3; ЧВН=");
	КонецЦикла; 
	Набор.Записать(Истина);
13. НовенькийЯ 18.07.16 21:47 Сейчас в теме
(12) ranelio, А по такой методе у нее памяти не хватает, о чем она и написала в 4ом сообщении
14. ranelio 19.07.16 08:11 Сейчас в теме
Тем не менее разница есть - как минимум не надо делать запрос, результаты которого съедают очень много памяти, если в регистре много записей.
Если всё равно вылетает, можно и разбить обработку: Запросом выбрать все значения какого-то реквизита регистра и далее поочередно их обработать
Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
|	ДвижениеКатушек.Сотрудник
|ИЗ
|	РегистрСведений.ДвижениеКатушек КАК ДвижениеКатушек")
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Набор = РегистрыСведений.ДвижениеКатушек.СоздатьНаборЗаписей();
	Набор.Отбор.Сотрудник.Установить(Выборка.Сотрудник);
    Набор.Прочитать();
    Для каждого Запись Из Набор Цикл
        Запись.Номер = Формат(Число(Запись.Номер),"ЧЦ=3; ЧВН=");
    КонецЦикла; 
    Набор.Записать(Истина);
КонецЦикла; 
Показать

Единственное реквизит должен быть проиндексирован.
ivan453; tani6e4ka; dante; user1194547; +4 Ответить
15. пользователь 11.02.21 11:49
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

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