Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка данных в накладную из Excel (не подтягивает зак. цену из базы)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
barracuda19911991
1С:Предприятие 7.7 Торговля+Склад для Украины (7.70.014)
При загрузке из файла Excel товаров в приходную накладную не затягивает текущую закупочную цену товара в соответствующую строку табличной части.
Помогите пожалуйста, не могу додумать, не хватает знаний.

Перем Док, Окно, Область, СписПарам, СписРугПодр, Путь, КодТов, Справочник;
//******************************************************************************

Процедура ВыбратьФайл()
    сФайл = "";
    сКатал = "";
    Если ФС.ВыбратьФайл(0,сФайл,сКатал,"Выберите файл импорта","Таблицы Excel (*.xls)|*.xls") = 1 Тогда
        ИмяФайла = сКатал+сФайл;
    КонецЕсли;
КонецПроцедуры

//******************************************************************************
Процедура ВыбКаталог()
   Если Путь = "" Тогда
     Путь = Строка(ФС.сКаталог());
   КонецЕсли;
   ФС.ВыбратьКаталог(Путь, "Выбор каталога для выбора файла");
КонецПроцедуры
//******************************************************************************
Процедура Загрузить()
        перем ЦенаТовара;
        Перем Результат;
   Если ПустоеЗначение(ИмяФайла) = 1 Тогда
     Предупреждение("Не выбран файл-заказ для загрузки!");
     СтатусВозврата(0);
     Возврат;
   КонецЕсли;

   Окно = СоздатьОбъект("Excel.Application");
   Если ИмяФайла <> "" Тогда
    //Книга = Окно.WorkBooks.Open(ФС.сКаталог() + "\" + ИмяФайла);
    Книга = Окно.WorkBooks.Open(ИмяФайла);
     //Окно.Visible = 1;
   КонецЕсли;

   чКоличествоСтрок = 0;
   Область = Окно.Sheets.Item(1);
   чКоличествоСтрок = Область.UsedRange.Rows.Count();

   КатЦен = СоздатьОбъект("Справочник.КатегорииЦен");
   Вал = СоздатьОбъект("Справочник.Валюты");
   Курс = СоздатьОбъект("Справочник.Валюты");

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

   ПН = СоздатьОбъект("Документ.ПриходнаяНакладная");
   ПН.Новый();
   ПН.ДатаДок=ТекущаяДата();
  
   КатЦен.НайтиПоНаименованию("Закупочная",0,0);  
   ПН.КатегорияЦен=КатЦен.ТекущийЭлемент();
  
   Вал.НайтиПоНаименованию("Гривня",0,0);
   ПН.Валюта=Вал.ТекущийЭлемент();
  
   ПН.Курс=1;
   ПН.Дата_курса=ТекущаяДата();
    
   ПН.Записать();

   НачатьТранзакцию();
  
   Для Стр = 1 По чКоличествоСтрок Цикл
       
     КодТовара = "";
     Кол=0;
  
     КодТовара=СокрЛП(Область.Cells(Стр, 1).Value); //загрузка кода из 1-го столбца ексель
     Кол=Число(Область.Cells(Стр, 2).Value);        //загрузка количества из 2-го столбца ексель
    
    Если ПустоеЗначение(КодТовара) = 1 Тогда
       Сообщить("Не указан код товара " + КодТовара, "!!");
       Продолжить;
     КонецЕсли;
  
     Если Товары.НайтиПоКоду(КодТовара,0) = 0 Тогда
       Сообщить("Не найден товар с кодом " + КодТовара + " " + "!");
       Продолжить;
     КонецЕсли;

     ПН.НоваяСтрока();
     //заполнение единицы измерения в табличной части (везде по умолч.-"шт.")
         Ед = СоздатьОбъект("Справочник.Единицы");
         Ед.НайтиПоНаименованию("шт.",0,0);
     ПН.Единица=Ед.ТекущийЭлемент();
    
     //заполнение наименования товара, кода, артикула, количества в табл. части
     ПН.Товар=Товары.ТекущийЭлемент();
     ПН.Количество=Кол;
     ПН.КодТов=Товары.Код;
     ПН.Код=Товары.Артикул;
    
     //подтянуть к текущей строке таблчной части текущей закупочной цены товара
     ЦеныТовара = СоздатьОбъект("Справочник.Цены");
     ЦеныТовара.ИспользоватьДату(РабочаяДата());
     ЦеныТовара.ИспользоватьВладельца(Товары);

     ПН.ЦенаСНДС=ЦеныТовара;

     ПН.Записать();
  
КонецЦикла;
    
   ЗафиксироватьТранзакцию();

   ОткрытьФорму(ПН.ТекущийДокумент());

КонецПроцедуры
Домовик
Цитата(barracuda19911991 @ 24.09.14, 7:35) необходимо зарегистрироваться для просмотра ссылки
//подтянуть к текущей строке таблчной части текущей закупочной цены товара
ЦеныТовара = СоздатьОбъект("Справочник.Цены");
ЦеныТовара.ИспользоватьДату(РабочаяДата());
ЦеныТовара.ИспользоватьВладельца(Товары);
ПН.ЦенаСНДС=ЦеныТовара;
ПН.Записать();


вот этот кусок ключевой.
спозиционировались на товаре.
зашли в подчиненный справочник.
?? спозиционировались на элементе подчиненного справочника по нужной категории? - нет
?? создали новый элемент если не нашли по нужной категории? - нет

что подставляем цене тогда?
barracuda19911991
нужно выбрать категорию цены (закупочная или розничная), но не выходит
ЦеныТовара = СоздатьОбъект("Справочник.Цены"); 
ЦеныТовара.ИспользоватьДату(РабочаяДата());
ЦеныТовара.ИспользоватьВладельца(Товары);
КатЦен = СоздатьОбъект("Справочник.КатегорииЦен");
КатЦен.НайтиПоНаименованию("Закупочная",0,0);
ЦеныТовара.ВыбратьЭлементы();

ПН.ЦенаСНДС=ЦеныТовара.ТекущийЭлемент();
ПН.Записать();
Домовик
загрузка из Эксель не ваша?. а вы кто?



найден=0;
ЦеныТовара.ВыбратьЭлементы();
Пока ЦЕныТовара.ПолучитьЭлемент()=1 Цикл
если ЦеныТовара.Категория=Катцен.ТекущийЭлемент() Тогда
ПН.ЦенаСНДС=ЦеныТовара.ТекущийЭлемент();
найден=1;
КонецЕсли;
КонецЦикла;
если найден=0 тогда сообщить("");



как называется реквизит по категории смотрите по конфигуратору. я точное название не помню.
barracuda19911991
Помог в результате следующий код:
        ЦеныТовара.ИспользоватьДату(ПН.ДатаДок);
        ЦеныТовара.ИспользоватьВладельца(Товары.ТекущийЭлемент());
        ЦеныТовара.ВыбратьЭлементыПоРеквизиту("КатегорияЦены",ПН.КатегорияЦен,1,0);
        ПН.ЦенаСНДС=ЦеныТовара.Цена;


Все корректно заполняет
спасибо
Vofka
barracuda19911991, для спасибо у нас есть специальная кнопочка wink.gif
igmig65
Цитата(barracuda19911991 @ 24.09.14, 16:54) необходимо зарегистрироваться для просмотра ссылки
Помог в результате следующий код:
        ЦеныТовара.ИспользоватьДату(ПН.ДатаДок);
        ЦеныТовара.ИспользоватьВладельца(Товары.ТекущийЭлемент());
        ЦеныТовара.ВыбратьЭлементыПоРеквизиту("КатегорияЦены",ПН.КатегорияЦен,1,0);
        ПН.ЦенаСНДС=ЦеныТовара.Цена;


Все корректно заполняет
спасибо


так нельзя, и в принципе это не правильно...
вы открываете выборку, но фактически ее не делаете.
и вот что у вас получится, если для этого товара нет элемента с нужной категорией цены?
выскочит ошибка, скорей всего...
у вас все срабатывает, потому что позиционируется на 1 строке выборки, и вы цену получаете.
Короче, логика не правильная...
Если вы уверены что такой тип цен есть для всех товаров, то нужно использовать НайтиПоРеквизиту(), через Если,
но если учесть возможность того, что у товара может быть несколько закупочных цен, то найдется первая, возможно не та что нужна...Тогда нужно еще одно условие, для ее определения.
Домовик
оййой, ошибок пооставляла.
по поводу перебора элементов, мной предложенного, так как обычно по две-три цены обычно. не более.
twilight_dream
Ну ещё один маленький момент. Режим нужно единицу передавать:
КатЦен.НайтиПоНаименованию("Закупочная",1,0);

Ну, отбор по владельцу (ИспользоватьВладельца(Товар)) это, естественно, не отменяет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.