В 1С 8.2 есть регистр сведений КонтактнаяИнформация, у него есть ресурсы(не реквизиты): Поле1, Поле2, ..., Поле10, Представление (все строковые).
Select1C.Поле1 возвращает пустую строку. С реквизитами это легко срабатывает, выводится Select1C.Объект.Код (где Объект - ссылка на справочник Контрагенты)
Как получить их значения в скрипте?

Нравится

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

Может, они просто не заполнены. У меня запросом получается выбрать все поле 1-10. По наблюдениям поле 1 для адреса это страна или индекс, поле 4 - город, поле 5 -населенный пункт. Попробуйте выбрать представление, оно не может быть пустым.

Обнаружил такую вещь при синхронизации. Так как КонтактнаяИнформация содержит не только адреса, но и email и телефоны, я не ставил Поля и Представление в соответствие полей, а делал все в скрипте, и выводили они у меня пустые строки. Как только поставил их в соответствие полей (даже одному любому строковому полю), сразу появилась нужная информация.

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

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

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

Интересует вопрос. А как вызвать импорт из 1С, из какого-нибудь произвольного раздела. Т.е. сделать действие, аналогичное "Импорт элемента" в разделе "Интеграции", но из другого раздела.

Нравится

1 комментарий

Добрый день, Дмитрий.
Ответ на Ваш вопрос в Dataflow\General\Main Grid\scr_DataflowsGridArea.
Обработчик:

function amiRunImportOnExecute(ActionMenuItem, Sender) {
	ExecuteImport(dlData.Dataset);
}

Функция ExecuteImport берет ID выделенной записи интеграции, проверяет ее тип, и в зависимости от него, запускает тот или иной процесс синхронизации.

switch (DataflowTypeID) {
		case (edtExcel) :
			var Workbook = System.EmptyValue;
			ExecuteImportFromExcel(DataflowID, Workbook, UpdateRecords);
			CollectGarbage();
			SendNotify(Self, 'RefreshHistoryDetail');
			break;
		case (edt1C) :
			var Attributes = GetNewDictionary();
			Attributes('IsMain') = true;	
			Attributes('IsShowError') = true;	
			scr_Dataflow1CUtils.ImportAllObject(DataflowID, Attributes);
			SendNotify(Self, 'RefreshHistoryDetail');
			break;
		default:
			ShowWarningDialog(msgDataflowTypeIsNotDefined);
			break;
	}

Таким образом, реализация Вашей задачи:
в произвольном месте раздела вызвать

    Attributes('IsMain') = true;	
    Attributes('IsShowError') = true;	
    scr_Dataflow1CUtils.ImportAllObject(DataflowID, Attributes);

Где DataflowID - ID записи настройки интеграции, узнать можно из Dataflow\General\Main Grid\sq_Dataflow. Не забудьте подключить scr_Dataflow1CUtils туда, откуда будет вызываться scr_Dataflow1CUtils.ImportAllObject(DataflowID, Attributes);

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

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

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

TS 3.4.0

Нравится

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

Проблема решилась. Забили прописать Object1C

Дмитрий, если будут дополнительные вопросы - обращайтесь.

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

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

В гриде есть кнопка, по которой стартует экспорт в 1С одной выделенной записи. Вот функция коннекта к 1С:

Window.Show();
var IsExclusive = false;
var Path = '\\\\dc\\1cbase$\\Торговля\\Торговля 2010';
var Login = '***';
var Password = '***';
var v77 = new ActiveXObject('V77.Application');
var ConnectParams = Generate1CParamString(Path, Login, Password, IsExclusive);
v77.Initialize(v77.RMTrade, ConnectParams, 'NO_SPLASH_SHOW');

Как заставить процесс 1С, который продолжает висеть в процессах, завершиться после выполнения функции?

Добавлял в конец функции строку

Disconnect1CConnections();

Из скрипта scr_Main
Но эта функция процесс не закрывает. Может быть кто-нибудь сталкивался с такой проблемой?

Нравится

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

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

Можно попробовать воспользоваться функцией возврата PID по имени процесса:

http://www.community.terrasoft.ua/blogs/2974

Если такой процесс существует, убить его утилитой TaskKill:

taskkill /pid 1230

где 1230 - Process ID, который вернула функция.

А далее, можно выполнить данную команду с помощью WScript.Shell:

var WshShell = new ActiveXObject('WScript.Shell');
WshExec = WshShell.Exec('taskkill /pid ' + PID);

Доброго времени суток!

Спасибо за ответ. Но не получается, так как он почему то не находит нужный процесс. Писал "1CV7" и "1CV7.exe". Процесс в это время запущен, проверял.

А как возвратить названия всех запущенных процессов?

Дмитрий, может попробовать убить по названию процесса?

var WshShell = new ActiveXObject('WScript.Shell');
WshExec = WshShell.Exec('taskkill /s ComputerName /f /im notepad.exe');

А что если нужно убить процесс только текущего пользователя?

Попробуйте в конце работы с 1С добавить такой код, может быть поможет:

	v77.ExitSystem(0);
	v77 = null;
	CollectGarbage();

Поставил в конец функции, и после выполнения спрашивает закрыть ли программу, нажимаю да, но процесс остается висеть в задачах...

После вызова Initialize надо еще такое вызвать:

v77.ExecuteBatch('СохранитьЗначение("НеЗапрашиватьПодтверждениеПриВыходе",1)');

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

Закрывать 1С77 следует вот такой конструкцией:

	if (Assigned(Param.Obj1C)) {
		Param.Obj1C.ExitSystem(0);
	}
	Param.Obj1C = System.EmptyValue;
	CollectGarbage();
Показать все комментарии

Иногда бывает необходимость получить название элемента перечисления в ходе интеграции с 1С. Например, если Вы планируете синхронизировать поле типа перечисление в 1С и справочник в TS.

Для этого можно использовать синтаксис 1С

Для 8.х:

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

Для 7.7:

var Name = Select1C.Тип.Представление()

Нравится

Поделиться

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

А можно так

var TypeName = Param.Obj1C.String(Select1C.Тип)

?

*где Param.Obj1C - COM-объект 1С;
Select1C - объект (объект 1С 'ВыборкаИзРезультатаЗапроса') содержащий текущую строку выборки из 1С

Спасибо, Максим :)

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

Добрый день!

Подскажите, как импортировать из 1С 8.2 в Террасофт данные из Регистра накопления? Насколько я понимаю, каким-то образом нужно передать в запрос дату, на которую требуется получить значения остатков.

Может у кого есть рабочий пример?

Нравится

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

Здравствуйте, Николай!

При импорте регистров сведений оптимальный вариант - производить импорт на деталь, и сортировать результат по дате добавления.

В принципе порядок импорта зависит от структуры контретного регистра сведений.

Алгоритм следующий:

1. Создаем корневую интеграцию с сущностью, по которой формируется регистр;
2. Создаем подчиненную интеграцию для переноса информации из регистра на деталь.

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

Переформулирую вопрос, так как внимательно изучил структуру регистра. В нем, оказывается, фиксируются все движения остатков. Причем, в окне регистра приходные и расходные операции обозначаются как "+" и "-". Для того, чтобы получить текущий остаток, я должен не просто взять все движения по регистру, но и взять их с правильным знаком. А вот как это сделать из Терасофта?

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

"bayborodin" написал:как установить фильтр по дате таким образом, чтобы он был всегда равен не фиксированному значению, а текущей дате?

Для этого необходимо в фильтрах интеграции задать фильтр по периоду:

111

"bayborodin" написал:в окне регистра приходные и расходные операции обозначаются как "+" и "-". Для того, чтобы получить текущий остаток, я должен не просто взять все движения по регистру, но и взять их с правильным знаком. А вот как это сделать из Терасофта?

Это также настраивается в блоке фильтрации.

"bayborodin" написал:И, еще, в 1С, обращаясь к регистру накопления, можно сразу получить остаток на интересуюущую дату. Возможно ли это реализовать через Террасофт?

Это интересная и нетривиальная задача. Рассмотрим детально:

Что такое остаток на интересующую дату? Это первая запись регистра сведений, отфильтрованная по данному товару, дате и отсортированная по дате.

Для того, чтобы это реализовать, есть два варината:

1. Импортировать всю информацию, и производить поиск средствами Terrasoft;

2. Реализовать на уровне программного кода подключение к 1С и выполнение запроса к регистрам. Хочу предупредить, этот вариант будет очень трудоемким.

"Alimova Anna" написал:

Это интересная и нетривиальная задача. Рассмотрим детально:

Что такое остаток на интересующую дату? Это первая запись регистра сведений, отфильтрованная по данному товару, дате и отсортированная по дате.

Для того, чтобы это реализовать, есть два варината:

1. Импортировать всю информацию, и производить поиск средствами Terrasoft;

2. Реализовать на уровне программного кода подключение к 1С и выполнение запроса к регистрам. Хочу предупредить, этот вариант будет очень трудоемким.

К сожалению, регистр остатков в 1С 8.2 - это не регистр сведений, а регистр накопления. Так что, предложенный вариант отпадает.

Это также настраивается в блоке фильтрации.
а как? можно тоже скриншот?

Заранее большое спасибо!

Николай, уточните, пожалуйста, из какого именно регистра планируется вести импорт? Мне нужно посмотреть структуру полей регистра дл ятого, чтобы показать пример.

Регистр накопления "ТоварыНаСкладах" 1С 8.2 УТ 10.3

Николай, у меня такой конфигурации нет, поэтому давайте попробуем посмотреть структуру в режиме удаленного доступа.

Либо, если есть возможность, предоставьте скриншот конфигуратора с раскрытой структурой.

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

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

Подскажите, как вы решаете задачу синхронизации товарных остатков между XRM и 1С?

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

И, вторая часть вопроса - если делать не как правильно, а как проще, то есть просто импортировать текущие значения регистра остатков - то, как это сдалать? Есть ли пример импорта остатков товаров из 1С в Террасофт, чтобы на него можно было посмотреть и разобраться (или любой другой пример работы с регистрами)?

Заранее спасибо за ответы!

P.S. Речь идет о Торговле 8.2

Нравится

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

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

Работу с регистраци сведений можно посмотреть на примере импорта адресов контрагентов (в приложении).

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

Для расчета остатков в коробочной версии существует отчет по складским документам.

В случае, если учет остатков планиуется вести в 1С, тогда необходимо решить, какую информацию импортировать.

Есть вариант вносить все складские документы, и по ним рассчитывать, однако это трудоемкий процесс, и возникнет вопрос сверки остатков 1С и Terrasoft.

"bayborodin" написал:И, вторая часть вопроса - если делать не как правильно, а как проще, то есть просто импортировать текущие значения регистра остатков - то, как это сдалать? Есть ли пример импорта остатков товаров из 1С в Террасофт, чтобы на него можно было посмотреть и разобраться (или любой другой пример работы с регистрами)?

Получать готовую информацию непосредственно из 1С - не только проще, но и правильнее.

Однако для решения вопроса таким образом без программирования не обойтись. Есть два варианта решения задачи:

1. Если у Вас 1С 8.2, тогда можно рассимотреть варианты интеграции с 1CAutomationServer и показывать отчет 1С по нажатию конпки в Terrasoft.

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

Спасибо за ответ, но стратегия дальнейших действий пока не ясна.

Опишу задачу более подробно: требуется перенести складской учет в Террасофт. С периодической выгрузкой документов в 1С. Следовательно: показывать просто отчет, сформированный 1С - не подойдет, нужно не просто витеть из Террасофта остатки по складам, но и управлять ими. При этом не просто записывать статические цифры на какую-то деталь, а использовать все возможности Terrasoft XRM Distrubution. Отсюда - желание проинициализировать начальные остатки данными из 1С, сделать это корректно, и в дальнейшем вести складской учет в Terrasoft.

Здравствуйте, Николай!

В таком случае рекомендуем производить импорт складских документов в раздел Склад (он есть в конфигурации XRMDistribution), и затем по складским документам делать аналитику и считать остатки.

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

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

Нравится

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

Варианты есть разные
1. Написать необходимый код для импорта данных, где будут учтены эти и любые другие нюансы;
2. Можно для проверки уникальности при импорте использовать например номер телефона или emai контрагента, а не название
Остальные требуют предварительной обработки данных
3. В TS вносим в карточки контрагента как новое поле (или, например, в поле Код) требуемое наименование "ромашка" и прочее, и при настройке импорта используем это поле как первичный ключ (уникальный)
4. В excel файл добавляем к каждой записи некий уникальный код, аналогичный код должен использоваться в записях TS. Дальше этот код используем как первичный ключ. Как вариант в excel вручную/макросом каким вписываем для каждой записи название контрагента из TS, и опять же ключ по этому названию

Здравствуйте, Роман!

В данном конкретном случае оптимальным вариантом при переносе из 1С будет экспортировать контрагентов с кодом, и добавить поле Код в проверку уникальности.

Прошу прощения, плохо смотрел, сообщение отредактировано, удалите его, пожалуйста

Здравствуйте, Роман!

В данном случае следует произвести выгрузку в Excel в том числе и поля Код.

Проверка уникальности - деталь, на которую добавляются значения при настройке синхронизации с MS Excel:

111

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

Добрый день. Хотел импортировать номенклатуру из 1С, но при любых условиях выдает ошибку в процессе импорта на 2265 позиции :(
Скриншоты:

Что я делаю не так и как тут быть?

Нравится

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

Роман,

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

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

Подробная информация об установке отладчика по ссылке: http://www.community.terrasoft.ru/blogs/7804

Добрый день, Анна, вот скриншот:

[URL=http://s1.ipicture.ru/Gallery/Viewfull/10764020.html][IMG]http://s1.ipi…]

Возможно не видно, желтым выделена скобка "{"

Роман, отладчик останавливается на finally, когда сбой произошел в обной из функций блока try.

В данном конкрентом случае, вероятнее всего, на WriteHistory.

Попробуйте загрузить в конфигурацию сервисы (в приложении), очистить кэш и перезапустить Terrasoft.

при очередной попытке импорта возникла ещё одна ошибка:

[URL=http://s1.ipicture.ru/Gallery/Viewfull/10765736.html][IMG]http://s1.ipi…]

Так же при другой попытке появилась ещё одна ошибка:

[URL=http://s1.ipicture.ru/Gallery/Viewfull/10766322.html][IMG]http://s1.ipi…]

Роман, уточните, пожалуйста, производилась ли Вами очистка кэша приложения после загрузки сервисов?

Да, производилась.

Роман,

Попробуйте выполнить следующее:

1. Установить галочку "создавать группы" в окне настроек интеграции;
2. Произвести импорт частями (например, отфильтровать по коду).

Вероятных причин сбоя несколько:

1. Сбой происходит на конкретной записи (в ней содержится текст в неизвестной кодировке, пустое название либо другие невалидные данные). В этом случае сбой происходит всегда на одной и той же записи, например, 2265.

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

Для устранения проблемы необходимо диагностировать, на каком этапе происходит сбой.

Вот что происходит с отмеченным "создавать группы":

Сначала, как и раньше:

[URL=http://s1.ipicture.ru/Gallery/Viewfull/10781014.html][IMG]http://s1.ipi…]

И добавляется:

[URL=http://s1.ipicture.ru/Gallery/Viewfull/10780966.html][IMG]http://s1.ipi…]

При этом импорт не доходит и до 1, аналогично при импорте кодов

Роман, предоставьте, пожалуйста, для анализа следующие сервисы конфигурации:

ds_DataflowHistory
sq_ataflowHistory
tbl_DataflowHistory

Анна, думаю вторым сервисом вы имели ввиду "sq_DataflowHistory", выгрузил, архив во вложении.

Здравствуйте, Роман!

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

При необходимости моэно добавить защиту от сбоев подобного характера, добавив в скрипт импорта номенклатуры программный код следующего вида:

 if (IsEmptyValue(Select1C.Наименование)){
 	Dataset('OfferingName') = 'Пустое название';
 }

Большое спасибо прекрасной техподдержке и вам лично! Вы спасли меня уже 2й раз:wink:

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

Добрый день, при импорте адресов контрагентов из 1с 8.2 в адреса контрагентов террасофта попадают не нужные данные, это номера телефонов и адреса почтовых ящиков, хотелось бы узнать как можно это отфильтровать, скриншот настроек террасофта прилагается:
Скриншот

Нравится

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

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

Здравствуйте, Роман!

Для того, чтобы корректно выбирались адреса, следует задать фильтры для того элемента, в котором импортируется адрес:

111

В данном конкретном случае значение фильтра необходимо подставить в соответствии с синтаксисом языка 1С: Значение(Перечисление.ТипыКонтактнойИнформации.Адрес)

Обратите внимание, в коробочной версии утилиты нет возмодности фильтрации. Для использования данной функциональности следует произвести установку утилиты интеграции с 1С из Каталога расширений.

Спасибо за ответ, Анна. В документации к утилите, на которую вы дали ссылку указано, что она уже встроена в террасофт с версии 322, а мы используем 3.4.0.61.

Роман, утилита, которая поставляется в каталоге расширений, постоянно обновляется и дорабатывается, и отличается от той, что поставляется в коробочной версии.

Спасибо, всё получилось, не закрывайте, пожалуйста, тему, буду тестировать и возможно возникнут вопросы

При попытке синхронизации выдает ошибку вида:

	HistoryDataset('TypeID') = TypeID;
	HistoryDataset.Post();
	HistoryDataset.Close();
}

Где выделено желтым:
HistoryDataset.Post();

Как победить?

Роман,

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

Если только для одной, тогда предоставьте, пожалуйста, скриншоты настроек интеграции.

И еще: сбой при импорте или при экспорте?

Спасибо за ответ, мне удалось исправить ошибку самостоятельно.
Пока, что есть возможность проверить только синхронизацию контрагентов и регистра сведений с настроенным соответствием адресов.
Например сейчас мне надо импортировать в адреса контрагентов террасофта адреса контрагентов из 1с, которые находятся в Регистре сведений->Контактная информция->представление. Мои настройки:

[URL=http://s1.ipicture.ru/Gallery/Viewfull/10527987.html][IMG]http://s1.ipi…]

Импорт проходит удачно, но адреса в контрагентах не поялвяются, нет никаких ошибок, что это может быть?

"Роман Асланов" написал:

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

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

Например сейчас мне надо импортировать в адреса контрагентов террасофта адреса контрагентов из 1с, которые находятся в Регистре сведений->Контактная информция->представление. Мои настройки:

Импорт проходит удачно, но адреса в контрагентах не поялвяются, нет никаких ошибок, что это может быть?


Так же хочется добавить, что при создании фильтра, например "Тип" содержит "Адрес", появляется ошибка при импорте, фильтр:

[URL=http://s2.ipicture.ru/Gallery/Viewfull/10562694.html][IMG]http://s2.ipi…]

Ошибка:

[URL=http://s2.ipicture.ru/Gallery/Viewfull/10562670.html][IMG]http://s2.ipi…]

В логе по этой ошибке написано:
"[12.05.14 09.39.07.606] (E) 'EditWindowUSI' значение атрибута не определено"|

Для устранения сбоя при фильтрации по типу Адрес попробуйте в фильтре вместо "содержит" установить "равно". Кроме того, фильтру нужно задать значение: "Значение(Перечисление.ТипыКонтактнойИнформации.Адрес)", а не просто "Адрес"

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

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

[URL=http://s2.ipicture.ru/Gallery/Viewfull/10566127.html][IMG]http://s2.ipi…]

Роман, а конфигурация 1С дорабатывалась? Вы уверены, что значение перечисления называется имеено Адрес?

Это можно проверить в конфигураторе 1С:

Для этого следует зайти в Перечисления - Типы контактой информации - Значения:

111

В случае, если значение не отличается, для точной диагностики нужен будет сеанс удаленной отладки.

Конфигурация дорабатывалась, но значение перечисления стоит "Адрес".

В таком случае для диагностики и устранения проблемы необходим сеанс удаленного доступа. Написала Вам на почту.

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