Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 02:43

1с83 запрос через com соединение

Автор buketov.av, 21 ноя 2019, 08:25

0 Пользователей и 1 гость просматривают эту тему.

buketov.av

Добрый день, Дорогие Форумчане!
Столкнулся с задачей: необходимо установить подключение к базе через com соединение и создать новый документ - с этим проблем нет.
Есть проблема с заполнением двух реквизитов этого документа, для того, чтобы их заполнить необходимо выполнить запрос к подключаемой базе, чтобы выбрать там сотрудника по реквизиту справочника "физическое лицо", ниже привожу код.
Скажите, что делаю не так и как правильно выполнить такой запрос и его обработать?


ЗапросВ = КомСоединение.NewObject("Запрос");
    ЗапросВ .Текст = "ВЫБРАТЬ
    |Сотрудники.Представление КАК Сотрудник,
    |Сотрудники.ФизическоеЛицо.Наименование КАК ФизическоеЛицо,
    |Сотрудники.СтруктураКомпании.Представление КАК СтруктураКомпании
    |ИЗ
    |Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    |НЕ Сотрудники.СтруктураКомпании = ЗНАЧЕНИЕ(Справочник.СтруктураКомпании.ПустаяСсылка)
    |И Сотрудники.ФизическоеЛицо = &ФизическоеЛицо";
   
    ФизЛицо = КомСоединение.Справочники.ФизическиеЛица.НайтиПоНаименованию(СтруктураДанных.Сотрудник);
    ЗапросВ.УстановитьПараметр("ФизическоеЛицо", ФизЛицо);
   
    com_Результат     = ЗапросВ.Выполнить(); // COM объект   
    com_ТЗ_Сотрудники = com_Результат.Выгрузить(); // COM объект
   
    // Получаем таблицу значений из COM-объекта
    // COMОбъект в -> строку
    // Запишем COMОбъект в строку на стороне базы-источника
    стр_ТЗ_Сотрудники = КомСоединение.ЗначениеВСтрокуВнутр(com_ТЗ_Сотрудники);

    // получим таблицу значений из строки
    ТЗ_Сотрудники = ЗначениеИзСтрокиВнутр(стр_ТЗ_Сотрудники);

    МенеджерДокумента = КомСоединение.Документы.ЗаписьВРНФактическиеОтпуска;
    КомСоединение.УстановитьБезопасныйРежим(Ложь);
    КомСоединение.УстановитьПривилегированныйРежим(Истина);

    НовДок      = МенеджерДокумента.СоздатьДокумент();
    НовДок.Дата = СтруктураДанных.Период;
    НовДок.Сотрудник...

wise

(0) это - СтруктураДанных.Сотрудник
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

buketov.av

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

wise

(2) это ОШИБКА! :befhbt:
где создаётся структура??
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

buketov.av

Цитата: wise от 21 ноя 2019, 09:21
(2) это ОШИБКА! :befhbt:
где создаётся структура??

в этой же процедуре


СтруктураДанных = Новый Структура;
Для каждого Стр Из Источник.ЭтотОбъект Цикл
СтруктураДанных.Вставить("Период",           Стр.Период);
СтруктураДанных.Вставить("Регистратор",      Строка(Стр.Регистратор));
СтруктураДанных.Вставить("Активность",       Стр.Активность);
СтруктураДанных.Вставить("ВидДвижения",      "");
СтруктураДанных.Вставить("Сотрудник",        Стр.Сотрудник);
СтруктураДанных.Вставить("ВидЕжегодногоОтпуска", Стр.ВидЕжегодногоОтпуска);
СтруктураДанных.Вставить("Количество",       Стр.Количество);
СтруктураДанных.Вставить("ДатаНачала",       Стр.ДатаНачала);
СтруктураДанных.Вставить("ДатаОкончания",    Стр.ДатаОкончания);
СтруктураДанных.Вставить("Компенсация",      Стр.Компенсация);
СтруктураДанных.Вставить("ДатаРегистрации",  Стр.ДатаРегистрации);
СтруктураДанных.Вставить("РабочийПериодС",   Стр.РабочийПериодС);
СтруктураДанных.Вставить("РабочийПериодПо",  Стр.РабочийПериодПо);
СтруктураДанных.Вставить("Основание",        Стр.Основание);
СтруктураДанных.Вставить("ПериодНачисления", Стр.ПериодНачисления);
СтруктураДанных.Вставить("Сторно",           Стр.Сторно);
КонецЦикла;


LexaK

попробуйте так

ЗапросВ = КомСоединение.NewObject("Запрос");
    ЗапросВ .Текст = "
|ВЫБРАТЬ первые 1 //для окумента только один сотрудник нужен, берем первого попашегося
    |Сотрудники.Ссылка КАК Сотрудник //вообще-то нужна ссылка
|//мусор
    |//Сотрудники.Представление КАК Сотрудник,
    |//Сотрудники.ФизическоеЛицо.Наименование КАК ФизическоеЛицо,
    |//Сотрудники.СтруктураКомпании.Представление КАК СтруктураКомпании
    |ИЗ
    |Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    |НЕ Сотрудники.СтруктураКомпании = ЗНАЧЕНИЕ(Справочник.СтруктураКомпании.ПустаяСсылка)
    |И Сотрудники.ФизическоеЛицо.Наименование = &ФизическоеЛицо
|И Не Сотрудники.ПометкаУдаления //помеченных на удаление не берем
|";
   
//сразу в запросе по имени и найдеа
//ФизЛицо = КомСоединение.Справочники.ФизическиеЛица.НайтиПоНаименованию(СтруктураДанных.Сотрудник);
    ЗапросВ.УстановитьПараметр("ФизическоеЛицо", ФизЛицо); //ФизЛицо - это точно наименование? или надо  ФизЛицо.Наименование
   
    com_Результат     = ЗапросВ.Выполнить().Выбрать(); // COM объект   
Если com_Результат.следующий() Тогда
//нашли сотрудника
com_ТЗ_Сотрудники = com_Результат.Сотрудник; // COM объект
Иначе
//соответственно не нашли
com_ТЗ_Сотрудники = Неопределено;
КонецЕсли;

//бред какой-то
//// Получаем таблицу значений из COM-объекта
//// COMОбъект в -> строку
//// Запишем COMОбъект в строку на стороне базы-источника
//стр_ТЗ_Сотрудники = КомСоединение.ЗначениеВСтрокуВнутр(com_ТЗ_Сотрудники);
//// получим таблицу значений из строки
//ТЗ_Сотрудники = ЗначениеИзСтрокиВнутр(стр_ТЗ_Сотрудники);

    МенеджерДокумента = КомСоединение.Документы.ЗаписьВРНФактическиеОтпуска;
    КомСоединение.УстановитьБезопасныйРежим(Ложь);
    КомСоединение.УстановитьПривилегированныйРежим(Истина);

    НовДок      = МенеджерДокумента.СоздатьДокумент();
    НовДок.Дата = СтруктураДанных.Период;
    НовДок.Сотрудник = com_ТЗ_Сотрудники; //что нашли/не нашли то и подставляем

   
если помогло нажмите: Спасибо!

buketov.av

ЗапросВ.УстановитьПараметр("ФизическоеЛицо", ФизЛицо); //ФизЛицо - это точно наименование? или надо  ФизЛицо.Наименование

вот здесь немного не понятно , что Вы имели ввиду? и это ФизЛицо мне как устанавливать?
так? - КомСоединение.Справочники.ФизическиеЛица.НайтиПоНаименованию(СтруктураДанных.Сотрудник);

wise

(4) а ничего, что структура в ЭТОЙ базе создаётся ЭТИМИ объектами заполняется, в Вы её пытаетесь в ЧУЖОЙ(COM) запрос ЭТИ объекты передать.??
теперь ПОНЯТНО, где ОШИБКА.!!
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

buketov.av

Цитата: wise от 21 ноя 2019, 09:59
(4) а ничего, что структура в ЭТОЙ базе создаётся ЭТИМИ объектами заполняется, в Вы её пытаетесь в ЧУЖОЙ(COM) запрос ЭТИ объекты передать.??
теперь ПОНЯТНО, где ОШИБКА.!!

и как это сделать правильно? можете подсказать?

Добавлено: 21 ноя 2019, 11:03


так заработало:

//выбираем сотрудника
ЗапросВ = КомСоединение.NewObject("Запрос");
ЗапросВ.Текст = "
|ВЫБРАТЬ первые 1
//для окумента только один сотрудник нужен
|KPI_Сотрудники.Ссылка КАК Сотрудник
|ИЗ
|Справочник.KPI_Сотрудники КАК KPI_Сотрудники
|ГДЕ
|НЕ KPI_Сотрудники.СтруктураКомпании = ЗНАЧЕНИЕ(Справочник.KPI_СтруктураКомпании.ПустаяСсылка)
|И KPI_Сотрудники.ФизическоеЛицо.Наименование = &ФизическоеЛицо
|И KPI_Сотрудники.ПометкаУдаления = ЛОЖЬ
|";

ЗапросВ.УстановитьПараметр("ФизическоеЛицо", СтруктураДанных.Сотрудник.Наименование);

com_Результат     = ЗапросВ.Выполнить().Выбрать(); // COM объект   
Если com_Результат.следующий() Тогда
//нашли сотрудника
com_ТЗ_Сотрудники = com_Результат.Сотрудник; // COM объект
Иначе
//соответственно не нашли
com_ТЗ_Сотрудники = Неопределено;
КонецЕсли;

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск