опять длина кода

1. DbIM 07.07.08 13:14 Сейчас в теме
Процедура Добавить()
Длина=8;
Спр=СоздатьОбъект("Справочник.Номенклатура");
Спр.ПорядокНаименований();
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
ТекДл=СтрДлина(Спр.Код);
Если ТекДл=Длина Тогда
Продолжить;
КонецЕсли;
Спр.Код=Лев("00000000",Длина-ТекДл)+Спр.Код;
Спр.Записать();
КонецЦикла;
КонецПроцедуры

Все работает. Но не всегда. :)
Иногда в отдельных случаях выдает что код не уникален.
Как бы так определить какой именно код не уникален, или вообще обойти эту проблему?
Заранее спасибо!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vovan519 276 07.07.08 15:17 Сейчас в теме
1. Мне больше нравится Спр.Код=Прав("00000000"+Спр.Код,Длина)
2. Ты уже сам почти определил. Вставивь Попытку перед "Запись" и обрабатывай ошибку. Или создай еще объект Номенклатура и в нем ищи по вычисленному коду.
3. Проблемы не обходят, их решают :). Определись, что хочешь сделать с Кодом, который после преобразования стал неуникальным и все. Решения могут быть самые разные: от поиска наименьшего "правильного" кода до установки кода = Фигня01, Фигня02...
3. kitt 323 08.07.08 03:04 Сейчас в теме
(0) пример для твоего , с присваиванием неуникальному коду очередного кода, то есть того который был бы присвоен следующему элементу при интерактивном создании
Процедура Добавить() 
	Длина=8; 
	Спр=СоздатьОбъект("Справочник.Номенклатура"); 
	Спр.ПорядокНаименований(); 
	Спр.ВыбратьЭлементы(); 
	Пока Спр.ПолучитьЭлемент()=1 Цикл 
		ТекЭлем = Спр.ТекущийЭлемент();
		ТекДл=СтрДлина(ТекЭлем.Код); 
		Если ТекДл=Длина Тогда 
			Продолжить; 
		КонецЕсли;    
		ТекКод = Лев("00000000",Длина-ТекДл)+ТекЭлем.Код;
		ТекЭлем.Код=ТекКод;
		
		Попытка
			ТекЭлем.Записать(); 
		Исключение        
			
			Спр.НайтиПоКоду(ТекКод);
			Сообщить("Код "+ТекКод+" уже используется у элемента "+Спр.ТекущийЭлемент());
			
			//Воспользуемся автоматически присваиваевым кодом
			НовЭлем = Спр.НовыйЭлемент();
			НовКод = Спр.Код;
			//не записываем его, поэтому элемент не сохраняется
			//но мы узнали новый код
			ТекЭлем.Код = НовКод;
			ТекЭлем.Записать();
			Сообщить(" элементу "+ТекЭлем+" присовен новый код "+НовКод);
					
		КонецПопытки;
	КонецЦикла; 
КонецПроцедуры

Показать
4. vovan519 276 08.07.08 09:56 Сейчас в теме
kitt, ошибки и недочеты просто режут глаза.
5. DbIM 08.07.08 10:32 Сейчас в теме
Проблему уже решил, но на будущее пригодиться!
Да. код уже ругается
Поле агрегатного объекта не обнаружено (НовыйЭлемент)
Ну буду разбираться.
Все равно большое Спасибо!
6. CheBurator 3125 08.07.08 14:09 Сейчас в теме
Учимся писать правильно! Константы следует определять там, где без них не обойтись
Процедура Добавить()
Длина=Метаданные.Справочник("Номенклатура").ДлинаКода;
7. vovan519 276 08.07.08 15:31 Сейчас в теме
Да что Вы о мелких недочетах "НовыйЭлемент" - мелкая описка, Длина - красивее удобнее, грамотнее, но не принципиально. Посмотрите хотя бы, сколько раз сбивается выборка Спр.
8. kitt 323 09.07.08 05:55 Сейчас в теме
vovan519 согласен, но торопился и ставил целью просто показать как можно генирировать новый уникальный код, уж не пинайте сильно ))
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот