Имя: Пароль:
1C
1C 7.7
v7: При записи элемента справочника элемент перестает быть выбран
0 POHNAH
 
21.01.15
14:07
Ситуация такая я нахожу тем или иным способом элемент, провожу с ним манипуляции и при исполнении метода Записать() текущий элемент слетает. Становится не выбран.

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

Что это может быть?
1 Ёпрст
 
21.01.15
14:08
[:]||||||||||||||[:]
2 Ёпрст
 
21.01.15
14:08
и то, это не всегда, а только в поиске, как правило в НайтиПоРеквизиту
3 Ёпрст
 
21.01.15
14:09
ну и, надеюсь, ты не пытаешься ТекущийЭлемент() записать ?
Если че, это ссылка только на чтение
4 POHNAH
 
21.01.15
14:34
(2) и (3) Пожалуйста поясни подробно.

Обработка не моя, но она работала. Ситуация такая именно эта функция находит элемент справочника по определнным входящим данным, причем разным(по айдишнику, по наименованию и тд) после этого редактирует этот элемент и записывает.

При этом поиск происходит именно НайтиПоРеквизиту.
5 Ёпрст
 
21.01.15
14:36
Больше кода
6 POHNAH
 
21.01.15
14:43
Функция НайтиСпр(стр,стрРод="",стрIDD="",вид,владелец="",ЭтоГруппа=0,стрКод = "",ПризнакУдаления = "OK")    
    
    Если ПустоеЗначение(стр) = 0 Тогда
        Если ПустоеЗначение(стрIDD) = 0 Тогда
            
            Если ЭтоГруппа="Нет" Тогда
                ЭтоГруппа = 0;
            ИначеЕсли ЭтоГруппа="Да" Тогда
                ЭтоГруппа = 1;
            КонецЕсли;
            
            стр = СокрЛП(стр);
            Попытка
                Спр = СоздатьОбъект("Справочник." + вид);
            Исключение
                Сообщить ("Не возможно создать Справочник." + вид);
            КонецПопытки;    
            
            
            ДлинаНаименования = Метаданные.Справочник(Вид).ДлинаНаименования;
            ДлинаКода = Метаданные.Справочник(Вид).ДлинаКода;
            стрКод = Лев(стрКод,2) + Прав(стрКод,ДлинаКода-2);
            
            
            Если ПроверитьУникальностьIDD(стрIDD,вид) > 1 Тогда
                Сообщить("Код IDD  " + стрIDD + " не уникален");
                Возврат "";
            КонецЕсли;
            
            
            Если Спр.НайтиПоРеквизиту("IDD",стрIDD,1) = 1 Тогда
                
                Если Спр.ЭтоГруппа() = ЭтоГруппа Тогда            
                    
                    Спр.Наименование = СокрЛП(Лев(стр,ДлинаНаименования));
                    
                    Если (ТипЗначения(стрРод) = 11) и (вид<>"Сотрудники") Тогда
                        Попытка
                            Спр.Родитель = стрРод;
                        Исключение
                        КонецПопытки;
                    КонецЕсли;
                    
                    Если ПустоеЗначение(владелец) = 0 Тогда                
                        Спр.владелец = владелец;
                    КонецЕсли;

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Слетает вот тут!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                    
                    Спр.Записать();
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Слетает вот тут!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                    
                    
                    Если Спр.Выбран() = 1 Тогда
                        
                        Если ПризнакУдаления = "DEL" Тогда
                            Спр.Удалить(0);
                        Иначе
                            Если (вид<>"Сотрудники") и (Спр.ПометкаУдаления()<>1) Тогда
                                Спр.СнятьПометкуУдаления();
                            КонецЕсли;
                        КонецЕсли;
                        
                    КонецЕсли;
                    
                    Возврат Спр.ТекущийЭлемент();
                    
                КонецЕсли;
                
                
            КонецЕсли;
            
            
            Если ПустоеЗначение(владелец) = 0 Тогда
                Спр.ИспользоватьВладельца(владелец);
            КонецЕсли;    
            
            Спр.ВыбратьЭлементы();
            
            Пока Спр.ПолучитьЭлемент() = 1 Цикл
                
                Если СокрЛП(Спр.Наименование) = СокрЛП(Лев(стр,ДлинаНаименования)) Тогда
                    Если Спр.ЭтоГруппа() = ЭтоГруппа Тогда                
                        Если Спр.Родитель = стрРод Тогда
                            
                            Спр.IDD = стрIDD;                
                            
                            Если ПустоеЗначение(владелец) = 0 Тогда
                                Если Спр.владелец <> владелец Тогда                    
                                    Спр.владелец = владелец;
                                КонецЕсли;
                            КонецЕсли;
                            
                            Спр.Записать();
                            
                            Если Спр.Выбран() = 1 Тогда
                                
                                Если ПризнакУдаления = "DEL" Тогда
                                    Спр.Удалить(0);
                                Иначе
                                    Спр.СнятьПометкуУдаления();
                                КонецЕсли;
                                
                            КонецЕсли;                    
                            
                            Возврат Спр.ТекущийЭлемент();
                            
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;            
                
            КонецЦикла;    
            
            
            Если (вид = "Договоры") или (вид = "Контрагенты") или (вид = "ТипыЦен")  или (вид = "Номенклатура")  или (вид = "Сотрудники") Тогда
                
                Если ЭтоГруппа = 1 Тогда
                    Спр.НоваяГруппа();
                Иначе
                    Спр.Новый();
                КонецЕсли;        
                
                Спр.Наименование = СокрЛП(Лев(стр,ДлинаНаименования));
                Спр.IDD = стрIDD;
                
                Если ТипЗначения(стрРод) = 11 Тогда
                    Попытка
                        Спр.Родитель = стрРод;
                    Исключение
                    КонецПопытки;
                КонецЕсли;                
                
                Если ПустоеЗначение(владелец) = 0 Тогда                
                    Спр.владелец = владелец;
                КонецЕсли;        
                
                
                Спр.Записать();
                
                Если Спр.Выбран() = 1 Тогда
                    
                    Если ПризнакУдаления = "DEL" Тогда
                        Спр.Удалить(0);
                    Иначе
                        Спр.СнятьПометкуУдаления();
                    КонецЕсли;
                    
                КонецЕсли;
                
                Возврат Спр.ТекущийЭлемент();
                
                
            КонецЕсли;
            
        КонецЕсли;    
    КонецЕсли;
    
    Ошибка = Ошибка + 1;
    
    Возврат "";
    
