|
v7: Элементарный перебор и программное изменение в 1с 7.7 | ☑ | ||
---|---|---|---|---|
0
EarthsSoul
13.08.15
✎
07:38
|
Добрый день
У меня задача всем (и группам и элементам) элементам 1с 7.7 в справочнике Номенклатура добавить в наименование уникальное число. В семерке не писал так что по возможности без глумления… Я вот написал такую обработку : СпрСотр = СоздатьОбъект("Справочник.Номенклатура"); Режим = 0; //выбирать без учета иерархии, 1 - с учетом (по умолч.) СпрСотр.ВыбратьЭлементы(Режим); Итератор = 0; Пока СпрСотр.ПолучитьЭлемент()=1 Цикл Итератор = Итератор +1; СпрСотр.Наименование = СпрСотр.Наименование +" "+Итератор; СпрСотр.Записать(); КонецЦикла; У меня выдает ошибку: СпрСотр.Наименование = СпрСотр.Наименование +" "+Итератор; {C:\USERS\DV\DESKTOP\ИЗМЕНИТЬ НОМЕНКЛАТУРУ.ERT(10)}: Изменено Наименование! Может быть нарушена последовательность выборки! Как исправить ошибку ? Или как решить задачу ? |
|||
1
HawkEye
13.08.15
✎
07:41
|
(0) использовать перед выборкой:
ПорядокКодов(); Синтаксис: ПорядокКодов() Назначение: Установить порядок выборки элементов справочника по возрастанию кода. Замечание: Метод вызывается до вызова метода ВыбратьЭлементы. Метод можно использовать только для |
|||
2
EarthsSoul
13.08.15
✎
07:44
|
(1)
Спасибо кажется работает |
|||
3
Медведик
13.08.15
✎
07:44
|
Альтернативный вариант, если выбирать в порядке кодов неудобно - в первом цикле заносить ссылки на элементы в список значений.
А вторым циклом получать ссылки из списка и их уже менять, не затрагивая порядок выборки. |
|||
4
EarthsSoul
13.08.15
✎
07:48
|
(3) на будущее приму во внимание
Жду окончания обработки справочника ... |
|||
5
HawkEye
13.08.15
✎
07:50
|
(4) на будущее, чтобы не ждать - запускай изменения в транзакции по 200-300 элементов за одну транзакцию ))
|
|||
6
mishaPH
модератор
13.08.15
✎
07:53
|
(5) Это имеет смысл если у него дбф
|
|||
7
EarthsSoul
13.08.15
✎
07:57
|
(6) у меня файловая, я так понимаю дбф ...
Да чет долго это делается (5) А как тут правильно поставить транзакции ? |
|||
8
HawkEye
13.08.15
✎
07:58
|
(6) у него ДБФ
|
|||
9
HawkEye
13.08.15
✎
08:00
|
(7) как-то так:
начатьТранзакцию() к= 0 начинаешь свой цикл по изменению к = к + 1 если к = 300 тогда зафиксироватьтранзкцию() начатьтранзакцию() к = 0: конецесли конеццикла - заканчиваешь свой цикл зафиксироватьТранзакцию() |
|||
10
EarthsSoul
13.08.15
✎
08:16
|
У меня еще и "Код не уникальный!" и ничего не записалось...
|
|||
11
EarthsSoul
13.08.15
✎
08:17
|
(9) сейчас закончу с транзакцией и выдам на суд ))
|
|||
12
EarthsSoul
13.08.15
✎
08:19
|
(9) как то так ?
СпрСотр = СоздатьОбъект("Справочник.Номенклатура"); Режим = 0; //выбирать без учета иерархии, 1 - с учетом (по умолч.) СпрСотр.ПорядокКодов(); СпрСотр.ВыбратьЭлементы(Режим); Итератор = 0; Пока СпрСотр.ПолучитьЭлемент()=1 Цикл НачатьТранзакцию() ; Итератор = Итератор +1; СпрСотр.Наименование = СпрСотр.Наименование +" "+Итератор; Если Итератор = 300 тогда ЗафиксироватьТранзакцию(); НачатьТранзакцию() ; СпрСотр.Записать(); конецесли КонецЦикла; зафиксироватьТранзакцию(); |
|||
13
EarthsSoul
13.08.15
✎
08:20
|
СпрСотр = СоздатьОбъект("Справочник.Номенклатура");
Режим = 0; //выбирать без учета иерархии, 1 - с учетом (по умолч.) СпрСотр.ПорядокКодов(); СпрСотр.ВыбратьЭлементы(Режим); Итератор = 0; Пока СпрСотр.ПолучитьЭлемент()=1 Цикл НачатьТранзакцию() ; Итератор = Итератор +1; СпрСотр.Наименование = СпрСотр.Наименование +" "+Итератор; Если Итератор = 300 тогда ЗафиксироватьТранзакцию(); НачатьТранзакцию() ; Итератор = 0; // (эту строчку забыл) СпрСотр.Записать(); конецесли КонецЦикла; зафиксироватьТранзакцию(); |
|||
14
Остап Сулейманович
13.08.15
✎
08:21
|
(12) Не взлетит. Даже если научишься счетчик итераций сбрасывать в "0" после фиксации транзакции.
|
|||
15
Остап Сулейманович
13.08.15
✎
08:21
|
(13) Все равно не взлетит.
|
|||
16
EarthsSoul
13.08.15
✎
08:21
|
(15) вижу что толку нет, и ? Подскажешь что дальше ?
|
|||
17
EarthsSoul
13.08.15
✎
08:22
|
(15) понимаю что логики в коде нет, так как её еще в голове нет ...
|
|||
18
Остап Сулейманович
13.08.15
✎
08:23
|
(16) Это не восьмера.
Вот здесь : СпрСотр.Наименование = СпрСотр.Наименование +" "+Итератор; нужно СпрСотр.Наименование = СокрЛП(СпрСотр.Наименование) +" "+Итератор; |
|||
19
Остап Сулейманович
13.08.15
✎
08:24
|
+ (18) И эттта... Команду записи нужно давать ДО фиксации транзакции.
|
|||
20
EarthsSoul
13.08.15
✎
08:26
|
(18) ну поправил только все равно не работает, а
корректно сделаны ? |
|||
21
EarthsSoul
13.08.15
✎
08:26
|
(19) понял чет не то ))
|
|||
22
Остап Сулейманович
13.08.15
✎
08:26
|
+ (19)
Итератор = 0; Пока СпрСотр.ПолучитьЭлемент()=1 Цикл НачатьТранзакцию() ; Итератор = Итератор +1; СпрСотр.Наименование = СпрСотр.Наименование +" "+Итератор; //Вот здесь СпрСотр.Записать(); Если Итератор = 300 тогда ЗафиксироватьТранзакцию(); НачатьТранзакцию() ; Итератор = 0;// (эту строчку забыл) конецесли; КонецЦикла; зафиксироватьТранзакцию(); |
|||
23
EarthsSoul
13.08.15
✎
08:28
|
Круто :), намного быстрее выдало результат
:) |
|||
24
EarthsSoul
13.08.15
✎
08:30
|
Спасибо Всем :)
Спасибо (1) Спасибо (3) |
|||
25
EarthsSoul
13.08.15
✎
08:30
|
Спасибо (22)
|
|||
26
Остап Сулейманович
13.08.15
✎
08:30
|
(23) Увеличь край счетчика до (например) 3 000. Должно стать еще быстрее. Зависит от объема памяти, фрагментрированности диска для темпов ...
|
|||
27
HawkEye
13.08.15
✎
08:45
|
первую НачатьТранзакцию() ; - перед циклом вынесите... что вы ее в каждом цикле начинаете?
|
|||
28
EarthsSoul
13.08.15
✎
08:48
|
(27) да поправлю
Блин уперся в другую проблему ... |
|||
29
HawkEye
13.08.15
✎
08:50
|
мхатовская пауза )))
|
|||
30
EarthsSoul
13.08.15
✎
08:51
|
29 )))
|
|||
31
EarthsSoul
13.08.15
✎
08:51
|
В общем пишет " Код не уникальный!"
|
|||
32
EarthsSoul
13.08.15
✎
08:52
|
Я пытался решить через
СпрСотр.УстановитьНовыйКод(); Весь код СпрСотр = СоздатьОбъект("Справочник.Номенклатура"); Режим = 0; //выбирать без учета иерархии, 1 - с учетом (по умолч.) СпрСотр.ПорядокКодов(); СпрСотр.ВыбратьЭлементы(Режим); Итератор = 0; НачатьТранзакцию() ; Пока СпрСотр.ПолучитьЭлемент()=1 Цикл Итератор = Итератор +1; СпрСотр.Наименование = СокрЛП (СпрСотр.Наименование) +" "+Итератор; // СпрСотр.УстановитьНовыйКод(); СпрСотр.Записать(); Если Итератор = 3000 тогда ЗафиксироватьТранзакцию(); НачатьТранзакцию() ; Итератор = 0; конецесли КонецЦикла; зафиксироватьТранзакцию(); Но он тогда вообще не отрабытвывает. Видимо потому что упорядоченно по коду и я его переприсваеваю. |
|||
33
HawkEye
13.08.15
✎
08:52
|
(31) раз пишет, то так оно и есть... )) вариант изменить код, не предлагать?
|
|||
34
1Сергей
13.08.15
✎
08:53
|
(32) сперва разберись с кодами, потом с наименованиями
|
|||
35
HawkEye
13.08.15
✎
08:54
|
(32) используй вариант из (3) выгрузи в ТЗ и там перебирай по ходу меняй что хочешь )))
зы. у кода еще префикс бывает... |
|||
36
EarthsSoul
13.08.15
✎
08:54
|
(34) да точно сделаю две обработки
|
|||
37
EarthsSoul
13.08.15
✎
08:55
|
(35) знаю что можно поставить, просто мне то он не нужен... Или он обязательный технически ?
|
|||
38
HawkEye
13.08.15
✎
08:56
|
(37) нет, не обязателен
|
|||
39
EarthsSoul
13.08.15
✎
08:58
|
Хотя ты прав в моем случае наверное нужен, ведь перенумирация это по сути. И что бы не пересекались можно с префиксом замутить.
|
|||
40
EarthsSoul
13.08.15
✎
08:58
|
Вернусь через час :)
|
|||
41
Медведик
13.08.15
✎
09:04
|
ТС, раз проблема с уникальностью кодов возникает...
Делай предварительную перенумерацию из префикса, которого точно нет, например пронумеруй все с префиксом "уху" от 1 до n. А вторым заходом нумеруй уже со своим стандартным. |
|||
42
Злопчинский
13.08.15
✎
11:38
|
(18) Остап Сулейманович, что ж ты регулярно фигню несешь? И новичков в заблуждение вводишь?
. против использования СокрЛП(СпрН.Наименование) - ничего не имею, не повредит, но вообщем есть особенность: дарю тебе "гениальный" код (хорошо бы проверить на скуле, на дбф работает): //******************************************* Процедура Сформировать() сч=1; СпрН = СоздатьОбъект("Справочник.Номенклатура"); СпрН.ВыбратьЭлементы(); Пока СпрН.ПолучитьЭлемент() = 1 Цикл Сообщить(""+СтрДлина(СпрН.Наименование)+" "+СпрН.Наименование+" сч="+сч); сч=сч+1; КонецЦикла; КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |