| 
    
            
         
         | 
    
  | 
Запрос 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'"; Ни с ' ни с " по отдельности не работает, ни преобразование в строку, ничего! Но такой вариант вполне, можно любую дату в принципе разобрать в такой вид.  | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |