Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как программно добавить/изменить цены?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Flexy
Здравствуйте Коллеги.
Есть Обработка, которая заполняет из файла Excel в ПН (и при необходимости карточку товара)Наименование/ШтрихКод/Артикул/Цену товара.Но эта обработка написана под Бух.
На данный момент столкнулся с проблемой.Не получается Добавить цену из файла Экселя и сохранить ее в карточке товара с Типом Закупочная.
Исходный код для Бух выглядит так:
товар.цена_розн=окр(товар.цена_прих+товар.цена_прих*товар.ТорговаяНаценка/100,0);
MATEVI
В ТИСе Цены это справочник. И работать надо как со справочником Спр = СоздатьОбъект ... и т.д.
Посмотрите как в ТИСе идет работа с закладкой цены
Flexy
Смотрел.Именно это у меня и не выходит.
Пробовал делать как-то так:
СпрЦены = СоздатьОбъект("Справочник.Цены");
СпрЦены.ИспользоватьВладельца(Товар);
....

И дальше у меня ступор.В Справочник Цен Тип Цены подтягивается со Справочника КатегорииЦен.В общем я запутался совсем.Что от куда, как и куда берется...
Прошу помощи rolleyes.gif
alex040269
Цитата(Flexy @ 31.10.11, 10:36) необходимо зарегистрироваться для просмотра ссылки
Смотрел.Именно это у меня и не выходит.
Пробовал делать как-то так:
СпрЦены = СоздатьОбъект("Справочник.Цены");
СпрЦены.ИспользоватьВладельца(Товар);
....

И дальше у меня ступор.В Справочник Цен Тип Цены подтягивается со Справочника КатегорииЦен.В общем я запутался совсем.Что от куда, как и куда берется...
Прошу помощи rolleyes.gif

ну, наверное нужно запросом проверить есть нужная запись, если есть, то изменить, если нет то добавить, если заведомо нет, то сразу добавить....
как т о так.
Flexy
Цитата(alex040269 @ 31.10.11, 9:49) необходимо зарегистрироваться для просмотра ссылки
ну, наверное нужно запросом проверить есть нужная запись, если есть, то изменить, если нет то добавить, если заведомо нет, то сразу добавить....
как т о так.

Этот алгоритм уже есть в обработке.
Меня интересует именно кусок кода в котором на Программном уровне Для Текущего Товара Добавиться в Список Цен цена с типом Закупочная.
Kaliban
как-то так:
             ЦеныТовара = СоздатьОбъект("Справочник.Цены"); 
    Если ПустоеЗначение(НаДату)=1 Тогда
        НаДату = РабочаяДата();
    КонецЕсли;
    ЦеныТовара.ИспользоватьДату(НаДату);
    ЦеныТовара.ИспользоватьВладельца(Тов.ТекущийЭлемент());
    КатегорииЦен = СоздатьОбъект("Справочник.КатегорииЦен");
    КатегорииЦен.ВыбратьЭлементы();
    Пока КатегорииЦен.ПолучитьЭлемент()=1 Цикл
        Если КатегорииЦен.ПометкаУдаления()=1 Тогда
            Продолжить;
        КонецЕсли;
        Если ЦеныТовара.НайтиПоРеквизиту("КатегорияЦены",КатегорииЦен.ТекущийЭлемент(),0)=0 Тогда
            ЦеныТовара.Новый();
        Иначе
            Если ЦеныТовара.ПометкаУдаления()=1 Тогда
                Если Вопрос("Цена "+ЦеныТовара.КатегорияЦены+ " помечена на удаление и не будет заполнена.
                            |Снять пометку удаления?","Да+Нет")="Да" Тогда
                    Попытка
                        ЦеныТовара.СнятьПометкуУдаления();
                    Исключение
                    Предупреждение(ОписаниеОшибки());
                        Возврат;
                    КонецПопытки;            
                КонецЕсли;
                Продолжить;
            КонецЕсли;
        КонецЕсли;  
        //опр валюту  
        ВалютаЦ=Тов.ВалютаУчета;
        ЦеныТовара.Наименование = КатегорииЦен.Наименование;
        ЦеныТовара.Единица = Тов.ЕдиницаПоУмолчанию;
        ЦеныТовара.КатегорияЦены = КатегорииЦен.ТекущийЭлемент();    
                           //ВычисленнаяЦена= тащите их экселя;
         ЦеныТовара.Цена = ВычисленнаяЦена;
        // Попытка
        ЦеныТовара.Записать();
                     // Исключение                                                                                                                  х
         //    глТрассировка(ОписаниеОшибки(),0);
         //    Возврат;
                  // КонецПопытки;
        
    КонецЦикла;
alex040269
Цитата(Flexy @ 31.10.11, 10:51) необходимо зарегистрироваться для просмотра ссылки
Этот алгоритм уже есть в обработке.
Меня интересует именно кусок кода в котором на Программном уровне Для Текущего Товара Добавиться в Список Цен цена с типом Закупочная.


СпрЦены = СоздатьОбъект("Справочник.Цены");
СпрЦены.ИспользоватьВладельца(Товар);
СпрЦены.ИспользоватьДату(Товар);
СпрЦены.Новый();
СпрЦены.<ИмяРеквизита> = Значение;
......
СпрЦены.Записать();
....


СпрЦены.ИспользоватьДату(Товар); точно не помню до новый() или после...
Flexy
Цитата(Kaliban @ 31.10.11, 10:07) необходимо зарегистрироваться для просмотра ссылки
как-то так:
             ЦеныТовара = СоздатьОбъект("Справочник.Цены"); 
    Если ПустоеЗначение(НаДату)=1 Тогда
        НаДату = РабочаяДата();
    КонецЕсли;
    ЦеныТовара.ИспользоватьДату(НаДату);
    ЦеныТовара.ИспользоватьВладельца(Тов.ТекущийЭлемент());
    КатегорииЦен = СоздатьОбъект("Справочник.КатегорииЦен");
    КатегорииЦен.ВыбратьЭлементы();
    Пока КатегорииЦен.ПолучитьЭлемент()=1 Цикл
        Если КатегорииЦен.ПометкаУдаления()=1 Тогда
            Продолжить;
        КонецЕсли;
        Если ЦеныТовара.НайтиПоРеквизиту("КатегорияЦены",КатегорииЦен.ТекущийЭлемент(),0)=0 Тогда
            ЦеныТовара.Новый();
        Иначе
            Если ЦеныТовара.ПометкаУдаления()=1 Тогда
                Если Вопрос("Цена "+ЦеныТовара.КатегорияЦены+ " помечена на удаление и не будет заполнена.
                            |Снять пометку удаления?","Да+Нет")="Да" Тогда
                    Попытка
                        ЦеныТовара.СнятьПометкуУдаления();
                    Исключение
                    Предупреждение(ОписаниеОшибки());
                        Возврат;
                    КонецПопытки;            
                КонецЕсли;
                Продолжить;
            КонецЕсли;
        КонецЕсли;  
        //опр валюту  
        ВалютаЦ=Тов.ВалютаУчета;
        ЦеныТовара.Наименование = КатегорииЦен.Наименование;
        ЦеныТовара.Единица = Тов.ЕдиницаПоУмолчанию;
        ЦеныТовара.КатегорияЦены = КатегорииЦен.ТекущийЭлемент();    
                           //ВычисленнаяЦена= тащите их экселя;
         ЦеныТовара.Цена = ВычисленнаяЦена;
        // Попытка
        ЦеныТовара.Записать();
                     // Исключение                                                                                                                  х
         //    глТрассировка(ОписаниеОшибки(),0);
         //    Возврат;
                  // КонецПопытки;
        
    КонецЦикла;

Вот это вроде бы работает, но как-то коряво.
1.Оно добавляет каждый раз для товара все категории , которые есть в Справочнике Категорий.
Вопрос: Как выбрать только 2 нужные категории?
2.Надо как-то прикрутить проверку Категорий.
Т.е. Если у товара уже есть эти 2 категории, то нужно всего лишь изменить в них цену, как для одной так и для другой.
А если их нет, то нужно добавить их и установить уже вычисленную цену.

Выручайте Товарищи.А то что-то башка не варит совсем 64000000.gif
Flexy
В общем как добавлять только одну категорию разобрался. Вот код.Может кому пригодиться.
Но остается вопрос как выбрать именно две нужные категории?Может через список значений отфильтровать?Возможен такой вариант?
Процедура Выполнить()  
    
    спрЦены = СоздатьОбъект("Справочник.Цены");
    спрКатегорииЦен = СоздатьОбъект("Справочник.КатегорииЦен");
    спрЦены.ИспользоватьДату(РабочаяДата());
        спрЦены.ИспользоватьВладельца(Товар);
    СпрКатегорииЦен.НайтиПоНаименованию("Розничная");
    
    Если спрЦены.НайтиПоРеквизиту("КатегорияЦены",спрКатегорииЦен.ТекущийЭлемент(),0)=0 Тогда
        флаг =0;    
           Сообщить("Возможно товар "+ Товар.Наименование+" " + "новый и пока не имеет Цены.Создаю Категорию и Цену Товара");
        спрЦены.Новый();
        Иначе
            Сообщить("Категория цены для товара "+ " "+Товар.Наименование+ "уже установлена.Меняю цену");
            Если спрЦены.ПометкаУдаления()=1 Тогда
                Если Вопрос("Цена "+спрЦены.КатегорияЦены+ " помечена на удаление и не будет заполнена.
                            |Снять пометку удаления?","Да+Нет")="Да" Тогда
                    Попытка
                        спрЦены.СнятьПометкуУдаления();
                    Исключение
                    Предупреждение(ОписаниеОшибки());
                        Возврат;
                    КонецПопытки;            
                КонецЕсли;
                КонецЕсли;
        КонецЕсли;  
        Если Флаг=0 Тогда
        спрЦены.Валюта = Товар.ВалютаУчета;
        спрЦены.Наименование = спрКатегорииЦен.Наименование;
        спрЦены.Единица = Товар.ЕдиницаПоУмолчанию;
        спрЦены.КатегорияЦены = спрКатегорииЦен.ТекущийЭлемент();
        спрЦены.Цена = Цен;//ВычисленнаяЦена;
        Иначе
        спрЦены.Цена = Цен;//ВычисленнаяЦена;
        КонецЕсли;
        спрЦены.Записать();
         КонецПроцедуры
Kaliban
Ну если имена категорий жестко заданы и не будут изменяться никогда - будьте как все, хардкодьте.
Пример быдлокода:
...
Пока КатегорииЦен.ПолучитьЭлемент()=1 Цикл
если (категорияЦен.Наименование="Закупочная")или(категорияЦен.Наименование="Розничная") тогда
...
иначе
продолжить;
конецЕсли
...

если нужно произвольное количество произвольных категорий,
влепите на форму обработки список или тз, и вместо цикла по всем категориям выбирайте из списка или тз.
Делов то.
Flexy
Вот еще вопросик возник.Решил не создавать новую темку т.к. касается этой.
Как спозиционироваться на новом Товаре? т.е делаю
Товар.Новый();
Товар.Наименование=НаименованиеТовара;
Товар.ПолнНаименование=НаименованиеТовара;
...
Товар.Записать()

Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(Товар.ТекущийЭлемент());
Единицы.ШтрихКод = Товар.ШтрихКод;

Но выдает ошибку:
Единицы.ШтрихКод = Товар.ШтрихКод;
Не выбран элемент!
Zaval
Попробуйте без "ТекущийЭлемент()". Когда он лишний - позиционирование сбивается.
Если не поможет - сохраните Товар в переменной перед "Записать()"
Flexy
Цитата(Zaval @ 04.11.11, 11:18) необходимо зарегистрироваться для просмотра ссылки
Попробуйте без "ТекущийЭлемент()".
Если не поможет - сохраните его в переменной перед "Зпаписать()"

Пробовал.
Делал так:
ТекТовар = Товар.ТекущийЭлемент();
ТекТовар.Записать();
                      
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Сообщить(ТекТовар);
Единицы.ШтрихКод = ТекТовар.ШтрихКод;

Та же ошибка.ШК записывается.Но Цикл выпадает с этой ошибкой на первом товаре и дальше не идет.
Zaval
ТекТовар - объявлена в Процедуре?
Что-то было с позиционированием при "Записать()", уже подробностей не помню(
Повозитесь с Отладчиком.
nysysimara
Цитата(Flexy @ 04.11.11, 12:22) необходимо зарегистрироваться для просмотра ссылки
Пробовал.
Делал так:
ТекТовар = Товар.ТекущийЭлемент();
ТекТовар.Записать();
                      
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Сообщить(ТекТовар);
Единицы.ШтрихКод = ТекТовар.ШтрихКод;

Та же ошибка.ШК записывается.Но Цикл выпадает с этой ошибкой на первом товаре и дальше не идет.


а если так:

Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Единицы.ВыбратьЭлементы();
Если Единицы.ПолучитьЭлемент()=1 Тогда
      Единицы.ШтрихКод = ТекТовар.ШтрихКод;


а вообще, если
Цитата
Товар.Новый();

у него же нет еще елементо подчиненного справочника

Во-первых, у Вас очепятка не
Цитата
ТекТовар.Записать();

а Товар.Записать();

и если он новый
    
        Единицы.Новый();
        Единицы.Владелец = ТекТовар;
        Единицы.ШтрихКод = ТекТовар.ШтрихКод;
        Единицы.Записать();
Flexy
Хм.Если не создавать объект Единицы.То в карточку товара Заноситься ШК, но на вкладке Единциы, Единицы Товара не Имеет ШК.Только когда я интерактивно
нажимаю Записать, то сразу же в единицу устанавливается ШК.
Не пойму ни фига


Цитата(nysysimara @ 04.11.11, 11:37) необходимо зарегистрироваться для просмотра ссылки
и если он новый
    
        Единицы.Новый();
        Единицы.Владелец = ТекТовар;
        Единицы.ШтрихКод = ТекТовар.ШтрихКод;
        Единицы.Записать();

Таким макаром записывается просто ШК.Без Коефициента и Штук.
Надо как-то спозиционироваться на текущем элементе Цены.Шт и Коэф по идее там уже автоматом проставляются, а вот ШК надо туда дописать.
nysysimara
Товар.Новый();
Товар.Наименование=НаименованиеТовара;
Товар.ПолнНаименование=НаименованиеТовара;
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();

Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.Новый();
Единицы.Владелец = ТекТовар;
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();


Я правильно понимаю:
1)создаем новый элемент Товар
2) создаем подчиненный ему элемент справочника "Единицы" ??
Flexy
1.Создаем Новый товар.
2.Записываем в реквизит Товара ШтрихКод.
3.Записываем Товар.
4.В единицах Товара Видим Только Единица = шт. Коефициент = 1 ШтрихКода = Нет.
5.Жму Записать Интерактивно в Карточке Товара.И тогда только в Единицы подтягивается ШК с Реквизита Справочника товара "ШтрихКод".
nysysimara
Товар.Новый();
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();

Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Единицы.ВыбратьЭлементы();
Если Единицы.ПолучитьЭлемент()=1 Тогда
      Единицы.ШтрихКод = ТекТовар.ШтрихКод;
      Единицы.Записать();
Иначе
      Сообщить("нет элемента спр.Единицы");
КонецЕсли;


Если выдаст сообщение, тогда заменить код на
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.Новый();
Единицы.Владелец = ТекТовар;
...
Заполнить необходимые реквизиты
...
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
Flexy
Цитата(nysysimara @ 04.11.11, 12:25) необходимо зарегистрироваться для просмотра ссылки
Товар.Новый();
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();

Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Единицы.ВыбратьЭлементы();
Если Единицы.ПолучитьЭлемент()=1 Тогда
      Единицы.ШтрихКод = ТекТовар.ШтрихКод;
      Единицы.Записать();
Иначе
      Сообщить("нет элемента спр.Единицы");
КонецЕсли;


нет элемента спр.Единицы huh.gif
nysysimara
повторюсь
Если выдаст сообщение, тогда заменить код на
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.Новый();
Единицы.Владелец = ТекТовар;
...
Заполнить необходимые реквизиты
...
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();


необходимые реквизиты - это Коэффициент, наименование(шт) и т.д.
mister-x
Я робив так (в комплексну колись завантажував прайс з ексель - ціни):
1. шукав товар по коду із екселя (або іншому унікальному реквізиту - УР), якщо вже такий є - то шукаємо по УР в дов. "Ціни" назву ціни із екселя. Якщо така одиниця є - записуємо значення на дану дату (дата вказувалась в обробці).
2. якщо товар є, а одиниці немає - то створ. назву одиниці і записуємо значення на дану дату.
3. інакше створ. товар і одиницю.
Flexy
Всем спасибо.Вроде бы разобрался.
На данный момент работает так:
ТекТовар = Товар;
                        ТекТовар.ИспользоватьДату(РабочаяДата());
                        ТекТовар.Записать();
                    
                    
                        Единицы = СоздатьОбъект("Справочник.Единицы");
                        Единицы.ИспользоватьВладельца(ТекТовар);
                        Единицы.Новый();
                        Единицы.Единица = Константа.ТипБазовойЕдиницыПоУмолчанию;;
                        Единицы.Коэффициент = 1;
                        Единицы.ШтрихКод = ТекТовар.ШтрихКод;
                        Единицы.ИспользоватьДату(рабочаяДата());
                          Единицы.Записать();

Пока хз правильно это или нет.В процессе работы узнаем laugh.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.