Имя: Пароль:
1C
1C 7.7
v7: как переиндексовать справочник?
,
0 napagokc
 
09.11.11
08:03
Семёрочники, помогите, пожалуйста!
Перегоняю справочники из 7.7 в 8.2. Получилось так, что Код договора в 7.7 имеет тип строка 6 символов. В конфе 8.2 код договора имеет тип число 5 знаков. Посмотрел в 7.7 и заметил, что, во-первых, весь код по сути - число, а во-вторых, используются только первый символ и два последних. То есть, так: Х000ХХ. Решил переиндексовать справочник в 7.7 перед переносом,  сделать так: 000ХХХ. То есть, четвертый символ заменить первым, а первый четвертым.
Это все делаю в отдельной функции:

Функция ПолучитьКодДоговора(КодДоговора)
   СпрДоговоры = СоздатьОбъект("Справочник.Договоры");
   Если СпрДоговоры.НайтиПоКоду(КодДоговора) = 1 Тогда
       НайденныйДоговор = СпрДоговоры.ТекущийЭлемент();
       Попытка
           Если Число(НайденныйДоговор.Код) > 99 Тогда
               НайденныйДоговор.Код = "000" + Лев(КодДоговора, 1) + Прав(КодДоговора, 2);
               НайденныйДоговор.Записать();
               Сообщить("Код договора '" + КодДоговора + "' преобразован в '" + НайденныйДоговор.Код + "'", "!");
               Возврат НайденныйДоговор.Код;
           Иначе
               Возврат КодДоговора;
           КонецЕсли;
       Исключение
           Сообщить("Невозможно преобразовать код договора " + СпрДоговоры.Наименование + " к числу!", "!!!");
       КонецПопытки;
   Иначе
       Возврат КодДоговора;
   КонецЕсли;
КонецФункции

Но у меня почему-то никогда не выполняется первое же условие. Почему? Что я делаю не так? Заранее благодарен.
1 napagokc
 
09.11.11
08:09
Вопрос-то даровой. Я просто с семёркой не знаком, практически, пожтому мог что-то не учесть. Поделитесь опытом, плз!

КодДоговора определяется верно по отладчику. Я в недоумении...
2 PuhUfa
 
09.11.11
08:10
(1) КодДоговора передаваемый в функцию строка? Справочник.Договоры подчиненный?
3 KRV
 
09.11.11
08:11
Наверно сравниваешь разные значения, не?
4 KRV
 
09.11.11
08:11
+(2) ИспользоватьВладельца()
5 alkov
 
09.11.11
08:12
СпрДоговоры.НайтиПоКоду(КодДоговора, 0) ?
6 napagokc
 
09.11.11
08:13
(2) Справочник Договоры - подчиненный, да.
Код договора передаю так:

ПолучитьКодДоговора(Спр.ОсновнойДоговор.Код);

где Спр = СоздатьОбъект("Справочник.Контрагенты");
7 filh
 
09.11.11
08:13
(0) А то что КодДоговора может быть больше 1?
8 napagokc
 
09.11.11
08:14
(5) Там же по умолчанию должно присваиваться? В справке так написано...

(4) Можно поподробнее, плз?
9 filh
 
09.11.11
08:14
Рукурсию делай и будет сщастье
10 andrewks
 
09.11.11
08:15
перенумерация справочника перед переносом - это моветон
11 alkov
 
09.11.11
08:18
(6) Зачем в процедуру передавать код договора, и по нему же потом искать договор? Не правильней было б:

ПолучитьКодДоговора(Спр.ОсновнойДоговор);

?
12 alkov
 
09.11.11
08:18
(11) в функцию
13 napagokc
 
09.11.11
08:23
(11) так просто запись короче получается и читать потом легче. Замени в моей функции "КодДоговора" на "Договор.Код" и увидешь, что читабельность чуть-чуть ухудшилась. + заменять "КодДоговора" проще (используя даблклик по переменной), чем Договоры.Код :) Только из этих соображений
14 alkov
 
09.11.11
08:25
(13) Передавать атрибут вместо объекта и потом искать объект по его атрибуту только лишь для увеличения читабельности? Это не шутка?
15 napagokc
 
09.11.11
08:32
(14) Так ведь в семерке в любом случае ссылку на объект можно получить только одним из методов: НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(). Это же не восьмерка
16 napagokc
 
09.11.11
08:33
(15) или я не правильно понял учебник по 7.7 на мисте.....
17 filh
 
09.11.11
08:34
Спр.ОсновнойДоговор и Спр.ОсновнойДоговор.ТекущийЭлемент()
чуешь разницу?
18 alkov
 
09.11.11
08:37
(15) Спр.ОсновнойДоговор - это тоже ссылка, если рассуждать в терминах 8-ки.
19 ParaWiz
 
09.11.11
08:37
мммм а зачем вообще все это если надо перелопатить весь справочник ?!

Процедура Сформировать()
   Конт=СоздатьОбъект("Справочник.Контрагенты");
   Дог=СоздатьОбъект("Справочник.Договоры");
   Конт.ВыбратьЭлементы();
   Пока Конт.ПолучитьЭлемент() = 1 Цикл
       Дог.ИспользоватьВладельца(Конт.ТекущийЭлемент());
       Дог.ПорядокНаименований();
       Дог.ВыбратьЭлементы();
       Пока Дог.ПолучитьЭлемент() = 1 Цикл
           Дог.Код="000"+Лев(Дог.Код,1)+Прав(Дог.Код,2);
           Дог.Записать();
       КонецЦикла;
   КонецЦикла;
КонецПроцедуры
20 napagokc
 
09.11.11
08:50
Ребятааа! Вы молодцы! Огромное спасибо все!
Особая благодарность (19) за предоставленный наглядный пример! :)
21 1Сергей
 
09.11.11
08:53
Видимо, снеговик и в правду разжижает моск
22 ParaWiz
 
09.11.11
09:29
(21) угу, я вообще не вкурил код в (0) ... ну то есть вкурить то вкурил ... но не понял зачем это все :) ...
23 Patrio_
O_Muerte
 
09.11.11
09:30
(8)Рекомендую - меньше всего верить справке!