Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: OLE-запрос
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
shkoda
Всем здрасте!

Суть такова -
нужно находясь в одной базе при помощи OLE-запроса получить из другой базы Оклад человека
далее этот Оклад будет пересчитываться по формуле

Так вот код

    Если ДокументОснование.Вид()="БольничныйЛист" Тогда
    
    Состояние("ожидайте...");    
        
    БазаОле=СоздатьОбъект("V77S.Application");
    КаталогБазыОЛе  = "\\123.ua\1C\123\";
    ПользовательОле = "123";
    ПарольОле       = "123";
    МонопольныйРежимOLE = ""; // для немонопольного запуска указать пустую строку!
    ЗапускБезЗаставки = 1;       // для появления заставки (например, чтобы наблюдать
                             // процесс запуска базы OLE визуально) поставьте здесь "0"
    РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
                       СокрЛП(КаталогБазыОле) + " /n" +
                       СокрЛП(ПользовательОле)+ " /p" +
                       СокрЛП(ПарольОле) + МонопольныйРежимOLE,
                       ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
        Если РезультатПодключения = 0 Тогда
             Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
        КонецЕсли;
    
    ОлеЗапрос = БазаОле.CreateObject("Запрос");
    СпрОлеСотр = БазаОле.CreateObject("Справочник.Сотрудники");
    СпрОлеНазнач = БазаОле.CreateObject("Справочник.Назначения");
    
    ЗапросБоль = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(ЗапросБоль)
    |Владелец = Справочник.Сотрудники.ТекущийЭлемент;
    |Оклад = Справочник.Назначения.Оклад;
    |"//}}ЗАПРОС
;

    Если ЗапросБоль.Выполнить(ТекстЗапроса) = 0 Тогда
        Сообщить("Fail");
        Возврат;
    Иначе
        Сообщить("Win");
    КонецЕсли;
    
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ЗапросБоль.Выгрузить(ТЗ);
    
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
        Сообщить("1С - круто! ");
        Оклад = ТЗ.Оклад;
    КонецЦикла;
        
    //Оклад = 1677; // то, что должно получится на выходе


Но, получается не так как предполагается
выдаёт ошибку
{Документ.РазницаВСрЗп.Форма.Модуль(130)}: Поле агрегатного объекта не обнаружено (Оклад)

честно сказать уже несколько дней бьюсь над этой бедой, но ничего толкового не получается((

подскажите, люди добрые как быть?

Спасибо!
Мичман Харитонов
Реквизит "Оклад", наверное, периодический?
И назначение - тоже?

То есть, что-то вроде
Справочник.Назначения.Получить(ДатаДок).Оклад.Получить(ДатаДок)
shkoda
Цитата(Мичман Харитонов @ 12.01.16, 17:18) необходимо зарегистрироваться для просмотра ссылки
Реквизит "Оклад", наверное, периодический?
И назначение - тоже?

То есть, что-то вроде
Справочник.Назначения.Получить(ДатаДок).Оклад.Получить(ДатаДок)


да, действительно - периодический
сейчас попробую
shkoda
shkoda @ 12.01.16, 20:19 необходимо зарегистрироваться для просмотра ссылки,

В общем, пришлось отложить это задание и делать другое, но зато когда вернулся к выполнению уже под другим углом взглянул на это всё и вот что получилось
надеюсь может кому поможет в будущем

    Если ДокументОснование.Вид()="БольничныйЛист" Тогда
    ДатаНачалаБоль = ДокументОснование.ДатаНачала;
    ДатаОкончанияБоль = ДокументОснование.ДатаОкончания;
    ТабельныйНомер = СокрЛП(Сотрудник.Код);
    Состояние("Запуск OLE, ожидайте...");    
        
    БазаОле=СоздатьОбъект("V77S.Application");
    КаталогБазыОЛе  = "\\контора\1C\ЗиК\";
    ПользовательОле = "Вася";
    ПарольОле       = "111";
    МонопольныйРежимOLE = ""; // для немонопольного запуска указать пустую строку!
    ЗапускБезЗаставки = 1;       // для появления заставки (например, чтобы наблюдать
                             // процесс запуска базы OLE визуально) поставьте здесь "0"
    РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
                       СокрЛП(КаталогБазыОле) + " /n" +
                       СокрЛП(ПользовательОле)+ " /p" +
                       СокрЛП(ПарольОле) + МонопольныйРежимOLE,
                       ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
        Если РезультатПодключения = 0 Тогда
            Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
        КонецЕсли;
        
    ОлеЗапрос = БазаОле.CreateObject("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(ОлеЗапрос)
    |Период с '"+ДатаОкончанияБоль+"' по '"+ДатаОкончанияБоль+"';
    |Владелец = Справочник.Сотрудники.Наименование;
    |Наименование = Справочник.Сотрудники.ФизическоеЛицо;
    |Оклад = Справочник.Сотрудники.ОсновноеНазначение.Владелец.ОсновноеНазначение.Оклад;
    |УникальныйНомер = Справочник.Сотрудники.Код;
    |Условие(УникальныйНомер = """+ТабельныйНомер+""");
    |Группировка Наименование;
    |"//}}ЗАПРОС
;

    Если ОлеЗапрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Сообщить("При обработке запроса произошла ОШИБКА");
        Возврат;
    Иначе
        //Сообщить("Запрос выполнен УСПЕШНО");
    КонецЕсли;
    
    Пока ОлеЗапрос.Группировка("Наименование")=1 Цикл
        Оклад = ОлеЗапрос.Оклад;
        Владелец = ОлеЗапрос.Владелец;
        Сообщить("Оклад сотрудника  " + СокрЛП(Владелец) + " в период больгичного с " + ДатаНачалаБоль + " по " + ДатаОкончанияБоль + " равен " + Оклад + " грн.");
    КонецЦикла;
    
    ОкладЗаДень = ( Оклад * 12 ) / 365;
    СуммаСтар = ОкладЗаДень * КвоДней * (ДокументОснование.ПроцентОплаты / 100);
    СуммаСтар = СуммаСтар - (СуммаСтар * 0.18); // НДФЛ
    СуммаКУдержанию = Макс(0,СуммаНов-СуммаСтар);
    СрЗпСтар = СуммаСтар/КвоДней;
    
    БазаОле = "";
    КонецЕсли;


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

CODE
Vofka
tatamodka, а?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.