Имя: Пароль:
1C
1C 7.7
v7: Загрузка приходной накладной из файла *.XLS
0 Andros Krasnodar
 
18.11.13
12:43
помогите ! как сделать поиск не по коду в моей базе, а по артикулу, который есть в накладной XLS
поправьте пожалуйста!
замысел такой
выбираю куда приходовать, потом выбираю файл в Формате XLS
потом указываю какая колонка Артикул, количество, цена
и она уже ищет в моей базе объекты по коду(А надо по артикулу)
и автоматически вбивает в накладную...
и еще Надо добавить процедуру которая укажет мне какая строка не загружена (ну это если не найдет) Ну чтобы я знал, что это новая позиция!!!!
БУДУ ОЧень благодарен!!!
Процедура Сформировать()          
    СпрНом = СОздатьОбъект("Справочник.НоменклатураАртикул");
    СпрОКЕИ = СОздатьОбъект("Справочник.ОКЕИ");  
    СпрПартии = СоздатьОбъект("Справочник.Партии");
    [b]СПрНом.НайтиПоКоду("796");[/b]
    СпрЕд = СОздатьОбъект("Справочник.Единицы");
    ДокПост = СОздатьОбъект("Документ.ПоступлениеТМЦРозница");  
    ДокПост.НайтиДокумент(Док);
    ExcelApp = СоздатьОбъект("Excel.Application");
    РабочиеКниги=ExcelApp.WorkBooks;
    ДокКнига=РабочиеКниги.Open(СокрЛП(ФайлЕксел));
    ДокЛист=ДокКнига.Worksheets(1);
    Флаг = 0;
    Ном = НомПер;
    Пока Флаг = 0 Цикл
        Н = СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value);    
        Н = "" + Н;
        Н = Прав(Н, 8);
        Сообщить(Н);
        Если СпрНом.НайтиПоКоду(Н) = 0 Тогда  
            //СПрНом.Новый();
            //СпрНом.Наименование = Н;  
            //СпрНом.ПолнНаименование = Н;
            //СпрНом.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Прочее;
            //СпрНом.СтавкаНДС = Перечисление.СтавкиНДС.НДС18;
            //СпрНом.ПолнНаименование = Н;
            //СПрНом.Записать();
            //СПрЕд.Новый();
            //СпрЕд.Владелец = СпрНом.ТекущийЭлемент();
            //СПрЕд.Наименование = "шт";
            //СпрЕд.ОКЕИ = СпрОкеи.ТекущийЭлемент();
            //СПрЕд.Коэффициент = 1;
            //СпрЕд.Записать();
            //СпрНом.БазоваяЕдиница = СпрЕд.ТекущийЭлемент();
            //СпрНом.ОсновнаяЕдиница = СпрЕд.ТекущийЭлемент();
            //СпрНом.Записать();  
            Сообщить("Номенклатура на найдена!");
        Иначе    
            ДокПост.НоваяСтрока();  
            ДокПост.Номенклатура = СпрНом.ТекущийЭлемент();
            ДокПост.Количество = СокрЛП(ДокЛист.Range(СокрЛП(Кол) + СокрЛП(Строка(Ном))).Value);
            ДокПост.Единица = СпрНом.ТекущийЭлемент().ОсновнаяЕдиница;
            ДокПост.Коэффициент = 1;
            ДокПост.ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
            ДокПост.Цена = СокрЛП(ДокЛист.Range(СокрЛП(Цена) + СокрЛП(Строка(Ном))).Value);
            ДокПост.СтавкаНДС = СпрНом.ТекущийЭлемент().СтавкаНДС;
            ДокПост.Сумма = ДокПост.ЦЕна*ДокПост.Количество;  
        
            
                СпрПартии.ИспользоватьВладельца(ДокПост.Номенклатура);
                СпрПартии.Новый();
                Попытка
                    СпрПартии.Записать();  
                    ДокПост.Партия = СпрПартии.ТекущийЭлемент();
                    СОобщить(СпрПартии.ТекущийЭлемент());
                Исключение  
                    Сообщить(ОписаниеОшибки(),"I");
                    Сообщить(321);
                    Возврат;
                КонецПопытки;
            Если ДокПост.СуммаВклНДС = 1 Тогда
                ДокПост.СУммаНДС = Окр(ДокПост.Сумма*глВыделяемыйНДС(ДокПост.СтавкаНДС), 2);
            Иначе
                ДокПост.СУммаНДС = Окр(ДокПост.Сумма*глНачисляемыйНДС(ДокПост.СтавкаНДС), 2);    
            КонецЕсли;
            //Сообщить(Н);
            //СОобщить(СокрЛП(ДокЛист.Range(СокрЛП(Кол) + СокрЛП(Строка(Ном))).Value));        
        КонецЕсли;
        Ном = Ном + 1;
        Если ПустаяСтрока(СокрЛП(ДокЛист.Range(СокрЛП(Код) + СокрЛП(Строка(Ном))).Value)) = 1 Тогда
            Флаг = 1;
        КонецЕсли;        
    КонецЦикла;
    ДокПост.Записать();  
    //ДокПост.Провести();
    Сообщить("Данные успешно загружены!");
    ДокКнига.Close();
