Имя: Пароль:
1C
1C 7.7
v7: Ищу элемент справочника, не найден создаю новый. Проверьте.
,
0 bizon2008
 
29.08.11
14:05
День добрый.
Ищу элемент справочника, не найден создаю новый. Проверьте пожалуйста. Что-то он мне не нравится, но рабочий.
Код ниже.


 СпрТовар  = СоздатьОбъект("Справочник.Номенклатура");
 СпрЕдиницы = СоздатьОбъект("Справочник.Единицы");
 СпрЦены = СоздатьОбъект("Справочник.Цены");
 СпрКлассификаторЕдИзм = СоздатьОбъект("Справочник.КлассификаторЕдИзм");

 тзТовар.ВыбратьСтроки();
 Пока тзТовар.ПолучитьСтроку()=1 Цикл
   флУспех = 1; //Пока все успешно
   
   //Ищем товар по общему коду, если не найден создаем новый.
   Если СпрТовар.НайтиПоРеквизиту("КодЧр",тзТовар.Код, 0)=1 Тогда
     СпрТовар.ТекущийЭлемент()
   Иначе
       СпрТовар.Новый();
       СпрТовар.КодЧр = тзТовар.Код;
   КонецЕсли;
       
   СпрТовар.Наименование = тзТовар.Товар;
   СпрТовар.ПолнНаименование = тзТовар.Товар;
   СпрТовар.ВалютаУчета=Константа.ОсновнаяВалюта;
   Если СпрКлассификаторЕдИзм.НайтиПоНаименованию(тзТовар.Ед)=1 Тогда
     СпрТовар.БазоваяЕдиница  =СпрКлассификаторЕдИзм.ТекущийЭлемент();
   Иначе
     //Если не нашли единицу измерения товар не записывать.
     Сообщить("Не найдена единица измерения - " + тзТовар.Ед);
     Успех = 0;
   КонецЕсли;
   
   СпрТовар.СтавкаНДС=Константа.ОсновнаяСтавкаНДС;
   СпрТовар.ВидТовара=Перечисление.ВидыТоваров.Товар;
   СпрТовар.ТипТовара=Перечисление.ТипыТоваров.Штучный;
   СпрТовар.ШтрихКод = тзТовар.ШтрихКод;
   СпрТовар.ИспользоватьДату('01.01.2011');
   Если флУспех = 1 Тогда
     СпрТовар.Записать();
     Сообщить("Товар записан - " + тзТовар.Товар);
   Иначе
     Сообщить("Товар не записан - " + тзТовар.Товар);
   КонецЕсли;
1 zak555
 
29.08.11
14:06
> КодЧр

это что ?
2 zak555
 
29.08.11
14:07
ИспользоватьДату

сначала надо
3 Шапокляк
 
29.08.11
14:07
А если товар по кодЧР найден, то его реквизиты все равно должны перезаписываться?
4 izekia
 
29.08.11
14:07
вот это вообще не нужно:
СпрТовар.ТекущийЭлемент()
он и так спозиционирован
ИспользоватьДату перед началом цикла поставить
5 chief accountant
 
29.08.11
14:09
Успех = 0;
Это к чему?
6 bizon2008
 
29.08.11
14:26
(1)Код для связи. Грубо говоря я туда пишу код товара из источника.
(2)Спасибо. Сделал.
(3)Да. Хотя тут проблема потенциальная выглядывает СпрТовар.БазоваяЕдиница меняться не должна. Один раз при вводе нового. И все
(4)Так нечем же пустое место в условии заполнить. По другому не придумал.
Дату перенес. Спасибо.
(5)Если не все поля заполнить удалось, то элемент не должен записываться. .
7 andrewks
 
29.08.11
14:27
(3)(4)+1
и почему в НайтиПоРеквизиту() 3-й параметр = 0.
у тебя спр.Номенклатура подчинённый? а где установка владельца?
8 chief accountant
 
29.08.11
14:29
(6) По коду это не так
9 Паланик
 
29.08.11
14:31
Успех = 0;

Роковая строка кода. Вся обработка не взлетит.

у тебя там проверяется переменная флУспех, а обнуляешь Успех.
10 chief accountant
 
29.08.11
14:31
(6) "Так нечем же пустое место в условии заполнить. По другому не придумал"
Или оставь пустое или измени условие
11 bizon2008
 
29.08.11
14:33
(9)Уже исправил.
12 bizon2008
 
29.08.11
14:35
(7)Не подчиненный. А что это так критично. Вроде только критично для подчиненного. Если единица то установка владельца игнорируется.
13 Ткачев
 
29.08.11
14:36
(9) Нах он вооще нужен !?
   Если СпрКлассификаторЕдИзм.НайтиПоНаименованию(тзТовар.Ед)=1 Тогда
     СпрТовар.БазоваяЕдиница  =СпрКлассификаторЕдИзм.ТекущийЭлемент();
//Сюда перенести концовку
Иначе
     Сообщить("Товар не записан - " + тзТовар.Товар);
КонецЕсли;
14 Ткачев
 
29.08.11
14:37
+(13)И видимо начало...
15 Fenikus
 
29.08.11
14:41
(14) можно еще и "Продолжить;" использовать
16 bizon2008
 
29.08.11
14:41
(10)Так? Синтаксическую проверку проходит. Но как-то некошерно.


Если СпрТовар.НайтиПоРеквизиту("КодЧр",тзТовар.Код, 0)=1 Тогда
Иначе
СпрТовар.Новый();
СпрТовар.КодЧр = тзТовар.Код;
КонецЕсли
17 Ткачев
 
29.08.11
14:42
(16)А так ?
Если СпрТовар.НайтиПоРеквизиту("КодЧр",тзТовар.Код, 0)=0 Тогда
СпрТовар.Новый();
СпрТовар.КодЧр = тзТовар.Код;
КонецЕсли
18 bizon2008
 
29.08.11
14:47
(17)Так лучше, но как-то логическая структура теряется.
Было если нашли, то стали на текущий, не нашли то новый.
Стало если нет то новый.
Появляется вопрос а мы стали на текущий элемент.
Или это уже паранойя?
19 Ткачев
 
29.08.11
14:51
(0)Я бы как то так сделал:
 СпрТовар  = СоздатьОбъект("Справочник.Номенклатура");
 СпрЕдиницы = СоздатьОбъект("Справочник.Единицы");
 СпрЦены = СоздатьОбъект("Справочник.Цены");
 СпрКлассификаторЕдИзм = СоздатьОбъект("Справочник.КлассификаторЕдИзм");

 тзТовар.ВыбратьСтроки();
 Пока тзТовар.ПолучитьСтроку()=1 Цикл
   //Ищем товар по общему коду, если не найден создаем новый.
   Если СпрТовар.НайтиПоРеквизиту("КодЧр",тзТовар.Код, 0)=0 Тогда
        СпрТовар.Новый();
        СпрТовар.КодЧр = тзТовар.Код;
   КонецЕсли;
       
   Если СпрКлассификаторЕдИзм.НайтиПоНаименованию(тзТовар.Ед)=1 Тогда
   СпрТовар.ИспользоватьДату('01.01.2011');
   СпрТовар.Наименование = тзТовар.Товар;
   СпрТовар.ПолнНаименование = тзТовар.Товар;
   СпрТовар.ВалютаУчета=Константа.ОсновнаяВалюта;
   СпрТовар.БазоваяЕдиница  =СпрКлассификаторЕдИзм.ТекущийЭлемент();
   СпрТовар.СтавкаНДС=Константа.ОсновнаяСтавкаНДС;
   СпрТовар.ВидТовара=Перечисление.ВидыТоваров.Товар;
   СпрТовар.ТипТовара=Перечисление.ТипыТоваров.Штучный;
   СпрТовар.ШтрихКод = тзТовар.ШтрихКод;
   СпрТовар.Записать();
   Сообщить("Товар записан - " + тзТовар.Товар);
   Иначе
     Сообщить("Не найдена единица измерения - " + тзТовар.Ед);
     Сообщить("Товар не записан - " + тзТовар.Товар);
     Продолжить;
   КонецЕсли;
20 Ткачев
 
29.08.11
15:06
Копипастил, да не докопипастил.

тзТовар.ВыбратьСтроки();
 Пока тзТовар.ПолучитьСтроку()=1 Цикл
       
   Если
СпрКлассификаторЕдИзм.НайтиПоНаименованию(тзТовар.Ед)=1 Тогда
   //Ищем товар по общему коду, если не найден создаем новый.

   Если СпрТовар.НайтиПоРеквизиту("КодЧр",тзТовар.Код, 0)=0 Тогда
        СпрТовар.Новый();
        СпрТовар.КодЧр = тзТовар.Код;
   КонецЕсли;
...
2 + 2 = 3.9999999999999999999999999999999...