Имя: Пароль:
1C
1C 7.7
v7: Починить подчиненный справочник
,
0 разработчик 1с
 
25.08.15
17:40
Подскажите, пожалуйста. Не большой знаток клюшек
Во время переноса данных самописными обработками "моргнул свет", и в подчинённом справочнике задвоились элементы. Теперь при попытке перезаписи некоторых элементов ругается о неуникальности кодов.
Очень не хочется перегружать весь справочник полностью, там около 500 тысяч элементов. Уникальность отключить нельзя. ТиИ ошибок никаких не находит.
1 lubitelxml
 
25.08.15
17:43
что куда переносили то?
2 lubitelxml
 
25.08.15
17:43
и где задвоилось?
3 разработчик 1с
 
25.08.15
17:45
(2) справочник. в 7.7
4 mehfk
 
25.08.15
17:45
(0) "Починить" через форум вашими руками?
5 Ёпрст
 
25.08.15
17:48
(0) поставьте в подчиненном справочнике серии кодов в пределах подчинения.
6 Ёпрст
 
25.08.15
17:48
и усё.
7 разработчик 1с
 
27.08.15
11:33
(6) неа, не помогло.
снимал галочку контроль уникальности, потом назад ставил, надеялся, что 77 сами удалят неуникальные, но нет, ругается, что есть и дальше не пускает.
8 Ёпрст
 
27.08.15
11:41
Кто, куда, кого не пускает ?
9 Ёпрст
 
27.08.15
11:41
И, что в тво1ём понятии "неуникальные" ?
10 aka AMIGO
 
27.08.15
11:43
можно написать обработку, непоследственно удаляющую дубли подч. справочника
11 разработчик 1с
 
27.08.15
11:44
(9) если выкл контроль уникальности, сохранить конфу, а потом вкл контроль и попытаться сохранить, то ругается на наличие неуникальных кодов справочника, и дальше сохранение не идёт.
12 Ёпрст
 
27.08.15
11:45
(11) взять обработку, перенумеровать коды. Наслаждаться
13 разработчик 1с
 
27.08.15
11:45
(10) в семёрке кодить ммм(((
14 Ёпрст
 
27.08.15
11:45
любой ючойз это умеет
15 разработчик 1с
 
27.08.15
11:46
(14) перенумеровывать не надо, это дубли..
ясно, только обработкой удалять
16 Злопчинский
 
27.08.15
11:49
там кода блин на один экран.. большой...
17 aka AMIGO
 
27.08.15
11:54
(16) :) немного меньше :)

(15) вопрос к тебе: открываешь спр-Родитель, в нём "открыть подчиненный" с выводом по группам, сразу видишь два-три одинаковых (с одним кодом) элемента? такая картина примерно?
18 beaver1971
 
27.08.15
11:58
(0) перенос как делался? какими инструментами?
19 разработчик 1с
 
27.08.15
11:58
(17) да, именно
20 разработчик 1с
 
27.08.15
11:59
(18) самописными обработками. из текстового файла берутся значения, создаются элементы...
21 Злопчинский
 
27.08.15
12:00
так.. я побежал за попкорном и колой...
8-ки что ли загрузку в 77 писали?
22 разработчик 1с
 
27.08.15
12:02
ДК = СоздатьОбъект("Справочник.Д");
    НАДК=СоздатьОбъект("Справочник.Н");
    Табл=СоздатьОбъект("ТаблицаЗначений");
    Табл.НоваяКолонка("Код","Число");
    ДК.ВыбратьЭлементы();
    Пока ДК.ПолучитьЭлемент()=1 Цикл
        НАДК.ИспользоватьВладельца(ДК.ТекущийЭлемент());
        НАДК.ВыбратьЭлементы();
        Пока НАДК.ПолучитьЭлемент()=1 Цикл
            Если Табл.НайтиЗначение(НАДК.Код)=0 Тогда
                Табл.НоваяСтрока();
                Табл.Код = НАДК.Код;
            Иначе
                НАДК.Удалить();
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;

нормально?
23 Ёпрст
 
27.08.15
12:04
(22)нет
24 разработчик 1с
 
27.08.15
12:07
(23) правильно, зачем нам Д справочник вообще, можно сразу Н перебирать
25 aka AMIGO
 
27.08.15
12:08
(16) 16 строк :)

(22) в ТЗ не такой оператор поиска, посмотри в СП
26 Злопчинский
 
27.08.15
12:10
(25) публикуй ;-)
27 aka AMIGO
 
27.08.15
12:11
И лучше использовать СЗ, а не ТЗ. И чистить её сразу после оператора:
Пока ДК.ПолучитьЭлемент()=1 Цикл
28 aka AMIGO
 
27.08.15
12:11
(26) 52р. 37 копеек :)
29 разработчик 1с
 
27.08.15
12:12
НайтиЗначение(<?>,,);
Синтаксис:
НайтиЗначение(<Знач>,<Строка>,<Колонка>)
Назначение:
Найти заданное значение в таблице значений. Возвращает число: 0 - значение не найдено; 1 - значение найдено
Параметры:
<Знач> - значение для поиска.
30 aka AMIGO
 
27.08.15
12:13
(29) и где в твоем коде <Строка>,<Колонка>?
И перед его выполнением присвоить: Строка=0;
31 aka AMIGO
 
27.08.15
12:15
НАДК.Удалить(1);
32 Ёпрст
 
27.08.15
12:18
(30) это не обязательные параметры
(31) по-умолчанию, там и так 1

(22) твоя ошибка в коде - коды могут быть одинаковыми для разных владельцев.
Тебе надо делать УдалитьСтроки  в первом цикле .
33 разработчик 1с
 
27.08.15
12:19
(32) не могут, там стояла уникальность во всём справочнике. это я только после тебя ставил туда-обратно в пределах подчинения.
34 разработчик 1с
 
27.08.15
12:20
получается вот так
    //ДК = СоздатьОбъект("Справочник.Д");
    НАДК=СоздатьОбъект("Справочник.Н");
    Табл=СоздатьОбъект(СписокЗначений");//"ТаблицаЗначений");
    //Табл.НоваяКолонка("Код","Число");
    //ДК.ВыбратьЭлементы();
    //Пока ДК.ПолучитьЭлемент()=1 Цикл
    //    НАДК.ИспользоватьВладельца(ДК.ТекущийЭлемент());
        НАДК.ВыбратьЭлементы();
        Пока НАДК.ПолучитьЭлемент()=1 Цикл
            Если Табл.НайтиЗначение(НАДК.Код)=0 Тогда
                //Табл.НоваяСтрока();
                //Табл.Код = НАДК.Код;
                Табл.ДобавитьЗначение(НАДК.Код);
            Иначе
                НАДК.Удалить(1);
            КонецЕсли;
        КонецЦикла;
    //КонецЦикла;
35 aka AMIGO
 
27.08.15
12:21
должно сработать
36 Ёпрст
 
27.08.15
12:22
(34) НАДК.ВыбратьЭлементы(0);
37 Злопчинский
 
27.08.15
12:24
(28) жадина... ;-)
38 aka AMIGO
 
27.08.15
12:26
(37) а поторговаться = 2р.37 копеек! неправда ваша :)

ладно уж :)
    СПТ = СоздатьОбъект("Справочник.Товары");
    СПЕ = СоздатьОбъект("Справочник.Единицы");
    СПТ.ВыбратьЭлементы();
    СЗ = СоздатьОбъект("СписокЗначений");
    Пока СПТ.ПолучитьЭлемент() = 1 Цикл
        СПЕ.ИспользоватьВладельца(СПТ.ТекущийЭлемент());
        СЗ.УдалитьВсе();
        СПЕ.ВыбратьЭлементы();
        Пока СПЕ.ПолучитьЭлемент() = 1 Цикл
            Если СЗ.НайтиЗначение(СПЕ.Код)=0 Тогда
                СЗ.ДобавитьЗначение(СПЕ.Код);
            Иначе
                СПЕ.Удалить(1);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;

Вот так примерно :)
39 aka AMIGO
 
27.08.15
12:29
+38 это если "В пределах подчинения"
надо смотреть, что там у него в БД осталось..
или "По всему справочнику"
40 Злопчинский
 
27.08.15
12:30
как-то мне не нравится удаление в выборке...
41 aka AMIGO
 
27.08.15
12:32
(40) ты прав!..
это типичный пример г-кода :)
Думать уже неохота :)
42 aka AMIGO
 
27.08.15
12:33
хотя.. может проскочить
СПЕ.Удалить(0);
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс