Имя: Пароль:
1C
1С v8
Пишу загрузку есть проблемы ..
0 anisa8310
 
14.09.14
21:36
Пишу загрузку, два файла-один проданные услуги, второй полученные оплаты, создаю и загружаю в документ "ОтчетОРозничныхПродажах", из первого файла загружаю в ТЧ Товары; из второго нужно в оплаты-по первому проблем не возникло-все нормально; Но как мне данные из второго массива загнать в этот же документ..второй процедурой-тогда нужно как то выцепить тот самый документ который идет загрузка..вот код: Подскажите пожалуйста, кто поопытнее, как мне лучше поступить) Заранее всех благодарю!

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

КонецПроцедуры

//Выбираем оплаты
&НаКлиенте
Процедура ПутьНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбораФайла.Фильтр                  = "Текстовые файлы (*.csv)|*.csv";
    ДиалогВыбораФайла.Заголовок               = "Выберите файл для загрузки данных";
    ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
    ДиалогВыбораФайла.Расширение              ="csv";
    ДиалогВыбораФайла.ИндексФильтра           = 0;
    ДиалогВыбораФайла.ПолноеИмяФайла          = Путь;
    Если ДиалогВыбораФайла.Выбрать() Тогда
        Путь = ДиалогВыбораФайла.ПолноеИмяФайла;
    КонецЕсли;

КонецПроцедуры



Процедура ЗагрузитьТоварыУслуги()
    //Запросом поверяем загружался ли услуги/товары ранее
    Запрос = Новый Запрос;
    Запрос.Текст=  " ВЫБРАТЬ
                     |    ОтчетОРозничныхПродажах.Ссылка,
                     |    ОтчетОРозничныхПродажах.Склад,
                     |    ОтчетОРозничныхПродажах.Товары.(
                     |        Транзакция
                     |    )
                     |ИЗ
                     |    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах"   ;
                  
    РезультатРеализация=Запрос.Выполнить();
                  
    /////////////Открытие xls-документа     товаров и услуг
    ///////////////////////////////////////////////////////////////////////
    Док = ПолучитьCOMОбъект(Путь1);
    счСтроки = 1;
    
    

    /////////////////////////Перебор строк услуг    
    Пока Док.Sheets(1).Cells(счСтроки,1).Value <>Неопределено Цикл
    Стр=Док.Sheets(1).Cells(счСтроки,1).Value;    
    //////////////Формирование массива услуги    
    Массив = Новый Массив(42);
    Для Сч=1 По 42 Цикл
        Позиция = Найти(Стр, ",");
        Массив.Вставить(сч,Сред(Стр, 1, Позиция-1));
        стр = Сред(Стр, Позиция + 1);
    КонецЦикла;
          
  
    Если СтрЗаменить(Массив[5],Символ(34),"")<>"890" и СтрЗаменить (Массив[11], Символ(34),"")<>"0" тогда          
        /////////Поиск документа по транзакции    
        ВыборкаРеализация = РезультатРеализация.Выбрать();
        ДокументПрисутствует = Ложь;
        Пока ВыборкаРеализация.Следующий() Цикл
            ВыборкаУслуги=ВыборкаРеализация.товары.выбрать();
            Пока ВыборкаУслуги.следующий() Цикл
                Если ВыборкаУслуги.Транзакция = Массив[2] тогда
                    ДокументПрисутствует = Истина;    
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;

////////////////Создание нового документа    
Если ДокументПрисутствует = Ложь тогда
    
  //Склад = СкладФорма;
/////////////////////Создаем запрос для выборки документа    
ЗапросДок = Новый Запрос;
ЗапросДок.Текст = "ВЫБРАТЬ
                  |    ОтчетОРозничныхПродажах.Ссылка
                  |ИЗ
                  |    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
                  |ГДЕ
                  |    ОтчетОРозничныхПродажах.Дата = &Дата
                  |    И ОтчетОРозничныхПродажах.Склад = &Склад";
ЗапросДок.УстановитьПараметр("Дата",Дата(СтрЗаменить(СтрЗаменить(Массив[30],Символ(34),""),"-","") ));
ЗапросДок.УстановитьПараметр("Склад",Склад.Ссылка);

РезультатДок = ЗапросДок.Выполнить().Выбрать();
//Результат1 = Запросдок.Выполнить().Выгрузить();


Если  РезультатДок.Количество()=0 тогда
    ///////////Создаем новый документ
    НовыйДокумент= Документы.ОтчетОРозничныхПродажах.СоздатьДокумент();
    НовыйДокумент.Организация = Организация ;
    НовыйДокумент.ВидОперации=Перечисления.ВидыОперацийОтчетОРозничныхПродажах.ОтчетККМОПродажах;
    НовыйДокумент.Дата = Дата(СтрЗаменить(СтрЗаменить(Массив[30],Символ(34),""),"-",""));
    НовыйДокумент.Склад =Склад;
    НовыйДокумент.СтатьяДвиженияДенежныхСредств=СДДС;
    НовыйДокумент.СчетКасса=СчетКассы;
    НовыйДокумент.СуммаВключаетНДС=Истина;
    НовыйДокумент.ВалютаДокумента=Справочники.Валюты.НайтиПоКоду("643");
    НовыйДокумент.Комментарий="Документ создан автоматически "+Массив[7];
    
    
    
    /////////Создаем строку табличной части услуги
    Услуги = НовыйДокумент.Товары.Добавить();        
    //Ищем номенклатуру с кодом если нет тогда созлаем и подставляем в документ
      
    Если Массив[5]<>"890" тогда
        Если Справочники.Номенклатура.НайтиПоРеквизиту("КодФиделио",Строка(Массив[5])).Пустая()=Ложь тогда
            Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("КодФиделио",Строка(Массив[5])).Ссылка;
        иначе
            Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
            Номенклатура.Наименование = Строка(СтрЗаменить(Массив[6],"#",Символ(34)));
            Номенклатура.КодФиделио = Строка(Массив[5]);
            Номенклатура.Комментарий="Создан автоматически при загрузки от "+ТекущаяДата();
            Номенклатура.ЕдиницаИзмерения=Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
            //Указать родителя номенклатуры
            //нужно сравнить коды разделить товары и услуги в этом месте
            Номенклатура.Услуга=Истина;
            Номенклатура.СтавкаНДС=Перечисления.СтавкиНДС.НДС18;
            

            Номенклатура.Записать();  
        КонецЕсли;
    КонецЕсли;    
    
    //Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("КодФиделио",СтрЗаменить(Массив[5],Символ(34),""));        
    Услуги.Номенклатура=Номенклатура.Ссылка;
    Услуги.Транзакция = Массив[2];
    Услуги.Цена= Массив[10];
    Услуги.Количество= Массив[12];
    Услуги.Сумма = Массив[12]*Массив[10];
    Услуги.Гость = Массив[24];
    Услуги.НомерПостоянногоСчета = СтрЗаменить(Массив[33],Символ(34),"");
    Услуги.НомерЧека = СтрЗаменить(Массив[38],Символ(34),"");
    Услуги.Субконто=Номенклатура.НоменклатурнаяГруппа;
    //Услуги.Субконто=Номенклатура.НоменклатурнаяГруппа;
    
    Услуги.СтавкаНДС = Номенклатура.СтавкаНДС;
    //Услуги.СуммаНДС=Массив[10]
    Услуги.СуммаНДС=Число((Услуги.Сумма/1.18)-Услуги.Сумма)*(-1);
    Услуги.СчетДоходов = СчетДоходов;
    Услуги.СчетРасходов = СчетРасходов;    
    Услуги.СчетУчетаНДСПоРеализации = СчетУчетаНДС;
    //Создаем строку табличной части оплаты
        
    НовыйДокумент.Записать();
    
    
Иначе
    ////////////////////Добавляем новую строку услуги в существующий документ
    РезультатДокумент = ЗапросДок.Выполнить().Выгрузить()[0];
    Документ = РезультатДокумент.Ссылка.ПолучитьОбъект();
    Услуги = Документ.товары.Добавить();        
    Если Массив[5]<>"890" тогда
        Если Справочники.Номенклатура.НайтиПоРеквизиту("КодФиделио",Строка(Массив[5])).Пустая()=Ложь тогда
            Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("КодФиделио",Строка(Массив[5])).Ссылка;
        иначе
            Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
            Номенклатура.Наименование = Строка(СтрЗаменить(Массив[6],"#",Символ(34)));
            Номенклатура.КодФиделио = Строка(Массив[5]);
            Номенклатура.Комментарий="Создан автоматически при загрузки от "+ТекущаяДата();
            Номенклатура.ЕдиницаИзмерения=Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
            //Указать родителя номенклатуры
            //нужно сравнить коды разделить товары и услуги в этом месте
            Номенклатура.Услуга=Истина;
            Номенклатура.СтавкаНДС=Перечисления.СтавкиНДС.НДС18;
            Номенклатура.Записать();  
        КонецЕсли;
    КонецЕсли;    

    //Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("КодФиделио",СтрЗаменить(Массив[5],Символ(34),""));        
    Услуги.Номенклатура=Номенклатура.Ссылка;
    Услуги.Транзакция = Массив[2];
    Услуги.Цена= Массив[10];
    Услуги.Количество= Массив[12];
    Услуги.Сумма = Массив[12]*Массив[10];
    Услуги.Гость = Массив[24];
    Услуги.НомерПостоянногоСчета = СтрЗаменить(Массив[33],Символ(34),"");
    Услуги.НомерЧека = СтрЗаменить(Массив[38],Символ(34),"");
    Услуги.Субконто=Номенклатура.НоменклатурнаяГруппа;
    //Услуги.Субконто=Номенклатура.НоменклатурнаяГруппа;
    Услуги.СтавкаНДС = Номенклатура.СтавкаНДС;
    Услуги.СуммаНДС=Число((Услуги.Сумма/1.18)-Услуги.Сумма)*(-1);
    Услуги.СчетДоходов = СчетДоходов;
    Услуги.СчетРасходов = СчетРасходов;    
    Услуги.СчетУчетаНДСПоРеализации = СчетУчетаНДС;
    
    
    Документ.Записать();
    
    
    
КонецЕсли;
КонецЕсли;
КонецЕсли;
счСтроки = счСтроки + 1;

КонецЦикла;

Сообщить("Реализация товаров и услуг  загружена ");



//////////закрываем документ
Док.Application.Quit();
                  
КонецПроцедуры  



Процедура ЗагрузитьОплаты()
        ///////////////////////////////////////////////////////////////////////
    Док = ПолучитьCOMОбъект(Путь);
    счСтроки = 1;


    /////////////////////////Перебор строк    
    Пока Док.Sheets(1).Cells(счСтроки,1).Value <>Неопределено Цикл
    Стр=Док.Sheets(1).Cells(счСтроки,1).Value;    
    //////////////Формирование массива услуги    
    Массив = Новый Массив(42);
    Для Сч=1 По 42 Цикл
        Позиция = Найти(Стр, ",");
        Массив.Вставить(сч,Сред(Стр, 1, Позиция-1));
        стр = Сред(Стр, Позиция + 1);
    КонецЦикла;
          

    Если СтрЗаменить(Массив[5],Символ(34),"")<>"900" и СтрЗаменить(Массив[5],Символ(34),"")<>"903"
        и СтрЗаменить (Массив[11], Символ(34),"")<>"0" и СтрЗаменить (Массив[21], Символ(34),"")<>"COMPANY"
        тогда          
    /////////////Создаем новый документ
        
                                                            
    /////////Создаем строку табличной части услуги
    //Услуги = НовыйДокумент.Оплата.Добавить();
    
    Если Массив[21]<>"COMPANY" тогда
            
    
    ВидыОплаты = Справочники.ВидыОплатОрганизаций.НайтиПоРеквизиту("КодФиделио",СтрЗаменить(Массив[5],Символ(34),""));        
    Услуги.ВидОплаты=ВидыОплаты.Ссылка;
    Услуги.Транзакция = Массив[2];
    Услуги.Контрагент = Справочники.Контрагенты.НайтиПоКоду("00-000057");
    Услуги.ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.НайтиПоКоду("00-000030");
    Услуги.СуммаОплаты = Массив[10];
    Услуги.СчетУчетаРасчетов=ПланыСчетов.Хозрасчетный.ПродажиПоПлатежнымКартам;
    //НовыйДокумент.Дата = Массив[7];

    //НовыйДокумент.Записать();

    
    
    

КонецЕсли;
КонецЕсли;
счСтроки = счСтроки + 1;

КонецЦикла;
Сообщить("Оплаты  загружены ");


//////////закрываем документ
Док.Application.Quit();
                  
КонецПроцедуры
1 vicof
 
14.09.14
22:08
В чем проблема-то?
2 Сияющий Асинхраль
 
14.09.14
22:15
Попробуй сформулировать вопрос по-другому, не выкатывая кучу строчек кода, которые все равно никто изучать не будет. Ну и уточнить неплохо бы для какой конфы делаешь, в УТ11 в отчете о розничных продажах отдельно отплат нет в принципе. В бухе кажись есть, притом только для случая эквайринга...
3 Зеленый Кот
 
14.09.14
23:04
ну почему не будет..
мне завтра загрузку из DBF писать...
пригодится!
Спасибо!
4 anisa8310
 
15.09.14
09:03
(3) У меня есть отличная выгрузка в DBF!
5 anisa8310
 
15.09.14
09:04
(2) В одном цикле прочитать два массива-возможно ли такое?
6 anisa8310
 
15.09.14
09:05
Док = ПолучитьCOMОбъект(Путь);
    счСтроки = 1;


    /////////////////////////Перебор строк    

    Пока Док.Sheets(1).Cells(счСтроки,1).Value <>Неопределено Цикл
    Стр=Док.Sheets(1).Cells(счСтроки,1).Value;    
    //////////////Формирование массива услуги    

    Массив = Новый Массив(42);
    Для Сч=1 По 42 Цикл
        Позиция = Найти(Стр, ",");
        Массив.Вставить(сч,Сред(Стр, 1, Позиция-1));
        стр = Сред(Стр, Позиция + 1);
    КонецЦикла;
это первый массив-и второй тоже в этом цикле профитать-но как если они одинаково называются
7 Wobland
 
15.09.14
09:07
(6) хто называются?
8 el7cartel
 
15.09.14
09:08
(6) переименуй! какие проблемы)))
9 Crush
 
15.09.14
09:08
(6) Одному из массивов дать другое имя?:)
10 anisa8310
 
15.09.14
09:14
Массив = Новый Массив(42);
    Для Сч=1 По 42 Цикл
        Позиция = Найти(Стр, ",");
        Массив.Вставить(сч,Сред(Стр, 1, Позиция-1));
        стр = Сред(Стр, Позиция + 1);
    КонецЦикла;
А как дать массиву другое имя?
разве можно это же некий объект?
11 MaxS
 
15.09.14
09:15
(3) ага, особенно этот код в цикле:
Номенклатура.ЕдиницаИзмерения=Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
Разработчики 1С платформы стараются, клиент-серверные технологии затачивают, управляемые формы... А програм_мисты_ пишут такой код. SQL сервер наверное думает - "они что там? Совсем память короткая? Зачем тыщу раз в секунду спрашивать одно и то же?"
12 Wobland
 
15.09.14
09:15
ВовсеНеМассив = Новый Массив(42);
13 Crush
 
15.09.14
09:17
(10) Это переменная.
ЭтаПеременнаяСодержитМассивКакЕёНеНазови = Новый Массив(42);
14 anisa8310
 
15.09.14
09:31
(11) да поняла -конечно это не окончательный вариант-учту-что надо один раз на сервер сбегать и запомнить-чтоб сто раз не бегать))
15 anisa8310
 
15.09.14
09:31
пока вот так...массивы-может надо было список значений делать...с массивом мало сталкивалась..
16 Wobland
 
15.09.14
09:36
(15) может обойтись без прокладки в виде массива или СЗ?
17 anisa8310
 
15.09.14
09:38
(16) а еще как можно? -файл раскладывать список значений и в массив)
18 Wobland
 
15.09.14
09:39
(17) складывать данные из файла сразу туда, куда надо, можно
19 anisa8310
 
15.09.14
09:43
мммм...интересненько-но пока некогда
20 Crush
 
15.09.14
12:04
(19)БУ ГА га:)
Сюжет для новой серии мультфильма "Маша и медведь":)
21 Torquader
 
15.09.14
12:07
(11) А разве кеш не спасёт от такого горе-программиста ?
22 Torquader
 
15.09.14
12:08
(20) Тут больше "база и песец" просматривается.
23 МишельЛагранж
 
15.09.14
12:16
(14) ничего не понял - то ли в txt выгрузка, то ли из XLS, то ли DBF...
(6) с массивами вообще какая-то чутунька...
(4) "У меня есть отличная выгрузка в DBF!"
сколько раз слышал - столько раз на поверку чухня какая-то оказывалось...
24 MaxS
 
15.09.14
12:24
(21) спасет, возможно, но при загрузке номенклатуры сплошь и рядом встречается код поиска номенклатуры  по одному реквизиту, в цикле построчной обработки файла. Здесь с кешем сложнее.