Имя: Пароль:
1C
1C 7.7
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;
    КонецЦикла;
    
    
КонецПроцедуры
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn