Версия для печати темы (https://pro1c.org.ua/index.php?s=fac68ad0800b777d7b3efa27170f9784&showtopic=5227)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Как программно добавить/изменить цены?

Автор: Flexy 31.10.11, 9:26

Здравствуйте Коллеги.
Есть Обработка, которая заполняет из файла Excel в ПН (и при необходимости карточку товара)Наименование/ШтрихКод/Артикул/Цену товара.Но эта обработка написана под Бух.
На данный момент столкнулся с проблемой.Не получается Добавить цену из файла Экселя и сохранить ее в карточке товара с Типом Закупочная.
Исходный код для Бух выглядит так:

товар.цена_розн=окр(товар.цена_прих+товар.цена_прих*товар.ТорговаяНаценка/100,0);

Автор: MATEVI 31.10.11, 9:31

В ТИСе Цены это справочник. И работать надо как со справочником Спр = СоздатьОбъект ... и т.д.
Посмотрите как в ТИСе идет работа с закладкой цены

Автор: Flexy 31.10.11, 9:36

Смотрел.Именно это у меня и не выходит.
Пробовал делать как-то так:

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

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

Автор: alex040269 31.10.11, 9:49

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

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

ну, наверное нужно запросом проверить есть нужная запись, если есть, то изменить, если нет то добавить, если заведомо нет, то сразу добавить....
как т о так.

Автор: Flexy 31.10.11, 9:51

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

Этот алгоритм уже есть в обработке.
Меня интересует именно кусок кода в котором на Программном уровне Для Текущего Товара Добавиться в Список Цен цена с типом Закупочная.

Автор: Kaliban 31.10.11, 10:07

как-то так:

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

Автор: alex040269 31.10.11, 10:10

Цитата(Flexy @ 31.10.11, 10:51) *
Этот алгоритм уже есть в обработке.
Меня интересует именно кусок кода в котором на Программном уровне Для Текущего Товара Добавиться в Список Цен цена с типом Закупочная.


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


СпрЦены.ИспользоватьДату(Товар); точно не помню до новый() или после...

Автор: Flexy 01.11.11, 15:03

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

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

Выручайте Товарищи.А то что-то башка не варит совсем 64000000.gif

Автор: Flexy 01.11.11, 18:03

В общем как добавлять только одну категорию разобрался. Вот код.Может кому пригодиться.
Но остается вопрос как выбрать именно две нужные категории?Может через список значений отфильтровать?Возможен такой вариант?

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

Автор: Kaliban 02.11.11, 10:33

Ну если имена категорий жестко заданы и не будут изменяться никогда - будьте как все, хардкодьте.
Пример быдлокода:

...
Пока КатегорииЦен.ПолучитьЭлемент()=1 Цикл
если (категорияЦен.Наименование="Закупочная")или(категорияЦен.Наименование="Розничная") тогда
...
иначе
продолжить;
конецЕсли
...

если нужно произвольное количество произвольных категорий,
влепите на форму обработки список или тз, и вместо цикла по всем категориям выбирайте из списка или тз.
Делов то.

Автор: Flexy 04.11.11, 11:10

Вот еще вопросик возник.Решил не создавать новую темку т.к. касается этой.
Как спозиционироваться на новом Товаре? т.е делаю

Товар.Новый();
Товар.Наименование=НаименованиеТовара;
Товар.ПолнНаименование=НаименованиеТовара;
...
Товар.Записать()

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

Но выдает ошибку:
Единицы.ШтрихКод = Товар.ШтрихКод;
Не выбран элемент!

Автор: Zaval 04.11.11, 11:18

Попробуйте без "ТекущийЭлемент()". Когда он лишний - позиционирование сбивается.
Если не поможет - сохраните Товар в переменной перед "Записать()"

Автор: Flexy 04.11.11, 11:22

Цитата(Zaval @ 04.11.11, 11:18) *
Попробуйте без "ТекущийЭлемент()".
Если не поможет - сохраните его в переменной перед "Зпаписать()"

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

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

Автор: Zaval 04.11.11, 11:27

ТекТовар - объявлена в Процедуре?
Что-то было с позиционированием при "Записать()", уже подробностей не помню(
Повозитесь с Отладчиком.

Автор: nysysimara 04.11.11, 11:37

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

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


а если так:

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


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

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

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

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

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

Автор: Flexy 04.11.11, 11:53

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


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

Таким макаром записывается просто ШК.Без Коефициента и Штук.
Надо как-то спозиционироваться на текущем элементе Цены.Шт и Коэф по идее там уже автоматом проставляются, а вот ШК надо туда дописать.

Автор: nysysimara 04.11.11, 12:03

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

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


Я правильно понимаю:
1)создаем новый элемент Товар
2) создаем подчиненный ему элемент справочника "Единицы" ??

Автор: Flexy 04.11.11, 12:10

1.Создаем Новый товар.
2.Записываем в реквизит Товара ШтрихКод.
3.Записываем Товар.
4.В единицах Товара Видим Только Единица = шт. Коефициент = 1 ШтрихКода = Нет.
5.Жму Записать Интерактивно в Карточке Товара.И тогда только в Единицы подтягивается ШК с Реквизита Справочника товара "ШтрихКод".

Автор: nysysimara 04.11.11, 12:36

Товар.Новый();
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();

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


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

Автор: Flexy 04.11.11, 12:37

Цитата(nysysimara @ 04.11.11, 12:25) *
Товар.Новый();
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();

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


нет элемента спр.Единицы huh.gif

Автор: nysysimara 04.11.11, 12:44

повторюсь
Если выдаст сообщение, тогда заменить код на

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


необходимые реквизиты - это Коэффициент, наименование(шт) и т.д.

Автор: mister-x 04.11.11, 12:48

Я робив так (в комплексну колись завантажував прайс з ексель - ціни):
1. шукав товар по коду із екселя (або іншому унікальному реквізиту - УР), якщо вже такий є - то шукаємо по УР в дов. "Ціни" назву ціни із екселя. Якщо така одиниця є - записуємо значення на дану дату (дата вказувалась в обробці).
2. якщо товар є, а одиниці немає - то створ. назву одиниці і записуємо значення на дану дату.
3. інакше створ. товар і одиницю.

Автор: Flexy 04.11.11, 13:04

Всем спасибо.Вроде бы разобрался.
На данный момент работает так:

ТекТовар = Товар;
                        ТекТовар.ИспользоватьДату(РабочаяДата());
                        ТекТовар.Записать();
                    
                    
                        Единицы = СоздатьОбъект("Справочник.Единицы");
                        Единицы.ИспользоватьВладельца(ТекТовар);
                        Единицы.Новый();
                        Единицы.Единица = Константа.ТипБазовойЕдиницыПоУмолчанию;;
                        Единицы.Коэффициент = 1;
                        Единицы.ШтрихКод = ТекТовар.ШтрихКод;
                        Единицы.ИспользоватьДату(рабочаяДата());
                          Единицы.Записать();

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua