Есть задача:
Импортировать выписки банка из 1С:Бухгалтерии 8.2 базовой версии в Terrasoft XRM 3.4.0.137 в Финансы/Операции.

1. Обновил модули интеграции 1С вот отсюда: https://community.terrasoft.ua/catalog/3796
2. Прицепляюсь к 1С, всё нормально.
3. А дальше не понимаю, что от меня желает эта оснастка интеграции:
3.1. "Перед началом настройки рекомендуется загрузить метаданные из 1С? Загрузить сейчас?"
Жму "Да", вроде ничего и не загрузилось. Или это нормально?
3.2. "Тип в 1С" - там в выпадающем списке только "Справочники". Этого же не достаточно? Выписки из банка - это разве справочники?
3.3. Для заполнения полей надо выбрать в "Тип в TS": "Набор данных", "Таблица" (ну уж точно не "Перечисление")?
3.4. В поисках полей TS нет тех полей, которые мне нужны в Финансы/Операции: "Фактическая дата", "Сумма, RUR", "Назначение", "Плательщик"/"Получатель", "Тип", "Состояние"

Нравится

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

Здравствуйте, Евгений!

3.1. "Перед началом настройки рекомендуется загрузить метаданные из 1С? Загрузить сейчас?"
Жму "Да", вроде ничего и не загрузилось. Или это нормально?
3.2. "Тип в 1С" - там в выпадающем списке только "Справочники". Этого же не достаточно? Выписки из банка - это разве справочники?

Вероятнее всего, Вами не были выполнены запросы на БД по добавлению объектов интеграции в tbl_1CObjectTypes.

Обратите внимание на инструкцию по установке утилиты. (в приложении)

3.3. Для заполнения полей надо выбрать в "Тип в TS": "Набор данных", "Таблица" (ну уж точно не "Перечисление")?

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

3.4. В поисках полей TS нет тех полей, которые мне нужны в Финансы/Операции: "Фактическая дата", "Сумма, RUR", "Назначение", "Плательщик"/"Получатель", "Тип", "Состояние"

Нужные поля находятся в наборе данных Операция, с ним и следует настраивать интеграцию.

Как это вставить в таблицы:
NSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{7770C2DE-BFCA-4980-B4D2-DF8AD632877E}', 'Справочники', 'Справочник')
INSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{20BBEA1D-DC1D-4F83-BF32-D01476F0112E}', 'Документы', 'Документ')
INSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{60CB936B-ABD8-46A0-929A-C189D99B3020}', 'ПланыВидовРасчета', 'ПланВидовРасчета')
INSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{E9BDA912-C60C-43A9-9486-32C9FA41377A}', 'Перечисления', 'Перечисление')
INSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{33FCCD6E-6E6E-454A-BFC9-3D79F895F0DB}', 'РегистрыСведений', 'РегистрСведений')
INSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{4B622A3D-1D5B-4547-B27D-0609ADACDB90}', 'РегистрыНакопления', 'РегистрНакопления')
INSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{AC1FDB3C-53BD-4992-A3FD-C5F498D9C434}', 'ПланыВидовХарактеристик', 'ПланВидовХарактеристик')
INSERT INTO tbl_1CObjectTypes (ID, Name, SQLName) VALUES ('{29BB104F-39FC-4F28-A74F-2854842452E1}', 'ПланыСчетов', 'ПланСчетов')
INSERT INTO tbl_1CObjectTypes (ID, NAME, SQLNAME) VALUES ('{A35397EC-B6CF-4593-9EFA-691776D9A25C}', 'РегистрыБухгалтерии', 'РегистрБухгалтерии')

INSERT INTO tbl_1CObjectTypes (ID, NAME, SQLNAME) VALUES ('{7558D403-3E85-4A82-AA44-AD9C805DF6BF}', 'ЖурналыДокументов', 'ЖурналДокументов')
Через что?

Нашёл как вставить через IBExpert через SQL Editor, но запросы, начиная с
INSERT INTO tbl_1CObjectTypes (ID, Name, sqLName) VALUES ('{20BBEA1D-DC1D-4F83-BF32-D01476F0112E}', 'Документы', 'Документ')
признаются ошибочными:
"Invalid token. Dynamic SQL Error. SQL error code = -104. Token unknown - line 2, column 1"
P.S. sqLName - это так надо? Я исправил на SQLName - но не помогло

Судя по коду ошибки, Вами используется СУБД Firebird.

Для установки утилиты на Firebird в мануале есть отдельная инструкция «Для Firebird.docx» в архиве http://www.community.terrasoft.ua/system/files/install_manual.zip

Инструкция в приложении.

Прошёл интеграцию утилиты с помощью IBExpert. Многие условия работы с базой - чёрная магия. Запуск скрипта из инструкции получился только при старте скрипта из меню Tools/Script Engine и выборе раздела "Таблицы". Успешно, без ошибок, если выполнить директивы удаления содержимого таблиц.
Теперь:
1. в интеграции 1С появилось значение поля 8.2 (test);
2. настройка интеграции успешно подключается к базе 1С:Бухгалтерия (базовая версия);
3. Но теперь пишет вот такую вот ошибку при импорте мета-данных 1С, либо вообще ничего не пишет:

0. Как исправить или я что-то сделал не так? Как увидеть лог ошибок или ещё что-то подобное?
1. Надо ли было играть с UTF8? Вроде поля данных заполнены были корректно в новом IBExpert, я не стал их искажать.
2. Работать с базой 1С можно только на локальной машине? Через сеть авторизоваться на 1С базе не получается.

Здравствуйте! Вероятнее всего, алиасы сущностей 1С внесены в базе в неправильной кодировке.

"linuxmasterz" написал:0. Как исправить или я что-то сделал не так? Как увидеть лог ошибок или ещё что-то подобное?

В данном случае рекомендуется переименовать их вручную в IBExpert либо же очистить таблицу и повторно выполнить запрос на вставку, однако же все-таки переконвертировать в Unicode перед выполнением запроса.

1. Надо ли было играть с UTF8? Вроде поля данных заполнены были корректно в новом IBExpert, я не стал их искажать.

Да. Это Firebird, он иначе с кириллицей работать не умеет.


2. Работать с базой 1С можно только на локальной машине? Через сеть авторизоваться на 1С базе не получается.

COM-объект 1С обязатетельно должен быть установлен на локальной машине. База может быть где угодно. Если база лежит в расшаренной папке, выбираем в настройках подключения "локально" и указываем сетевой путь.

Если база развернута на сервере, соответственно, параметры сервера.

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

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

В 1С 7.7 я написала обработку переноса документа Договора в Terrasoft CRM 3.2.
Все отлично переносится, но есть одна проблема.

В договоре есть два поля, созданные администратором 1С: Договорные условия и Предмет договора. Оба они имеют тип Строка, флаги - Неограниченная длина и Многострочное поле.

В 1С информация в самом договоре выглядит так:

В поле Договорные условия такой текст:

1- 03.08.11- 10,40
2- 15.08.11- 20,40
3- 12.09.11- 30,20

В поле Предмет договора такой текст:
10,40 до 15.08.11
30,00 до 15.09.11
40,00 до 25.09.11
50,00 до 15.10.11

Оба текста бухгалтером вносятся с использованием Enter для перехода на новую строку

Эти два поля мне нужно одной строкой с использованием переноса строк перенести в Terrasoft в поле Memo таблицы Contracts.

Текст программы такой:

if (EmptyValue(sqOfferingContact) = 1) then
sqOfferingContact = TS.Services.GetNewItemByUSI("sq_Contact"); //Создание экземпляра запроса
endif;

if (EmptyValue(refOffering) = 1) then
refOffering = CreateObject("Document.Договор"); //1С Документ Договор
endif;

Memo = dsOffering.DataFields.ItemsByName("Memo");
Memo.Value = ("Договорные условия:"+(refOffering.ДоговорныеУсловия))+". "+РазделительСтроки+ "Предмет договора; "+(refOffering.ПредметДоговора)));

Вот как выглядит текст в Terrasoft в поле Memo документа Contracts после этого.

1- 03.08.11- 10,402- 15.08.11- 20,403- 12.09.11- 30,20 Предмет дог

Причем если попробовать пролистать строку курсором, то после подстроки "1- 03.08.11- 10,40" он не двигается дальше, а переходит на новую строку. Весь текст просмотреть невозможно.

Как перенести его средствами языка 1С без потери форматирования, т.е. в таком же виде как он записан в документе Договор 1С, т.е. выглядел в поле Memo вот так:

Договорные условия: 1- 03.08.11- 10,40
2- 15.08.11- 20,40
3- 12.09.11- 30,20.
Предмет договора: 10,40 до 15.08.11
30,00 до 15.09.11
40,00 до 25.09.11
50,00 до 15.10.11

Заранее спасибо за помощь.

Нравится

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

Здравствуйте, Наталья!

Для того, чтобы добавить разделитель строки в Terrasoft, используйте \r\n.

В результате программный код примет следующий вид:

Memo.Value = ("Договорные условия:"+(refOffering.ДоговорныеУсловия))+". "+"\r\n" + "Предмет договора; "+(refOffering.ПредметДоговора)));

Здравствуйте, Анна.

Строка

Memo.Value = ("Договорные условия:"+(refOffering.ДоговорныеУсловия))+". "+"\r\n" + "Предмет договора; "+(refOffering.ПредметДоговора)));

переносится в Terrasoft буквально как строка:

Договорные условия: 1- 03.08.11- 10,40 2- 15.08.11- 20,40 3- 12.09.11- 30,20.\r\nПредмет договора:

Если \r\n записать без кавычек, то 1С ругается. Потому, что такой функции в 1С нет.

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

Еще один вариант переноса именно для 1С:

Симв(13)+Симв(10)

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

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

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

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

function OnBeforeRecordImport(Param, Dataset, Select1C) {

var Account = Select1C[QueryLink].Владелец.Код; //вытаскиваем код владельца счета
var AccountID = GetDatasetFieldValueFromDatasetByUSI('ds_Account','Code1C',Account,'ID'); //вытаскиваем наш ID контрагента по этому счету
var AccountName = GetDatasetFieldValueFromDatasetByUSI('ds_Account','Code1C',Account,'Name'); // еще и наименование
var RSN = Select1C[QueryLink].Номер; //номер Р/C
var Bank = Select1C[QueryLink].БанкОрганизации.Код; //код банка
var BankID = GetDatasetFieldValueFromDatasetByUSI('ds_Bank','Code1C',Bank,'ID'); // наш ID банка по коду
var INN_KPP = Select1C[QueryLink].Владелец.ИНН; //ИНН_КПП
var INN = INN_KPP.substr(0,9);
var KPP = INN_KPP.substr(11,10); // парсим ИНН и КПП
var Description = Select1C[QueryLink].Наименование; //Описание счета пихаем в дескрипшн
var Name = Select1C[QueryLink].Владелец.Наименование;

Dataset('CountryID') = '{DE315AF9-5694-44DF-988C-633933E856F3}';
Dataset('AccountID') = AccountID;
Dataset('BankID') = BankID;
Dataset('RSN') = RSN;
Dataset('INN') = INN;
Dataset('KPP') = KPP;
Dataset('Description') = Description;
Dataset('Name') = Name;
}

Вставлял окошки с выводом на коды, на ID контрагентов - вроде все правильно работает, но по факту в таблицу tbl_accountbillinginfo влетают записи с одним и тем же AccountID. Немного непонятно как это происходит.
PS: Как можно организовать вывод в консоль? Неудобно для отслеживания состояния переменных ShowInformationDialog использовать )

Нравится

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

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

Для вывода информации в консоль используйте

Log.Write(1, 'тест в лог'); // 1 - цвет для warning, синий, 2 -цвет ошибок, красный, 0 - простой текст

Количество записей совпадает с источником ?

Не совсем понятен вопрос - количество каких записей? До конца я по всей базе скрипт не прогонял, там тысячи записей, смотрю по журналу изменений БД и по результату который выдает sq_accountbillinginfo.
Со стороны 1С иду по справочнику "Расчетные счета" - их меньше чем контрагентов в целом, плюс есть контрагенты с несколькими счетами.

Попробуйте, до присвоения значений датасету написать

...
Dataset.DisableEvents();
Dataset('CountryID') = '{DE315AF9-5694-44DF-988C-633933E856F3}';
Dataset('AccountID') = AccountID;
Dataset('BankID') = BankID;
Dataset('RSN') = RSN;
Dataset('INN') = INN;
Dataset('KPP') = KPP;
Dataset('Description') = Description;
Dataset('Name') = Name;
Dataset.EnableEvents();
...

Ок, совместно удалось разрешить проблему - из настроек синхронизации удалил появляющиеся там по дефолту соответсвия Code1C и Object1C и записи начали нормально добавлятся. Спасибо!

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

В настройках синхронизации с 1С при добавлении объекта синхронизации типа "Документ" автоматически добавляются ключевые поля для связки документа в ТС с документом в 1С:
- ДатаДок
- НомерДок
- Объект1С (название объекта 1С)

В 1С бывает возникает ситуация, когда дата документа корректируется и изменяется, например, с даты 01.08.11 на 05.08.11. В таком случае при следующем импорте документа в Террасофт из 1С фильтрация по дате 05.08.11, номеру документа и объекту 1С выдаст пустой результат, и создастся новый документ в Террасофте. Но это не правильно, потому что на самом деле этот документ уже есть в Террасофте. Допустим, номер документа является уникальным в 1С в диапазоне 1 года. Каким образом нужно настроить импорт документов из 1С так, чтобы находились документы не по полной дате, а по году, то есть накладывался фильтр по 2011 году? Учитывается ли в утилите синхронизации такая особенность? и как это сделать?

Нравится

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

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

В случае, если номер документа является уникальным - необходимо установить данное поле [Номер] как Ключевое (а у даты - снять данную галочку).
Нумерацию же документов можно проводить с учетом года (указывая в номере документа год). Или проводить фильтрацию: "дата создания документа больше чем 31.12.2010"(в этом случае номер в рамках года будет уникальным).

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

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

 ГУИДССЫЛКИ	= СсылкаНаОбъект.УникальныйИдентификатор();
// или
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("00013");
Если НЕ НоменклатураСсылка.Пустая() Тогда
   Сообщить("GUID = " + НоменклатураСсылка.УникальныйИдентификатор());
КонецЕсли; 
 

Я эту проблему у себя решал тем, что создавал фильтр типа like и накладывал это фильтр там, где шла фильтрация по полю Date1C (ДатаДок):

function AddDate1CYearFilter(SelectQuery) {
    for (var i = 0; i < SelectQuery.Count; i++){
        var Select = SelectQuery.Items(i);
        var Filters = Select.Filters;
		AddLikeFieldFilter(Select, 'Date1CYear', 'Date1C', ltEqual);
    }
}
 
function ApplyDate1CYearFilter(Dataset, DocDate) {
	var FilterName = 'Date1CYear';
	var SelectQuery = Dataset.SelectQuery;
	var DateObj = new Date(DocDate);
	var FilterPattern = '[0-3][0-9].[0-1][0-9].'+DateObj.getYear();
	var FilterCodes = new Array(FilterName);
	EnableSelectQueryFilters(SelectQuery, true, FilterCodes);	
	SetParameterValue(SelectQuery.Parameters, FilterName, FilterPattern);
}

Вызов этих функций в разных местах:

AddDate1CYearFilter(Dataset.SelectQuery);
 
ApplyDate1CYearFilter(Dataset, DocDate);

Может и есть какое-то лучшее решение, но пока сделал так :smile:

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

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

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

Нравится

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

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

Ответ несколько не о том, что я спрашивал, но тоже актуален )

Можно подробнее о рекомендованной процедуре импорта?
1. Импортируем контрагентов
2. Импортируем юр. лица/физ. лица в платежные реквизити контрагентов, вставля в скрипт проверку на соответсвие контрагента TS<>1C (без скрипта мне не удалось это сделать, делал подчиненную интеграцию, родительское пол TS - Контрагент, в и тоге в платжные реквизиты каждого контрагента влетают все юрлица из 1с).

Я правильно рассуждаю?

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

А каким образом в подчиненной синхронизации можно получить данные вышестоящей? Это реально?

Кстати, если поставить поле родителя 1с равным "UUID", то схема работает и в платежные реквизиты (подчиненноая синхронизация) попадают данные соответсвующих юрлиц, а не все сразу.

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

Ну, на данный момент новых граблей не нашел ) Контрагенты и их юр.лица импортируются, работает без единого скрипта. Дальнейшая настройка, дмаю потребует вмешательства, но это по ходу пьесы.

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