КонецФункции // НайтиСпр(стр,вид)
7 ikea
 
21.01.15
14:46
Еще больше кода)
8 ikea
 
21.01.15
14:49
Там где слетает напиши констукцию:
Попытка
    Спр.Записать();
Исключение
    ОписаниеОшибки();
Конецпопытки.

потом запусти обработку и посмотри что выдает.
9 Ёпрст
 
21.01.15
14:55
вообще хрень с МОДА..только у меня это вот так выглядит :
Функция НайтиСпр(Вид,Имя,Режим=0,Владелец=0,Родитель=0,Создавать=0,ЭтоГруппа=0)
    Перем Спр;
    Спр=СоздатьОбъект("Справочник."+Вид);
    Если Владелец<>0 Тогда
        Спр.ИспользоватьВладельца(Владелец);
    КонецЕсли;
    Рез=Спр.НайтиПоНаименованию(Имя,Режим,1);
    Если Рез=1 Тогда
        Если Спр.ЭтоГруппа()<>ЭтоГруппа Тогда
            Рез=0;
        КонецЕсли;
    КонецЕсли;
    Если Рез=1 Тогда
        Возврат Спр.ТекущийЭлемент();
    Иначе
        Если Создавать=1 Тогда
            Подчиненность=0;
            Если ЭтоГруппа=0 Тогда
                Спр.Новый();
            Иначе
                Спр.НоваяГруппа();
            КонецЕсли;
            Если Владелец<>0 Тогда
                Спр.Владелец=Владелец;
                Подчиненность=1;
            КонецЕсли;
            Если Родитель<>0 Тогда
                Спр.Родитель=Родитель;
            КонецЕсли;
            Мета=Метаданные.Справочник(Вид);
            Спр.Наименование=Имя;
            Спр.Код=СоздатьНовыйКод(Вид,Спр,Подчиненность,Мета);
            Спр.IDD=ПолучитьУникальныйIDD();
            Спр.Записать();
            М_Сообщить("Создан новый справочник "+Вид+"  "+Имя+",  "+Спр.Код);
            Возврат Спр.ТекущийЭлемент();
        Иначе
            Возврат "";
        КонецЕсли;
        
    КонецЕсли;
КонецФункции
10 Ёпрст
 
21.01.15
14:58
И.. слёт обычно после записи, нужно было через НайтиЭлемент перепозицонирование делать было