Ручное добавление записи в 1С из скрипта Террасофт

Пытаюсь вручную из скрипта добавить ДоговорКонтрагента в 1С
Сам Контрагент благополучно создался.
А договор этого контрагента выдаёт при создании следуйщую извесную ошибку
"Не удалось сохранить Договор Контрагента!"
вот код которым пытаюсь сохранить договор:

 var Invoice1C = v8.Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
     Invoice1C.Дата = "10.09.2012";
     Invoice1C.Номер = "92837482374";

    Invoice1C.Организация = v8.Справочники.Организации.НайтиПоНаименованию("ТОВ \"БАРЕЛЬ\"""");

Нравится

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

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

Есть подозрение, что какое-то из полей даты есть обязательным для заполнения, но:

Если в начале строки содержится что-то, что может быть проинтерпретировано как строковое представление даты в виде ДД.ММ.ГГ, где ГГ- две цифры года, ММ- числовое обозначение месяца (01, ..., 12), ДД- день месяца, то будет произведено соответствующее преобразование. В противном случае значение даты будет нулевым.

Здравствуйте Дмитрий,
спасибо что отозвались.
заменил
Contract1C.Дата = "10.09.2012";
на
Contract1C.Дата = "10.09.12";
Не помогло.
Что ещё могу предоставить для нахождения "граблей".
Может скриншоты Конфигуратора 1С? Какие?

Александр,
я думаю Вашего кода достаточно.

Есть еще одна идея: смотрите, здесь вы используете ссылку на объект:

Contract1C.Владелец = Invoice1C.Контрагент.Ссылка; 

здесь записываете:

Contract1C.Записать();

и только потом:

Invoice1C.Записать();

Хотя здесь ссылку записываете уже после записи:

Contract1C.Записать(); 
Invoice1C.ДоговорКонтрагента=Contract1C.Ссылка;

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

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

Дмитрий,
поставил перед Contract1C.Записать(); следующий код:

ShowInformationDialog(
'1. '+Contract1C.Код+"\r\n"+
'2. '+Contract1C.Владелец.Наименование+"\r\n"+
'3. '+Contract1C.Наименование+"\r\n"+
'4. '+Contract1C.Номер+"\r\n"+
'5. '+Contract1C.ВидДоговора.Метаданные().Имя+"\r\n"+
'6. '+Contract1C.Дата+"\r\n"+
'7. '+Contract1C.ВалютаВзаиморасчетов.Наименование+"\r\n"+
'8. '+Contract1C.Организация.Наименование+"\r\n");

1cUpdate: Дата появилась после изменения:
Contract1C.Дата = '10.09.2012 0:00:00';
Но ошибка сохранения всё равно осталась.

Александр, рекомендую обратить внимание на код карточки в 1С, которая создает договор контрагента. Там хитрая штука: без основного договора нельзя создать контрагента, а без контрагента - договор. При этом если одна из записей не сохранена в базу данных, то и ссылку на нее в другой записи поставить нельзя.

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

Здравствуйте Анна,
спасибо что отозвались на зов помощи))

без основного договора нельзя создать контрагента, а без контрагента - договор.

Дело в том что контрагент благополучно создаётся кодом:

        tab2 = v8.Справочники.Контрагенты.СоздатьЭлемент();
        tab2.Наименование = "ТТТ";
        tab2.Записать();      

Без указания основного договора.
После чего я его благополучно НахожуПоНаименованию в вышеуказанном скриншоте/коде создания ДоговораКонтрагента.

А вот то же самое со СчётНаОплатуПокупателю и ДоговорКонтрагента не получается.
Не подскажите хоть "в какую сторону бежать", я в разработке 1С не силён.
Во вложении код 1С по Форме элемента ДоговорКонтрагента.

Доброе утро, Александр!

"Швец Александр" написал:

Дмитрий,
поставил перед Contract1C.Записать(); следующий код:

ShowInformationDialog(
'1. '+Contract1C.Код+"\r\n"+
'2. '+Contract1C.Владелец.Наименование+"\r\n"+
'3. '+Contract1C.Наименование+"\r\n"+
'4. '+Contract1C.Номер+"\r\n"+
'5. '+Contract1C.ВидДоговора.Метаданные().Имя+"\r\n"+
'6. '+Contract1C.Дата+"\r\n"+
'7. '+Contract1C.ВалютаВзаиморасчетов.Наименование+"\r\n"+
'8. '+Contract1C.Организация.Наименование+"\r\n");
1c

Правильно ли я понимаю, что Contract1C.Код = ''; т.е. пусто?

"Олейник Дмитрий" написал:Правильно ли я понимаю, что Contract1C.Код = ''; т.е. пусто?

Верно, я предположил что в 1С предусмотренна автонумерация подобно СРМ.
Но даже после подстановки

Contract1C.Код = "99999999999999";

В скриншоте начал появляться присвоенный код, но ошибка сохранения осталась.

Александр, значение поля Код в 1С генерируется программно, и должно быть не просто не пустым - его формат должен соответствовать объекту.

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

Contract1C.Код = GetLeetersFromGUID(Connector.GenGUID());

Если у Вас 1С77, тогда

Contract1C.УстановитьНовыйКод();

Анна, учитывая свойства поля КОД в конфигураторе 1С(см. скриншот), по идее предложенная Вами функция должна была вернуть нечто подобное
Contract1C.Код = "000932123";
или
Contract1C.Код = "GHDEDSASW";
1с

Ошибка сохранения осталась.

У нас 1с v.82
но предложенный

Contract1C.УстановитьНовыйКод();

Всё таки устанавливает код.

НО Ошибка сохранения осталась.

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

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

Contract1C.Владелец = Invoice1C.Контрагент.Ссылка;

прописать что-то вроде этого:

Contract1C.Владелец = v8.Справочники.Контрагенты.НайтиПоНаименованию("ТТТ").Ссылка;

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

"Швец Александр" написал:
dogovorkontragenta.txt 30.71 кб

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

Александр, можно попробовать установить отладчик в скрипте scr_Dataflow1CUtils_V80V81V82 в функции Prepare1CQuery и посмотрите, какой запрос в итоге уходит в 1С. Нас интересует содержимое Query.Text в самом конце функции.

Можно попробовать выполнить этот запрос непосредственно в 1С и посмотреть результат.

Анна, а как мне использовать сам Prepare1CQuery в scr_Dataflow1CUtils_V80V81V82 если я работаю напрямую с ActiveXObject и даже не подключаю данный скрипт к своему...
Какие фактические параметры передать Prepare1CQuery после подключения scr_Dataflow1CUtils_V80V81V82?

Здравствуйте! У меня получилось таким образом:

ГСЧ = Новый ГенераторСлучайныхЧисел();
Конт = Справочники.Контрагенты.СоздатьЭлемент();
Конт.Наименование = "Контрагент" + ГСЧ.СлучайноеЧисло(10000);
Конт.УНП = ГСЧ.СлучайноеЧисло(100000000,999999999);
Конт.Страна = Справочники.Страны.НайтиПоНаименованию("РБ");
Конт.Записать(); 
Дог = Справочники.Договоры.СоздатьЭлемент();
 Дог.НомерДоговора = ГСЧ.СлучайноеЧисло(0,5000);
 Дог.Наименование = "Договор" + Строка(НомерДок);
 Дог.Владелец = Конт.Ссылка;
 Дог.ВидДоговора = Перечисления.ВидыДоговоров.Годовой;
 Дог.ВалютаДоговора = Справочники.Валюты.НайтиПоНаименованию("RUB");
 Дог.СуммаПоДоговору = ГСЧ.СлучайноеЧисло(0,50000000);
 //Дог.ДатаДоговора = Дата(2009,1,1)+ГСЧ.СлучайноеЧисло(0, 60*60*24*355);
 Дог.Записать();

Дмитрий, Анна
спасибо большое
я разобрался.
У нас в 1С есть поле СхемаНалогообложения, которое не является обязательным, но без него 1С не сохраняет ДоговорКонтрагента.
Совет изыскателям таких же граблей - Просто в СРМ заполните абсолютно все поля договора(даже необязательные) и методом исключения поймёте чего не хватало.

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