Имя: Пароль:
1C
 
Ошибка при установке значения атрибута контекста : Реквизит недоступен для
0 Старуха Шапокляк
 
28.05.10
15:20
В спр.Контрагенты добавлен реквизит "Ключ" - строка, 25символов. Надо загрузить контрагентов из Эксель. В Эксель они попали из другой программы, которая является наиболее приоритетной, чем та, в которую загружать будем. Поэтому при загрузке, надо предусмотреть несколько условий:
анализируем Ключ: Ключ не совпал
анализируем ИНН: ИНН совпал
анализируем КПП: КПП совпал
В таком случае, надо заполнить Ключ и все остальные заполненные поля данными из файла (Кроме ИНН и КПП, т.к. они совпали).

Выходит ошибка:

Ошибка при установке значения атрибута контекста (ЮрФизЛицо): Реквизит недоступен для группы
ОбъектКА.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
по причине:
Реквизит недоступен для группы


Вот мой код:

Ексель = новый COMОбъект("Excel.Application");
   
   Для ТекНомер = 1 По КоличествоСтраниц Цикл
       для н= 1 по   ВсегоКоличестовСтрок -1 цикл
           Ключ = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки).Value;
           Ключ = СтрЗаменить(Ключ, Символы.НПП, "");                   //убрала пробел как разделитель
           
           КодКА = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +1).Value;
           КодКА = СтрЗаменить(КодКА, Символы.НПП, "");                    
           
           ИНН = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +2).Value;
           ИНН = СтрЗаменить(ИНН, Символы.НПП, "");                      
           
           КПП = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +3).Value;
           КПП = СтрЗаменить(КПП, Символы.НПП, "");                      
           
           ЮРФЛ = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +4).Value;
           Название = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +5).Value;
           // .......
           
           // Ищем контрагента в справочнике по реквизиту      
           КА = Справочники.Контрагенты.НайтиПоРеквизиту("Ключ",Ключ);
           Если КА.Пустая() Тогда                              //не нашли с таким ключом  
               
               Если не ИНН = "" Тогда                              //ИНН не пустое в файле
                   КА = Справочники.Контрагенты;
                   СсылкаКА = КА.НайтиПоРеквизиту("ИНН",ИНН);
                   Если НЕ СсылкаКА.Пустая() Тогда                 //нашли такой ИНН
                       
                       Если не КПП = "" Тогда                          //КПП не пустое в файле
                           СсылкаКА = КА.НайтиПоРеквизиту("КПП",КПП);
                           Если Не СсылкаКА.Пустая() Тогда             //нашли такое КПП
                               
                               ОбъектКА = СсылкаКА.ПолучитьОбъект();
                               
                               // вставила это условие и все равно ошибка вылетает
                               Если ОбъектКА.ЭтоГруппа Тогда         //если элемент это группа
                                   Сообщить(ОбъектКА + " - является группой!!! Пропускаем его...");
                                   Продолжить;
                               Иначе
                                   
                                   ОбъектКА.Ключ = Ключ;
                                   
                                   //ИНН не берем, т.к. он совпал
                                   //КПП не берем, т.к. он совпал
                                   //Код не меняем, т.к. в базе уже введен код
                                   
                                   Если не ЮРФЛ = "" Тогда               //если значение "ЮРФЛ" в файле заполнено
                                       Если СокрЛП(ЮРФЛ) = "Юридическое лицо" Тогда      
                                           ОбъектКА.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
                                       ИначеЕсли СокрЛП(ЮРФЛ) = "Физическое лицо" Тогда  
                                           ОбъектКА.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
                                       КонецЕсли;
                                   Иначе
                                       Сообщить ("ЮЛ/ФЛ для контрагента " + Название + " в файле не заполнен!");
                                   КонецЕсли;
                                   
                                   Если не Название = "" Тогда
                                       ОбъектКА.Наименование =  Название;
                                   КонецЕсли;
                                   
                                   // ...                                    
                                   ОбъектКА.Записать();
                                   
                               КонецЕсли;  //если элемент это группа
                           Иначе // не нашли такое КПП
                           КонецЕсли;  //нашли такое КПП
                       КонецЕсли;  //КПП не пустое в файле
                   КонецЕсли;          //нашли такой ИНН
               КонецЕсли;  //ИНН не пустое в файле
           КонецЕсли;  //не нашли с таким ключом  
       КонецЦикла;
   КонецЦикла;
1 maxar
 
28.05.10
15:24
включаем отладку - ставим галку остановка по ошибке - и смотрим результаты своих ошибок...
2 mikecool
 
28.05.10
15:27
"Реквизит недоступен для группы " - не надо группе устанавливать этот реквизит
смотри признаки реквизитов - если только для элемента - не устанавливай для группы
3 Старуха Шапокляк
 
28.05.10
15:30
(2) Так я и поставила условие в (0):

Если ОбъектКА.ЭтоГруппа Тогда         //если элемент это группа

                                   Сообщить(ОбъектКА + " - является группой!!! Пропускаем его...");
                                   Продолжить;
                               Иначе
4 butterbean
 
28.05.10
15:31
мне одному кажется, что поиск по ИНН и поиск по КПП между собой никак не связаны??
5 hhhh
 
28.05.10
15:32
(4) связаны
6 mikecool
 
28.05.10
15:32
а кпп всегда уникальны?
7 mikecool
 
28.05.10
15:33
(5) как? меня это тоже напрягло
8 maxar
 
28.05.10
15:34
пипец - если нашли по инн - потом если есть кпп ищем по кпп -
кпп - это не уникальный реквизит - т.е. ищем всегда один и тот эе элемент по кпп
9 mikecool
 
28.05.10
15:35
КА = Справочники.Контрагенты;
                   СсылкаКА = КА.НайтиПоРеквизиту("ИНН",ИНН);
                   Если НЕ СсылкаКА.Пустая() Тогда                 //нашли такой ИНН
вот здесь будет только одна ссылка, если таковой имеется
затем ищем по кпп и находим другого контрагента
10 Старуха Шапокляк
 
28.05.10
15:39
(9) спасибо, а как мне тогда в связке искать эти два значения - сначала ИНН, затем если нашли, то проверять у него КПП???
11 butterbean
 
28.05.10
15:40
(10) запросом ищи
12 Старуха Шапокляк
 
28.05.10
15:43
В (0) вопрос снимается, нашла где была ошибка.
Но вопрос про связь ИНН и КПП - остается открытым: Как сначала у этого контрагента проанализировать сначала ИНН, а затем у него же КПП?
13 mikecool
 
28.05.10
15:43
(10) пробежалась по файлу, собрала инн-кпп в кучу, и затем параметром в (11)
14 Старуха Шапокляк
 
28.05.10
15:44
(13) Легко вам сказать! Как это сделать???
15 mikecool
 
28.05.10
15:47
инн-кпп в таблицу значений
таблицу значений во врем таблицу
потом запрос
типа
выбрать ИНН, КПП
поместить ВТ_Данные
Из &ТЗ;
выбрать Контрагенты.ссылка, ВТ_Данные.ИНН, ВТ_Данные.КПП
из ВТ_Данные
левое соединение справочник.контрагенты Как Контрагенты
по ВТ_Данные.ИНН = Контрагенты.ИНН И ВТ_Данные.КПП = Контрагенты.КПП
16 mikecool
 
28.05.10
15:47
+15 там где нулл в ссылка - контрагент не найден
17 Шапокляк
 
28.05.10
15:48
СсылкаКА = КА.НайтиПоРеквизиту("ИНН",ИНН);
                   Если НЕ СсылкаКА.Пустая() Тогда                 //нашли такой ИНН

                       
                       Если не КПП = "" Тогда                          //КПП не пустое в файле
//////////////////////////
Если СсылкаКА.КПП=КПП Тогда
///////////////////////////
вместо вот этого:
                           СсылкаКА = КА.НайтиПоРеквизиту("КПП",КПП);
                           Если Не СсылкаКА.Пустая() Тогда             //нашли такое КПП
18 butterbean
 
28.05.10
15:52
(17) так ты не найдешь тех, у кого один ИНН, но разные КПП
19 Шапокляк
 
28.05.10
15:56
(17) Мне не надо, это к автору пожалуйста. Я только догадываться могу, что у нее там в базе происходит. Так, чуть-чуть ее код подрихтовала, не более того
20 Шапокляк
 
28.05.10
15:56
19 к (18)
21 Старуха Шапокляк
 
28.05.10
16:03
(17),(18) cпасибо!
Но мне бы код полегче, без таблиц значений и временных таблиц, например, как в (17). Неужели, задать простое условие: проанализировать у контрагента ИНН, а затем у него же КПП - надо такую сложную конструкцию делать???
22 hhhh
 
28.05.10
16:06
(21)

ВЫБРАТЬ
   Ссылка
ИЗ
   Справочник.Контрагенты КАК Контрагенты
ГДЕ
   Контрагенты.ИНН = &ИНН
   И Контрагенты.КПП = &КПП
23 Шапокляк
 
28.05.10
16:11
(21)Ну не так там и слоно, хотя я бы запросом без соединений и попробовала, что-то вроде
   Запрос.Текст =
   "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Представление
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    Контрагенты.ИНН = &ИНН
   |    И Контрагенты.КПП = &КПП";

   Запрос.УстановитьПараметр("ИНН", ИНН);
   Запрос.УстановитьПараметр("КПП", КПП);

   Результат = Запрос.Выполнить();

   ВыборкаДетали = Результат.Выбрать();
ЕстьКонтрагент=0;
   Пока ВыборкаДетали.Следующий() Цикл
ЕстьКонтрагент=1;
СсылкаКА=ВыборкаДетали.ссылка;
ОбъектКА=СсылкаКА.ПолучитьОбъект();
//пиши тут что надо


   КонецЦикла;
Если ЕстьКонтрагент=0 Тогда
//НЕТ с таким ИНН и КПП

КонецЕсли;
24 Старуха Шапокляк
 
28.05.10
16:19
(22), (23) - спасибо, а как мне связать ваш запрос с данными из файла (Ключ, ИНН и КПП)?
25 Шапокляк
 
28.05.10
16:20
Для ТекНомер = 1 По КоличествоСтраниц Цикл
       для н= 1 по   ВсегоКоличестовСтрок -1 цикл
           Ключ = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки).Value;
           Ключ = СтрЗаменить(Ключ, Символы.НПП, "");                   //убрала пробел как разделитель

           
           КодКА = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +1).Value;
           КодКА = СтрЗаменить(КодКА, Символы.НПП, "");                    
           
           ИНН = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +2).Value;
           ИНН = СтрЗаменить(ИНН, Символы.НПП, "");                      
           
           КПП = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +3).Value;
           КПП = СтрЗаменить(КПП, Символы.НПП, "");                      
           
           ЮРФЛ = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +4).Value;
           Название = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +5).Value;
           // .......
 Запрос=Новый Запрос;
и вот сюда.
26 Старуха Шапокляк
 
28.05.10
16:24
(25) Большое СПАСИБО!!!! Буду пробовать!!!
)))))))
27 Старуха Шапокляк
 
28.05.10
16:34
Подскажите еще, пожалуйста, два момента:

1) Нужен вначале анализ на реквизит Ключ. Если такого ключа нет в базе, то идет запрос как в (23) и тогда этот Ключ тоже надо вбить в базу.

2) В запросе (23) я найду контрагентов, которых:
или нет с таким как в файле ИНН и КПП
или есть с таким как в файле ИНН и КПП.
Т.е. это случаи или полного совпадения или полного несовпадения. А как мне тогда найти тех, у кого ИНН совпадает, а КПП из базы или не совпадает или вообще не заполнено (в этом случае, приоритет у КПП из файла, его надо вбить).
28 Старуха Шапокляк
 
28.05.10
16:38
+(27) На мой первый вопрос из (27):
Я так полагаю, что должно быть что-то вроде:

КА = Справочники.Контрагенты.НайтиПоРеквизиту("КодSAP",КодСап);
Если КА.Пустая() Тогда     //не нашли с таким ключом
Запрос=Новый Запрос;
...
СсылкаКА=ВыборкаДетали.ссылка;
ОбъектКА=СсылкаКА.ПолучитьОбъект();
...
Иначе //нашли с таким ключом
КонецЕсли;

Но как тогда дальше связать Ключ, ИНН и КПП? Не знаю, понятно ли я изложила свою мысль...
29 mikecool
 
28.05.10
16:40
запрос в цикле - уже не оригинально
смотрим (15)
30 hhhh
 
28.05.10
16:46
(29) по сравнению с тем, что было до этого, запрос в цикле - большой шаг вперед.
31 Шапокляк
 
28.05.10
16:47
Запрос один и тот же почти: для Ключа
  "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Представление
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |ГДЕ
   |    Контрагенты.Ключ = &Ключ";

   Запрос.УстановитьПараметр("Ключ", Ключ);
нашла есть ли кто с таким ключом. Если нету ищем по какой-то логике. Если есть что делаем? Как вариант проверяем, совпадает ли у найденного ИНН и КПП. Если не совпадают что делаем? Перезаписываем, спрашиваем?

По вопросу ИНН и КПП. Не нашли с ИНН и КПП какими нужно. Что делаем? Ищем сначала по ИНН (запрос по аналогии сделаете, надеюсь). не нашли никого, по КПП искать бессмысленно дальше (все кто в одной налоговой имеют один и тот же КПП за редким исключением). Нашли нескольких с одним ИНН. Перебираем. У контрагента КПП не пустое и не совпадает с нашим. Что делаем? Варианты - проверяем наименование или еще что, спрашиваем у пользователя, идем дальше. У контрагента КПП пустое. Что делаем? Варианты - заполняем своим кпп, спрашиваем у пользователя, идем дальше. Короче, вы на бумажке алгоритм составьте для начала и решите что делать, а инструмент вот он.

(29) Никто не претендует на оригинальность. Пусть хоть как-то с мертвой точки сдвинется, к тому же все равно, как правило, вмешательство пользователей потребуетя в принятие решения. А ваша временная таблица убьет автора :) К тому же Ваш запрос из (15) не решает ее задачу, а для единичного прогона не сильно оптимален.
32 Старуха Шапокляк
 
28.05.10
16:51
(31) Шапокляк - огромное Вам СПАСИБО!!! Что бы я делала без Вас!?
:*)
33 Шапокляк
 
28.05.10
16:51
(32) :) Успехов!