Имя: Пароль:
1C
1С v8
Загрузка цен из файла в документ
0 Валидатор
 
07.11.13
12:03
конфа 1с 8.2 КА, нужно загрузить данные из файла в документ установки цен номенклатуры, причем данные по двум видам цен - оптовая и розничная, создал в справочнике номенклатура эти виды предварительно, возникает вопрос при создании их в документе:
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
    
    Сообщить("Начало загрузки цен...");
    
    КЧ = Новый КвалификаторыЧисла(12,2);
    КД = Новый КвалификаторыДаты();
    КС = Новый КвалификаторыСтроки(30);
    КС2 = Новый КвалификаторыСтроки(40);
    Массив = Новый Массив;
    Массив.Добавить(Тип("Дата"));
    ОписаниеТиповД = Новый ОписаниеТипов(Массив, , КД);
    Массив.Очистить();
    Массив.Добавить(Тип("Число"));
    ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
    Массив.Очистить();
    Массив.Добавить(Тип("Строка"));
    ОписаниеТиповС = Новый ОписаниеТипов(Массив, , ,КС);
    Массив.Очистить();
    Массив.Добавить(Тип("Строка"));
    ОписаниеТиповС2 = Новый ОписаниеТипов(Массив, , ,КС2);
    Массив.Очистить();
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить("АртикулНом",ОписаниеТиповС2 , "Код номенклатуры");
    ТаблицаЗначений.Колонки.Добавить("АртикулБезПрефикса",ОписаниеТиповС2 , "артикул без префикса");
    ТаблицаЗначений.Колонки.Добавить("Номенклатура",ОписаниеТиповС2 , "Описание номенклатуры");
    ТаблицаЗначений.Колонки.Добавить("ЦенаОпт",ОписаниеТиповС2 , "Цена оптовая");
    ТаблицаЗначений.Колонки.Добавить("ЦенаРозн",ОписаниеТиповС2 , "Цена розничная");
    ТаблицаЗначений.Колонки.Добавить("ЦенаРознБезСкидки",ОписаниеТиповС2 , "Цена розничная без скидки");
    ТаблицаЗначений.Колонки.Добавить("Скидка",ОписаниеТиповС2 , "Скидка");
    ТаблицаЗначений.Колонки.Добавить("Штрихкод",ОписаниеТиповС2 , "Штрихкод");

    Текст = Новый ЧтениеТекста(ПутьКФайлу, "cp866");
    Стр = Текст.ПрочитатьСтроку();
    Пока Стр <> Неопределено Цикл
        МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"&#9474;");
        НоваяТЗ = ТаблицаЗначений.Добавить();
        АртикулНом = МассивСтрок[0];
        НоваяТЗ.АртикулНом = СокрЛП(АртикулНом);
        
        АртикулБезПрефикса = МассивСтрок[1];
        НоваяТЗ.АртикулБезПрефикса = СокрЛП(АртикулБезПрефикса);
        
        Номенклатура = МассивСтрок[2];
        НоваяТЗ.Номенклатура = СокрЛП(Номенклатура);
        
        ЦенаОпт = МассивСтрок[3];
        НоваяТЗ.ЦенаОпт = СокрЛП(ЦенаОпт);
        
        ЦенаРозн = МассивСтрок[4];
        НоваяТЗ.ЦенаРозн = СокрЛП(ЦенаРозн);

        ЦенаРознБезСкидки = МассивСтрок[5];
        НоваяТЗ.ЦенаРознБезСкидки = СокрЛП(ЦенаРознБезСкидки);
        
        Скидка = МассивСтрок[6];
        НоваяТЗ.Скидка = СокрЛП(Скидка);
        
        Штрихкод = МассивСтрок[7];
        НоваяТЗ.Штрихкод = СокрЛП(Штрихкод);
        
        Стр = Текст.ПрочитатьСтроку();
        Если ТипЗнч(Стр) = Неопределено Тогда
            Продолжить;    
        КонецЕсли;
    КонецЦикла;
    
    Документ = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    Документ.Комментарий = Комментарий;
    Документ.Дата = ТекущаяДата();
    СтрокаТиповЦен = Документ.ТипыЦен.Добавить();
    Розничная = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");
    СтрокаТиповЦен.ТипЦен = Розничная;
    
    Для каждого Строчка из ТаблицаЗначений Цикл
            НоменклатураПоискПоНаименованию = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Строчка.АртикулНом);
            Если НоменклатураПоискПоНаименованию = Справочники.Номенклатура.ПустаяСсылка() Тогда
                НоменклатураПоискПоНаименованию = СоздатьНоменклатуру(Строчка.АртикулНом, Строчка.Номенклатура, ГруппаТоваровНов,Строчка.Штрихкод);
                НоменклатураПоискПоНаименованию = НоменклатураПоискПоНаименованию.Ссылка;    
            КонецЕсли;
            НоваяСтрока = Документ.Товары.Добавить();
            НоваяСтрока.ТипЦен = Плановая;
            Валюты = Справочники.Валюты.НайтиПоНаименованию("руб.");
            НоваяСтрока.Валюта = Валюты;
            НоваяСтрока.ЕдиницаИзмерения = НоменклатураПоискПоНаименованию.ЕдиницаХраненияОстатков;
            НоваяСтрока.Номенклатура = НоменклатураПоискПоНаименованию;
            НоваяСтрока.ПроцентСкидкиНаценки = Строчка.Скидка;
            НоваяСтрока.Цена = Число(Строчка.ЦенаРозн);
        Попытка
            Документ.Записать();
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;    
    
    Сообщить("Цены были загружены");
КонецПроцедуры   //ОсновныеДействияФормыОсновныеДействияФормыВыполнить
вот как тут загрузить сразу 2 типа цен?
1 Валидатор
 
07.11.13
12:09
в одни документ сразу
2 Валидатор
 
07.11.13
12:18
все, разробрался
3 Валидатор
 
07.11.13
16:33
хотя нет, проблема еще актуальна, как загрузить в одну строку два вида цен?
4 Михаил Козлов
 
07.11.13
16:36
В ТЧ типы цен добавить 2 строки. В ТЧ Товары правильно оформить ИндексСтрокиТаблицыЦен (завести документ с 2 типами цен и несколькими товарами и потом запросом посмотреть, как этот индекс формируется).
5 Валидатор
 
07.11.13
17:04
(4) добавил, один тип цен - Розничная, другая - Оптовая, а если грузить сначала одну, а потом другуЮ и в конце сворачивать их по номелктауре?
6 Михаил Козлов
 
07.11.13
17:08
(5) Заведите документ руками и посмотрите на содержание табличных частей: ИндексСтрокиТаблицыЦен нужен для заполнения таблицы значений на форме.
7 Валидатор
 
07.11.13
17:11
(6) я не совсем понимаю что такое ИндексСтрокиТаблицыЦен
8 Валидатор
 
07.11.13
17:12
(6) создал документ руками, в типе цен выбрал Розничная и Оптовая, появилось скажем так 2 колонки больших разделенных еще http://pikucha.ru/icgK9
9 Валидатор
 
07.11.13
17:24
Документ = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
Документ.Комментарий = Комментарий;
    Документ.Ответственный = ПараметрыСеанса.ТекущийПользователь;
    Документ.Дата = ТекущаяДата();
    СтрокаТиповЦен = Документ.ТипыЦен.Добавить();
    Розничная = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");
    Оптовая = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Оптовая");

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


Делаю так и не особо индекс помогает(
10 KUBIK
 
07.11.13
17:26
(8) Вот кусок кода (DBF --> Розница 1.0) смотри:

     Если Результат.Пустой() Тогда
         Док=Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
         Док.Номер=НомерДок;
         Док.УстановитьВремя(РежимАвтоВремя.НеИспользовать);
         Док.Дата=ДатаДок+ДБФ.TimeH*60*60+ДБФ.TimeM*60+ДБФ.TimeS;
        
     Иначе
         Выборка=Результат.Выбрать();
         Пока Выборка.Следующий() Цикл
             Док=Выборка.Ссылка.ПолучитьОбъект();
             Если Док.Проведен Тогда
                 Сообщить("Найден проведенный документ :"+Док+". Пропущен");
                 Успех=Ложь;
                 Возврат Успех;
             Иначе    
                 Док.УстановитьВремя(РежимАвтоВремя.НеИспользовать);
                 Док.Дата=ДатаДок+ДБФ.TimeH*60*60+ДБФ.TimeM*60+ДБФ.TimeS;
                 НайденНепроведенным=Истина;
                 Док.Товары.Очистить();
                 Док.ТипыЦен.Очистить();
             КонецЕсли;
         КонецЦикла;    
     КонецЕсли;
    
     Док.НеПроводитьНулевыеЗначения=Ложь;
     Док.Ответственный=Ответственный;
    
     ТЦ=Док.ТипыЦен.Добавить();
     ТЦ.ТипЦен=ТипЦенЗакупка;
     ТЦ=Док.ТипыЦен.Добавить();
     ТЦ.ТипЦен=ТипЦенПродажа;
     ТЦ=Док.ТипыЦен.Добавить();
     ТЦ.ТипЦен=ТипЦенОбщепит;
    
     Док.Комментарий="#Загружен из 7.7: Установка цен №"+НомерДок77+" от "+Формат(ДатаДок,"ДЛФ=Д")+?(СокрЛП(ДБФ.KOMMENT)="",""," | "+СокрЛП(ДБФ.KOMMENT));
    
     ДБФТ.ТекущийИндекс=ДБФТ.Индексы.iIDX;
     ДБФТ.Ключ.IDX=ДБФ.IDX;
     //ДБФТ.ТекущийИндекс=ДБФТ.Индексы.iNOMERDOC;
     //ДБФТ.Ключ.NOMERDOC=ДБФ.NOMERDOC;
    Сч=0;
    
     Если ДБФТ.НайтиПоКлючу("=") Тогда
        
         Код77=СокрЛП(ДБФТ.CODE);
         ТекТов=НайтиНоменклатуру(Код77);
        
            
        
         Если ДБФТ.PRICEPIT=0 И ДБФТ.PRICEZAK=0 И ДБФТ.PRICEPRO=0 Тогда
         Иначе    
             Если  ТекТов.Пустая() Тогда
                 Сообщить("Товар: Код "+Код77+" не обнаружен в базе данных! Пропущено!", СтатусСообщения.Важное);
            Иначе    
                
                 НС=Док.Товары.Добавить();
                 НС.Номенклатура=ТекТов;
                 НС.ЕдиницаИзмерения=ТекТов.ЕдиницаХраненияОстатков;
                 НС.ТипЦен=ТипЦенЗакупка;
                 НС.Цена=ДБФТ.PRICEZAK;
                 НС.ИндексСтрокиТаблицыЦен=Сч;
                 //
                 НС=Док.Товары.Добавить();
                 НС.Номенклатура=ТекТов;
                 НС.ЕдиницаИзмерения=ТекТов.ЕдиницаХраненияОстатков;
                 НС.ТипЦен=ТипЦенПродажа;
                 НС.Цена=ДБФТ.PRICEPRO;
                 НС.ИндексСтрокиТаблицыЦен=Сч;
                 //
                 НС=Док.Товары.Добавить();
                 НС.Номенклатура=ТекТов;
                 НС.ЕдиницаИзмерения=ТекТов.ЕдиницаХраненияОстатков;
                 НС.ТипЦен=ТипЦенОбщепит;
                 НС.Цена=ДБФТ.PRICEPIT;
                 НС.ИндексСтрокиТаблицыЦен=Сч;
                 //
                 Сч=Сч+1;
             КонецЕсли;
            
         КонецЕсли;
        
        
         Пока ДБФТ.Следующая() Цикл
            
             Если ДБФТ.IDX=ДБФ.IDX Тогда
                 //Если ДБФТ.NOMERDOC=ДБФ.NOMERDOC Тогда
                 Код77=СокрЛП(ДБФТ.CODE);
                 ТекТов=НайтиНоменклатуру(Код77);
                
                 Если ДБФТ.PRICEPIT=0 И ДБФТ.PRICEZAK=0 И ДБФТ.PRICEPRO=0 Тогда
                 Иначе    
                     Если  ТекТов.Пустая() Тогда
                         Сообщить("Товар: Код "+Код77+" не обнаружен в базе данных! Пропущено!", СтатусСообщения.Важное);
                     Иначе
                         НС=Док.Товары.Добавить();
                         НС.Номенклатура=ТекТов;
                         НС.ЕдиницаИзмерения=ТекТов.ЕдиницаХраненияОстатков;
                         НС.ТипЦен=ТипЦенЗакупка;
                         НС.Цена=ДБФТ.PRICEZAK;
                         НС.ИндексСтрокиТаблицыЦен=Сч;
                         //
                         НС=Док.Товары.Добавить();
                         НС.Номенклатура=ТекТов;
                         НС.ЕдиницаИзмерения=ТекТов.ЕдиницаХраненияОстатков;
                         НС.ТипЦен=ТипЦенПродажа;
                         НС.Цена=ДБФТ.PRICEPRO;
                         НС.ИндексСтрокиТаблицыЦен=Сч;
                         //
                         НС=Док.Товары.Добавить();
                         НС.Номенклатура=ТекТов;
                         НС.ЕдиницаИзмерения=ТекТов.ЕдиницаХраненияОстатков;
                         НС.ТипЦен=ТипЦенОбщепит;
                         НС.Цена=ДБФТ.PRICEPIT;
                         НС.ИндексСтрокиТаблицыЦен=Сч;
                         //
                         Сч=Сч+1;
                     КонецЕсли;
                 КонецЕсли;
             Иначе
                 Прервать;
             КонецЕсли;
         КонецЦикла;
     КонецЕсли;
    
     Если Док.Товары.Количество()=0 Тогда
         Сообщить("Документ "+Док.Номер+" не будет записан! Не заполнена ПОЛНОСТЬЮ табличная часть документа! Выполните обновление справочника ""Номенклатура""!",СтатусСообщения.Важное);
         Успех=Ложь;
         Возврат Успех;
     КонецЕсли;
11 lamme
 
07.11.13
17:37
(0)
кеп. идеология документа УстановкаЦенНоменуклатуры такая.
в ТЧ = ТипыЦен  - устанавливаешь свои типы цен, которые надо установить собственно
в ТЧ = Товары - прописываешь товары ,которым устанавливаешь цену. В этой же колонке есть и реквизит = ТипЦен
при этом Товары.ТипЦен - должен быть одним из ТипыЦен.ТипЦен
-
12 Валидатор
 
07.11.13
17:45
(11) так и делал, создавал документ, добавлял 1 тип цен , потом грузил данные по этому типу цен циклом, потом добалвлял другой тип цен и грузил по нему данные
13 х86
 
07.11.13
17:47
(0)посмотри поиском, я уже раз надцать постил процедуру заполнения установки цен
14 Валидатор
 
07.11.13
17:50
(13) нету
15 х86
 
07.11.13
17:52
16 Валидатор
 
07.11.13
17:55
(15) под каким ты там ником? мне кажется там все вариаты не особо рабочие)
17 Михаил Козлов
 
07.11.13
17:55
(8) Добавьте несколько товаров и посмотрите в ЗАПРОСЕ.
18 Валидатор
 
07.11.13
17:55
(15) у меня дело в том что сразу по 2 видам цен данные грузятся, по 1 то без проблем, а вот одновременно два нет
19 Валидатор
 
07.11.13
17:56
(17) происходит дублирование просто данных, а вот в какой момент не могу понять(
20 х86
 
07.11.13
17:57
(16)первое что нашёл
там есть идеи
21 Wobland
 
07.11.13
17:59
(17) автору нужно узнать, что все данные хранятся в таблицах. а это уже уровнем выше
22 Михаил Козлов
 
07.11.13
18:00
(18) В ТЧ товары будет 2 строки на каждую номенклатуру. Различаются индексом.
23 Валидатор
 
07.11.13
18:00
(20) там идеи для заполнения 1 вида цен по тем идеям для двух и более видов цен будет как у меня:
             Розничная                          Оптовая
ванна        10
рог          15
стул        45
ванна                                                2
рог                                                13
стул                                               14
24 Валидатор
 
07.11.13
18:01
(22) то я понял, в консоли запросов у меня по 4 строки получается, поэтому и не выводится ничего, вот и непонятносьт, в какой момент в коде дублироваться может информация