Имя: Пароль:
1C
1С v8
Не получается никак при заливки xls файла менять реквизит элемента справочника?
, ,
0 1987denis
 
27.09.13
22:16
Имеется файл в формате xls содержащий список товаров, загружаю его в ТЧ. Далее сохраняю в Справочнике товары.
У элемента Справочника имеется реквизит Наличие(Тип Булево)
1.При загрузке если товар имеется в прайсе и в 1с, то Наличие=Истина
2.Если товар имеется в прайсе но нет в 1с , создается данный элемент, Наличие=Истина
3.Если товара нет в прайсе, но он есть в 1с, то у данного элемента Начисление=Ложь
Никак не могу сделать, пункт №3, товар остается в прайсе без изменения(Наличие=Истина)
Может подскажете в чем причина?
&НаКлиенте
Процедура ЗагрузитьВСправочники(Команда)
    СоздаемТовар();
КонецПроцедуры


&НаСервере
Процедура СоздаемТовар()
    
    Для Каждого Стр Из Объект.СписокПартнеров Цикл

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

        КонецЕсли;
                
        Если НЕ Справочники.Товар.НайтиПоНаименованию(Стр.Наименование) = Справочники.Товар.ПустаяСсылка()  Тогда
            
            ТекЭлемент =  Справочники.Товар.НайтиПоНаименованию(Стр.Наименование);
            ТекОб = ТекЭлемент.ПолучитьОбъект();            
            ТекОб.Наличие = Ложь;
            Попытка
                ТекОб.Записать();
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
            
            Сообщить("В справочнике номенклатура присутствует элемент " + ТекОб.Ссылка);
            
        Иначе    
            
            ВыборкаЭлемента = Справочники.Товар.СоздатьЭлемент();
            ВыборкаЭлемента.Наименование = Стр.Наименование;
            ВыборкаЭлемента.Цена         = Стр.Цена;
            ВыборкаЭлемента.Склад        = Стр.Склад;
            ВыборкаЭлемента.Наличие      = Истина;
            ВыборкаЭлемента.Родитель     = НоваяГруппа.Ссылка;
            
            Попытка
                ВыборкаЭлемента.Записать();
                Сообщить("Добавлен элемент");
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;

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


КонецПроцедуры
1 ProProg
 
27.09.13
22:19
Ошибок пипец
2 extrim-style
 
27.09.13
22:21
(0) Если Справочники.Товар.НайтиПоНаименованию(Стр.ВидТовара).Пустая()
3 Euguln
 
27.09.13
22:21
Код конечно - УГ.
А так - создавай массив ссылок номенклатур, которые уже записал, а потом запросом из справочника выбирай оставшиеся
4 ProProg
 
27.09.13
22:21
Гнать сцаными тряпками такого кодера.
5 ProProg
 
27.09.13
22:28
1) у вас что один поставщик всего? что если поставщиков много и у одного есть, у другого нет, у третьего есть. А реквизит один на всех????
2) Доспутим даже поставщик всего 1. Вообще один.
Где тут запрос по всей номенклатуре, соединение с таблицей, и если нет в таблице то идет уже другая выборка по товарам которых нет в таблице, и только у них мы ставим Ложь.


По примеру и коду - переписать все нафиг.
Долго писать, а мне лень поэтому мучайся как хочешь.
6 1987denis
 
27.09.13
22:28
поставщик 1
7 1987denis
 
27.09.13
22:29
Пример показать как надо сделать можете?
8 1987denis
 
27.09.13
22:33
Я просто не знаю как обратиться к таблице в которую я выгрузил данные из xls
9 Индиго
 
27.09.13
22:37
(0)Не хотел  поддерживать негатив.
Но извини, они правы...
Работать тебе надо над собой.
10 ProProg
 
27.09.13
22:39
1) ты два раза обращаешся к поиску тем самым дублируешь запрос.

Достаточно ОДИН раз обратится к поиску через переменную и далее проверять ее и дальше не искать дважны.


НайденЭлемент = Справочники.Товар.НайтиПоНаименованию(Стр.Наименование);

Если НЕ НайденЭлемент = Справочники.Товар.ПустаяСсылка()  Тогда
            
            ТекЭлемент =  НайденЭлемент.Ссылка;
11 ProProg
 
27.09.13
22:40
Справочники.Товар.ПустаяСсылка()

Лучше объявить один раз перед началом всего цикла и тоже через переменную.

ПустаяСсылка = Справочники.Товар.ПустаяСсылка();

И далее уже обращатся на проверку через ПустаяСсылка
12 Индиго
 
27.09.13
22:41
(10)Мань..
Да успокойся уже:-)
Он надеюсь понял.
13 ProProg
 
27.09.13
22:41
Менеджер Справочника тоже можнообъявить ожин раз.

СпрНоменклатура = Справочники.Номенклатура;

И тоже разместить перед циклом а в цикле обращаться через СпрНоменклатура
14 extrim-style
 
27.09.13
22:43
(9) не хотел, но поддержал
+(11) НоваяГруппа = Справочники.Товар.НайтиПоНаименованию(Стр.ВидТовара);
        Если НоваяГруппа.Пустая() Тогда
            
            ГруппаТовара = Справочники.Товар.СоздатьГруппу();
            ГруппаТовара.Наименование = Стр.ВидТовара;
            Попытка
                ГруппаТовара.Записать();
                НоваяГруппа = ГруппаТовара.Ссылка();
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
            
        КонецЕсли;
        Сообщить(НоваяГруппа);
15 ProProg
 
27.09.13
22:43
Ну а по поводу пункта три писать запрос. ТЗ во временнуб таблицу. Запрос со справочником номенклатуры с соединением временной таблицы. все элементы которые не соединены в выборке это те которых нет. И уже там ложь.

Но это я могу дать кусок кода - он но к тебе не к месту будет. ты там ничо не поймешь))
Тк как это уже целая готовая программа по прайсам. и там все через регистры сделано.
16 ProProg
 
27.09.13
22:43
(14) Если НоваяГруппа.Пустая() Тогда - вот это нехороший кусок кода.
17 Индиго
 
27.09.13
22:44
(15)Маня, ты прям убиваешь все мои запасы попкорна...
18 extrim-style
 
27.09.13
22:44
(16) почему? хоть я поучусь в этой теме, если уж не ТС)
19 1987denis
 
27.09.13
22:46
Давайте
20 ProProg
 
27.09.13
22:47
(18) обращение через точку к объекту.
эффективнее НоваяГруппа = ПустаяСсылка
где ПустаяСсылка перед циклом создаем переменнею см (11)
21 1987denis
 
27.09.13
22:49
НайденЭлемент = Справочники.Товар.НайтиПоНаименованию(Стр.Наименование);

        Если НЕ НайденЭлемент = ПустаяСсылка  Тогда
            
            ТекЭлемент =  НайденЭлемент.Ссылка;
            ТекЭлемент.Наличие=Ложь;
            
            Попытка
                ТекЭлемент.Записать();
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
            
            Сообщить("В справочнике номенклатура присутствует элемент " + ТекЭлемент.Ссылка);
            
        Иначе    
            НайденЭлемент=Стр.Наименование;
            ВыборкаЭлемента = Справочники.Товар.СоздатьЭлемент();
            ВыборкаЭлемента.Наименование = Стр.Наименование;
            ВыборкаЭлемента.Цена         = Стр.Цена;
            ВыборкаЭлемента.Склад        = Стр.Склад;
            ВыборкаЭлемента.Наличие      = Истина;
            ВыборкаЭлемента.Родитель     = НоваяГруппа.Ссылка;
            //ВыборкаЭлемента.Записать();
            Попытка
                ВыборкаЭлемента.Записать();
                Сообщить("Добавлен элемент");
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;

        КонецЕсли;
22 1987denis
 
27.09.13
22:49
{Обработка.ЗагрузкаПрайсаПоставщика.Форма.Форма.Форма(100)}: Поле объекта недоступно для записи (Наличие)
            ТекЭлемент.Наличие=Ложь;
23 extrim-style
 
27.09.13
22:50
(18) ааа... ну это ерунда) это только для твоих миллионнопозиционных прайсов актуально)
24 extrim-style
 
27.09.13
22:50
(23) к (20)
25 1987denis
 
27.09.13
22:50
не понял
26 Индиго
 
27.09.13
22:52
гы..Ниче несмотрел.
Увидел ИНАЧЕ Синим и понял- это писдец.
27 Индиго
 
27.09.13
22:53
(21)Убери это и никому больше не показывай
28 extrim-style
 
27.09.13
22:53
(26) хватить троллить. ничё он не смотрел. ты уже полчаса в код втыкаешь, не знаешь с какой стороны к нему подойди, признайся честно)
29 1987denis
 
27.09.13
22:54
Индиго
Не все сразу становились такими "Гуру"  как вы!, Извините уж...
30 Индиго
 
27.09.13
22:56
(28)Иди накуй. Я достаточно серьезный спец.
31 1987denis
 
27.09.13
22:56
я и не спорю что вы серьезный спец...
32 Euguln
 
27.09.13
22:58
(30) воу воу палехче
33 extrim-style
 
27.09.13
22:58
(30) он к тебе на "вы" обратился). ты теперь просто обязан ему помочь.
34 Индиго
 
27.09.13
22:59
(29)Нет конечно.Только после 12 лет служения
Пртчем не которые думают...
35 extrim-style
 
27.09.13
22:59
(30) Молоток! Я в тебя верю! Тут главное - начать.
36 1987denis
 
27.09.13
23:00
Ну так когда начинали, точно так же задавали "глупые вопросы" и смотрели на очевидные вещи не понимаю, как их сделать...
37 Euguln
 
27.09.13
23:01
(36) ничего подобного, он таким родился, и даже акушерам советы давал, когда его вытаскивали )))
38 Индиго
 
27.09.13
23:02
(36)Просто заткнуться.
39 Индиго
 
27.09.13
23:02
для начала
40 extrim-style
 
27.09.13
23:03
какой серьёзный перец)
41 Индиго
 
27.09.13
23:04
А вообще если честно..
42 Индиго
 
27.09.13
23:05
Надоели вы мне:-))..
43 Индиго
 
27.09.13
23:05
Мне спать уже пора.Жена зовет
44 Индиго
 
27.09.13
23:06
:-))))
45 Индиго
 
27.09.13
23:06
Удачи вам
46 Euguln
 
27.09.13
23:07
(45) иди иди, подкаблучник ))
47 extrim-style
 
27.09.13
23:07
давай. не бухти больше)
48 extrim-style
 
27.09.13
23:08
49 Индиго
 
27.09.13
23:08
(45)для тебя лично
:-))
ТОП....
ТОП...
ТоПП

Спокойной НЕ Ночи
50 Euguln
 
27.09.13
23:10
(49) серьезный спец, по словам жены )))
51 extrim-style
 
27.09.13
23:12
как называется, когда человек сам с собой разговаривает?
52 extrim-style
 
27.09.13
23:13
(51) к (49)
53 1c_pro_fun
 
28.09.13
00:36
(21) Народ местный любит поглумиться...

ВМЕСТО:
ТекЭлемент =  НайденЭлемент.Ссылка;
ТекЭлемент.Наличие=Ложь;
Попытка
    ТекЭлемент.Записать();
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

НАДО:
ТекЭлемент =  НайденЭлемент.ПолучитьОбъект();
ТекЭлемент.Наличие=Ложь;
ТекЭлемент.Записать();

Чтобы было меньше глупых вопросов нужно прочесть в синтакс-помощнике о назначении возвращаемого функцией ПолучитьОбъект() значения.