Здравствуйте Коллеги.
Есть Обработка, которая заполняет из файла Excel в ПН (и при необходимости карточку товара)Наименование/ШтрихКод/Артикул/Цену товара.Но эта обработка написана под Бух.
На данный момент столкнулся с проблемой.Не получается Добавить цену из файла Экселя и сохранить ее в карточке товара с Типом Закупочная.
Исходный код для Бух выглядит так:
товар.цена_розн=окр(товар.цена_прих+товар.цена_прих*товар.ТорговаяНаценка/100,0);
В ТИСе Цены это справочник. И работать надо как со справочником Спр = СоздатьОбъект ... и т.д.
Посмотрите как в ТИСе идет работа с закладкой цены
Смотрел.Именно это у меня и не выходит.
Пробовал делать как-то так:
СпрЦены = СоздатьОбъект("Справочник.Цены");
СпрЦены.ИспользоватьВладельца(Товар);
....
СпрЦены = СоздатьОбъект("Справочник.Цены");
СпрЦены.ИспользоватьВладельца(Товар);
....
как-то так:
ЦеныТовара = СоздатьОбъект("Справочник.Цены");
Если ПустоеЗначение(НаДату)=1 Тогда
НаДату = РабочаяДата();
КонецЕсли;
ЦеныТовара.ИспользоватьДату(НаДату);
ЦеныТовара.ИспользоватьВладельца(Тов.ТекущийЭлемент());
КатегорииЦен = СоздатьОбъект("Справочник.КатегорииЦен");
КатегорииЦен.ВыбратьЭлементы();
Пока КатегорииЦен.ПолучитьЭлемент()=1 Цикл
Если КатегорииЦен.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Если ЦеныТовара.НайтиПоРеквизиту("КатегорияЦены",КатегорииЦен.ТекущийЭлемент(),0)=0 Тогда
ЦеныТовара.Новый();
Иначе
Если ЦеныТовара.ПометкаУдаления()=1 Тогда
Если Вопрос("Цена "+ЦеныТовара.КатегорияЦены+ " помечена на удаление и не будет заполнена.
|Снять пометку удаления?","Да+Нет")="Да" Тогда
Попытка
ЦеныТовара.СнятьПометкуУдаления();
Исключение
Предупреждение(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
Продолжить;
КонецЕсли;
КонецЕсли;
//опр валюту
ВалютаЦ=Тов.ВалютаУчета;
ЦеныТовара.Наименование = КатегорииЦен.Наименование;
ЦеныТовара.Единица = Тов.ЕдиницаПоУмолчанию;
ЦеныТовара.КатегорияЦены = КатегорииЦен.ТекущийЭлемент();
//ВычисленнаяЦена= тащите их экселя;
ЦеныТовара.Цена = ВычисленнаяЦена;
// Попытка
ЦеныТовара.Записать();
// Исключение х
// глТрассировка(ОписаниеОшибки(),0);
// Возврат;
// КонецПопытки;
КонецЦикла;
СпрЦены = СоздатьОбъект("Справочник.Цены");
СпрЦены.ИспользоватьВладельца(Товар);
СпрЦены.ИспользоватьДату(Товар);
СпрЦены.Новый();
СпрЦены.<ИмяРеквизита> = Значение;
......
СпрЦены.Записать();
....
ЦеныТовара = СоздатьОбъект("Справочник.Цены");
Если ПустоеЗначение(НаДату)=1 Тогда
НаДату = РабочаяДата();
КонецЕсли;
ЦеныТовара.ИспользоватьДату(НаДату);
ЦеныТовара.ИспользоватьВладельца(Тов.ТекущийЭлемент());
КатегорииЦен = СоздатьОбъект("Справочник.КатегорииЦен");
КатегорииЦен.ВыбратьЭлементы();
Пока КатегорииЦен.ПолучитьЭлемент()=1 Цикл
Если КатегорииЦен.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Если ЦеныТовара.НайтиПоРеквизиту("КатегорияЦены",КатегорииЦен.ТекущийЭлемент(),0)=0 Тогда
ЦеныТовара.Новый();
Иначе
Если ЦеныТовара.ПометкаУдаления()=1 Тогда
Если Вопрос("Цена "+ЦеныТовара.КатегорияЦены+ " помечена на удаление и не будет заполнена.
|Снять пометку удаления?","Да+Нет")="Да" Тогда
Попытка
ЦеныТовара.СнятьПометкуУдаления();
Исключение
Предупреждение(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
Продолжить;
КонецЕсли;
КонецЕсли;
//опр валюту
ВалютаЦ=Тов.ВалютаУчета;
ЦеныТовара.Наименование = КатегорииЦен.Наименование;
ЦеныТовара.Единица = Тов.ЕдиницаПоУмолчанию;
ЦеныТовара.КатегорияЦены = КатегорииЦен.ТекущийЭлемент();
//ВычисленнаяЦена= тащите их экселя;
ЦеныТовара.Цена = ВычисленнаяЦена;
// Попытка
ЦеныТовара.Записать();
// Исключение х
// глТрассировка(ОписаниеОшибки(),0);
// Возврат;
// КонецПопытки;
КонецЦикла;
В общем как добавлять только одну категорию разобрался. Вот код.Может кому пригодиться.
Но остается вопрос как выбрать именно две нужные категории?Может через список значений отфильтровать?Возможен такой вариант?
Процедура Выполнить()
спрЦены = СоздатьОбъект("Справочник.Цены");
спрКатегорииЦен = СоздатьОбъект("Справочник.КатегорииЦен");
спрЦены.ИспользоватьДату(РабочаяДата());
спрЦены.ИспользоватьВладельца(Товар);
СпрКатегорииЦен.НайтиПоНаименованию("Розничная");
Если спрЦены.НайтиПоРеквизиту("КатегорияЦены",спрКатегорииЦен.ТекущийЭлемент(),0)=0 Тогда
флаг =0;
Сообщить("Возможно товар "+ Товар.Наименование+" " + "новый и пока не имеет Цены.Создаю Категорию и Цену Товара");
спрЦены.Новый();
Иначе
Сообщить("Категория цены для товара "+ " "+Товар.Наименование+ "уже установлена.Меняю цену");
Если спрЦены.ПометкаУдаления()=1 Тогда
Если Вопрос("Цена "+спрЦены.КатегорияЦены+ " помечена на удаление и не будет заполнена.
|Снять пометку удаления?","Да+Нет")="Да" Тогда
Попытка
спрЦены.СнятьПометкуУдаления();
Исключение
Предупреждение(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Флаг=0 Тогда
спрЦены.Валюта = Товар.ВалютаУчета;
спрЦены.Наименование = спрКатегорииЦен.Наименование;
спрЦены.Единица = Товар.ЕдиницаПоУмолчанию;
спрЦены.КатегорияЦены = спрКатегорииЦен.ТекущийЭлемент();
спрЦены.Цена = Цен;//ВычисленнаяЦена;
Иначе
спрЦены.Цена = Цен;//ВычисленнаяЦена;
КонецЕсли;
спрЦены.Записать();
КонецПроцедуры
Ну если имена категорий жестко заданы и не будут изменяться никогда - будьте как все, хардкодьте.
Пример быдлокода:
...
Пока КатегорииЦен.ПолучитьЭлемент()=1 Цикл
если (категорияЦен.Наименование="Закупочная")или(категорияЦен.Наименование="Розничная") тогда
...
иначе
продолжить;
конецЕсли
...
Вот еще вопросик возник.Решил не создавать новую темку т.к. касается этой.
Как спозиционироваться на новом Товаре? т.е делаю
Товар.Новый();
Товар.Наименование=НаименованиеТовара;
Товар.ПолнНаименование=НаименованиеТовара;
...
Товар.Записать()
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(Товар.ТекущийЭлемент());
Единицы.ШтрихКод = Товар.ШтрихКод;
Попробуйте без "ТекущийЭлемент()". Когда он лишний - позиционирование сбивается.
Если не поможет - сохраните Товар в переменной перед "Записать()"
ТекТовар = Товар.ТекущийЭлемент();
ТекТовар.Записать();
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Сообщить(ТекТовар);
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
ТекТовар - объявлена в Процедуре?
Что-то было с позиционированием при "Записать()", уже подробностей не помню(
Повозитесь с Отладчиком.
ТекТовар = Товар.ТекущийЭлемент();
ТекТовар.Записать();
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Сообщить(ТекТовар);
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Единицы.ВыбратьЭлементы();
Если Единицы.ПолучитьЭлемент()=1 Тогда
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Новый();
Единицы.Владелец = ТекТовар;
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
Хм.Если не создавать объект Единицы.То в карточку товара Заноситься ШК, но на вкладке Единциы, Единицы Товара не Имеет ШК.Только когда я интерактивно
нажимаю Записать, то сразу же в единицу устанавливается ШК.
Не пойму ни фига
Единицы.Новый();
Единицы.Владелец = ТекТовар;
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
Товар.Новый();
Товар.Наименование=НаименованиеТовара;
Товар.ПолнНаименование=НаименованиеТовара;
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.Новый();
Единицы.Владелец = ТекТовар;
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
1.Создаем Новый товар.
2.Записываем в реквизит Товара ШтрихКод.
3.Записываем Товар.
4.В единицах Товара Видим Только Единица = шт. Коефициент = 1 ШтрихКода = Нет.
5.Жму Записать Интерактивно в Карточке Товара.И тогда только в Единицы подтягивается ШК с Реквизита Справочника товара "ШтрихКод".
Товар.Новый();
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Единицы.ВыбратьЭлементы();
Если Единицы.ПолучитьЭлемент()=1 Тогда
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
Иначе
Сообщить("нет элемента спр.Единицы");
КонецЕсли;
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.Новый();
Единицы.Владелец = ТекТовар;
...
Заполнить необходимые реквизиты
...
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
Товар.Новый();
...
ТекТовар = Товар.ТекущийЭлемент();
Товар.Записать();
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Единицы.ВыбратьЭлементы();
Если Единицы.ПолучитьЭлемент()=1 Тогда
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
Иначе
Сообщить("нет элемента спр.Единицы");
КонецЕсли;
повторюсь
Если выдаст сообщение, тогда заменить код на
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.Новый();
Единицы.Владелец = ТекТовар;
...
Заполнить необходимые реквизиты
...
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.Записать();
Я робив так (в комплексну колись завантажував прайс з ексель - ціни):
1. шукав товар по коду із екселя (або іншому унікальному реквізиту - УР), якщо вже такий є - то шукаємо по УР в дов. "Ціни" назву ціни із екселя. Якщо така одиниця є - записуємо значення на дану дату (дата вказувалась в обробці).
2. якщо товар є, а одиниці немає - то створ. назву одиниці і записуємо значення на дану дату.
3. інакше створ. товар і одиницю.
Всем спасибо.Вроде бы разобрался.
На данный момент работает так:
ТекТовар = Товар;
ТекТовар.ИспользоватьДату(РабочаяДата());
ТекТовар.Записать();
Единицы = СоздатьОбъект("Справочник.Единицы");
Единицы.ИспользоватьВладельца(ТекТовар);
Единицы.Новый();
Единицы.Единица = Константа.ТипБазовойЕдиницыПоУмолчанию;;
Единицы.Коэффициент = 1;
Единицы.ШтрихКод = ТекТовар.ШтрихКод;
Единицы.ИспользоватьДату(рабочаяДата());
Единицы.Записать();
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua