Здравствуйте! У меня не типовая/самописная конфигурация 1С. В Creatio  создан не типовой специальный объект TiServiceDesk_Base, который содержит наряды TiWorkOrder подрядчиков Account.  Мне необходимо по запросу из 1С считать массив нарядов за месяц по конкретному подрядчику. Связываюсь по протоколу ODATA3. Коннектится все нормально, но когда делаю запрос, то код ошибки получаю 301. Видимо сам запрос некорректен.

Прошу помощи в виде примеров запроса через ODATA3 к таблицам Creation. В переписке видел, что есть ert-обработка на 1С с примером идентификации и запроса к базе. Можете мне ее выслать?

Сам SQL запрос выглядит так:

 

SELECT * FROM "TiWorkOrder"

LEFT JOIN "Account" ON "TiWorkOrder."TiContractorid"="Account"."Id"

WHERE "Account"."Cod" = 123456 AND "TiWorkOrder"."TiFactEndDate" > '2024-01-01' AND "TiWorkOrder"."TiFactEndDate" < '2024-02-01'

Нравится

2 комментария

Добрый день.



Вы можете найти примеры запросов Odata в документации:



https://documenter.getpostman.com/view/10204500/SztHX5Qb?version=latest

https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…

Cherednichenko Nikita,

Не лучше ли выложить в community готовый пример 1С аутентификации и запросов GET, POST, который будет полезен всем последующим программистам 1С ? Команда Creatio заинтересована в дальнейшем развитиии проекта и последующих интерегациях с 1С?

Показать все комментарии

При подготовке этого релиза 1C Connector 3.6 команда технической поддержки тщательно проанализировала обращения клиентов, в результате чего сформировался список наиболее востребованных обновлений и улучшений. Подробнее...

Нравится

Поделиться

0 комментариев
Показать все комментарии

Доброе всем время суток!
Проблема такая:
На данный момент внедряем у себя в компании TerrasoftXRM и при интеграции стандартными средствами системы, с 1С вылетает ошибка (показано на скрине)
Соединение происходит по следующему алгоритму:
TerrasoftXRM -> Инструменты -> Интеграции -> Добавить синхронизацию с 1С -> Далее второй скрин параметры соединения, пароля на пользователя нет.
Все делалось как в руководстве и в то же время вот такая проблема.
Заранее спасибо

Нравится

4 комментария

Есть подозрение, что на машине с которой пытаетесь подключится к 1с не установлена сама 1с.

Возможно у вас на машине не корректно установлена 1С или ее версия отличается (напр. 8.1)

Так стоп!
Уважаемые форумчане я подключаюсь к базе по сети к расшаренной папке с базой. на машине где стоит Terrasoft, 1С не установлено.
Правельно ли я понял что надо еще ставить 1С и на сервер Terrasoft???

На сервер Terrasoft не обязательно, но 1С должна быть установлена на каждой машине, с которой Вы будете запускать интеграцию с 1С из Terrasoft.

Показать все комментарии

Подскажите пожалуйсто, при попытке соеденится с базой 1С при помощи утилиты, выскакивает сообщение "Невозможно создание обьекта сервером програмирования обьектов" (!!!) Использую Террасофт XRM(MSSQL) и встроенную утилиту. 1С версии 8.1 , одинаковое сообщение про попытке выгрузить данные из файла 1С, и при попытке связатся в базой 1С в MSSQL.

Нравится

2 комментария

Такое сообщение может появляться если на рабочей станции на которой запущен TSCRM нет клиента 1С или неверно указана версия 1С в настройке соединения.

"Славянский Евгений" написал:

Спасибо.

Показать все комментарии

Еще одна функция загрузки из .xls
Обработку для выгрузки из 1С выложу немного позднее.

function ImportOffMov() {
  var ExlApp = new ActiveXObject("Excel.Application");
  var WorkBook = ExlApp.Workbooks.Open(xlfile);
  var Sheet = WorkBook.ActiveSheet;    
  var ds_Store = Services.GetNewItemByUSI('ds_Store');
  var ds_Account = Services.GetNewItemByUSI('ds_Account');
  var ds_Offering = Services.GetNewItemByUSI('ds_Offering');
  var ds_OfferingMovement = Services.GetNewItemByUSI('ds_OfferingMovement');
  var ds_OfferingInMovement = Services.GetNewItemByUSI('ds_OfferingInMovement');
       
  ds_Store.Open();
  ds_Offering.Open();
  ds_Account.Open();
  ds_OfferingMovement.Open();
  ds_OfferingInMovement.Open();

  for(var i=1;iSheet.UsedRange.Rows.Count;i++){
    if(Sheet.Cells(i, 1).Value=='Ш'){
      ds_Account.Locate('INN' , Sheet.Cells(i, 4));
      ds_OfferingMovement.Append();
      ds_OfferingMovement('Number')=Sheet.Cells(i, 2);
      ds_OfferingMovement('AccountID')=ds_Account('ID');
      ds_OfferingMovement('TypeID')='{A48368CD-E28D-458D-8AE8-E2A314186C5C}';
      ds_OfferingMovement('Amount')=Sheet.Cells(i, 5).Value;
      ds_OfferingMovement('Date')=StrToDate(Sheet.Cells(i, 3).Value).getVarDate();
      ds_OfferingMovement.Post();
    }
    if(Sheet.Cells(i, 1).Value=='С'){
      ds_Offering.Locate('OfferingName', Sheet.Cells(i, 2));
      ds_OfferingInMovement.Append();
      ds_OfferingInMovement('OfferingMovementID')=ds_OfferingMovement('ID');
      ds_OfferingInMovement('OfferingID')=ds_Offering('ID');
      ds_OfferingInMovement('UnitName')='Шт.';
      ds_OfferingInMovement('StoreID')=ds_Store('ID');
      ds_OfferingInMovement('Quantity')=Sheet.Cells(i, 4).Value;
      ds_OfferingInMovement('Cost')=Sheet.Cells(i, 3).Value;
      ds_OfferingInMovement('Amount')=Sheet.Cells(i, 5).Value;
      ds_OfferingInMovement('SignedAmount')=Sheet.Cells(i, 5).Value;
      ds_OfferingInMovement('SignedQuantity')=Sheet.Cells(i, 4).Value;
      ds_OfferingInMovement.Post();
    }
  }
  ds_Store.Close();
  ds_Account.Close();
  ds_Offering.Close();
  ds_OfferingMovement.Close();
  ds_OfferingInMovement.Close();
  WorkBook.Close();
  ExlApp.Quit();
}

Нравится

Поделиться

5 комментариев

Антон, снова теги мешают :smile:

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

ds_OfferingMovement('TypeID')='{A48368CD-E28D-458D-8AE8-E2A314186C5C}';

IDшники желательно определять в скрипте scr_Consts, читать удобнее и в случае изменения нужно будет поправить только в одном месте.

И опять же я бы на Update переделал. Хотя по ситуации, конечно. Скажу Вам как новичку: датасеты на массовых апдейтах - зло :)

посчитайте строки перед циклом

...
  var RowsCount = Sheet.UsedRange.Rows.Count;
  for(var i=1;i<RowsCount;i++)
...   

при больших Excel-файлах заметите невероятное ускорение в скорости )
Видимо коварный ексель при обращению к свойству Count пересчитывает UsedRange...
Была подобная задача. На файлах в 5000 строк разнится по скорости отработки цикла - 10-ки раз.

Показать все комментарии

Написал вот, вдруг кому будет полезно :)

function ImportStocks(xlsfile) {
  var ExlApp = new ActiveXObject("Excel.Application");
  var WorkBook = ExlApp.Workbooks.Open(xlsfile);
  var Sheet = WorkBook.ActiveSheet;
  var ds_Offering = Services.GetNewItemByUSI('ds_Offering');
  var i = 0;
  var code='';
  var stock='';
  ds_Offering.Open();
  for(var i=1;iSheet.UsedRange.Rows.Count;i++){
    code = Sheet.Cells(i, 2).Value;
    stock = Sheet.Cells(i, 3).Value;
    if (ds_Offering.Locate('OfferingName' , code)){
      ds_Offering.Edit();
      ds_Offering('Available') = stock;
      ds_Offering.Post();
    }
  }          
  ds_Offering.Close();
  WorkBook.Close();
  ExlApp.Quit();
}

Нравится

Поделиться

15 комментариев

Код нужно поправить для читабельности :smile:
А способ хороший - сам часто им пользуюсь для быстрого импорта.

Ох.. недоглядел :)
Обязательно подправлю, спасибо за замечание.

Кстати, в иногда в таких случаях (при импорте больших таблиц) следует события датасета отключать. Dataset.DisableEvents();

Вот, теперь прям красота:smile:

ООО "Лайнсервис"
www.ls-crm.ru

Я еще только учусь - фактически второй день работаю с террасофтом.
Очень огорчает, конечно, отсутствие вменяемой документации.
И очень радует наличие хорошего community.
Спасибо :)

Ну такой метод, стремный. Я не совсем помню сколько записей будет в датасете после ds_Offering.Open();

Тут два варианта
1) Все. Тогда тянуть на клиент всю таблицу продуктов... Ну не самое оптимальное решение.
2) 40. Тогда ds_Offering.Locate просто не найдет кучу записей.

Я бы не стал так делать. Есть смысл если там хитрая логика, но тогда не нужно делать

"Глова Сергей" написал: Dataset.DisableEvents();

"Underscore a.k.a. _" написал:сколько записей будет в датасете после ds_Offering.Open();

в контексте - все записи будут. Если конечно не фильтровали после создания его

ООО "Лайнсервис"
www.ls-crm.ru

