Имя: Пароль:
1C
1С v8
загрузка данных из excel
,
0 Liya1203
 
23.11.16
09:21
добрый день! загружаю данные из Excel. отбор данных происходит по полю "ТипМарка". После нахождения ТипМарки из файла в справочнике номенклатура подставляется соответствующее наименование. проблема в том, что Тип Марка не уникальное поле( существуют записи с одинаковой тип маркой, но с разным наименование) и в связи с этим подставляется не правильное наименование. Как осуществить поиск элемента по 2-м реквизитам?



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

    
    ЕдИзмСправ = Справочники.КлассификаторЕдиницИзмерения;
    спрНоменклатура = Справочники.Номенклатура;
           СпрВидыРабот = Справочники.ВидыРабот;
    

    
    Для Каждого Строка Из ТЗ Цикл
        
        НомерСтроки = НомерСтроки + 1;
        ПолныйКод = СокрЛП(СтрЗаменить(Строка(Строка.ПолныйКод),".","/"));
        ВидРабот = "";
        ВидРабот = СпрВидыРабот.НайтиПоКоду(ПолныйКод,Истина);

    
        ТипМарка = Строка.ТипМарка;
    
        Материал = "";
        Материал = спрНоменклатура.НайтиПоРеквизиту("ТипМарка",ТипМарка);
        Если  (не Материал = Справочники.Номенклатура.ПустаяСсылка()) и (не ВидРабот = Справочники.ВидыРабот.ПустаяСсылка())

            //    и СокрЛП(ВидРабот.Наименование) =  СокрЛП(Строка.Наименование)
            Тогда
            ТЧСтр = ЭтотОбъект.Объект.Материалы.Добавить();
            ТчСтр.Материал = Материал;
            ТчСтр.Количество = Строка.КоличествоПоПроекту;
            //ТчСтр.ВидРабот.ПолныйКод = Строка.ПолныйКод;
            ТчСтр.ВидРабот = ВидРабот;
            ТчСтр.Цена = Строка.ЦенаЗаЕдиницу;
            Если ЗначениеЗаполнено(Строка.ЦенаЗаЕдиницу)  и ЗначениеЗаполнено(Строка.КоличествоПоПроекту) Тогда
                ТчСтр.Итого = Строка.ЦенаЗаЕдиницу * Строка.КоличествоПоПроекту;
            КонецЕсли;
            
              
            Если НЕ СокрЛП( ВРег(СтрЗаменить(Материал.Наименование," ",""))) =  СокрЛП(ВРег(СтрЗаменить(Строка.НаименованиеМатериала," ",""))) Тогда //Наименование в файле<> Наименование в 1С предупреждение
                стрОшиб = ТЗОшибки.Добавить();
                стрОшиб.СообщОшиб =  Строка.ТипМарка+ " наименование из файла '" + Строка.НаименованиеМатериала + "' не совпадает с 1С '" + Материал.Наименование+"'";
                Сообщить(Строка.ТипМарка+ " наименование из файла '" + Строка.НаименованиеМатериала + "' не совпадает с 1С '" + Материал.Наименование+"'",СтатусСообщения.БезСтатуса);
            КонецЕсли;
            
        Иначе
            стрОшиб = ТЗОшибки.Добавить();
            стрОшиб.СообщОшиб = "НЕ ЗАГРУЖЕН "+?(Строка.ТипМарка = "","'Нет кода'",Строка.ТипМарка) + " '" + Строка.НаименованиеМатериала+ "' , т.к.отсутствует в справочнике 1С.";
            Сообщить("НЕ ЗАГРУЖЕН "+?(Строка.ТипМарка = "","'Нет кода'",Строка.ТипМарка) + " '" + Строка.НаименованиеМатериала+ "' , т.к.отсутствует в справочнике 1С.",СтатусСообщения.ОченьВажное);
            Продолжить;
        КонецЕсли;    
        
    КонецЦикла;
    ТабОшибок = ВывестиОшибки(ТЗОшибки);
    Возврат ТабОшибок;
КонецФункции
1 Мимохожий Однако
 
23.11.16
09:24
Я бы
Для Каждого Строка Из ТЗ Цикл
заменил на
Для Каждого ТекСтрока Из ТЗ Цикл.
2 Romyr
 
23.11.16
09:25
(0) >Как осуществить поиск элемента по 2-м реквизитам?
Выборкой или Запросом.
3 Romyr
 
23.11.16
09:27
или в чем проблема?
4 Liya1203
 
23.11.16
09:37
Проблема в формировании запроса
             Запрос = Новый Запрос("Запрос");
   Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                  |    Номенклатура.Ссылка
                  |ИЗ
                  |    Справочник.Номенклатура КАК Номенклатура
                  |ГДЕ
                  |    Номенклатура.ТипМарка = &ТипМарка
                  |    И Номенклатура.НаименованиеПолное ПОДОБНО &НаименованиеПолное";
   Запрос.Параметры.Вставить("НаименованиеПолное", спрНоменклатура.НайтиПоКоду(Строка.НаименованиеМатериала));
   Запрос.Параметры.Вставить("ТипМарка", ТипМарка);
5 Maniac
 
23.11.16
09:38
Проблема в твоей голове а не запросе
6 Maniac
 
23.11.16
09:39
спрНоменклатура.НайтиПоКоду(Строка.НаименованиеМатериала)

возвращает ссылку на элемент
А ты в запросе пытаешся как текст потом ее втюхать
7 Romyr
 
23.11.16
09:53
Глубоко уважаемый Маньяк правильно заметил.
Вы либо в условиях в запросе вместо наименования ищите сразу по ссылке или в Параметр НаименованиеПолное передавайте Строка.НаименованиеМатериала а не ссылку.
8 Liya1203
 
23.11.16
10:54
(7) не могли бы Вы пример привести как это сделать?
9 Lazy Stranger
 
23.11.16
11:08
(8) да также как с типом, в чем разница?
Запрос.Параметры.Вставить("НаименованиеПолное", Строка.НаименованиеМатериала);
10 Liya1203
 
24.11.16
11:23
(9) Как присвоить результат запроса колонке Материал таб.части. реквизит материал имеет тип СправочникСсылка.Номенклатура


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

    
    ЕдИзмСправ = Справочники.КлассификаторЕдиницИзмерения;
    спрНоменклатура = Справочники.Номенклатура;
           СпрВидыРабот = Справочники.ВидыРабот;
    

    
    Для Каждого Строка Из ТЗ Цикл
        
        НомерСтроки = НомерСтроки + 1;
        ПолныйКод = СокрЛП(СтрЗаменить(Строка(Строка.ПолныйКод),".","/"));
        ВидРабот = "";
        ВидРабот = СпрВидыРабот.НайтиПоКоду(ПолныйКод,Истина);

       Запрос = Новый Запрос("Запрос");
       Запрос.Текст = "ВЫБРАТЬ
                  |    Номенклатура.Ссылка,
                  |    Номенклатура.ТипМарка,
                  |    Номенклатура.Наименование
                  |ИЗ
                  |    Справочник.Номенклатура КАК Номенклатура
                  |ГДЕ
                  |    Номенклатура.ТипМарка = &ТипМарка
                  |    И Номенклатура.Наименование = &Наименование";
   Запрос.УстановитьПараметр("Наименование", Строка.НаименованиеМатериала);
   Запрос.УстановитьПараметр("ТипМарка", Строка.ТипМарка);
   Выборка = Запрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
    
        Если (не ВидРабот = Справочники.ВидыРабот.ПустаяСсылка()) и (не Выборка.Следующий()=спрНоменклатура.ПустаяСсылка())     Тогда

            //(не Материал = Справочники.Номенклатура.ПустаяСсылка()) и
              
                                   
            ТЧСтр = ЭтотОбъект.Объект.Материалы.Добавить();
                        
            ТчСтр.Материал = Выборка.Наименование;
            ТчСТР.ТипМарка=Строка(Выборка.ТипМарка);
            ТчСтр.Количество = Строка.КоличествоПоПроекту;
            //ТчСтр.ВидРабот.ПолныйКод = Строка.ПолныйКод;
            ТчСтр.ВидРабот = ВидРабот;
            ТчСтр.Цена = Строка.ЦенаЗаЕдиницу;
            Если ЗначениеЗаполнено(Строка.ЦенаЗаЕдиницу)  и ЗначениеЗаполнено(Строка.КоличествоПоПроекту) Тогда
                ТчСтр.Итого = Строка.ЦенаЗаЕдиницу * Строка.КоличествоПоПроекту;
            КонецЕсли;
                          
            
        Иначе
            стрОшиб = ТЗОшибки.Добавить();
            стрОшиб.СообщОшиб = "НЕ ЗАГРУЖЕН "+?(Строка.ТипМарка = "","'Нет кода'",Строка.ТипМарка) + " '" + Строка.НаименованиеМатериала+ "' , т.к.отсутствует в справочнике 1С.";
            Сообщить("НЕ ЗАГРУЖЕН "+?(Строка.ТипМарка = "","'Нет кода'",Строка.ТипМарка) + " '" + Строка.НаименованиеМатериала+ "' , т.к.отсутствует в справочнике 1С.",СтатусСообщения.ОченьВажное);
            Продолжить;
        КонецЕсли;    
          КонецЦикла;

        
    КонецЦикла;
    
    ТабОшибок = ВывестиОшибки(ТЗОшибки);
    Возврат ТабОшибок;

КонецФункции
11 catena
 
24.11.16
11:26
(10)Колонка Материал - какой тип? Выборка.Наименование - какой тип? Зачем так мучить бедное животное?
12 Liya1203
 
24.11.16
11:32
(11) Колонка Материал-СправочникСсылка.Номенклатура
Выборка.Наименование- строка
13 catena
 
24.11.16
11:34
(12)Есть такая игрушка - сортер. Для деток от 6 мес. Учит не засовывать квадратное в круглое.
14 sur0k
 
24.11.16
23:17
(12)
Если ТипЗнч(ТчСтр.Материал) = ТипЗнч(Выборка.Наименование) Тогда
ТчСтр.Материал = Выборка.Наименование;
Иначе
ТчСтр.Материал = Выборка.Ссылка;
КонецЕсли;