Имя: Пароль:
1C
1C 7.7
v7: Обработка выгрузки в дбф или хлс
,
0 ColonelAp4u
 
15.09.15
11:08
Добрый день уважаемые программисты. Ни когда ранее не сталкивался с кодом 7.7, но вот пришлось. Стоит Задача создать новую чистую БД с переносом долгов контрагентов. При загрузке из файла нужно создать док инвентаризация сальдо контрагента. А для начала выгрузить из базы ТиС файл с данными о контре и о взаиморасчете с ним. Нашел на мисте


////////////////////////////////////////////////////////
Процедура Выгрузить_в_Excel()
    xl=СоздатьОбъект("Excel.Application");
    xl.Workbooks.Add(); //Добавляем новый документ
    xl.Visible=1; //Делаем его видимым

    row=1; //первая строка
    спр=СоздатьОбъект("Справочник.Контрагенты");
    спр.ВыбратьЭлементы();
    Пока спр.ПолучитьЭлемент() = 1 Цикл
        xl.Cells(row,1).Value=спр.Код;
        xl.Cells(row,2).Value=спр.Наименование;
        row=row+1;//переходим на следующую строку
    КонецЦикла;
КонецПроцедуры
1 ColonelAp4u
 
15.09.15
11:09
Но как я понял он просто возьмет из спр контра и занесет в таблицу код наименование. А как сделать так что бы он еще занес взаиморасчеты
2 HawkEye
 
15.09.15
11:10
(0) откроется ексель и выгрузиться код и наименование контрагентов и групп - для загрузки не пойдёт... Ищи дальше
3 Рэйв
 
15.09.15
11:10
(1)Запрос к регистру надо, а не справочник перебирать
4 HawkEye
 
15.09.15
11:11
(1) надо писать код
5 Рэйв
 
15.09.15
11:11
+(0)Лучше в текст выгружай. И проще и не будешь зависить от того установлен ексель или нет
6 ColonelAp4u
 
15.09.15
11:11
(2) для загрузки есть другая мне пока выгрузить нужно
7 ColonelAp4u
 
15.09.15
11:12
делать запрос в взаиморасчеты?
8 Рэйв
 
15.09.15
11:13
(7)Ну, если они у тебя хранятся гдето еще, то в "где-то еще":-)
9 aka AMIGO
 
15.09.15
11:14
Три варианта:
взять с ИТС TRANREF.ERT
Использовать КД..2..
Перенести по OLE/COM
10 HawkEye
 
15.09.15
11:16
(6) ну я не сомневался, что есть, я даже уверен, что она что-то даже и загружает, как и эта... Что-то выгружать, вопрос насколько это будет отвечать твоим требованиям))
Ну ты эта... держи нас в курсе)
11 ColonelAp4u
 
15.09.15
11:55
Вроде как нашел откуда взять есть регистр контрагенты в нем есть контр и сальдо вот почему то ошибку выдает
спр=СоздатьОбъект("Регистры.Контрагенты");
{C:\USERS\ALBERT\DESKTOP\ВЫГРУЗКА В ЕХС.ERT(11)}: Неудачная попытка создания объекта (Регистры.Контрагенты)
12 ColonelAp4u
 
15.09.15
11:57
может регистр нужно не создать а прочитать? просто справка 1с не работает
13 ColonelAp4u
 
15.09.15
12:00
как в 7 обратится к регистру?
14 SiAl-chel
 
15.09.15
12:04
15 SiAl-chel
 
15.09.15
12:05
16 ColonelAp4u
 
15.09.15
12:26
Подскажите пож запрос обязателен в регистр? методом не получится воспользоваться?
Метод Остатки()?
17 ColonelAp4u
 
15.09.15
12:45
На основании данного примера пытаюсь сделать выборку данных
РегТовары = СоздатьОбъект("Регистр.Товары");