Просто раньше нужно было FetchRecordsCount = -1 проставлять длятого что-бы все отобрать. Потом это вроде убирали. Блин, простой вопрос в тупик поставил :)
Upd: Проверил - он таки сразу после создания -1 равен.

А как можно использовать эту функцию с вызовом окна выбора самого файла xls для импорта?

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Окно выбора файла должно возвратить имя файла - его сюда и передаем как параметр xlsfile

ООО "Лайнсервис"
www.ls-crm.ru

"Александр Кудряшов" написал:Окно выбора файла должно возвратить имя файла - его сюда и передаем как параметр xlsfile

)) то понятно...

If OpenDialog.Execute then ImportStocks(OpenDialog.Filename);

А как это реализовать в TS :smile:

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

 var FileName = System.CreateObject('TSObjectLibrary.Value');
 if (!(System.OpenDialog(FileName, '*.xls|*.xlsx', EmptyStr, EmptyStr, EmptyStr))) {
  return;
 }
ImportStocks(FileName.Value);

--
www.it-sfera.com.ua

навскидку например так

var FileName = System.CreateObject('TSObjectLibrary.Value');
if (!(System.OpenDialog(FileName, '*.xls', EmptyStr, "Выбор файла Microsoft Excel", EmptyStr))) {
		return;
	}

имя файла вернется в FileName.Value

[опередили уже:smile:]

ООО "Лайнсервис"
www.ls-crm.ru

Жизнь такая штука... :wink:

--
www.it-sfera.com.ua

Спасибо

"Александр Кудряшов" написал:

"Виталий Ковалишин aka samael" написал:

всем и каждому...
Так глядишь и перейду с дельфы)))

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Показать все комментарии

Возникла необходимость получить остатки по регистру накопления из Террасофта.
В 1С подобную операцию я бы сделал таким образом :
РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки(ТекущаяДата(), Фильтр);
либо вообще не передавал бы первый параметр
Как это реализовать в террасофте - не понимаю.
При попытке вызова Obj1C.ТекущаяДата() получаю вполне логичное "Объект не поддерживает это свойство или метод"
При попытке оставить пустое место вместо параметра - не менее логичное "Синтаксическая ошибка"
При передаче null или '20090807' - "Несоответствие типов"
Подскажите как быть, пожалуйста.

Нравится

9 комментариев

Покажите часть кода как вы вызываете этот регистр

Здравствуйте, Антон.
Приведите, пожалуйста, текст Вашей функции. И, если честно, не очень понятно, что значит "остатки по регистру накопления".

Добрый день.
Вот так это выглядит в 1С :
Фильтр = Новый Структура();
Фильтр.Вставить("Контрагент",Справочники.Контрагенты.НайтиПоКоду("000002245"));
А = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки ('20090807', Фильтр).Итог("СуммаВзаиморасчетов");
А вот так я это делаю в террасофт
var C1Account = Obj_1C.Справочники.Контрагенты.НайтиПоКоду("000002245");;
var C1Register = Obj_1C.РегистрыНакопления.ВзаиморасчетыСКонтрагентами;
var C1Filter = Obj_1C.NewObject("Структура");
C1Filter.Вставить("Контрагент",C1Account);
C1temp = C1Register.Остатки(null,C1Filter);
sum = C1temp.Итог("СуммаВзаиморасчетов");

Здравствуйте, Антон.
На сколько я понимаю, в 1С Вы делаете

.Остатки ('20090807', Фильтр).

а в JScript'е

.Остатки(null,C1Filter);

и в результате ругается на несоответствие типов?

Можете попробовать вот так:

var d = new Date();
C1temp = C1Register.Остатки(d ,C1Filter);

Это был лишь один из примеров. В JScripte можно написать

.Остатки('20090807',C1Filter);

и все равно ругается на несоответствие
спасибо за совет, но так тоже ругается на несоответствие типов :)

А вы уверены что ругается именно на дату?
У меня скрипты в Terrasoft работают с 1С, и дата вида '20090807' передается нормально. Скорее всего проблема в другом.

И еще, на всякий случай.
К 1С можно обращаться двумя способами: Как к серверу OLE

new ActiveXObject("V81.Application")

и как к COM объекту

 new ActiveXObject("V81.COMConnector")

Каждый из способов имеет свои плюсы и минусы.

Добрый день, коллеги!

Извините за вопрос в столь старой ветке, но, все же интересно - удалось ли решить проблему? В настоящий момент бьюсь над аналогичной задачей - получить из 1С остатки товаров на текущую дату.

За пример рабочего кода буде премного благодарен!

Здравствуйте!

К сожалению готового примера кода у нас нету. Пробовали ли Вы способ указанный в этой теме? Какие именно ошибки у Вас возникают? Каким способом Вы обращаетесь к 1С? Приведите, пожалуйста, также код, с помощью которого Вы пытаетесь получить остатки товаров для его анализа.

Спасибо.

Показать все комментарии