7.7 Изменение цен номенклатуры из текстового документа

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем RoZii, 3 фев 2010.

  1. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    Делаю обработку для изменения цен номенклатуры в бухгалтерии. Цены предварительно выгружаются в txt из 8 (там все нормально) а вот при загрузки, если номенклатуры нет, то в 7 созадется новая (правильно), а вот с типом цен в номенклатуре проблема... Если нет типов цен у товара, то он создается и прекрасно записывается вместе с ценой, а если уже существует то обработка должна заменять значение цены, а она так же ставит новое, или если у товара помимо этого типа цены стоит еще один, то тоже обработка создает новый.. а не заменяет цену.. А вот если второй раз прогонять, то там где она первый раз создавала сама тип цен и он там один, то все изменяется... Ничего понять не могу..

    Код:
    //*******************************************
    Функция  ИзменитьЭлемент(Эл) 
    Был = 0;
    СпрЦен = СоздатьОбъект("Справочник.Цены");
    СпрЕдиница    = СоздатьОбъект("Справочник.ЕдиницыИзмерений");
    СпрЕдиница.ИспользоватьВладельца(Эл);
    ЕдИзмЦены    = СоздатьОбъект("Справочник.ЕдиницыИзмерений"); 
    ЕдИзмЦены.НайтиПоКоду("796");
    ВалютаЦены = СоздатьОбъект("Справочник.Валюты");
    ВалютаЦены.НайтиПоКоду("810"); 
    ТипЦеныСпр=СоздатьОбъект("Справочник.ТипыЦен");   
    ТипЦеныСпр.НайтиПоКоду("00002"); 
    
    // Проверим, есть ли у данного ТМЦ такая единица
    Если СпрЕдиница.НайтиПоКоду("796") = 0 Тогда
    Сообщить("У ТМЦ """ + СокрЛП(Эл) + """ отсутствует единица с кодом """ + СокрЛП(ЕдИзмЦены), "!");
    Возврат 0;
    КонецЕсли;  
    СпрЦен.ИспользоватьДату(Дата(2009,06,01));
    СпрЦен.ИспользоватьВладельца(Эл); 
    Если ТипЦены.Выбран() = 1 Тогда
    СпрЦен.ВыбратьЭлементы();
    Пока СпрЦен.ПолучитьЭлемент() = 1 Цикл   
    Если СокрЛП(СпрЦен.ТипЦен.Наименование) = СокрЛП(ТипЦены.Наименование)  Тогда   //Судя по отладчику травит тут СпрЦен.ТипЦен.Наименование всегда равен первому типу цен по списку у товара... 
    СпрЦен.Валюта = ВалютаЦены.ТекущийЭлемент();
    СпрЦен.ТипЦен = ТипЦены.ТекущийЭлемент();  
    СтараяЦена = СпрЦен.Цена;
    СпрЦен.Цена = ЦенаНом;
    ЦенаНом=0;
    Был = 1;
    СпрЦен.Записать();
    Сообщить("Изменён тип цены: '" + СпрЦен.ТипЦен.Наименование + "' у номенклатуры: '" + Эл.Наименование + "' старая цена была: " + СтараяЦена+ "' новая цена: " + СпрЦен.Цена);
    ЦенаНом=0;
    КонецЕсли; 
    прервать;
    КонецЦикла;
    Если Был = 0 Тогда  
    СпрЦен.Новый();                             
    СпрЦен.Валюта = ВалютаЦены.ТекущийЭлемент();
    СпрЦен.ТипЦен = ТипЦены;  
    СпрЦен.Цена = ЦенаНом;
    ЦенаНом=0;
    СпрЦен.Записать();
    Сообщить("Создан новый тип цены: '" + СпрЦен.ТипЦен.Наименование + "' у номенклатуры: '" + Эл.Наименование + "'");
    КонецЕсли;  
    //    СпрЦен.Записать(); 
    Возврат 1;
    Иначе
    Сообщить("Не выбран тип цены!", "!");   
    Активизировать("ТипЦены",1);
    //        Возврат 0;
    КонецЕсли;
    КонецФункции
    //*******************************************
    Процедура Сформировать() 
    ИмяКаталога=КаталогИБ()+"Торговля";
    Тов=СоздатьОбъект("Справочник.Номенклатура");
    
    ВидыНоменклатуры=СоздатьОбъект("Справочник.ВидыНоменклатуры");
    ВидыНоменклатуры.НайтиПоНаименованию("Товар");
    ЕдиницыИзмерений=СоздатьОбъект("Справочник.ЕдиницыИзмерений");
    ЕдиницыИзмерений.НайтиПоКоду("796");
    
    Первый=0;
    Для индекс=1 по СписокНакладных.РазмерСписка() Цикл
    Если индекс=1 Тогда
    Первый=1;
    КонецЕсли; 
    Если СписокНакладных.Пометка(индекс)=0 Тогда
    Продолжить;
    КонецЕсли;
    ИмяНакладной=СписокНакладных.ПолучитьЗначение(индекс);
    Т=СоздатьОбъект("Текст");
    Т.Открыть(ИмяКаталога+ИмяНакладной);
    Если Т.КоличествоСтрок()=0 Тогда
    Предупреждение("Файл загрузки пустой");
    Возврат;
    КонецЕсли;
    КолСтр=Число(Т.ПолучитьСтроку(1));
    Для инд=1 по КолСтр Цикл
    Позиция=1+(инд-1)*7;
    ТоварКод=Т.ПолучитьСтроку(Позиция+1);
    ТоварРодительКод=Т.ПолучитьСтроку(Позиция+2);
    ТоварРодительНаименование=Т.ПолучитьСтроку(Позиция+3);
    ТоварНаименование=Т.ПолучитьСтроку(Позиция+4);
    ТоварПолнНаименование=Т.ПолучитьСтроку(Позиция+5); 
    ТоварЦена=Число(Т.ПолучитьСтроку(Позиция+6));
    
    ЦенаНом=ТоварЦена;
    Если Тов.НайтиПоКоду(ТоварРодительКод,0)=0 Тогда
    Тов.ИспользоватьРодителя("");
    Тов.НоваяГруппа();
    Тов.Код=ТоварРодительКод;
    Тов.Наименование=ТоварРодительНаименование;
    Тов.Записать(); 
    Сообщить(""+Тов.ТекущийЭлемент());
    КонецЕсли;  
    Тов.ИспользоватьРодителя(Тов.ТекущийЭлемент());
    Тов.ИспользоватьДату(Дата(2008,06,01));
    
    Если Тов.НайтиПоКоду(ТоварКод,0)=0 Тогда
    Тов.Новый();
    Тов.Код=ТоварКод;
    Тов.Наименование=ТоварНаименование;
    Тов.ПолнНаименование=ТоварПолнНаименование;
    Тов.ТипТовара=Перечисление.ТипыТоваров.Собственный;
    Тов.ВидНоменклатуры=ВидыНоменклатуры.ТекущийЭлемент();
    Тов.ЕдиницаИзмерения=ЕдиницыИзмерений.ТекущийЭлемент();  
    Тов.ПорядокХраненияОтпускнойЦены=1;
    Тов.ТипНоменклатуры=Перечисление.ТипыНоменклатуры.Товар;
    Тов.Записать();
    Сообщить("Создан элемент номенклатуры: "+ТоварРодительКод+""+ТоварКод+" "+ТоварРодительНаименование);
    КонецЕсли;
    
    
    
    СпрТов=СоздатьОбъект("Справочник.Номенклатура");                      
    
    //    Если Тов.ЭтоГруппа() = 1 Тогда
    //        Тов.ИспользоватьРодителя(ТоварКод);
    //    Иначе
    //        СпрТов.НайтиЭлемент(ТоварКод);
    ИзменитьЭлемент(Тов.ТекущийЭлемент());
    //    Возврат;
    //    КонецЕсли;
    
    СпрТов.ВыбратьЭлементы();
    Если СпрТов.ПолучитьЭлемент() = 1 Тогда 
    Если СпрТов.ЭтоГруппа() = 1 Тогда 
    Продолжить;
    КонецЕсли; 
    Если ИзменитьЭлемент(СпрТов.ТекущийЭлемент()) = 0 Тогда  
    Возврат;
    КонецЕсли; 
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    КонецПроцедуры
    
    //******************************************* 
    
    Процедура Список()
    СписокНакладных.УдалитьВсе();
    ИмяКаталога=КаталогИБ()+"Торговля";
    ИмяФайла=ФС.НайтиПервыйФайл(ИмяКаталога+"*.*");
    Пока СтрДлина(ИмяФайла)>0 Цикл
    Если (ИмяФайла<>".") и (ИмяФайла<>"..") Тогда
    СписокНакладных.ДобавитьЗначение(ИмяФайла);
    КонецЕсли;
    ИмяФайла=ФС.НайтиСледующийФайл();
    КонецЦикла;    
    КонецПроцедуры
    
    
    
    
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Добавил одну переменную для работы с периодическими реквизитами.
    МояДата типа дата
    Код:
    Пока СпрЦен.ПолучитьЭлемент() = 1 Цикл                   
    Если СпрЦен.ТипЦен = ТипЦены  Тогда   //сравнивайте элементы, а не наименования...
    СпрЦен.Валюта = ВалютаЦены.ТекущийЭлемент();                
    СпрЦен.ТипЦен = ТипЦены.ТекущийЭлемент();                  
    СтараяЦена = СпрЦен.Цена.Получить(МояДата);   //реквизит-то ПЕРИОДИЧЕСКИЙ
    СпрЦен.Цена.Установить(МояДата,ЦенаНом); //аналогично....
    ЦенаНом=0;                
    Был = 1;                
    СпрЦен.Записать();     
    КонецЕсли;             
    прервать;        
    КонецЦикла;
    
    
  3. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    Видимо я что-то не так поняла... Добавляла
    Код:
     МояДата=Дата(2009,06,01)
    
    
    ошибка
    Код:
    СтараяЦена = СпрЦен.Цена.Получить(МояДата);   
    {E:...ИЗМЕНЕНИЕЦЕНЫНОМЕНКЛАТУРЫРАБОЧАЯ.ERT(28)}: Значение не представляет агрегатный объект (Получить)
    
    
    и на форму поле дата добавляла с именем МояДата, но ошибку тогда выдает..

    Код:
    СтараяЦена = СпрЦен.Цена.Получить(МояДата);   
    {E:...ИЗМЕНЕНИЕЦЕНЫНОМЕНКЛАТУРЫРАБОЧАЯ.ERT(27)}: Значение не представляет агрегатный объект (Получить)
    
    
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    у вас типовая бухгалтерия? Какой релиз?
  5. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    7.70.500 типовая
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Проверьте в конфигураторе является ли реквизит ЦЕНА справочника ЦЕНЫ периодическим реквизитом (закладка дополнительно). Что-то здесь не так.....
  7. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    да, галочка стоит.
    Также стоит изменяется документами и ручное изменение
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Должно работать..... Посмотрите что есть СпрЦен
    Вставтьте до ошибки:
    Код:
    Сообщить(ТипЗначенияСтр(СпрЦен));
    Сообщить(СпрЦен.Вид());
    
    
  9. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    Код:
    (ТипЗначенияСтр(СпрЦен))     // справочник
    
    СпрЦен.Вид()   //цены
    
    
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда я ничего не понимаю...
    Реквизит Цены в справочнике ЦЕНЫ является периодическим (и вы это подтвердили что у вас это так), а ошибку выдает как будто он не периодический.... Выкладывайте обработку полностью - гляну
  11. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    и через
    Код:
    Если СпрЦен.ТипЦен = ТипЦены  Тогда 
    
    все равно сравнивает только первый тип цен у товара, и так же добавляет.. у нас 2 типа цена:цена приобретения и цена продажи. Цена продажи стоит везде первая, а установить мне надо цену приобретения.. когда она вторая в списке, то просто опять создается цена приобретения и новая цена, и у товара становится уже 3 типа цен две из которых одинаковы..


    Обработка

    Вложения:

  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    "Прервать" нужно внутрь условия... выбирается только действительно первый...
    Код:
    ......
    ЦенаНом=0;      
    прервать;  
    КонецЕсли;  
    
    
  13. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    так и ошибка-то внутри условия
    Код:
    Справочник  //это сообщение перед ошибкой
    Цены                      //сообщение перед ошибкой
    СтараяЦена = СпрЦен.Цена.Получить(МояДата);
    {D:\DOCUMENTS AND SETTINGS\OLGA\РАБОЧИЙ СТОЛ\МОИ ТЕСТИРУЕМЫЕ\77\ИЗМЕНЕНИЕЦЕНЫНОМЕНКЛАТУРЫРАБОЧАЯ.ERT(30)}: Значение не представляет агрегатный объект (Получить)
    
  14. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    Вот из этой обработки пыталась выдернуть идею, она работает..

    Вложения:

  15. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1) переместите "прервать" внутрь условия
    2) уберите напрочь "СпрЦен.ИспользоватьДату(Дата(2009,06,01));"

    Все будет работать....
  16. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    Вроде работает :) :) сейчас еще дату в новый() добавлю и дотестирую )))))))

    перестал создавать новую номенклатуру ((
  17. TopicStarter Overlay
    RoZii
    Offline

    RoZii Опытный в 1С

    Регистрация:
    29 июл 2009
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    все вроде создает, сделала новую базу для тестов )))) Спасибо большое за помощь ))))

Поделиться этой страницей