Имя: Пароль:
1C
1C 7.7
v7: тис 9.2 правильность указания базовой и основной единицы
0 Gavrinev
 
02.02.12
15:23
ТИС 9.2 (7.70.954) Пишу загрузку эл. накл. из тхт файла.
Загружается нормально, в спр номенклатура при просмотре не указана единица??? Далее при формировании документа продажа, при подборе выскакивает сообщение:
В подборе выбрана единица другого элемента справочника Номенклатура.
Проверьте правильность указания базовой и основной единицы для элемента
"Деталь № 1", а также правильность указания единиц измерения
в справочниках единиц и цен для данной позиции номенклатуры.
[code]
   Для Инд = 1 По Тхт.КоличествоСтрок()-1 цикл
       Состояние(Инд);
       СЗ.УдалитьВсе();
       СТ=Тхт.ПолучитьСтроку(Инд);
       СЗ.ИзСтрокиСРазделителями(Ст);
       Тов=ПроверитьАналог(СЗ.ПолучитьЗначение(1),СЗ.ПолучитьЗначение(2),СЗ.ПолучитьЗначение(10));
       Если Спн.НайтиПоКоду(Тов.Код)=1 Тогда
           // установка новых цен ****************************************************
           СпЦены.ИспользоватьВладельца(Спн.ТекущийЭлемент());
           СпЦены.ВыбратьЭлементы();
           СпЦены.Новый();
           Если СпВал.НайтиПоКоду("810")=1 Тогда
               спЦены.Валюта = СпВал.ТекущийЭлемент();
           КонецЕсли;
           СпЦены.Записать();            
           СпЕд.ИспользоватьВладельца(Спн.ТекущийЭлемент());
           СпЕд.ВыбратьЭлементы();
           СпЕд.Новый();
           Если СпОКЕИ.НайтиПоКоду("778")=1 Тогда
               СпЕд.ОКЕИ = СпОКЕИ.ТекущийЭлемент();
           КонецЕсли;    
           СпЕд.Коэффициент = 1;
           СпЕд.ШтрихКод = СЗ.ПолучитьЗначение(10);
           СпЕд.Записать();
           Спн.БазоваяЕдиница = СпЕд.ТекущийЭлемент();
           Спн.ОсновнаяЕдиница = СпЕд.ТекущийЭлемент();
           спЦены.Процент = 0;
           Если СпТипыЦен.НайтиПоКоду("00004")=1 Тогда
               спЦены.ТипЦен = СпТипыЦен.ТекущийЭлемент();                  
               СпЦены.Записать();
               СпЦены.Цена.Установить(ТекущаяДата(),СЗ.ПолучитьЗначение(9));
           КонецЕсли;    
           Спн.Артикул = СЗ.ПолучитьЗначение(10);
           Спн.Весовой = 0;
           //Если ПустоеЗначение(Спн.ВидНоменклатуры)=1 Тогда
               Спн.ВидНоменклатуры=Перечисление.ВидыНоменклатуры.Прочее;
           //КонецЕсли;                                                    
           Спн.ПолнНаименование = СЗ.ПолучитьЗначение(1);
           //Спн.СтавкаНДС = ПолучитьСтавкуНДС();        
           Спн.Записать();                                                  
           // данные по партии *******************************************************        
           СпПарт.ИспользоватьВладельца(Спн.ТекущийЭлемент());
           СпПарт.ВыбратьЭлементы();
           СпПарт.Новый();
           СпПарт.ПриходныйДокумент = Док.ТекущийДокумент();
           СпПарт.Поставщик = ВыбКлиент;
           СпПарт.ЗакупочнаяЦена = СЗ.ПолучитьЗначение(6);
           СпПарт.РозничнаяЦена = СЗ.ПолучитьЗначение(9);
           СпПарт.Записать();
           док.НоваяСтрока();
           док.ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
           док.номенклатура = Спн.ТекущийЭлемент();
           док.Партия = спПарт.ТекущийЭлемент();
           док.Единица = СпЕд.ТекущийЭлемент();
           док.Коэффициент = 1;
           док.Количество = СЗ.ПолучитьЗначение(5);
           док.Цена = СЗ.ПолучитьЗначение(9);
           глПересчетТаблЧасти(док,"Номенклатура");
           глПересчетТаблЧасти(док,"Количество");

           
       КонецЕсли;
   КонецЦикла;

       СуммаВзаиморасчетов    = Док.Итог("Сумма")
                               +?(Док.СуммаВклНП =1,0,Док.Итог("СуммаНП" ))
                               +?(Док.СуммаВклНДС=1,0,Док.Итог("СуммаНДС"));
   
       Док.СуммаВзаиморасчетов    = глПересчет (СуммаВзаиморасчетов,Док.Валюта,Док.Курс,глРубли,Док.ДатаДок,Док.Кратность);
       Док.Записать();

[code]
В инете на эту тему сказано - несоответствие товара с единицой и патрией, но в отладчике проверял все норм...
Просьба подсказать в чем может быть причина...
1 Gavrinev
 
02.02.12
16:10
Люди пажалуста, помогите... HELP !!!
2 Дядя Васька
 
02.02.12
16:20
Вместо:
3 Дядя Васька
 
02.02.12
16:20
СпЕд.ИспользоватьВладельца(Спн.ТекущийЭлемент());
           СпЕд.ВыбратьЭлементы();
           СпЕд.Новый();
4 Дядя Васька
 
02.02.12
16:20
Пиши
           СпЕд.Новый();
СпЕд.Владелец = Спн.ТекущийЭлемент();
5 Дядя Васька
 
02.02.12
16:24
СпЕд.ВыбратьЭлементы(); нафик не нужно, так же с ценами и партиями.
6 Gavrinev
 
02.02.12
16:26
Понял, щас буду пробовать... Спасибо.
7 miki
 
02.02.12
16:30
(4)Есть разница?
8 Gavrinev
 
02.02.12
16:30
(2,3,4,5) выдает ошибку
СпЕд.Записать();
{D:\ЗАГРУЗКАНАКЛДАНЫХ.ERT(85)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!
Я вообщето думал что сначала нада использовать владельца а потом новый() ???
9 Ёпрст
 
02.02.12
16:36
(0) Это че за бред ?

СпЕд.ВыбратьЭлементы();
СпЕд.Новый();

Нужно всего лишь Использовать владельца, потом проверить, нет ли же созданной единицы в спраочнике, выбрав её по рекизиту ОКЕИ, ...и ежели не найдена - только тогда создавать новый элемент
10 aka AMIGO
 
02.02.12
16:37
(0)ты своим вот этим:
          СпЕд.ИспользоватьВладельца(Спн.ТекущийЭлемент());
           СпЕд.ВыбратьЭлементы();
           СпЕд.Новый(); //??????
....
           СпЕд.Записать();

загрузишь много-много ненужных элементов, после чего на мисте будет тема: кака избавиться от лишних?

ИМХО, конечно..

я-б лучше применил
Если СпЕд.ВыбратьЭлементы()=0 Тогда //тогда уж
СпЕд.Новый();
Иначе
Если СпЕд.Найти....=0 Тогда //условие поиска подобного элемента в спр
СпЕд.Новый();
...
КонецЕсли;

ведь у тебя только 2 типа единиц должно быть для элемента номенклатуры?

ЗЫ. дел хозяйское..
возможно, ошибаюсь..
тогда прошу простить покорно..
11 Gavrinev
 
02.02.12
16:39
(10) Огромное спасибо буду пробовать..
12 Дядя Васька
 
02.02.12
17:58
(7) Сначала задает владельца, потом нового создает. Хз выбран он там или нет. Наоборот как-то логичнее все же.
13 Gavrinev
 
03.02.12
09:18
(12) Странно что логика не работает ???
(10) Создал цикл, посмотреть есть-ли вообще элементы, так вообще ничего нет...
[code]
           СпЕд.ИспользоватьВладельца(Спн.ТекущийЭлемент());
           СпЕд.ВыбратьЭлементы()=1 Тогда //тогда уж
               Пока СпЕд.ПолучитьЭлемент()=1 Цикл
                   Если СпЕд.Владелец = Спн.ТекущийЭлемент() Тогда
                       СпЕд.ТекущийЭлемент();
                   КонецЕсли;
               КонецЦикла;
           
[code]
Может в чем другом дело?
14 aka AMIGO
 
04.02.12
12:35
(13) дело всё в том-же..
Для справочника Спн твой справочник СпЕд - подчиненный.
оператором:
СпЕд.ИспользоватьВладельца(Спн.ТекущийЭлемент());
ты устанавливаешь фильтр по подчинению записей СпЕд одной записи Владельца-номенклатуры.
Если после этого СпЕд.ВыбратьЭлементы()=0, то в СпЕд выбранному владельцу не подчинено НИЧЕГО, единиц измерения для Владельца-номенклатуры в БД нет!
Иначе было-бы: СпЕд.ВыбратьЭлементы()=1

вот в (10) я и написал 2 проверки в условиях "Если"
1. первое "Если": проверка подчиненных элементов, если их нет - создается СпЕд.Новый()
2. второе "Если": - поскольку ВыбратьЭлементы вернула "1", то элементы есть, надо проверить среди них наличие нужного, т.е. поискать по условию (9) - по ОКЕИ, или перебрать в цикле Пока СпЕи.ПолучитьЭлемент()=1, проверяя условием равенство искомому ОКЕИ
Если по ОКЕИ элемент (единицаИзм) не найден - создается СпЕд.Новый()
вот примерно это и написано в (10).

если внимательно разберешь - должно помочь
обращайся, если чё..
15 Gavrinev
 
07.02.12
13:20
(14) Как раз у меня проблема в том что при проверке СпЕд.ВыбратьЭлементы()=1, а при переборе Пока СпЕд.ПолучитьЭлемент()=1 Цикл -- ничего нет, сразу переходит на конец цикла... ( и как с этим боротся?)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой