Имя: Пароль:
1C
1С v8
Перенос данных из 7.7 в 8
0 Cameron_Rifkin
 
15.07.16
10:42
Дали задачу сделать отчёт из древней базы - 2009 года. В 7ке я не силен, поэтому решил подцепить 7ку из 8ки и перетащить данные туда, а там уж засунуть их в СКД и всё такое. После некоторых плясок с синтаксис-помощником и перевода части функций на английский всё заработало. Но! Работает оно только в пределах месяца, как только я пытаюсь построить отчёт хотя бы за 2 месяца, при переходе на следующий месяц у меня вылетает семерка. Не по ошибке, а просто вылетает. Не понимаю, что может быть не так.

Вот код, если что. Проблема происходит когда я иду на второй заход по внешнему циклу и пытаюсь из него зайти во внутренний...

    Коннектор = Новый COMОбъект("V77.Application");
    Если Коннектор = Неопределено Тогда
        Сообщить("Не удалось создать объект  V77.Application ");
    КонецЕсли;
    ПутьКБухБазе = "";
    ПользовательБухБазы = "";
    Парольпользователя="";
    Попытка
        СтрокаПодключения = "/D""" + ПутьКБухБазе + """ /N""" + ПользовательБухБазы + """ /P"""+ ПарольПользователя + """";
        V77 = Коннектор.Initialize(Коннектор.RMComplex, СтрокаПодключения, "");
        Если НЕ V77 Тогда
            Сообщить("Неудачная попытка входа в 77");
            Возврат;
        КонецЕсли;      
    Исключение
        Сообщить("Не удалось загрузить 1С 77." + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Сч50    =    Коннектор.evalexpr("СчетПоКоду(""50"")");
    Сч51    =    Коннектор.evalexpr("СчетПоКоду(""51"")");
    Сч58_3    =    Коннектор.evalexpr("СчетПоКоду(""58.3"")");
    Сч58    =    Коннектор.evalexpr("СчетПоКоду(""58"")");
    Сч60    =    Коннектор.evalexpr("СчетПоКоду(""60"")");
    Сч60_1    =    Коннектор.evalexpr("СчетПоКоду(""60.1"")");
    Сч62    =    Коннектор.evalexpr("СчетПоКоду(""62"")");
    Сч62_1    =    Коннектор.evalexpr("СчетПоКоду(""62.1"")");
    Сч62_3    =    Коннектор.evalexpr("СчетПоКоду(""62.3"")");
    Сч68_1    =    Коннектор.evalexpr("СчетПоКоду(""68.1"")");
    Сч68    =    Коннектор.evalexpr("СчетПоКоду(""68"")");
    Сч69    =    Коннектор.evalexpr("СчетПоКоду(""69"")");
    Сч70    =    Коннектор.evalexpr("СчетПоКоду(""70"")");
    Сч90    =    Коннектор.evalexpr("СчетПоКоду(""90"")");
    Сч44    =    Коннектор.evalexpr("СчетПоКоду(""44"")");
    Сч71    =    Коннектор.evalexpr("СчетПоКоду(""71"")");
    НачДата    =    ДатаНачала;
    КонДата    =    ДатаОкончания;
    
    ТаблицаДвижений = Новый ТаблицаЗначений;
    ТаблицаДвижений.Колонки.Добавить("Дата",Новый ОписаниеТипов("Дата"));
    ТаблицаДвижений.Колонки.Добавить("ВО",Новый ОписаниеТипов("Строка"    , , Новый КвалификаторыСтроки(2, ДопустимаяДлина.Фиксированная)));
    ТаблицаДвижений.Колонки.Добавить("Операция",Новый ОписаниеТипов("Строка"    , , Новый КвалификаторыСтроки(100, ДопустимаяДлина.Переменная)));
    ТаблицаДвижений.Колонки.Добавить("Документ",Новый ОписаниеТипов("Строка"    , , Новый КвалификаторыСтроки(10, ДопустимаяДлина.Переменная)));
    ТаблицаДвижений.Колонки.Добавить("Корреспондент",Новый ОписаниеТипов("Строка"    , , Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
    ТаблицаДвижений.Колонки.Добавить("Дебет",Новый ОписаниеТипов("Число"));
    ТаблицаДвижений.Колонки.Добавить("Кредит",Новый ОписаниеТипов("Число"));
    ТаблицаДвижений.Колонки.Добавить("НазначениеПлатежа",Новый ОписаниеТипов("Строка"    , , Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
    
    Счетчик=1;
    ДатаПериода = НачДата;
    Пока ДатаПериода < КонДата Цикл;
        БухИт = Коннектор.CreateObject("БухгалтерскиеИтоги");
        БухИт.ВключатьСубсчета(0, 0);
        БухИт.ПериодМ(ДатаПериода);
        НачМ = БухИт.НачПериода();
        КонМ = БухИт.КонПериода();
        СтрокаСчетов = "50,62.1;50,90;51,62.1;51,90;58.3,62.1;58.3,90;62.3,62.1;62.3,90;44,50;44,51;44,62.3;44,71.1;60.1,50;60.1,51;60.1,62.3;60.1,71.1;68.1,50;68.1,51;68.1,62.3;68.1,71.1;69,50;69,51;69,62.3;69,71.1;70,50;70,51;70,62.3;70,71.1";
        БухИт.DoQuery(НачМ, КонМ,СтрокаСчетов);
        БухИт.ВыбратьПериоды();
        Попытка
             Работаем = БухИт.ПолучитьПериод();
         Исключение
             Работаем = 0;
        КонецПопытки;
        Пока Работаем = 1 Цикл
            Нач = БухИт.НачПериода();
            Кон = БухИт.КонПериода();
            
            Опер = Коннектор.CreateObject("Операция");
            Опер.ВыбратьОперацииСПроводками(Нач, Кон,СтрокаСчетов);
            Пока Опер.ПолучитьПроводку() = 1 Цикл
                СчДт = Опер.Дебет.Счет;
                СчКт = Опер.Кредит.Счет;
                ПервичныйДокумент = Опер.ПервичныйДокумент;
                СчетГруппаДт = СчДт.Родитель(1);
                СчетГруппаКт = СчКт.Родитель(1);
                
                // Если проводка сложная, то не рассматриваем проводку
                // в которй не указан один из счетов.
                Если Опер.ComplexEntry() = 1 Тогда
                    Если (Коннектор.ПустоеЗначение(СчДт)=1) или (Коннектор.ПустоеЗначение(СчКт) = 1) Тогда
                        Продолжить;                            
                    КонецЕсли;
                КонецЕсли;
                Если Опер.Сумма = 0 Тогда
                    Продолжить;
                КонецЕсли;
                Контрагент="";
                Если (СчетГруппаДт.Наименование = Сч50.Наименование) ИЛИ ( СчетГруппаДт.Наименование = Сч51.Наименование) ИЛИ (СчетГруппаДт.Наименование = Сч58.Наименование) ИЛИ (СчетГруппаДт.Наименование = Сч62.Наименование) Тогда
                    Дебет = Опер.Сумма;
                    Кредит = 0;
                    Попытка
                        Контрагент = "ИНН "+Опер.Кредит.Субконто(1).ИНН+" "+Опер.Кредит.Субконто(1).Наименование;
                    Исключение
                        Контрагент="";
                    КонецПопытки;
                ИначеЕсли ( СчетГруппаДт.Наименование = Сч44.Наименование) ИЛИ ( СчетГруппаДт.Наименование = Сч60.Наименование) ИЛИ ( СчетГруппаДт.Наименование = Сч68.Наименование) ИЛИ ( СчетГруппаДт.Наименование = Сч69.Наименование) ИЛИ ( СчетГруппаДт.Наименование = Сч70.Наименование) Тогда
                    Кредит = Опер.Сумма;
                    Дебет = 0;
                    Если НЕ СчетГруппаДт.Наименование = Сч70.Наименование И НЕ СчетГруппаДт.Наименование = Сч69.Наименование Тогда
                        Попытка
                            Контрагент = "ИНН "+Опер.Дебет.Субконто(1).ИНН+" "+Опер.Дебет.Субконто(1).Наименование;
                        Исключение
                            Контрагент="";
                        КонецПопытки;
                    ИначеЕсли НЕ СчетГруппаДт.Наименование = Сч69.Наименование Тогда
                        Попытка
                            Контрагент = Опер.Дебет.Субконто(1).Наименование;
                        Исключение
                            Контрагент="";
                        КонецПопытки;
                    КонецЕсли;
                Иначе
                    Продолжить;
                КонецЕсли;
                Содержание = Опер.СодержаниеПроводки;
                Документ = Опер.Документ;
                Если СокрЛП(СтрЗаменить(СтрЗаменить(СтрЗаменить(ПервичныйДокумент,".",""),",",""),"№","")) <> "" Тогда
                    Операция=ПервичныйДокумент;
                Иначе
                    Операция= Опер.ДатаОперации;
                КонецЕсли;    
                СтрокаДвижений = ТаблицаДвижений.Добавить();
                СтрокаДвижений.Дата = Документ.ДатаДок;
                СтрокаДвижений.Операция = Операция;
                СтрокаДвижений.Документ = Документ.НомерДок;
                КоличествоСубконто = Опер.Кредит.Счет.КоличествоСубконто();
                СтрокаДвижений.Корреспондент = Контрагент;
                СтрокаДвижений.Дебет = Дебет;
                СтрокаДвижений.Кредит = Кредит;
                Попытка
                    СтрокаДвижений.НазначениеПлатежа = Документ.НазначениеПлатежа;
                Исключение
                    СтрокаДвижений.НазначениеПлатежа = "";
                КонецПопытки;
                Если Найти(СтрокаДвижений.НазначениеПлатежа,"комисси")>0 Тогда
                    СтрокаДвижений.ВО="02";
                Иначе
                    СтрокаДвижений.ВО="01";
                КонецЕсли;
                Состояние("Обработано "+Счетчик+" записей");
                Счетчик=Счетчик+1;
            КонецЦикла;
            ДатаПериода = ДобавитьМесяц(ДатаПериода,1);
            Попытка
             Работаем = БухИт.ПолучитьПериод();
             Исключение
             Работаем = 0;
            КонецПопытки;
        КонецЦикла;
    КонецЦикла;

Подскажите, что я делаю не так
1 lubitelxml
 
15.07.16
12:32
отладчиком посмотри
2 Горогуля
 
15.07.16
12:33
не глядя: не используешь силу КД
3 Cameron_Rifkin
 
15.07.16
15:47
(2) у меня нет задачи перенести эти данные в 8ку. Мне просто нужно получить отчет в вменяемом виде. В 8 я это сделаю за 5 минут на СКД, в 7ке я очень смутно представляю как это делать.
4 Cameron_Rifkin
 
15.07.16
15:47
(1) как? работает-то 8ка, а вываливается 7ка
5 lubitelxml
 
15.07.16
15:57
(4) ну так посмотри на какой строке вываливается то
6 lubitelxml
 
15.07.16
15:57
и отпиши сюда
7 youalex
 
15.07.16
16:00
Можно попробовать сделать внешний на 7.7.
А из 8 - пинать 77 на открытие этого отчета.
8 MaxS
 
15.07.16
20:39
А нельзя, разве в 7-ке написать функцию извлечения данных в ТЗ и из 8-ки просто её вызывать?
9 MadJhey
 
15.07.16
21:04
(8) можно, только автор наверно данные в тз не сможет засунуть.
10 MaxS
 
15.07.16
21:12
(9) В крайнем случае - в 7-ке сохранить в mxl, в 8-ке открыть файл и загрузить в ТЗ.
11 EvgeniuXP
 
16.07.16
00:30
(9) они также суются с маленьким отличием!
12 Aleksey
 
16.07.16
00:32
(8) перепиши и запусти этот же отчет в 7-ке и посмотри на что ругается
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс