Добрый день!

Делаю интеграцию с 1С 8.2 на стороне Terrasoft:

1c_import_ts.png

Скриптами получаю "контактную информацию" из "контактного лица". Вот запрос:

var Object1C = Param.Obj1C;            
                var ContactInfo = Object1C.NewObject("Запрос");          
                ContactInfo.text = "ВЫБРАТЬ КонтактнаяИнформация.Объект," + '\n'+
                                "КонтактнаяИнформация.Тип," + '\n'+
                                "КонтактнаяИнформация.Вид," + '\n'+
                                "КонтактнаяИнформация.Представление," + '\n'+
                                "КонтактнаяИнформация.Поле1," + '\n'+
                                "КонтактнаяИнформация.Поле2," + '\n'+
                                "КонтактнаяИнформация.Поле3," + '\n'+
                                "КонтактнаяИнформация.Поле4," + '\n'+
                                "КонтактнаяИнформация.Поле5," + '\n'+
                                "КонтактнаяИнформация.Поле6," + '\n'+
                                "КонтактнаяИнформация.Поле7," + '\n'+
                                "КонтактнаяИнформация.Поле8," + '\n'+
                                "КонтактнаяИнформация.Поле9," + '\n'+
                                "КонтактнаяИнформация.Поле10," + '\n'+
                                "КонтактнаяИнформация.Комментарий," + '\n'+
                                "КонтактнаяИнформация.ЗначениеПоУмолчанию" + '\n'+
                        "ИЗ" + '\n'+
                                "РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация" + '\n' +
                        "ГДЕ"+ '\n' +
                                "КонтактнаяИнформация.Объект = &Ссылка1;";                 
                ContactInfo.УстановитьПараметр("Ссылка1", Select1C[QueryLink].Ссылка);                                       
                var SContactInfo = ContactInfo.execute()               
                var RContactInfo = SContactInfo.Выгрузить();

В 1С это так выглядит:

1c_import.png

Из "Представление" (1) значение получаю без проблем!

Как получить значение перечисления "Тип" (2)? Может кто-то уже такое делал?

Спасибо!

Нравится

8 комментариев
Param.Obj1C.Перечисления.ТипыКонтактнойИнформации.Другое

Если нам нужно получить тип из 1С, тогда вот пример скрипта:

var EnumName = 'ТипыКонтактнойИнформации';
var EnumIndex = Param.Obj1C.Перечисления[EnumName].Индекс(Select1C.Тип);
var Name = Select1C.Тип.Метаданные().EnumValues.Get(EnumIndex).Имя; 

Обратите внимание, это для 1С 8.х

В 1С 77 название можно было получить проще: Select1C.Тип.Представление()

Пробовал следующий код:

var EnumName = 'ТипыКонтактнойИнформации';
var EnumIndex = Param.Obj1C.Перечисления[EnumName].Индекс(RContactInfo.Получить(i).Тип);
var Name = Select1C.Тип.Метаданные().EnumValues.Get(EnumIndex).Имя;

Name из undefined ((((

Александр, а что у Вас в RContactInfo?

Это переменная с результатом выполнения запроса:

var SContactInfo = ContactInfo.execute()                
var RContactInfo = SContactInfo.Выгрузить();

Александр, в данном случае необходимо произвести отладку и выяснить, что у нас в RContactInfo.Получить(i).Тип

Для корректной работы функции должна быть ссылка на элемент перечисления. В случае, если у нас там что-то другое, код работать не будет.

RContactInfo.Получить(i).Тип - закрытый объект, как узнать ссылка это или скажем посмотреть его свойства?

Александр, попробуйте сравнить значение. Например, есть Вам точно известно, что тип в данном регистре - Адрес, тогда:

if (Param.Obj1C.Перечисления.ТипыКонтактнойИнформации.Адрес == RContactInfo.Получить(i).Тип){
//если выполняется, тогда равно.
}else{
это не ссылка на элемент перечисления.
}

Еще один из способов получения названия элемента из ссылки на него описан здесь: http://www.community.terrasoft.ua/blogs/8329#comment-34738

Спасибо. нашел решение проблемы!

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

В ТС у меня есть контрагент и его деталь [Платежные реквизиты], на которой есть "Банк" и "Номер счета". В 1С у меня есть клиент, у которого в картчке указывается и основные данные, и текущие платежные реквизиты.
Каким образом мне нужно настроить экспорт из ТС в 1С контрагента и его платежные реквизиты в одну карточку клиента в 1С?
Картинка примерно следующая:
Окно настроек
Вопрос только: что указывать в поле "Поле родителя в 1С" в настройке "Платежные реквизиты(ТС)-Клиенты(1С)"?

Каким образом можно это реализовать?

Нравится

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

Пободные вопросы по иморту [Платежных реквизитов] рассматривались ранее.
Ознакомьтесь с следующими ссылками:
http://www.community.terrasoft.ua/forum/topic/5363
http://www.community.terrasoft.ua/forum/topic/6898

Спасибо, то, что нужно

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

Время от времени возникает ситуация, когда код записи в 1С изменяется на другой. При этом, если настраивать синхронизацию справочников по двум ключевым полям (коду и названию объекта), то такая связка будет утрачена. Есть ли возможность использовать в качестве ключевого поля ID записи в 1С, которая не изменяется и всегда является идентифицирующей уникально конкретную запись в диапазоне одной таблицы?

Нравится

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

В случае если Вы используете тилиту синхронизации из каталога расширений:
http://www.community.terrasoft.ru/catalog/3796

В данноей утилите есть возможность выбора сопоставления Uuid(со стороны 1-C) и UuiD-1C(Terrasoft).
Установите данные поля как уникальные.

Спасибо :twisted:

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

Столкнулся с такой проблемой: выгружаю счета контрагентов и платежи, которые привязаны к счетам, но в списке полей 1С для документа "Платежное поручение входящее" отсутствует поле "Счет на оплату" (ссылка на счет, по которому сделан платеж). То есть я не могу привязать операцию к счету. Какие есть варианты решения проблемы без изменения чего либо в 1С?

Нравится

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

Судя по всему, поле связи - это ДокументОснование (в списке должно отображаться с пробелом: "Документ Основание").

Антон, сразу хочу обратить Ваше внимание, что настройка импорта этого поля "в лоб" может привести к некоторым проблемам, так как через это поле документ "Платежное поручение входящее" может быть связано не только со счетами, а и с другими документами. Полный перечень - в описании типа поля. Необходимо перед импортом проверять тип документа-основания.

Спасибо. А можно чуть подробнее объяснить, как проверять тип документа-основания? Как я понимаю нужно добавить скрипт для проверки по событию (onBeforeRecordImport) чтения из базы, а вот как именно?

P.S. Когда добавляю скрипт к элементу импорта (в скрипте ничего не пишу) и пытаюсь синхронизировать, ругается, что скрипт src_Dataflow1CUtils не найден. В скрипте удаляю привязку к скрипту, и добавляю привязку к src_Dataflow1CUtils и тогда работает.

Можно добавить такое условие:

return (Select1C.ДокументОснование.MetaData().FullName() != "Документ.СчетНаОплатуПокупателю");

В случае, если условие выполнится, функция вернёт true и сохранение не произойдёт.

Либо такое:

if (Select1C.ДокументОснование.MetaData().FullName() != "Документ.СчетНаОплатуПокупателю") {
	Dataset.Values('InvoiceID') = null;
}

В этом случае запись сохранится, но поле "Счет" не будет заполнено.

Что касается второго Вашего замечания, попробуйте повторно ввести значение "scr_Dataflow1CUtils" в строке

var Script1CConfIncludedScripts = new Array('scr_Dataflow1СUtils'/*, 'scr_Dataflow1CUtils_V81'*/);

скрипта scr_Dataflow1CConsts, и после этого сохранить скрипт. Возможная причина проблемы - в строке названия скрипта символы '1C' введены на русском, тогда как реальное название скрипта scr_Dataflow1CUtils содержит только латинские символы.

Спасибо. Но проблема возникает еще такая: когда добавляю соответствие "договорОснование"->"Счет" и элемент синхронизации с настройками "Счета" (элемент импорта счетов), то событие onBeforeRecordImport не наступает, и в конце выдает ошибку "Ошибка импорта. 'Ref' - есть null или не является объектом. Возникла при импорте записи 1C 00000000008"

Догадываюсь, что ошибка возникает при обработке связи по полю "ДокументОснование". Как можно посмотреть из-за чего эта ошибка возникает?

Очень вероятно, что проблема возникает для записей, у которых это поле не заполнено (они созданы не на основании какого-либо документа).

Попробуйте создать три независимые настройки импорта с такими параметрами:

1) Для импорта счетов из 1С в Terrasoft.
2) Для импорта всех документов типа "Платежное поручение входящее". В этой настройке поле "ДоговорОснование" должно отсутствовать. Укажите ключевое поле (например, "Номер").
3) Для создания связи операций со счетами. В этой настройке будет только ключевое поле из предыдущей настройки и поле "ДоговорОснование". В ней также должен быть скрипт, указанный в предыдущих комментариях (на случай, если поручение создано не на основании счета).

При импорте по последней настройке сообщения об ошибке тоже будут появляться, но на результат они не повлияют: записи, у которых поле "ДоговорОснование" не заполнено, останутся без изменений, а у созданных на основании счетов поле "Счет" в Terrasoft будет обновлено.

Спасибо за ответ. Но проблема видимо не только в том, что это поле у некоторых записей не заполнено. Когда смотрю в 1С, то вижу, что ссылка на счет указана. А при загрузке этих платежей возникает ошибка.

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

Без поля "ДоговорОснование" импорт проходит. А когда его добавляю, то в основном все заканчивается ошибками, только некоторые платежи получают ссылку на счет, но и то неправильно. Видимо это из-за того, что "ДоговорОснование" содержит несколько ссылок разного типа (это видно в 1С). Вот и интересует, как можно посмотреть, что за данные приходят из 1С и правильно их обработать.

Антон, прикрепляю к сообщению пример моих настроек.

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

Также убедитесь, что к элементу синхронизации "Все операции" не присоединён скрипт (если Вы получили этот элемент путём копирования, такое вполне может быть).

Наконец, необходимо немного модифицировать условие в скрипте для элемента "Операции только по счетам":

if (IsEmptyValue(Select1C.ДокументОснование) ||
		(Select1C.ДокументОснование.MetaData().FullName() != "Документ.СчетНаОплатуПокупателю")) {
        Dataset.Values('InvoiceID') = null;
}

Выражение Select1C.ДокументОснование.MetaData().FullName() возвращает название типа документа, на основании которого создан текущий документ "Платежное Поручение Входящее". В зависимости от его значения можно заполнять связями те или другие поля датасета.

А где пример настроек?
Еще с помощью дебаггера удалось выяснить:
Не правильно отрабатывает функция function GetImport1CFieldValue(Select1C, SourceDataset, ObjectField, Param) и не удается получить Field1C, и тогда в строке if (Assigned(Field1C.Ref) && (!Field1C.Ref.IsEmpty())) { происходит исключение.
И тогда событие onBeforeRecordImport не наступает

Прошу прощения, забыл прикрепить.

Попробовал сделать, как Вы указали. Результаты аналогичные. Из всех платежек связалось всего несколько, хотя их больше должно быть. И то связи платежек со счетами получились неправильные. Хотя в 1С всё выглядит правильно. Кроме того при импорте записей возникают ошибки:
Не правильно отрабатывает функция function GetImport1CFieldValue(Select1C, SourceDataset, ObjectField, Param) и не удается получить Field1C, и тогда в строке if (Assigned(Field1C.Ref) && (!Field1C.Ref.IsEmpty())) { происходит исключение.
И тогда событие onBeforeRecordImport не наступает.

То есть очевидно, что глюк где-то в функции, которая должно получить из 1С ссылку на счет.

Если вы пользуетесь базовой утилитой Terrasoft 3.3.2 с 1C версии 8.1,
тогда замените строку:

if (Assigned(Field1C.Ref) && (!Field1C.Ref.IsEmpty())) {

на

if (Assigned(Field1C) && Assigned(Field1C.Ref) && (!Field1C.Ref.IsEmpty())) {

Также платежки могут не связыватся из-за того что в Террасофте не созданы соответствующие документы

"Кривонос Максим" написал:Если вы пользуетесь базовой утилитой Terrasoft 3.3.2 с 1C версии 8.1

Да, базовой утилитой, но только версия 1С 8.2
Замена кода ничего в плане решения не даст. Проблема в том, что поля из 1С не читаются правильно. Из всех платежек (около тысячи), связи со счетом установились у 65 и то не правильно. Хотя в 1С видно, что у многих есть правильные ссылки на счета.

С чего Вы взяли, что замена кода ничего не даст?

P.S. Версия 8.2 на данный момент официально не поддерживается.

Вы проимпортировали все счета из 1С ?
Если да, то в настройках поля ("Документ основание" - Счет(InoviceID)) НЕ заполняйте поле "Элемент синхронизации, настройки которого необходимо использовать..."

"Кривонос Максим" написал:С чего Вы взяли, что замена кода ничего не даст?
P.S. Версия 8.2 на данный момент официально не поддерживается.

Замена кода ничего не даст при проверке Assigned(Field1C.Ref) вылетит из функции по эксцепшену, ведь Field1C неустановлен.
Может глюки из-за того, что используется версия 8.2, весьма вероятно.
"Кривонос Максим" написал:Вы проимпортировали все счета из 1С ?
Если да, то в настройках поля ("Документ основание" - Счет(InoviceID)) НЕ заполняйте поле "Элемент синхронизации, настройки которого необходимо использовать..."

Пробовал. Всё равно правильно не работает.

"Штинов Антон Викторович" написал:Замена кода ничего не даст при проверке Assigned(Field1C.Ref) вылетит из функции по эксцепшену, ведь Field1C неустановлен.
Может глюки из-за того, что используется версия 8.2, весьма вероятно.

Если условие не пройдет проверку Assigned(Field1C), то проверку Assigned(Field1C.Ref) оно не будет проводить и ошибки не будет.

С этим исправлением и настройкой полей какие есть проблемы на текущий момент?

На текущий момент с исправлением в настройке и коде проблема такая же как и была:
1.связи платежка->счет правильно не загружаются для большинства их них (из всех платежек в 1С, поле с указанием счета установлено примерно у половины)
2.некоторые загружаются, но не правильно (в 1С для этих платежей указан правильный счет)

Я правильно понял ситуацию:

Вы импортируете из 1С платежки, которые связаны напрямую через поле "Документ Основание" со "счетами" в 1С (примерно половина данных в 1С связана именно со "счетами"). Импортируемые данные никак не фильтруете. Ранее были проимпортированы абсолютно все "счета" из 1С без ошибок.
Вопросы:
Сколько платежек создано в Террасофте после импорта?
Сколько платежек правильно привязаны?
Сколько платежек не правильно привязаны (при этом поле счет не пустое)?
Есть ли в логе какие-либо ошибки после импорта?

"Кривонос Максим" написал:Сколько платежек создано в Террасофте после импорта?

806
(привязка платежка->счет импортируется отдельно, по совету указанному выше, если импортировать платежки сразу с привязкой к счету, то их импортируется 29, и точно так же не правильно, как и сейчас)
"Кривонос Максим" написал:Сколько платежек правильно привязаны?

0
"Кривонос Максим" написал:Сколько платежек не правильно привязаны (при этом поле счет не пустое)?

29
"Кривонос Максим" написал:Есть ли в логе какие-либо ошибки после импорта?

Куча ошибок:
Ошибка импорта. 'Ref' - есть null или не является объектом. Возникла при импорте записи 1C 00000000291 Mon Jul 5 00:00:00 UTC+0400 2010

Попробуйте поднять тестовую базу, рядом с основной, и накатить в нее вот эти сервисы http://community.terrasoft.ua/catalog/3796.
После чего настроить новый импорт "Плтажек", заполнив в соответствии полей только эти:
Номер - Назначение
UUID - UID1C
Object1C - Object1C
Документ Основание - Счет

[quote="Кривонос Максим"]Попробуйте поднять тестовую базу, рядом с основной, и накатить в нее вот эти сервисы http://community.terrasoft.ua/catalog/3796.[/quote]
Как я понимаю из всех вложений
1C_290410.zip
Install_Manual.rar
1C_131010.zip
Самое последние: 1C_131010.zip
Но почему-то оно не скачивается. Скачалось только 1C_290410.zip, стоит ли пробовать устанавливать эти сервисы?
И судя по обсуждению в той ветке форума они как раз уже установлены для моей версии терасофта.

1C_290410.zip попробуйте, все равно тестовая база.
1C_131010.zip видимо еще не дотестированы

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

Пробовал ставить галочку в окне настройки импорта таблицы "разрешить добавление записей в TS" тогда вываливается ошибка приложения: OLE error 80020101

Какие еще варианты решения проблемы есть?
И как теперь вернуть террасофт в предыдущее состояние?

Удалите тестовую базу и вернитесь к обычной.
Вы накатывали сервисы по инструкции?

Почему у 29 платежек проставлен неправильный счет остается загадкой.


Ошибка импорта. 'Ref' - есть null или не является объектом. Возникла при импорте записи 1C 00000000291 Mon Jul 5 00:00:00 UTC+0400 2010

5 июля?
а по последнему импорту были ошибки?

1. Только что попробовал накатать сервисы еще раз. Сначала восстановил базу. Потом накатал сервисы, как указанно в инструкции. Поставил галочку "Разрешить добавление записей в TS" для импорта связей. Попробовал импортировать. 29 раз был вопрос, про изменение суммы в операции. В итоге ничего не импортировалось. В логах куча ошибок типа:

Ошибка импорта. Ошибка сохранения записи. Оригинальное сообщение об ошибке: The statement has been terminated.
Cannot insert the value NULL into column 'Subject', table 'TerraSoftTest.dbo.tbl_Cashflow'; column does not allow nulls. INSERT fails. Возникла при импорте записи1C 00000000068 Mon Mar 30 11:58:02 UTC+0400 2009

2. Удалил все операции. Запустил импорт операций (без связей со счетами). В результате вызывается отладчик и потом приложение падает с ошибкой

OLE error 80020101

3. Может Вам предоставить доступ и Вы посмотрите наживую?

"Штинов Антон Викторович" написал:Mar 30 11:58:02 UTC+0400 2009

Мне кажется это тоже старая запись...
Очистите деталь истории и проимпортируйте заново.

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

Компания Лайнсервис разработала модуль интеграции с 1С Предприятием, выполненный в виде COM библиотеки, и реализующий набор функций для работы с приложением 1С Предприятие версий 7.7, 8.0 и 8.1.
Подключение к приложению 1С Предприятие осуществляется с помощью COM-объектов, которые являются оберткой над внутренними объектами 1С Предприятия.
Для работы с объектами 1C Предприятие созданы абстрактные классы, представляющие общее поведение объектов 1С Предприятия. Реализованы следующие виды классов:
- обеспечивающие управление объектами конфигурации, например справочниками элементов или журналами документов;
- представляющие поведение динамических выборок различных объектов, например элементов справочника или документов;
- реализующие функциональность одного отдельного объекта 1С Предприятие, например отдельного элемента справочника или документа журнала;
- представляющие возможность работы с ссылками на отдельный элемент справочника или документ журнала, предназначенные для присвоения реквизиту одного объекта ссылочного значения другого объекта.

Функциональность версии 1С Предприятия 8.х позволяет модулю интеграции подключаться в двух режимах: в виде OLE Automation Server или во внутрипроцессном режиме. При этом, в случае первого подключения, в контексте выполнения доступны все переменные и процедуры Глобального модуля, помеченные словом Экспорт. В случае внутрипроцессного подключения доступны все переменные и процедуры модуля внешнего подключения, помеченные словом Экспорт.

Основное назначение модуля реалиация бизнес логики синхронизации с приложением 1С Предприятие в проектных решениях.

По вопросам приобретения +7 495 797-6880 http:\\www.ls-crm.ru .

Нравится

Поделиться

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

А демоверсия какая-нибудь есть? 

Демо пока нет, есть предварительное описание объектов и функций, могу выслать не e-mail

Описание... на E-mail... пожалуйста!

В личку закинул.

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Если возможно, скиньте и мне, пожалуйста.
duude@yandex.ru
Спасибо.

Будьте любезны ! скиньте пожалуйста на email nazymlp@bk.ru

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

agro@rosko.com.ua

Спасибо

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