Имя: Пароль:
1C
1C 7.7
v7: Перемещение элементов справочника из одной группы в другую
0 Izuchayu1C7
 
30.04.15
12:48
При перемещении сотрудников из одной группы в другую пишет ошибку "Код не уникален!". Понятно что встречаются элементы в одинаковым кодом. Как сделать так чтобы элементы переносились с новый кодом?

  СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
        
  СпрСотр.НайтиПоНаименованию("Приходящие");
  Приходящие=СпрСотр.ТекущийЭлемент();
  
  СпрСотр.НайтиПоНаименованию("Работающие");
  Работающие=СпрСотр.ТекущийЭлемент();
  СпрСотр.ИспользоватьРодителя(Работающие);
  СпрСотр.ВыбратьЭлементы();
  
      Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
           СпрСотр.Родитель=Приходящие;
           СпрСотр.Записать();
      КонецЦикла;
1 Новый участник
 
30.04.15
12:50
"Понятно что встречаются элементы в одинаковым кодом".

Это путь армянского комсомола - сначала создать проблему, потом с жертвами её решить.
2 Izuchayu1C7
 
30.04.15
12:50
Прикинул что нужно использовать что то типа, и не могу это состыковать

Процедура ВводНового()
СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
СвободныйКод=0;
Для К=1 По 99999
Цикл
Если СпрСотр.НайтиПоКоду(К)=1 Тогда
    Продолжить;
    Иначе
    СвободныйКод=К;
    Прервать;
    КонецЕсли;
КонецЦикла;                
КонецПроцедуры
3 Эльниньо
 
30.04.15
13:23
(2) Мдяяя..

СпрСотр.УстановитьНовыйКод();
4 lavalit
 
30.04.15
13:25
Скорее всего установлены серии кодов "в пределах подчнения"
и ето есть не на пользу как выяснилось. так что при переносе используйте "попытку" и в исключении можно использовать "УстановитьНовыйКод(<префикс>)" префикс не обязалово
5 Izuchayu1C7
 
06.05.15
13:34
(4) (3)
СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.НайтиПоНаименованию("Приходящие");
Приходящие=СпрСотр.ТекущийЭлемент();
СпрСотр.НайтиПоНаименованию("Работающие");
Работающие=СпрСотр.ТекущийЭлемент();
СпрСотр.ИспользоватьРодителя(Работающие);
СпрСотр.ВыбратьЭлементы();

Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
    СпрСотр.Родитель=Приходящие;
    СпрСотр.УстановитьНовыйКод();
    СпрСотр.Записать();  
КонецЦикла;


Переносит по одному сотруднику. Как сделать чтобы сразу всех, их там сотни.
6 Андрей_Андреич
 
naïve
06.05.15
13:37
А программно не решить - в момент переноса объект заблокирован. Так что делай полную перенумерацию справочника и включай уникальность.
7 Izuchayu1C7
 
06.05.15
13:42
(6) подскажите как сделать полную перенумерацию программно?
8 DCKiller
 
06.05.15
13:48
(7) Обработку пиши
9 Builder
 
06.05.15
13:52
(7) Код текстовый или числовой?
Если текстовый - перекодируешь всех с префиксом и делаешь уникальные коды. Потом в конфигураторе делаешь коды на весь справочник. Можешь потом перекодировать обратно без префиксов.
Как то так:
К=1;
СпрСотр.ВыбратьЭлементы();
  Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
    СпрСотр.Код="А"+К;
    К=К+1;
    СпрСотр.Записать();  
КонецЦикла;
10 Izuchayu1C7
 
06.05.15
13:53
(8) я так понял там все сложно? с разбегу не решить по-быстрому...
11 Builder
 
06.05.15
13:55
(10) См. (9)
Если код не текстовый - делаешь его в конфигураторе текстовым, так проще будет.
12 1Сергей
 
06.05.15
13:56
(5) сначала занеси всех сотров из папки-источника в СписокЗначений или массив (или ТЗ), потом обходя Этот список меняй родителя, устанавливай новый код, записывай
13 Андрей_Андреич
 
naïve
06.05.15
13:56
На ИТС UCRefRen.ert - все написано до вас.
14 Izuchayu1C7
 
07.05.15
09:09
(13) Переименовал с помощью обработки UCRefRen.ert
(12) Пробовал использовать СписокЗначений, может ошибся в синтаксисе, но все равно переносит по одному
15 Izuchayu1C7
 
07.05.15
09:10
Серии кодов - стоит "во всем справочнике"
Тип кода - "текстовый"
16 фобка
 
07.05.15
09:11
(14) код со списком
17 Izuchayu1C7
 
07.05.15
09:12
СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
СписокЗнач = СоздатьОбъект("СписокЗначений");

СпрСотр.НайтиПоНаименованию("Приходящие");
Приходящие=СпрСотр.ТекущийЭлемент();
СпрСотр.НайтиПоНаименованию("Работающие");
Работающие=СпрСотр.ТекущийЭлемент();
СпрСотр.ИспользоватьРодителя(Работающие);
СпрСотр.ВыбратьЭлементы();    

Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
    СписокЗнач.ДобавитьЗначение(Работающие);
    СпрСотр.Родитель=Приходящие;
    СпрСотр.УстановитьНовыйКод();
    СпрСотр.Записать();
КонецЦикла;
18 фобка
 
07.05.15
09:13
(17) нужно два цикла, сначала добавляешь в список, потом бежишь по списку и меняешь родителя
19 Izuchayu1C7
 
07.05.15
13:56
(18) что то я не догоняю, подскажите в чем ошибка

СпрСотр=СоздатьОбъект("Справочник.Сотрудники");
СписокЗнач = СоздатьОбъект("СписокЗначений");

СпрСотр.НайтиПоНаименованию("Приходящие");
Приходящие=СпрСотр.ТекущийЭлемент();
СпрСотр.НайтиПоНаименованию("Работающие");
Работающие=СпрСотр.ТекущийЭлемент();
СпрСотр.ИспользоватьРодителя(Работающие);
СпрСотр.ВыбратьЭлементы();    

Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
    СписокЗнач.ДобавитьЗначение(СпрСотр.ТекущийЭлемент());
    КонецЦикла;
    Для Номер = 1 По СписокЗнач.РазмерСписка() Цикл
    Значение = СписокЗнач.ПолучитьЗначение(Номер);
       СпрСотр.Родитель=Приходящие;
    СпрСотр.УстановитьНовыйКод();
    СпрСотр.Записать();
КонецЦикла;
20 Izuchayu1C7
 
07.05.15
13:56
СпрСотр.Родитель=Приходящие;
{Справочник.Сотрудники.ФормаСписка.ФормаСписка.Модуль(77)}: Не выбран элемент!
21 DCKiller
 
07.05.15
14:08
(20) У тя в справочнике группа-то с таким наименованием есть?
22 Izuchayu1C7
 
07.05.15
14:10
(21) есть
23 DCKiller
 
07.05.15
14:11
(22) А ты все-таки проверь, на всякий случай, что у тебя возвращает метод СпрСотр.НайтиПоНаименованию("Приходящие"). И если 1, то убедись, что нашел он действительно группу, а не элемент.
24 Izuchayu1C7
 
07.05.15
14:15
(23) думаю что он находит действительно то что нужно, т.к. элементы до появления 2го цикла туда добавлялись.
см. пост выше
25 DCKiller
 
07.05.15
14:16
(24) Почему у тебя в (19) цикл внутри не закрывается?
26 DCKiller
 
07.05.15
14:18
(25) а, блин... короче:

В цикле по СЗ сделай такую хрень:

СпрСотр = СоздатьОбъект("Справочник.КакойТоТамСправочник");
СпрСотр.НайтиЭлемент(Значение);
СпрСотр.Родитель = Приходящие;
...

и дальше как у тебя там есть
27 Izuchayu1C7
 
07.05.15
14:22
(26) СПАСИБО Дружище! выручил, не хватает пока у меня тямы.
28 Izuchayu1C7
 
07.05.15
14:22
СпрСотр.НайтиЭлемент(Значение);
этой строчки мне не хватало