1. Метод Остаток
Синтаксис: Остаток(<Измерен1>,<Измерен2>...,<ИмяРесурса>

Пример:
//получить остаток данного товара на данном складе
Колво = РегТовары.Остаток (ТекТовар, ТекСклад, "Количество");

//получить стоимость данного товара на данном складе
Стоимость = РегТовары.Остаток (ТекТовар, ТекСклад, "Стоимость");
В измерения мне нужно подставлять измерения регистра? если да их 2 асКонтрагент, асАналитика. А ресурс у меня 1 чСальдо и получается пока я перебираю элементы справочника контрагенты я хочу подставить в измерение спр.наименование, спр.аналитика, а какой ресурс указать?
18 aka AMIGO
 
15.09.15
12:48
Лучше так:
Колво = РегТовары.СводныйОстаток (ТекТовар, ТекСклад, "Количество");
19 aka AMIGO
 
15.09.15
12:49
проверь количество запятых на соответствие Измерениям регистра
20 HawkEye
 
15.09.15
12:50
(17) чсальдо...
Не надо в измерения строки сувать...

Регистр.контрагенты, с измерениями контрагент, аналитика (реквизит контрагента) и ресурсом САЛЬДО - это ПЯТЬ
21 ColonelAp4u
 
15.09.15
13:55
(20) хоть 25 не я писал
22 SiAl-chel
 
15.09.15
14:29
(17) В 1С есть такое понятие как Ссылка. И она есть ни код, ни наименование (для справочника), это уникальный идентификатор. В измерениях регистров обычно указывают ссылку на справочник, а не наименование или что другое из простых типов данных.
23 ColonelAp4u
 
15.09.15
15:23
Выгрузку сделал, помогите с загрузкой не могу понять что то
24 ColonelAp4u
 
15.09.15
15:24
Необходимо что бы для каждой строки из файла если сальдо больше или меньше 0 (но не =) Создать документ инвентаризация сальдо контрагента
25 ColonelAp4u
 
15.09.15
15:25
Процедура Сформировать()
  //В одной транзакции запись элементов в базе DBF пойдет намного быстрее
    НачатьТранзакцию();

    xl=СоздатьОбъект("Excel.Application");
    //Получаем область с заполненными данными
    UsedRange=xl.ActiveSheet.UsedRange;
    //число строк в этой области
    rows=UsedRange.Rows.Count;
    спр=СоздатьОбъект("Справочник.Контрагенты");

    //цикл по строкам
    Спр2 = СоздатьОбъект("Справочник.Пользователи");
    Спр2.НайтиПоКоду("0000000001");

    Для row = 1 По rows Цикл
        //читаем строку из ячейки Excel (значения должны располагаться в первой колонке)
        имя=СокрЛП(UsedRange.Cells(row,1).Value);
        Долг = СокрЛП(UsedRange.Cells(row,2).Value);
        Док = СоздатьОбъект("Документ.ИнвентаризацияСальдо");
        Док.фсКонтрагент = спр.НайтиПоНаименованию(Имя);
        Док.асСотрудник =Спр2;
        Док.чОстаток = Долг;
        Док.Записать();
        
        
    
      
    КонецЦикла;
    ЗафиксироватьТранзакцию();
КонецПроцедуры
26 ColonelAp4u
 
15.09.15
15:26
ругается вот тут   UsedRange=xl.ActiveSheet.UsedRange;
27 ColonelAp4u
 
15.09.15
15:26
Плохой тип переменной
28 ColonelAp4u
 
15.09.15
19:04
Помогите кто на работе еще
Процедура Сформировать()
  //В одной транзакции запись элементов в базе DBF пойдет намного быстрее
    НачатьТранзакцию();

    xl=СоздатьОбъект("Excel.Application");
    //Получаем область с заполненными данными
    UsedRange1=xl.ActiveSheet.UsedRange;
    //число строк в этой области
    rows=UsedRange1.Rows.Count;
    спр=СоздатьОбъект("Справочник.Контрагенты");

    //цикл по строкам
  
    Для row = 1 По rows Цикл
        //читаем строку из ячейки Excel (значения должны располагаться в первой колонке)
        имя= UsedRange1.Cells(row,1).Value;
        Долг = UsedRange1.Cells(row,2).Value;
        Если Долг< 0 Тогда
               Док = СоздатьОбъект("Документ.ИнвентаризацияСальдо");
            Док.асКонтрагент =имя;
            Док.чОстаток = Долг;
            Док.Записать();
        ИначеЕсли Долг>0 Тогда
            Док = СоздатьОбъект("Документ.ИнвентаризацияСальдо");
            Док.асКонтрагент = спр.НайтиПоНаименованию(Имя);
            Док.чОстаток = Долг;
            Док.Записать();
        КонецЕсли;          
    КонецЦикла;
    ЗафиксироватьТранзакцию();
КонецПроцедуры
Загрузка из хлс файла которая создает док инвентаризация сальдо, реквизит контрагент не заполняется подскажите как его заполнить
29 ColonelAp4u
 
15.09.15
19:05
Пробую 2 варианта подставить просто имя(строка) и пытаюсь найти по имени но в 7 он возвращает не контра а 0 или 1 если найден или нет подскажите как заполнить реквизит если есть наименование
30 Кочерга
 
15.09.15
19:17
спр.НайтиПоНаименованию(Имя);
Док.асКонтрагент = спр.ТекущийЭлемент();
Если мне не изменяет мой склероз, то примерно около этого
31 HawkEye
 
16.09.15
08:32
(28) я же предупреждал.

xl=СоздатьОбъект("Excel.Application");
    //Получаем область с заполненными данными

ничего ты тут не получаешь... просто объект создаешь, файл кто за тебя открывать будет?

(30) это лишь вершина айсберга...
32 Остап Сулейманович
 
16.09.15
08:40
(28) За "ActiveSheet", АктивЦелл и прочие актив в ВБА руки нужно обрывать по самое немогу. Из вне МСО нужно работать с конкретными книгами, листами, ячейками.
33 ColonelAp4u
 
16.09.15
12:22
Ребят не критикуйте меня по программированию на 7 вчера увидел ее 1 раз в жизни. Обработки дали мне. эксель открыт с нужным файлом и тогда он с него читает уже все сделал.
Базу очистил через Сервис Очистка БД , а в регистрах остались записи как их оттуда грохнуть?
34 palpetrovich
 
16.09.15
12:29
мдя... на наших глазах происходит действие под названием " настоящему программисту пофик на чем писать" :)
35 palpetrovich
 
16.09.15
12:41
+(34) в общем, как уже говорили, хабудь про эксель, делай примерно так

// в базе источнике
Процедура ПолучитьОстаткиВзаиморасчетов()    
    Запрос = СоздатьОбъект("Запрос");                        
    ТекстЗапр = "
    |ПЕРИОД С д1 По д2;
    |Контрагент     = Регистр.ТвойРегистр.Контрагент;
    |ОстатокВзаиморасчетов = Регистр.ТовайРегистр.ТвойРессурс;
    |Функция Остаток = КонОст(ОстатокВзаиморасчетов);
    |Группировка Контрагент без групп;";
    Если ЗапросПоПартиям.Выполнить(ТекстЗапр) = 0 Тогда
        Возврат;
    КонецЕсли;
    тбОстаткиВ = СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(тбОстаткиВ,1,0);
    ЗначениеВФайл(КаталогИБ()+"Ost.txt",тбОстаткиВ,1);    
КонецПроцедуры    

// в базе приемнике
Процедура ВводОстатков()
    Перем тзОст;  
    ЗначениеИзФайла(КаталогИБ()+"OstPart.txt",тзОст,1);    
    спр= СоздатьОбъект("Справочник.Контрагенты");
    Док = СоздатьОбъект("Документ.ВводОстатковВзаиморасчетов");
    тзОст.ВыбратьСтроки();  
    Пока тзОст.ПолучитьСтроку()=1 цикл  
        Если спр.НайтиЭлемент(тзОст.Контрагент)=1 Тогда
            Док.Контрагент = спр.ТекущийЭлемент();
            Док.Долг = число(тзОст.Остаток);
        КонецЕсли;
    КонецЦикла;        
    Док.Записать();
КонецПроцедуры
36 Зеленый пень
 
16.09.15
12:52
э....
А почему бы просто не сделать табличный документ и его сохранить в Ексель через Файл - Сохранить как?
Программист всегда исправляет последнюю ошибку.