Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Как вызвать функцию написанную в 1С


Автор: Delphist 24.2.2009, 10:56
Здравствуйте! Я программист (Delphi). Столкнулся со следующей проблемой:
в "1С:Предприятие" была сконфигурирована база данных, и там была написана некая функция, 
стоит задача вызывать эту функцию из внешней программы, т.е. как должен
выглядеть код в частности на Delphi (можно на С++), который позволял бы вызывать эту
функцию.

Автор: AkelaSQL 24.2.2009, 14:00
О какой платформе идёт речь? Где расположена функция (какой модуль)? Как соединяетесь с 1С?

Автор: Delphist 24.2.2009, 14:38
Цитата(AkelaSQL @  24.2.2009,  15:00 Найти цитируемый пост)
О какой платформе идёт речь?  Как соединяетесь с 1С? 

Меня интересует и для v7.7 и для v8.1

Цитата(AkelaSQL @  24.2.2009,  15:00 Найти цитируемый пост)

Как соединяетесь с 1С? 

Соединяюсь, ну например для v8.1
Код

function
  Create1CObject(s1cAppProgID: string; var UseInstance1C: boolean):
  Variant;
var
  GUID: TGUID;
  IU: IUnknown;
begin

  try
    GUID := ProgIDToClassID(s1cAppProgID);
    if UseInstance1C and SUCCEEDED(GetActiveObject(GUID, nil, IU)) then
      Result := IU
    else
    begin
      UseInstance1C := False;
      Result := CreateOleObject(Trim(s1cAppProgID));
    end;
  except
    Result := Unassigned;
  end;
end;

function ConnectTo1C8_COM( s1cAppProgID,
                           InitLine : string;
                           var UseInstance1C: boolean) : Variant;
begin

  if Length(Trim(s1cAppProgID))<=0 then
    s1cAppProgID:='v8.COMConnector';
  Result := Create1CObject(s1cAppProgID, UseInstance1C);
  if not VarIsEmpty(Result) then
    Result:=Result.Connect(Trim(InitLine));
end;


Цитата(AkelaSQL @  24.2.2009,  15:00 Найти цитируемый пост)

Где расположена функция (какой модуль)?

Я особенно не шарю в 1С, знаю лишь то, что есть собственная конфигурация в 1С:Предприятие, ну и функция написанная 1С программистами. Знаю лишь то, что они ее разместят в то место, чтобы ее можно было вызвать из внешней программы

Автор: AkelaSQL 24.2.2009, 15:41
Для 8.1
Тогда они должны поместить её в модуль внешнего соединения (желательно). Далее, после установки ком-соединения, выполняем: КомОбъект.ИмяФункции();

ИЛИ КомОбъект.EvalExpr("ИмяФункции()");

Для выполнения куска 1С - ного кода можно использовать:

КомОбъект.ExecuteBatch("ОтветСервера = КаталогПользователя() + "01.tmp";
        ТекстЗагружаемыеДанные    = СоздатьОбъект("AddIn.V7TextFile");    
        ИнтернетОбъект    = СоздатьОбъект("AddIn.V7HttpReader");
        ИнтернетОбъект.КоличествоПопытокАвторизации = 0;")


Для 7.7 аналогично, только процедуру нужно расположить в глобальном модуле.

Автор: Delphist 24.2.2009, 17:08
Цитата(AkelaSQL @  24.2.2009,  16:41 Найти цитируемый пост)
Тогда они должны поместить её в модуль внешнего соединения (желательно). Далее, после установки ком-соединения, выполняем: КомОбъект.ИмяФункции();

Спасибки. Тут еще одна проблема, чтобы протестить все это дело, мне нужно написать функцию в 1С, которую я бы вызывал. В 1С я не великий спец  smile, поэтому нужна помощь - помоги написать функцию  пусть это будет функция с названием SaveToDBF(aDate: TDate), которая просто выводит на экран дату указанная в параметре aDate и возвращает значение -1. 

И еще а как я через EvalExpr узнаю результат, который вернула SaveToDBF?

Автор: AkelaSQL 25.2.2009, 09:55
Ф
Код

ункция SaveToDBF(aDate) Экспорт
    aDate = Дата(aDate);
    Предупреждение(Строка(aDate),60);
    Возврат -1;
КонецФункции //SaveToDBF(aDate)



Далее если вызвать

Код

Результат = КомОбъект.EvalExpr("SaveToDBF("25.02.09") ")


тогда Результат будет равен -1


    Только я не рекомендую работать с интерактивными объектами и методами на стороне КомОбъекта. В качестве передаваемых параметров могут использоваться только переменные примитивных типов (строка, число, булево). Так что окошки диалога с пользователем лучше выводи в дельфях.

Автор: Delphist 25.2.2009, 10:42
Цитата(AkelaSQL @  25.2.2009,  10:55 Найти цитируемый пост)
Только я не рекомендую работать с интерактивными объектами и методами на стороне КомОбъекта. В качестве передаваемых параметров могут использоваться только переменные примитивных типов (строка, число, булево). 

Спасибо!!!Вообщем создал я новую конфигурацию, затем создал в нем справочник, теперь хочу в 1С сделать форму с одной кпопкой при клике на которую должна вызываться SaveToDBF. Ток вот не фига не получается.

AkelaSQL у меня к тебе огромная просьба, добавить, пожалуйста, в мою конфигурацию, которую я прикрепил, форму с кнопокой вызывающая SaveToDBF. А то я до кузькиной зимы в этом конструкторе буду ковыряться

Автор: AkelaSQL 25.2.2009, 11:45
Размещение кнопки в форме справочника в твоём случае - это плохой подход. Создал тебе обработку и общий модуль, вызывай её.

У тебя релиз платформы какой-то старый, так что конфа может не открыться, обновляй платформу 1С

Автор: Delphist 25.2.2009, 14:31
Цитата(AkelaSQL @  25.2.2009,  12:45 Найти цитируемый пост)
Размещение кнопки в форме справочника в твоём случае - это плохой подход. Создал тебе обработку и общий модуль, вызывай её.

Поставил 8.1, все ок, твоя конфигурация открывается, спасибки - увидел твою формочку

Но возникла следующая проблема, при коннекте к 1С через v81.COMConnector из под Delphi 
выдается ошибка 
{ОбщийМодуль.МодульВнешнегоСоединения(3,2)}: Процедура или функция с указанным именем не определена
{Предупреждение}

Может нужно добавлять эту функцию в модуль внешнего соединения, который не вручную создается, а вызывается через контекстное меню (правой кнопкой мыши) на слове Конфигуратор? smile 

Автор: AkelaSQL 25.2.2009, 14:57
1. В свойствах внешнего модуля должны быть установленны галочки: Глобальный, Клиент, Внешнее соединение.
2. Пользователь, под которым конектишься к 1С должен иметь право: Дополнительное право внешнего подключения (соединения), устанавливается на закладке "Прочее" в "Меню-Администрирование-Пользователи"

Добавлено через 2 минуты и 49 секунд
Цитата

Может нужно добавлять эту функцию в модуль внешнего соединения, который не вручную создается, а вызывается через контекстное меню (правой кнопкой мыши) на слове Конфигуратор? 


можно и так, это монопенисуально...

Добавлено через 4 минуты и 33 секунды
Воронеж - хер догонишь....


Я кстати родом из Борисоглебска

Автор: Delphist 25.2.2009, 15:22
Цитата(AkelaSQL @  25.2.2009,  15:57 Найти цитируемый пост)

на закладке "Прочее" в "Меню-Администрирование-Пользователи"

Так у меня этот список вообще пустой, я без пользователя подключаюсь - скорее всего по умолчанию как админ

Автор: AkelaSQL 25.2.2009, 15:40
Заведи пользователя.

Автор: Delphist 25.2.2009, 16:08
Цитата(AkelaSQL @  25.2.2009,  16:40 Найти цитируемый пост)
Заведи пользователя. 

1. Да нет, дело не в этом. Я тут начал разбираться выясняется, что если мы работаем через v81.COMConnector (через com), то внешней функции 1С запрещено использовать функции интерфейса (т.е. вызывать диалоговые окна и прочее)

2. Результат = КомОбъект.EvalExpr("SaveToDBF("25.02.09") ") вызаывать так нельзя, потому что нужно передавать параметр даты в котором указано не только дата, но и время 25.02.09 00:00:00 (где в качестве нулей может стоять реальные часы:минуты:секунды), а иначе выдается ошибка невозможно провести преобразование даты.


Автор: AkelaSQL 25.2.2009, 17:24
Я частично тебя об этом предупреждал:

 
Цитата

Только я не рекомендую работать с интерактивными объектами и методами на стороне КомОбъекта. В качестве передаваемых параметров могут использоваться только переменные примитивных типов (строка, число, булево). Так что окошки диалога с пользователем лучше выводи в дельфях.


Добавлено через 34 секунды
Но это уже детали...

Автор: Delphist 25.2.2009, 17:49
Цитата(Delphist @  25.2.2009,  17:08 Найти цитируемый пост)
Результат = КомОбъект.EvalExpr("SaveToDBF("25.02.09") ") вызаывать так нельзя, потому что нужно...

А что нужно подправить в SaveToDBF чтобы ее можно было вызывать именно так SaveToDBF("25.02.09")  а не 
SaveToDBF("25.02.09 00:00:00") 

Автор: Delphist 27.2.2009, 14:41
Цитата(Delphist @  25.2.2009,  18:49 Найти цитируемый пост)
А что нужно подправить в SaveToDBF чтобы ее можно было вызывать именно так SaveToDBF("25.02.09")  а не 
SaveToDBF("25.02.09 00:00:00") 

Вопрос по прежнему актуален

Автор: AkelaSQL 27.2.2009, 15:10
1С 8.1 замечательно понимает вот такой формат: Дата("00010101140000"), поэтому для даты 25.02.09 вызывай её так: SaveToDBF("20090225000000")

Добавлено через 1 минуту и 22 секунды
и плюсуй, плюсуй!!!

Автор: Delphist 27.2.2009, 20:45
Цитата(AkelaSQL @  27.2.2009,  16:10 Найти цитируемый пост)
1С 8.1 замечательно понимает вот такой формат: Дата("00010101140000"), поэтому для даты 25.02.09 вызывай её так: SaveToDBF("20090225000000")


Не совсем понял. У меня есть функция:
Код

Функция SaveStorehouseDataToDBF(aDate) Экспорт
    aDate = Дата(aDate);
    Возврат 2;
КонецФункции


Так вот если я передаю в качестве параметра aDate  дату вот так ("25.02.09") , то 1С ругается, если же ("25.02.09 00:00:00")
Но у меня задача такова, что время передовать мне не нужно. Так вот как 1С отучить (что нужно написать в функции), чтобы она воспринимала дату без времени нормально?

Автор: AkelaSQL 2.3.2009, 10:04
("25.02.09 00:00:00")  - это и есть дата без времени, тебе что нулей к дате добавить трудно?

Автор: Delphist 2.3.2009, 11:15
Цитата(AkelaSQL @  2.3.2009,  11:04 Найти цитируемый пост)
("25.02.09 00:00:00")  - это и есть дата без времени, тебе что нулей к дате добавить трудно? 

НЕт не трудно - меня напрягает этот маразм, почему чтобы передать просто дату, нужно еще писать и время smile 

Автор: AkelaSQL 3.3.2009, 10:09
Потому что тип данных называется DateTime, а дата всего лишь составляющая данного типа. Передай "20090225" это тоже должно прокатить...

Добавлено через 1 минуту и 25 секунд
И вообще, есть правила преобразования типов или что? в дельфях совсем нет понятия типизации переменных?

Автор: Delphist 3.3.2009, 10:27
Цитата(AkelaSQL @  3.3.2009,  11:09 Найти цитируемый пост)
И вообще, есть правила преобразования типов или что? в дельфях совсем нет понятия типизации переменных? 

Есть, но у нас есть TDate и TDateTime

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)