Вопрос

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

В тесте пытаюсь записать лид с одним заполненным полем(Название контрагента

Мой код:

public static void insertData()
        {
            Console.WriteLine("Попытка создать лид");
 
            // Экземпляр класса запроса.
            var insertQuery = new InsertQuery()
            {
                // Название корневой схемы.
                RootSchemaName = "Lead",
                // Коллекция добавляемых значений колонок.
                ColumnValues = new ColumnValues()
            };
 
            var columnExpressionName = new ColumnExpression
            {
                // Тип выражения запроса к схеме объекта — параметр.
                ExpressionType = EntitySchemaQueryExpressionType.Parameter,
                // Параметр выражения запроса.
                Parameter = new Parameter
                {
                    // Значение параметра.
                    Value = "ЛИД C САЙТА",
                    // Тип данных параметра — строка.
                    DataValueType = DataValueType.Text
                }
            };
 
 
          
 
            // Инициализация коллекции колонок запроса.
            insertQuery.ColumnValues.Items = new Dictionary<string, ColumnExpression>();
            // Добавление выражений запроса в коллекцию добавляемых колонок.
            // Колонка [Название контрагента].
            insertQuery.ColumnValues.Items.Add("Account", columnExpressionName);
           
 
 
            // Сериализация экземпляра класса запроса на добавление в JSON-строку.
            var json = new JavaScriptSerializer().Serialize(insertQuery);
 
            // Преобразование строки JSON-объекта в массив байтов.
            byte[] jsonArray = Encoding.UTF8.GetBytes(json);
            // Создание экземпляра HTTP-запроса.
            var insertRequest = HttpWebRequest.Create(insertQueryUri) as HttpWebRequest;
            // Определение метода запроса.
            insertRequest.Method = "POST";
            // Определение типа содержимого запроса.
            insertRequest.ContentType = "application/json";
            // Добавление полученных ранее аутентификационных cookie в запрос на получение данных.
            insertRequest.CookieContainer = AuthCookie;
            // Установить длину содержимого запроса.
            insertRequest.ContentLength = jsonArray.Length;
 
            // Добавление CSRF-токена в заголовок запроса.
            CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
            string csrfToken = cookieCollection["BPMCSRF"].Value;
            insertRequest.Headers.Add("BPMCSRF", csrfToken);
 
            // Помещение в содержимое запроса JSON-объекта.
            using (var requestStream = insertRequest.GetRequestStream())
            {
                requestStream.Write(jsonArray, 0, jsonArray.Length);
            }
 
          
          
          // Выполнение HTTP-запроса и получение ответа от сервера.
          using (var response = (HttpWebResponse)insertRequest.GetResponse())
          {
              // Вывод ответа в консоль.
              using (StreamReader reader = new StreamReader(response.GetResponseStream()))
              {
                  Console.WriteLine("JSON ответ от сервера");
                  Console.WriteLine(reader.ReadToEnd());
              }
          }
 
 
        }

 

У меня такой же вопрос

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

Добрый день.

В таких случаях проще всего сравнить запросы через Fiffler(тогда станет ясно что забыли). Пример работы можно посмотреть - https://academy.terrasoft.ua/documents/technic-sdk/7-12/vypolnenie-zapr…

Короче, проблема было в том что в карточке лида были обязательные поля. Но конечно забавно возвращать 500ю ошибку 

VladKapitanchyk,

Спасибо

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

Добрый день.
Как рассчитать "общий вес" (1) по значениям в детали (2)?

Мне бы пример кода. А там разберемся сами.

У меня такой же вопрос

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

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

Пример такого расчета в системе Вы можете найти в схеме OrderPageV2 - значение поля "Итого" обновляется при добавлении записи на деталь "Продукты в заказе" (OrderProductDetailV2), метод UpdateOrderProductSummary.

Спасибо.

Подскажите где храниться данные метод?
В отладчике увидел. Но где он физически находиться не нашел.

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

OrderPageV2 и OrderProductDetailV2 в пакете Order.

Это я нашел. Но самих методов нет.
Вот смотрите в
есть вызов OrderPage:

				Product: {
					schemaName: "OrderProductDetailV2",
					entitySchemaName: "OrderProduct",
					filter: {
						masterColumn: "Id",
						detailColumn: "Order"
					},
					subscriber: function() {
						this.updateAmount();
					}
				},

а в OrderProductDetailV2

define("OrderProductDetailV2", [], function() {
	return {
		entitySchemaName: "OrderProduct",
		methods: {
			init: function() {
				this.callParent(arguments);
				this.set("MultiSelect", true);
				this.set("isCollapsed", false);
			}
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

И понять не могу где этот метода размещен.

Уточните, пожалуйста, Вашу версию и продукт. У меня в 770 больше кода...

7,5

Посмотрел 7,7 там да кода больше но не видно где сам расчет происходит.

Здравствуйте, самим подсчётом занимаются методы миксина ProductEntryPageUtils который подключен к карточке OrderPageV2, все это еще связано песочницей с самой деталью. Но все это слишком заточено на универсальность и для Вашего кейса не нужно.
Все что Вам нужно, так это переопределить с вызовом родительского метода, в карточке в которой у Вас размещена деталь, метод:
onDetailChanged
В нем проверять Ваша ли деталь стригерила это событие, и если Ваша, обращаться к БД с помощью esq запроса:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-r…
Получив нужную сумму, или любые другие данные из БД и посчитав их агрегацию, поместить их куда Вам необходимо на карточку, к примеру в колонку завязанную на виртуальный атрибут.
Таблицу детали вы знаете, единственное условие это Id записи связи, который Вы легко получите в карточке через this.get("имя-колонки-связи")

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

Добрый день! Потребовалось добавить поле "Код" в таблицу единиц измерения. Добавление самого поля не составило проблем, добавил его в таблицу, в sq_ запрос и в ds_ выборку. Но есть проблема по добавлению текстового поля в справочник. В администраторе я не нашёл wnd_ объект, который отображается для единицы измерения. В клиентской части, когда я захожу в Справочники->Настройки для пункта "Единицы измерения" не указано окна редактирования. Указан только источник данных. Как я понял, если отсутствует значение у окна редактирования, то поля должны как-то сами подтягиватся. Почему тогда код не появился?

У меня такой же вопрос

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

Если окно не указано, то используется стандартное окно редактирования из двух полей - Name и Description.
Сделайте свое окно редактирования (в качестве TemplateWindowUSI = wnd_BaseDBEdit) и укажите его в настройках справочника.

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

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

У меня такой же вопрос

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

Татьяна, здравствуйте,

Просьба более детально описать задачу. А именно формирование кода. В каком виде он должен формироваться? При создании записи в коде значение должно увеличиваться на 1?

Или вот рандом есть, к примеру:

function GetRandomValue(MinValue, MaxValue) {
	MaxValue++;
	var Range = MaxValue - MinValue;
	var Value = Math.floor(Math.random()*Range) + MinValue;
	return Value;
}

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

Татьяна,

необходимо добавить новое поле в таблицу, запрос, датасет и системную настройку.

При сохранении карточки брать значение системной настройки,а саму настройку увеличивать на единицу.

Здравствуйте. С заполнением кода в новых карточках Контрагентов все прошло успешно.Но существуют еще сотни старых карточек, с пустыми значениями. Необходима обработка или скрипт, который пробегался бы по всей базе и заполнял бы код в карточках Контрагентов там, где значения пусты..спасибо.

Татьяна,

Вам необходимо написать SQL-запрос, который будет это делать:)

Оглашаете переменную с кодом, с которого нужно начать, и в цикле пробегаетесь по записям, где поле "Код" не заполнено и выполняете update записи. После update'а прибавляете единицу - и так далее, пока записей с незаполненным полем не останется.

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

В обработчике нажатия на кнопку ОК карточки контрагента считывать значение системной настройки и, в случае, если поле не заполнено, заполнять считанным значением + 1.

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Иногда возникает необходимость "нумеровать" контрагентов (по аналогии с "масками" в других разделах). Для реализации можно рассмотреть следующий вариант.

Перед изменениями сделайте резервную копию базы.

Для такой возможности следует:

1. Зайти в системные настройки:

/system/files/1_55.png

2. Добавить новую настройку:

/system/files/2_38.png

3. Ввести следующие параметры:

/system/files/3_21.png

4. Создать еще одну настройку с такими параметрами:

/system/files/4_14.png

5. Далее открыть функцию ds_AccountOnDatasetBeforePost в скрипте scr_Account и добавить в ней строку:

SetAccountNumber(Dataset);

6. Также необходимо прописать функцию, которая будет вызываться:

function SetAccountNumber(Dataset) {
var AccountNumber = Dataset.Values('AccountCode');
if (IsEmptyValue(AccountNumber)) {
SetItemSystemNumber('Account', Dataset, 'AccountCode');
}
}

Где – 'AccountCode' название поля «Код» в конфигурации.

Сохраните изменения и проверьте работоспособность.

/system/files/6_1_0.png

Поле «Код» после сохранения будет заполняться автоматически.

/system/files/6_2_0.png

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

1)Приходит товар от разных поставщиков в разной валюте, отгрузка соответственно происходит также в разной валюте. По умолчанию в Terrasoft при добавлении отгрузки или прихода, в таблице накладные нет поля "выбор валюты", как можно добавить данное поле? "ресурсы>склад>накладные> и в самой таблице "выбор валюты""
2)Как можно сделать по умолчанию при отгрузке или приходу товара, выбор того или иного товара не по "продукт" а по "код"? где это все редактируется?
3)Как добавить колонку "код" в "ресурсы>склад>накладные>продукты"?
4)Как в таблице "продукты" сделать склада по умолчанию, чтобы не выбирать его постоянно.

Огромнейшее спасибо!

У меня такой же вопрос

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

К сожалению, Вами не указана версия. В новых версиях данный функционал уже реализован.

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

Чтобы добавить в карточку поле, необходимо последовательно добавить поле в таблицу tbl_OfferingMovament, поля в запрос sq_OfferingMovement, поле в датасет ds_OfferingMovement и поле в карточку. Инструкция в приложении.

Либо же воспользоваться функционалом пользовательских полей.

"Смирнов Д.И." написал:
2)Как можно сделать по умолчанию при отгрузке или приходу товара, выбор того или иного товара не по "продукт" а по "код"? где это все редактируется?

Для этого нужно сделать следующее:

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

"Смирнов Д.И." написал:
3)Как добавить колонку "код" в "ресурсы>склад>накладные>продукты"?

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

"Смирнов Д.И." написал:
4)Как в таблице "продукты" сделать склада по умолчанию, чтобы не выбирать его постоянно.

Пронумеровать склады в справочнике и установить в запросе sq_Store сортировку по номеру.

версия Terrasoft 3.0.2.66

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

Инструкция по добавлению колонки Код в приложении.

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

"Alimova Anna" написал:Чтобы добавить в карточку поле, необходимо последовательно добавить поле в таблицу tbl_OfferingMovament, поля в запрос sq_OfferingMovement, поле в датасет ds_OfferingMovement и поле в карточку. Инструкция в приложении.

Либо же воспользоваться функционалом пользовательских полей.


Все сделал как написано в приложении! Через "пользовательские поля" не получилось, т.к. не нашел соответствующего поля "ресурсы" "склад" "накладные".
Так вот все отобразилось, НО!
При выборе валюты выскакивает приложение написано в шапке "Just-In-Time Debugging".
Пишет: An exception 'Runtime Error' has occurred in Script.
И предлагает "Possible Debuggers:"
1)New instance of Microsoft Script Debugger
2)New instance of Microsoft Script Editor

И вопрос
"Do you want to debugger using the select debugger?"
Yes или No

И вот сам Terrasoft что написал:

Ошибка выполнения метода 'wnd_BaseGridAreaOnNotify'. request synchronization error
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements
Error Code: 44 «Call Stack»
[11.10.25 12.03.30.093] (E) Ошибка выполнения метода 'wnd_OfferingMovementEditOnPrepare'. Ошибка открытия источника данных "X25\Workspaces\OfferingMovement\General\ds_OfferingMovement".
Оригинальное сообщение об ошибке: conversion error from string "BLOB"
Overflow occurred during data type conversion.
Error Code: 14 «Call Stack»
[11.10.25 12.15.09.718] (E) Ошибка выполнения метода 'wnd_OfferingMovementEditOnPrepare'. Ошибка открытия источника данных "X25\Workspaces\OfferingMovement\General\ds_OfferingMovement".
Оригинальное сообщение об ошибке: conversion error from string "BLOB"
Overflow occurred during data type conversion.
Error Code: 14 «Call Stack»

Пропала информация о приходе и отгрузке

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

Попробуйте взять резервную копию базы данных и повторить выполнение инструкции.

Верно! Был добавлено поле типа большой бинарный объект.
У меня нет на английском типа global unique identifier.
Переводчик перевел как глобальный уникальный идентификатор.

И необходимо ставить на галочку "Реплицируется"?

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

Ошибка открытия источника данных
conversion error from string "BLOB"
Error Code 14.

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

Все получилось!
Удалил все изменения, и сделал все заново.

Огроооомнейшее спасибо Анна!

Появилась новая задача! Валюта теперь есть, а вот пересчитывать в любую другую валюту при отгрузке, отличающую от валюты прихода программа не хочет. Что то еще надо добавить

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

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

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

1. Валюта должна храниться в карточке контрагента, и подтягиваться оттуда. То есть, необходимо сделать следующее:

В таблице, запросе, датасете, карточке Контрагент создать поле валюта CurrencyID

2. в запросе, датасете и карточке Наклыдные создать поле Валюта, которое подтягивать из таблицы контрагент

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

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

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

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

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

1. Валюта должна храниться в карточке контрагента, и подтягиваться оттуда. То есть, необходимо сделать следующее:

В таблице, запросе, датасете, карточке Контрагент создать поле валюта CurrencyID

2. в запросе, датасете и карточке Наклыдные создать поле Валюта, которое подтягивать из таблицы контрагент

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

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

Анна Алимова
Специалист II линии технической поддержки Terrasoft


Так тяжело разобраться... Может можно вас попросить инструкцию, как вы присылали выше?... если нет, то хотя бы можно попросить вас написать то что выше,только с названием таблиц на языке этих таблиц?

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

Таблица Контрагент в конфигурации называется tbl_Account. Ее запрос и датасет, соответственно, sq_Account и ds_Account

Для того, чтобы добавить в нее валюты, необходимо создать в таблице поле CurrencyID, а в запросе - поля CurrencyID из tbl_Account и CurrencyName из присоединенной в запросе таблицы tbl_Currency

Запрос Накладные называется sq_OfferingMovement.

:twisted:
Пошел разбираться!

Без сто грамм не разберешься! :cry:

Таблицы нашел, но не совсем понятно.
В таблицу Контрагент поле валюта добавил.
в запросе сделал CurrencyID из tbl_Account.
Вот с CurrencyName не понял, есть только Name.

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

в скрипте датасета Накладные - аналогичная ситуация.

Для того, чтобы добавить CurrencyName, нужно сделать следующее:

1. В запросе sq_OfferingMovement добавить в блок FROM новый join - таблицу tbl_Currency:

currency

2. уже из присоединенной таблицы добавить CurrencyName:

currencyname

Добавил! Но есть вопрос.
На вашем фото видно что tbl_Currency Вы добавили в tbl_Account,
я пробовал сделать аналогично, но там где ON Join1 ID = tbl_Account. не выбирается поле CurrencyID (его там просто нет).
Так вот вопрос, tbl_Currency надо добавлять в tbl_Account и почему нет поля CurrencyID. Или же все таки tbl_Currency добавить необходимо в From. Вот фото того что я добавил:

И тогда прошу вас дать следующие комментарии:
Как создать вычисляемое поле суммы в валюте контрагента?
И как в скрипте датасета Накладные прописать вычисление поля в зависимости от того, какая валюта указана в карточке контрагента?

C уважением, Дмитрий Смирнов!

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

Таблицу tbl_Currency действительно нужно присоединять к tbl_Account (как показано на рисунке), потому что оттуда мы подтягиваем идентификатор CurrencyID, соответственно, это поле есть только в tbl_Account.

Для создания вычисляемого поля:

1. Создайте в датасете ds_OfferingMovement вычисляемое поле со следующими настройками:

111

2. Создайте обработчик события OnDatasetCalcFields

222

3. Добавьте в обработчик следующий программный код:

333

var dsCurrencyRate = Services.GetSingleItemByUSI('ds_CurrencyRate');
ApplyDatasetFilter(dsCurrencyRate, 'CurrencyID', Dataset('CurrencyID'), true);
Dataset('AmountCurrency') = Dataset('Amount') * dsCurrencyRate('Rate');

Вот еще пару уточняющих вопросов:
когда создаешь CurrencyID в Account
в tbl_Account тип данных - уникальный идентификатор?
в sq_Account поле будет tbl_Currency и Currency ?
в ds_Account создаем "строковое поле" Currency?

C уважением, Дмитрий Смирнов!

Здравствуйте, Дмитрий.

Когда создаешь CurrencyID в Account в tbl_Account, тип данных - уникальный идентификатор?

Да.

в sq_Account поле будет tbl_Currency и Currency ?

tbl_Currency и ID

в ds_Account создаем "строковое поле" Currency?

Да, строка. В ds_Account формат поля должен совпадать с форматом поля в tbl_Currency.

С наступающим праздником Вас!
С Днем Великой Октябрьской Социалистической Революции!

Войдите или зарегистрируйтесь, чтобы комментировать