КонецПроцедуры

//******************************************************************************
// КаталогИмяФайла(ПолноеИмяФайла, Каталог, Файл)
//
// Параметры:
//  ПолноеИмяФайла - строка: каталог и имя файла.
//  Каталог        - если передан, в него будет возвращено имя каталога.
//  Файл           - если передан, в него будет возвращено имя файла.
//
// Возвращаемое значение:
//  0 - если указанного каталога не существует
//  1 - если указанный каталог существует
//
// Описание:
//  Если каталог не существует, то пользователю предлагается его создать.
//
Функция КаталогИмяФайла(ПолноеИмяФайла, Каталог, Файл)
    
    Каталог=""; Файл=ПолноеИмяФайла; Разд=Найти(Файл, "\");
    
    Пока 0<Разд Цикл
        Каталог=Каталог+Лев(Файл, Разд); Файл=Сред(Файл, Разд+1); Разд=Найти(Файл, "\");
    КонецЦикла;
    Каталог=Каталог+".";

    Если СтрДлина(Каталог)<4 Тогда
    ИначеЕсли ФС.СуществуетФайл(Каталог)=1 Тогда
    ИначеЕсли "Да"=Вопрос(Каталог+"
                          |Указанный каталог не существует! Создать?","Да+Нет") Тогда
        ФС.СоздатьКаталог(Каталог);
    Иначе
        Каталог=""; Возврат(0);
    КонецЕсли;
    
    Возврат(1);
    
КонецФункции // КаталогИмяФайла()

//******************************************************************************
// Предопределенная процедура
//
Процедура ПриНачалеВыбораЗначения(ЭлементДиалога, ФлагОбработки)
    
    Перем Каталог, Файл;
    
    Если ЭлементДиалога="ФайлЕксел" Тогда
        КаталогИмяФайла(ФайлЕксел, Каталог, Файл);
        Если ФС.ВыбратьФайл(0, Файл, Каталог, "Файл выгрузки",
                            "Текстовые (*.xls)|*.xls", "xls")=1 Тогда
            ФайлЕксел=Каталог+Файл;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры  

Код = "A";
Кол = "B";
Цена = "C";
НомПер = 1;
1 spectre1978
 
18.11.13
12:52
Если СпрНоменкл.НайтиПоРеквизиту ("Артикул", АртикулИзXLS, 0)=1 Тогда
// Такая позиция есть у тебя в справочнике
Иначе
// это будет новая позиция
КонецЕсли;

для реквизита Артикул должен быть включен признак сортировки
2 Andros Krasnodar
 
18.11.13
12:55
О попробую
а куда воткнуть?
а то я еще зелененький
3 spectre1978
 
18.11.13
13:36
(2) очевидно, вместо НайтиПоКоду.
4 Andros Krasnodar
 
18.11.13
14:21
не прет...
вот бы полностью как надо !!!
:) ПЛЗ
несплю... :)
5 spectre1978
 
18.11.13
18:49
(4) На конкретные вопросы ответить - пожалуйста, а полностью как надо делай сам. Или если надо готовое, то за денежки.
6 Жан Пердежон
 
18.11.13
18:52
(4) зарплату тоже за тебя приходить получить?)
7 MaxS
 
18.11.13
19:21
"Интересная" логика. Если номенклатура не найдена, то нужно её создать, а добавлять в документ не обязательно. Если эта же номенклатура попадётся второй раз, то так и быть -  добавим в документ. ;)
8 GreyK
 
18.11.13
19:50
(0) Назначь цену за обработку, когда получишь обработку увидишь её код и сам поймёшь сколько времени ты съэкономил.
9 Tatitutu
 
18.11.13
19:59
Прыг-Скок...или из MS EXCEL в 1С (7.7) TiS* (открытый код - бесплатно)
http://infostart.ru/public/83084/
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой