Столкнулся с такой проблемой: выгружаю счета контрагентов и платежи, которые привязаны к счетам, но в списке полей 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

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

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