Имя: Пароль:
1C
1С v8
Загрузка из DBF В бух 8,3
, ,
0 Arutynov
 
04.09.14
16:06
Есть код загрузки.
    БД = Новый XBase;
    БД.Кодировка = КодировкаXBase.OEM;
    БД.ОткрытьФайл(Объект.ВыбрФайл);
    Если БД.Открыта()=0 Тогда
          Сообщить( "Плохой dbf-файл!");
            Возврат;
    КонецЕсли;
    Если БД.Первая()=0 Тогда
             Сообщить("Ошибка файла dbf - сбой!!!!!!");
    КонецЕсли;


    
    Таб = Новый("ТаблицаЗначений");
    Таб.Колонки.Добавить("Numb");
    Таб.Колонки.Добавить("Date");
    Таб.Колонки.Добавить("Klkod");
    Таб.Колонки.Добавить("Klname");
    Таб.Колонки.Добавить("Tkod");
    Таб.Колонки.Добавить("Tvname");
    Таб.Колонки.Добавить("Bei");
    Таб.Колонки.Добавить("Kol");
    Таб.Колонки.Добавить("INN");
    Таб.Колонки.Добавить("NDS");
    Таб.Колонки.Добавить("Cena");
    Таб.Колонки.Добавить("Summa");

    Пока Не БД.ВКонце() Цикл
        НоваяСтрока                     = Таб.Добавить();
        
        НоваяСтрока.Numb        =БД.Numb;
        НоваяСтрока.Date        =БД.Date;
        НоваяСтрока.Klkod        =БД.Klkod;
        НоваяСтрока.Klname        =БД.Klname;
        НоваяСтрока.Tkod        =БД.Tkod;
        НоваяСтрока.Tvname      =БД.Tvname;
        НоваяСтрока.Bei         =БД.Bei;
        НоваяСтрока.Kol            =БД.Kol;
        НоваяСтрока.INN            =БД.INN;
        НоваяСтрока.NDS            =БД.NDS;
        НоваяСтрока.Cena        =БД.Cena;
        НоваяСтрока.Summa       =БД.Summa;
        НоваяСтрока.INN            =БД.INN;


        БД.Следующая();
    КонецЦикла;
    Таб.Сортировать("Numb");
    НачатьТранзакцию();
    Буф="";
    Для каждого Стрк из Таб цикл
        Если буф<>Стрк.Numb тогда
        новыйТовар=Документы.РеализацияТоваровУслуг.СоздатьДокумент();
        новыйТовар.Номер=Стрк.Numb;
        новыйТовар.Дата=стрк.Date;
        новыйТовар.ВидОперации=перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;
        Организация=Справочники.Организации.НайтиПоКоду("00-000001");
        новыйТовар.Организация=Организация;

        новыйТовар.Контрагент=Справочники.Контрагенты.НайтиПоКоду(стрк.Klkod);
        новыйТовар.ДоговорКонтрагента=новыйТовар.Контрагент.ОсновнойДоговорКонтрагента;
        новыйТовар.ПодразделениеОрганизации=Справочники.ПодразделенияОрганизаций.НайтиПоКоду("00-000001");
        новыйТовар.ТипЦен=Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("00-000001");
        новыйТовар.ВалютаДокумента=Справочники.Валюты.НайтиПоКоду("643");
        новыйТовар.СуммаВключаетНДС=Истина;
        новыйТовар.СпособЗачетаАвансов=перечисления.СпособыЗачетаАвансов.Автоматически;
        новыйТовар.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.РасчетыПоАвансамПолученным;
         новыйТовар.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПокупателями;

        новыйТовар.Склад=Справочники.Склады.НайтиПоКоду("00-000001");
        СтрокаТч=новыйТовар.Товары.Добавить();
        СтрокаТч.Номенклатура=Справочники.Номенклатура.НайтиПоКоду(стрк.Tkod);
        СтрокаТч.ЕдиницаИзмерения=СтрокаТч.Номенклатура.ЕдиницаИзмерения;
        СтрокаТч.СтавкаНДС=СтрокаТч.Номенклатура.СтавкаНДС;
        СтрокаТч.Количество=Стрк.Kol;
        СтрокаТч.Цена=Стрк.Cena;
        СтрокаТч.Сумма=Стрк.Summa;
        СтрокаТЧ.СчетУчета=ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
        СтрокаТЧ.СчетДоходов=ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1");
        СтрокаТЧ.СчетРасходов=ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");
        СтрокаТЧ.СчетУчетаНДСПоРеализации=ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.03");
        СтрокаТЧ.СуммаНДС=Число(СокрЛП(стрк.NDS));


        новыйТовар.Комментарий=Стрк.Klkod+" "+стрк.Klname;
        новыйТовар.Записать();
        Буф=Стрк.Numb;
            Сообщить(Строка(новыйТовар.Дата)+" Создан рнк №"+строка(новыйТовар.Номер));

        Иначе
        СтрокаТч=новыйТовар.Товары.Добавить();
        СтрокаТч.Номенклатура=Справочники.Номенклатура.НайтиПоКоду(стрк.Tkod);
        СтрокаТч.ЕдиницаИзмерения=СтрокаТч.Номенклатура.ЕдиницаИзмерения;
        СтрокаТч.СтавкаНДС=СтрокаТч.Номенклатура.СтавкаНДС;
        СтрокаТч.Количество=Стрк.Kol;
        СтрокаТч.Цена=Стрк.Cena;
        СтрокаТч.Сумма=Стрк.Summa;
        СтрокаТЧ.СчетУчета=ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
        СтрокаТЧ.СчетДоходов=ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1");
        СтрокаТЧ.СчетРасходов=ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");
        СтрокаТЧ.СчетУчетаНДСПоРеализации=ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.03");
        СтрокаТЧ.СуммаНДС=Число(СокрЛП(стрк.NDS));

        новыйТовар.Записать();
        
    КонецЕсли;

    КонецЦикла;
    ЗафиксироватьТранзакцию();

БД.ЗакрытьФайл();



Все загружает, только очень долго. Скорее всего что-то делаю не так.
1 Garykom
 
гуру
04.09.14
16:10
(0) "Таб = Новый("ТаблицаЗначений");"

WTF?!
2 Arutynov
 
04.09.14
16:11
Создал таблицу значений, что не так
?
3 fmrlex
 
04.09.14
16:12
Все что ты ищешь по кодам-константам можно найти ДО цикла.
4 fmrlex
 
04.09.14
16:13
(1) Оно работает ))
5 Arutynov
 
04.09.14
16:18
(3) сейчас попробую, но когда писал так в толстом клиенте все быстро работало
6 fmrlex
 
04.09.14
16:22
(0) + еще для бухии посмотри есть процедурки в общих модулях для заполнения счетов учета.
Ну и потоково создаешь документы... сам понимаешь это занимает некоторое время.
7 Arutynov
 
04.09.14
16:24
Я думал есть более логичный способ создания документа с DBF
8 _fvadim
 
04.09.14
16:27
замер сделать - поглядеть узкие места.
если не критично создание всех документов разом - выкинуть транзакцию.
и да, (3) сделать в первую очередь.
9 fmrlex
 
04.09.14
16:27
(7) Ну куда уж логичнее. Просто ты часто теребишь базу.
10 Garykom
 
гуру
04.09.14
16:38
(2) ЭЭЭ тогда убери "новыйТовар.Записать();" после каждой строки
11 Garykom
 
гуру
04.09.14
16:39
(10)+ и вообще перепиши КРАСИВО! А то с этом ничче не понять и криво пашет.
12 _fvadim
 
04.09.14
16:42
(11) необязательно.
можно всё выделить и нажать alt+shift+F
13 Garykom
 
гуру
04.09.14
16:43
(11) Начни с этого:

КоличествоЗаписей = БД.КоличествоЗаписей();
Для НомерЗаписи=1 По КоличествоЗаписей Цикл
   БД.Перейти(НомерЗаписи);
КонецЦикла;

(12) Не в этом проблема не форматирования а содержание кривое
14 Garykom
 
гуру
04.09.14
16:46
(13) И продолжи сделай функцию СоздатьДокумент(Параметры)

и можно для удобства читаемости функцию ДобавитьСтрокуВТовары(СсылкаДокумент, ПараметрыСтроки)
15 Garykom
 
гуру
04.09.14
16:47
(14) и будет у тебя КРАСИВЫЙ и ЛЕГКОЧИТАЕМЫЙ код, в котором ЛЕГКО найти ошибки и дописать...
16 Garykom
 
гуру
04.09.14
16:48
(14) да не обязательно "СсылкаДокумент" лучше не сохранять а передавать сам "ДокументОбъект"
17 Arutynov
 
04.09.14
16:50
Спасибо, сейчас осмысляю вами предложенное
18 _fvadim
 
04.09.14
16:51
(16)
осталось сказать когда следующий урок и озвучить домашнее задание :)
19 Arutynov
 
04.09.14
16:53
Да главное чтоб у ученика все получилось!
20 Garykom
 
гуру
04.09.14
17:10
(17)(19) так суть то простая все что можно выносить в отдельные процедуры/функции
(даже если они будут 1 раз всего вызываться)
и общий код будет состоять по сути из вызовов этих процедур/функций

ЗЫ
и для каждой процедуры/функции сверху краткий коммент что делает, что на входе/выходе
21 Garykom
 
гуру
04.09.14
17:11
(20)+ зато потом очень удобно, если новая задача подобна тем что уже делал, просто процедуру/функцию копи/пасте и чуток исправить ))
Программист всегда исправляет последнюю ошибку.