Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запрос по ОЛЕ из УТП в бух
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Trintintin
Задача - связать остатки в 2х базах. Утп и бух.
1С:Предприятие 8.3 (8.3.9.2033), утп (1.2.32.1)
бух той же версии, последняя.

Связь по артикулу!

Не взлетает такая хрень:
В8 = Новый COMОбъект("V83.Application"); 

    Попытка
        Открытие = В8.Connect("File=""" + СокрЛП(Путь));
        Сообщить("Все чьотко!");
    Исключение
        Предупреждение("База данных не открыта!!!");
        Возврат;
    КонецПопытки;
    
    ЗапрВсеАртикулы = Новый Запрос;
    ЗапрВсеАртикулы.Текст = "ВЫБРАТЬ
                            |    Номенклатура.Артикул
                            |ИЗ
                            |    Справочник.Номенклатура КАК Номенклатура
                            |ГДЕ
                            |    Номенклатура.Артикул <> """"";
    МассАртикулыУпр = ЗапрВсеАртикулы.Выполнить().Выгрузить().ВыгрузитьКолонку("Артикул");
    
    СписВсехАртикулов = Новый СписокЗначений;
    СписВсехАртикулов.ЗагрузитьЗначения(МассАртикулыУпр);
    
    СписЗначВ8 = В8.NewObject("СписокЗначений");    
    Для Каждого ЗапСписЗн из СписВсехАртикулов Цикл
        СписЗначВ8.Добавить(ЗапСписЗн);
    КонецЦикла;    
        
    ЗапрВ8 = В8.NewObject("Запрос");
    ЗапрВ8.Текст = "ВЫБРАТЬ
                   |    ХозрасчетныйОстатки.КоличествоОстаток,
                   |    ХозрасчетныйОстатки.Субконто1.Артикул КАК Артикул
                   |ИЗ
                   |    РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет = &Счет, , Субконто1.Артикул В (&Артикулы)) КАК ХозрасчетныйОстатки";
    Счет281В8 = В8.ПланыСчетов.Хозрасчетный.НайтиПоКоду("281");              
    ЗапрВ8.УстановитьПараметр("Счет",Счет281В8);
    ЗапрВ8.УстановитьПараметр("Артикулы",СписЗначВ8);      
    
    РезПоБух = ЗапрВ8.Выполнить().Выгрузить();
    Если РезПоБух.Количество() > 0 Тогда
        Сообщить("Есть!!!");
    КонецЕсли;

В отладчике объект СписЗначВ8 имеет такое же количество элементов как и в УТП.
Но ругается:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(49)}: Ошибка при вызове метода контекста (Выполнить)
РезПоБух = ЗапрВ8.Выполнить().Выгрузить();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.9.2033): {(5, 81)}: Неверные параметры
РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет = &Счет, , Субконто1.Артикул В (<<?>>&Артикулы)) КАК ХозрасчетныйОстатки

Спасибо!


Bernet
Trintintin @ Сегодня, 12:48 необходимо зарегистрироваться для просмотра ссылки ,
попробуйте вместо СписВсехАртикулов передать в запрос в параметр "&Артикулы" ваш массив "МассАртикулыУпр"
Trintintin
Bernet @ Сегодня, 14:30 необходимо зарегистрироваться для просмотра ссылки ,
Исчо раз проверил все 3 варианта - массив, список и список8 - ниц не працйе!
Bernet
Trintintin @ Сегодня, 15:25 необходимо зарегистрироваться для просмотра ссылки ,
А если так? тоже не проканает? По идее раз это внешнее соединение, то при передаче параметра в запрос там должен быть либо простой тип (не ссылочный), либо если ссылочный, то полученный уже в той базе куда подключаемся. Мне кажется что тут проблема том что вы в список пытаетесь запихнуть значение элемента списка, сформированное в текущей базе. Может если попробовать в список значений базы подключения запихнуть массив с кодами то все получится?
В8 = Новый COMОбъект("V83.Application"); 

    Попытка
        Открытие = В8.Connect("File=""" + СокрЛП(Путь));
        Сообщить("Все чьотко!");
    Исключение
        Предупреждение("База данных не открыта!!!");
        Возврат;
    КонецПопытки;
    
    ЗапрВсеАртикулы = Новый Запрос;
    ЗапрВсеАртикулы.Текст = "ВЫБРАТЬ
                            |    Номенклатура.Артикул
                            |ИЗ
                            |    Справочник.Номенклатура КАК Номенклатура
                            |ГДЕ
                            |    Номенклатура.Артикул <> """"";
    МассАртикулыУпр = ЗапрВсеАртикулы.Выполнить().Выгрузить().ВыгрузитьКолонку("Артикул");
    
   // СписВсехАртикулов = Новый СписокЗначений;
   //  СписВсехАртикулов.ЗагрузитьЗначения(МассАртикулыУпр);
    
    СписЗначВ8 = В8.NewObject("СписокЗначений");    
    Для Каждого Элемент из МассАртикулыУпр Цикл
        СписЗначВ8.Добавить(Элемент);
    КонецЦикла;    
        
    ЗапрВ8 = В8.NewObject("Запрос");
    ЗапрВ8.Текст = "ВЫБРАТЬ
                   |    ХозрасчетныйОстатки.КоличествоОстаток,
                   |    ХозрасчетныйОстатки.Субконто1.Артикул КАК Артикул
                   |ИЗ
                   |    РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет = &Счет, , Субконто1.Артикул В (&Артикулы)) КАК ХозрасчетныйОстатки";
    Счет281В8 = В8.ПланыСчетов.Хозрасчетный.НайтиПоКоду("281");              
    ЗапрВ8.УстановитьПараметр("Счет",Счет281В8);
    ЗапрВ8.УстановитьПараметр("Артикулы",СписЗначВ8);      
    
    РезПоБух = ЗапрВ8.Выполнить().Выгрузить();
    Если РезПоБух.Количество() > 0 Тогда
        Сообщить("Есть!!!");
    КонецЕсли;
Trintintin
Bernet @ Сегодня, 15:39 необходимо зарегистрироваться для просмотра ссылки ,
Ура, заработало!!!
необходимо зарегистрироваться для просмотра ссылки

Ошибка была в этом цикле:
Для Каждого ЗапСписЗн из СписВсехАртикулов Цикл
        СписЗначВ8.Добавить(ЗапСписЗн);
    КонецЦикла;



Правильно:
Для Каждого ЗапСписЗн из СписВсехАртикулов Цикл
        СписЗначВ8.Добавить(ЗапСписЗн.Значение);
    КонецЦикла;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.