Групповое исправление инв. номеров в БГУ2.0

1. Skaredov 5 24.08.16 09:25 Сейчас в теме
Процедуры модуля формы:
&НаСервере
Процедура ВыполнитьНаСервере()
	
	СписокИН = Справочники.ИнвентарныеНомераОС.Выбрать();
	
	Пока СписокИн.Следующий() Цикл
		ТекИнвНомер = СписокИН.ПолучитьОбъект();
		ТекНовыйПрефикс = "02"+СокрЛП(ТекИнвНомер.ПрефиксКода);
		ТекИнвНомер.ПрефиксКода = ТекНовыйПрефикс; 
		ТекИнвНомер.Код = СокрП(ТекНовыйПрефикс)+ СокрП(ТекИнвНомер.ПорядковыйНомер);
                //при выполнении следующей команды зацикливается  
		ТекИнвНомер.Записать();
	КонецЦикла;	
	
КонецПроцедуры

&НаКлиенте
Процедура КнопкаВыполнить(Команда)
	ВыполнитьНаСервере();
КонецПроцедуры
Показать
Вознаграждение за ответ
Показать полностью
Найденные решения
2. tarassov 112 24.08.16 09:47 Сейчас в теме
(1) Skaredov,
1. Сомнительна конструкция
СписокИН = Справочники.ИнвентарныеНомераОС.Выбрать(); 
Пока СписокИн.Следующий() Цикл 

лучше выбрать запросом и далее обходить в цикле уже выборку запроса
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tarassov 112 24.08.16 09:47 Сейчас в теме
(1) Skaredov,
1. Сомнительна конструкция
СписокИН = Справочники.ИнвентарныеНомераОС.Выбрать(); 
Пока СписокИн.Следующий() Цикл 

лучше выбрать запросом и далее обходить в цикле уже выборку запроса
3. tarassov 112 24.08.16 09:50 Сейчас в теме
(1) Skaredov,
2. ТекИнвНомер.Записать() - при записи могут отрабатывать разные события. Их надо смотреть
В моей БГУ вижу:
Процедура ПриЗаписи(Отказ)
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ ОС.ГрупповойУчет Тогда
		Отказ= УжеЕстьИнвНомер(Владелец,ОС);
		Если Отказ Тогда
			ОбщегоНазначенияБГУ.СообщитьОбОшибке("Для ОС "+ОС+" уже введен инвентарный номер",,,СтатусСообщения.Важное);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры
Показать


т.е если "УжеЕстьИнвНомер", то 1С попытается вывести сообщение "Для ОС "+ОС+" уже введен инвентарный номер", плюс - установить флаг отказа. Вот и возможная причина "зависания"
4. tarassov 112 24.08.16 09:56 Сейчас в теме
(1) Skaredov,
3. прежде чем писать
ТекИнвНомер.Код = СокрП(ТекНовыйПрефикс)+ СокрП(ТекИнвНомер.ПорядковыйНомер);

хорошо бы проверить, а не существует ли в базе уже такой номер (СокрП(ТекНовыйПрефикс)+ СокрП(ТекИнвНомер.ПорядковыйНомер))
5. Xershi 1484 24.08.16 10:53 Сейчас в теме
(1) Skaredov, как уже сказали пиши запрос. Возможно на твоей платформе такая конструкция не корректно работает.

Но скорее всего у тебя при записи справочника работают процедуры в модуле или подписки на события. Проверяй их тоже!
7. oleg21592 20 24.08.16 13:31 Сейчас в теме
(1) Skaredov, или так с проверкой на будущии дубли
&НаСервере
Процедура ВыполнитьНаСервере()
    
	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ИнвентарныеНомераОС.Ссылка КАК Ссылка,
		|	ИнвентарныеНомераОС.Владелец КАК Владелец,
		|	""02"" + ИнвентарныеНомераОС.ПрефиксКода КАК ТекНовыйПрефикс,
		|	ВЫРАЗИТЬ(""02"" + ИнвентарныеНомераОС.ПрефиксКода + ИнвентарныеНомераОС.ПорядковыйНомер КАК СТРОКА(30)) КАК Код
		|ПОМЕСТИТЬ инв
		|ИЗ
		|	Справочник.ИнвентарныеНомераОС КАК ИнвентарныеНомераОС
		|ГДЕ
		|	НЕ ИнвентарныеНомераОС.ПометкаУдаления
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	КОЛИЧЕСТВО(инв.Ссылка) КАК Ссылка,
		|	инв.Владелец КАК Владелец,
		|	инв.Код КАК Код
		|ПОМЕСТИТЬ Дубли
		|ИЗ
		|	инв КАК инв
		|
		|СГРУППИРОВАТЬ ПО
		|	инв.Код,
		|	инв.Владелец
		|
		|ИМЕЮЩИЕ
		|	НЕ КОЛИЧЕСТВО(инв.Ссылка) = 1
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	инв.Ссылка КАК Ссылка,
		|	инв.Владелец КАК Владелец,
		|	инв.ТекНовыйПрефикс КАК ТекНовыйПрефикс,
		|	инв.Код КАК Код,
		|	Дубли.Код КАК КодДубль
		|ИЗ
		|	инв КАК инв
		|		ЛЕВОЕ СОЕДИНЕНИЕ Дубли КАК Дубли
		|		ПО инв.Ссылка = Дубли.Ссылка
		|			И инв.Владелец = Дубли.Владелец";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.КодДубль) Тогда 
			
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Инв не установлен из-за дублей "+ ВыборкаДетальныеЗаписи.КодДубль+"  "+ВыборкаДетальныеЗаписи.Ссылка;
			Сообщение.КлючДанных = ВыборкаДетальныеЗаписи.Ссылка;
			Сообщение.Сообщить();
			
		Иначе 	
	        ТекИнвНомер = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
	        ТекИнвНомер.ПрефиксКода = ВыборкаДетальныеЗаписи.ТекНовыйПрефикс; 
	        ТекИнвНомер.Код = ВыборкаДетальныеЗаписи.Код;
	                
	        ТекИнвНомер.Записать();
		КонецЕсли;
		
		
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    
КонецПроцедуры

&НаКлиенте
Процедура КнопкаВыполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры
Показать
11. CaptainMorgan 26.08.16 10:12 Сейчас в теме
(1) Многое из предложенного верно, только ключевой фразой Skaredov является:
//при выполнении следующей команды зацикливается


Автору данного вопроса необходимо выдать "не рыбу, но удочку".

Так вот, для решения данной проблемы необходимо воспользоваться режимом конфигуратора "Отладчик"
Надо поставить точку останова в строке:
ТекИнвНомер.Записать();

И далее по шагам пройти весь алгоритм записи объекта.
Алгоритм рано или поздно попадёт в процедуру подписки на событие "При установке нового кода справочника"

Там можно выяснить, что к примеру код префикс состоящий только из цифр недопустим.
И если устанавливать, к примеру "02-", то программа заработает.

Так же, в процессе отладки, изучая алгоритм можно понять, что если изменить код так:
...
ТекИнвНомер.ОбменДанными.Загрузка = Истина;
ТекИнвНомер.Записать();
...

то все проверки и процедуры выполняемые перед записью элемента справочника, будут игнорироваться.

Но в этом случае программист должен самостоятельно их выполнять и устанавливать все реквизиты корректными.
6. oleg21592 20 24.08.16 13:08 Сейчас в теме
можно такое групповой обработкой сделать.

Администрирование - поддержка и обслуживание - Корректировка данных -групповое изменение реквизитов.
Дополнительные параметры - перве 2 галки снять остальные поставить три ( показать служебные реквизиты и режим разработчика)

в шапке не забыть выбрать справочник "Инвентарные номера ОС"

в таблице изменить 2 строки
Инв. № ="02"+[Префикс кода]+[Инв. №]
Префикс кода ="02"+[Префикс кода]

жмем изменить реквизиты.
8. sailor-cat 6 24.08.16 13:45 Сейчас в теме
Для прапорщиков объясните пожалуйста:
//при выполнении следующей команды зацикливается

Это что значит и в этом ли проблема?
9. Xershi 1484 24.08.16 15:26 Сейчас в теме
(8) sailor-cat, это значит, что автор сам не знает, что там на самом деле. Но виснет похоже.
10. sailor-cat 6 24.08.16 15:51 Сейчас в теме
(9) Понятно.
Тогда я бы рискнул предложить
ТекИнвНомер.ОбменДанными.Загрузка = Истина

На свой страх и риск.
И не забудьте перекреститься и сделать бэкап.
12. v3rter 01.09.16 17:46 Сейчас в теме
А "О2" (буква "О") тоже зацикливается?
13. white-mount 01.09.16 19:16 Сейчас в теме
Отладчик запускали?
Если на тестовой работает важно знать размер базы. Это критично.
Оставьте свое сообщение

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