Имя: Пароль:
1C
1С v8
Запрос 1С 7.7 в 1С 8.2 через COM
0 sbvoshod
 
25.05.16
07:49
Доброго времени суток всем.
Возникла такая проблема в решении следующей задачи:
Переношу данные из 1С 7.7 в базу 1С 8.2 (Обычное приложение, Толстый клиент).
Подключаюсь к БД 7.7 через COM-соединение

БД77 = Новый COMОбъект("V1CEnterprise.Application");
СтрокаПодключения = "/D"""+СокрЛП(ПутьКБД77)+""" /N"""+СокрЛП(ПользовательБД77)+""" /P"""+СокрЛП(ПарольБД77)+"""";
    попытка
    РезультатПодключения=БД77.Initialize(БД77.RMTrade,СтрокаПодключения,?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
исключение
    Предупреждение(ОписаниеОшибки(),0);
    конецпопытки;

С загрузкой справочников все прошло отлично.
Далее перегружаю остатки.
Создаю запрос и тут столкнулся с проблемой, не знаю как толком обойти её.
В общем проблема в том, что не могу задать в тексте запроса дату!!!
Т.е. текст такой:

Запрос = БД77.CreateObject("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(запроспоостаткам)
        |Без итогов;
              //|Период С ДатаЗапроса по ДатаЗапроса;
        |Склад = Регистр.ОстаткиТоваров.Склад;
        |Товар = Регистр.ОстаткиТоваров.Товар;
        |БазоваяСтоимость = Регистр.ОстаткиТоваров.БазоваяСтоимость;
        |ВалютнаяСтоимость = Регистр.ОстаткиТоваров.ВалютнаяСтоимость;
        |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
        |ФлагУчета = Регистр.ОстаткиТоваров.ФлагУчета;
        |Функция БазоваяСтоимостьКонОст = КонОст(БазоваяСтоимость);
        |Функция ВалютнаяСтоимостьКонОст = КонОст(ВалютнаяСтоимость);
        |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
        |Группировка Склад без групп;
        |Группировка Товар без групп;
        |Условие(ОстатокТовара > 0);
        |"//}}ЗАПРОС
        ;

Косяк в том, что как я эту дату туда не запихиваю, в итоге получается дата формата 1С 8.2!!! Запрос 1С 7.7 её не понимает и выдает естественно ошибку.
Пробовал разные методы: брал текущую дату, даже делал в базу 7.7 константу, задавал в ней дату, потом уже в обработке переноса в 1С 8.2 писал

ДатаЗапроса = БД77.Константа.ДатаЗапроса;

Он дату то получает, но она всегда в формате 1С 8.2, даже если получить её из константы базы 1С 7.7!
В общем, пока вышел из положения так: просто заремарил в запросе период, в 1С 7.7 изменил точку актуальности на нужную мне дату и получил остатки на ДатуТА() автоматом.
Но мне еще периодические реквизиты из справочников переносить! :)
И переносить документы за период некоторый!
Че делать!? Как жить!?
У кого есть решение данной проблемы? Может как то по другому подключиться к 1С 7.7 или все таки есть метод получения нормальной семерошной даты внутри 1С 8.2?
1 Mikeware
 
25.05.16
07:53
1. в поиск. рассматривалось неоднократно
2. формируй текст сразу с датами
3. используй готовые функции в клюшках (добавь, если нету), или даже внешние обработки
2 VladZ
 
25.05.16
07:53
(0)  Я обычно переношу либо файлами (текст), либо с помощью КД.
3 sbvoshod
 
25.05.16
07:55
(1) Покопаюсь, спасибо.
(2) Поздно пить боржоми :) Уже основные справочники и остатки по товарам перетащил. Столько работы заново переделывать :)
4 Mikeware
 
25.05.16
08:03
(3) КД - полезна. Хотя и дурна местами...
5 hhhh
 
25.05.16
09:36
(3) что-то как-то типа

|Период С '" + Формат(ДатаЗапроса, НужныйФормат) + "' по '" + Формат(ДатаЗапроса, НужныйФормат) + "'
6 sbvoshod
 
30.05.16
19:41
(5) Пробовал - не катит.
Примерно так делаю:
ДатаЗапроса = Неопределено;
        ДатаЗапроса = Формат(ДатаВводаОстатков,"ДФ=dd.MM.yyyy"); //ДатаВводаОстатков - реквизит на форме

ТекстЗапроса =
        "//{{ЗАПРОС(запроспоостаткам)
        |Период с ДатаЗапроса по ДатаЗапроса;
        |Без итогов;
        |Склад = Регистр.ОстаткиТоваров.Склад;
        |Товар = Регистр.ОстаткиТоваров.Товар;
        |БазоваяСтоимость = Регистр.ОстаткиТоваров.БазоваяСтоимость;
        |ВалютнаяСтоимость = Регистр.ОстаткиТоваров.ВалютнаяСтоимость;
        |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
        |ФлагУчета = Регистр.ОстаткиТоваров.ФлагУчета;
        |Функция БазоваяСтоимостьКонОст = КонОст(БазоваяСтоимость);
        |Функция ВалютнаяСтоимостьКонОст = КонОст(ВалютнаяСтоимость);
        |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
        |Группировка Склад без групп;
        |Группировка Товар без групп;
        |Условие(ОстатокТовара > 0);
        |"//}}ЗАПРОС
        ;

Результат такой:
"{Форма.Форма.Форма(436)}: Ошибка при вызове метода контекста (Выполнить)
        Если Запрос.Выполнить(ТекстЗапроса) <> 0 Тогда
по причине:
Произошла исключительная ситуация (1С:Предприятие): Период с  <<?>> ДатаЗапроса по ДатаЗапроса;
Запрос[2] : Ошибка в выражении 'ДатаЗапроса'
"
7 VitShvets
 
30.05.16
20:20
|Период с " + ДатаЗапроса + " по " + ДатаЗапроса;
8 VitShvets
 
30.05.16
20:21
*Забыл вторую кавычку:
|Период с " + ДатаЗапроса + " по " + ДатаЗапроса + ";
9 sbvoshod
 
30.05.16
20:38
(8) Дак из ни нифига...
Вообще ни как так не проканало. В общем я уже завел в 77 функцию, которая возвращает дату. Записал её в запросе. Проверил - в 7.7 все робит, в 8.2 выдает мне ошибку в тексте запроса на скобку!!! Но в 7.7 то ничего не выдает.
В общем вышел наконец то из этой проблемы следующим образом:
Код в 8.2:
ДатаЗапроса = Неопределено;
ДатаЗапроса = "31.12.2015";
Запрос = БД77.глВыполнитьЗапросПоОстаткамИз82(ДатаЗапроса);
Если Запрос <> 0 Тогда
    Пока Запрос.Группировка() = 1 Цикл
    // выполняем нужные нам действия
    КонецЦикла;
Иначе
    Предупреждение("Запрос не выполнен в 1С 7.7",5);
КонецЕсли;
Код в 1С 7.7 (в глобальном модуле):
Функция глДатаИз82(СтрокаДаты) Экспорт
                          
    Сообщить(СтрокаДаты);
    Возврат Дата(СтрокаДаты);
    
КонецФункции

Функция глВыполнитьЗапросПоОстаткамИз82(ДатаЗапроса) Экспорт
    Перем Запрос,ДатаЗапроса77;  
    
    ДатаЗапроса77 = глДатаИз82(ДатаЗапроса);
    
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(запроспоостаткам)
    |Период с ДатаЗапроса77 по ДатаЗапроса77;
    |Без итогов;
    |Склад = Регистр.ОстаткиТоваров.Склад;
    |Товар = Регистр.ОстаткиТоваров.Товар;
    |БазоваяСтоимость = Регистр.ОстаткиТоваров.БазоваяСтоимость;
    |ВалютнаяСтоимость = Регистр.ОстаткиТоваров.ВалютнаяСтоимость;
    |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
    |ФлагУчета = Регистр.ОстаткиТоваров.ФлагУчета;
    |Функция БазоваяСтоимостьКонОст = КонОст(БазоваяСтоимость);
    |Функция ВалютнаяСтоимостьКонОст = КонОст(ВалютнаяСтоимость);
    |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
    |Группировка Склад без групп;
    |Группировка Товар без групп;
    |Условие(ОстатокТовара <> 0);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат 0;
    Иначе
        Возврат Запрос;
    КонецЕсли
    
КонецФункции

Вот такая трехэтажная конструкция работает!
Большего и не надо, можно просто любой запрос отработать в 7.7 :)
Единственное, пробовал сам текст запроса передавать из 8.2, но он почему то же некорректно передается - обрезается и все тут!!!
В общем тяжко, но работоспособно.
10 sbvoshod
 
30.05.16
20:45
(8) Щас испытаю, может проканает. Отпишусь! будем наполнять форум знаниями. А то я весь нэт излазал, ничего нет такого почему то. Есть из 7.7 в 8.2 передача даты. Обратно нет :)
11 sbvoshod
 
30.05.16
20:47
(8) Не, нифига:
Вот результат:
{Форма.Форма.Форма(436)}: Ошибка при вызове метода контекста (Выполнить)
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
по причине:
Произошла исключительная ситуация (1С:Предприятие): Период с (дата(31.12.2015) <<?>> ) по (дата(31.12.2015));
Запрос[2] : Ошибка в выражении ')'

Вот код:

Запрос = БД77.CreateObject("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(запроспоостаткам)
        |Период с (дата("+ДатаЗапроса+")) по (дата("+ДатаЗапроса+"));
        |Без итогов;
        |Склад = Регистр.ОстаткиТоваров.Склад;
        |Товар = Регистр.ОстаткиТоваров.Товар;
        |БазоваяСтоимость = Регистр.ОстаткиТоваров.БазоваяСтоимость;
        |ВалютнаяСтоимость = Регистр.ОстаткиТоваров.ВалютнаяСтоимость;
        |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
        |ФлагУчета = Регистр.ОстаткиТоваров.ФлагУчета;
        |Функция БазоваяСтоимостьКонОст = КонОст(БазоваяСтоимость);
        |Функция ВалютнаяСтоимостьКонОст = КонОст(ВалютнаяСтоимость);
        |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
        |Группировка Склад без групп;
        |Группировка Товар без групп;
        |Условие(ОстатокТовара <> 0);
        |"
        ;
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Возврат;
КонецЕсли;

Причем всяко разно пробовал скобки, без скобок и так и сяк - в 1С 7.7 выполняется нормально, из 8 не хочет.
12 hhhh
 
30.05.16
21:32
(11) да не в скобки надо взять дату а в апострофы? Чего вы чудите?
13 sbvoshod
 
30.05.16
22:28
(12) Ну дык у Вас написано:
|Период с " + ДатаЗапроса + " по " + ДатаЗапроса + ";
Так не катит.
Но почти. Методом тыка натыкал вот такой вариант:

ДатаЗапроса = "'31.12.2015'";

ТекстЗапроса =
"//{{ЗАПРОС(запроспоостаткам)
|Период с "+ДатаЗапроса+" по "+ДатаЗапроса+";
|Без итогов;
|Склад = Регистр.ОстаткиТоваров.Склад;
|Товар = Регистр.ОстаткиТоваров.Товар;
|БазоваяСтоимость = Регистр.ОстаткиТоваров.БазоваяСтоимость;
|ВалютнаяСтоимость = Регистр.ОстаткиТоваров.ВалютнаяСтоимость;
|ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
|ФлагУчета = Регистр.ОстаткиТоваров.ФлагУчета;
|Функция БазоваяСтоимостьКонОст = КонОст(БазоваяСтоимость);
|Функция ВалютнаяСтоимостьКонОст = КонОст(ВалютнаяСтоимость);
|Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
|Группировка Склад без групп;
|Группировка Товар без групп;
|Условие(ОстатокТовара <> 0);
|"
;

ЕЕЕ!!! Победа! Полная! :)
Спасибо!!!
14 sbvoshod
 
30.05.16
22:30
Причем только так работает!
Именно если взять ДатаЗапроса = "'31.12.2015'";
Ни с ' ни с " по отдельности не работает, ни преобразование в строку, ничего!
Но такой вариант вполне, можно любую дату в принципе разобрать в такой вид.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший