Приветствую, уважаемые форумчане!

На больших проектах, по разработке на платформе Terrasoft, ощущается острая необходимость документации кода. На сегодняшний день есть множество frameworks для автоматической генерации документов на основе markdown или wiki.

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

Может кто-то использует нечто подобное, подскажите best-practice, поделитесь как вы решаете эту проблему.

Для генерации документации, клиентской части ядра, платформы, используется JSDuck. Можно сформировать для каждого сайта нечто а-ля https://academy.terrasoft.ru/jscoresdk/ Но как-бы заставить jsduck собирать информацию ещё и про схемы конфигурации... Или же проще использовать другой framework для этой задачи...

Нравится

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

Добрый день.

JSDuck является оптимальным решением и позволяет генерировать действительно удобную и полезную документацию. Приложения, созданные на ExtJS, поддерживают автоматическое создание документации, так как генератор изначально создавался для Sencha и позволяет распознавать синтаксис ExtJS.
Запуск генератора осуществляется из командной строки:

$ jsduck

При этом, вся конфигурация должна быть описана по умолчанию в файле jsduck.json, находящемся в этой же директории.
Можно все параметры конфигурации описывать в командной строке, не используя файл конфигурации. Например

$ jsduck path/to/src --output docs

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

$ jsduck --config=mypath/to/myconfig.json

Справку по всем параметрам командной строки можно посмотреть командой

$ jsduck --help

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

Пример файла конфигурации:

{
"--title": "My Application Docs",
"--warnings": [
"-all:path/to/extjs/src"
],
"--output": "docs",
"--": [
"path/to/extjs/src",
"path/to/my/app"
]
}

Краткое описание параметров:
title — титульный заголовок на странице документации.
warnings — позволяет управлять потоком предупреждений, которые пишутся в консоль, если документированный код не соответствует самому коду. В приведенном примере с помощью опции "-all" игнорируются все предупреждения, возникающие в фреймворке extjs.
output — директория сгенерированной документации.
В последней секции "--" перечисляются директории с исходниками, из которых должна быть сгенерированна документация.

Ознакомиться с официальной документацией можно по этой ссылке: https://github.com/senchalabs/jsduck/wiki

Я читал документацию по JSDuck. И формировал документацию для ядра Terrasoft BPMonline.
Но как это поможет сгенерировать документацию для модулей конфигурации? Возможно ли настроить JSDuck так, чтобы можно было сгенерировать документацию по всем клиентским файлам конфигурации. Если у вас это удавалось - будет здорово, если вы со всеми поделитесь инструкцией и конфигами.

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

"--": [
"path/to/extjs/src",
"path/to/my/app"
]

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

Привожу в качестве примера наш конфигурационный файл:
{
"--title": "bpm'online NUI Docs",
"--warnings": ["-link", "-nodoc(,)", "-inheritdoc", "-type_syntax"],
"--output": "..\\Documentation",
"--footer": "Terrasoft 2002-2016 Все права защищены",
"--tags": ".\\meta-tags.rb",
"--": [
"C:\\Projects\\NuewUnitTests\\Terrasoft.Nui\\ConfigurationJS"
]
}
Создание пользовательских тегов описано в документации JSDuck.

Добрый день! У меня наконец получилось извлечь боле менее вразумительную документацию с помощью JSDuck. Прошлый раз утилита постоянно обрывалась по ошибке. Я считал, что это из-за нестандартной структуры клиентских модулей. Нестандартных для классов ExtJS.
Но правильно настроив конфиг и используя правильные комментарии удалось сгенерировать кое-что полезное. Спасибо.

А как быть с серверным кодом? Может подскажите оптимальный инструмент для документации по серверному коду?

Добрый день!
К сожалению, на данный момент у нас нет опробованного оптимального инструмента для генерации документации по серверному коду Конфигурации Приложения. Идет анализ и тестирование подходящего инструмента. Рекомендую обратить внимание на следующие подходы к созданию документации и используемые при этом инструменты, описанные в статьях https://habrahabr.ru/post/102177/
и https://habrahabr.ru/post/252101/

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

Добрый день! У нас доступ к почте осуществляется через браузер и через OUTLOOK. Нам необходимо, чтобы все пользователи обращались к почте только через BPMONLINE. Возможно ли через настройки нашего почтового сервера и BPMONLINE заблокировать доступ к почте из других программ, кроме BPMONLINE?

Нравится

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

Боюсь данный вопрос не касается bpm'online, данный вопрос стоит задать вашим системным администраторам.

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

Уважаемые форумчане.
Вопрос по версии 7.6
Не получается сделать фильтрацию на детали.
Создал деталь активностей связанных контрагентов Activity на странице контрагента. Она похожа на деталь
Ативности в контрагенте, только она должна выдавать перечень активностей не текущего контрагента,
а активности контрагентов, которые связаны с текущим контрагентом. Связи контрагентов хранятся во
вьюхе VwAccountRelationship. В ней есть колонки AccountId и RelatedAccountId.
Сделал запрос

 SELECT * FROM Activity
INNER JOIN VwAccountRelationship ON Activity.AccountId = VwAccountRelationship.RelatedAccountId
WHERE VwAccountRelationship.AccountId = 'a40cfdfb-cd46-4c63-9448-44110861c12c'

a40cfdfb-cd46-4c63-9448-44110861c12c - Id текущего контрагента.
Этот запрос выдает верный результат. Там всего одна запись.
Но сделать с помощью фильтра на js не получается.
Пробовал следующий код, но он выдает кучу ненужных записей.
"Activity": {
                "schemaName": "SuSchema1Detail",
                "entitySchemaName": "Activity",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"           
                },
                filterMethod: "activityFilter"
        }
methods: {
                        activityFilter: function() {
                                var currentAccount = this.get("Id");
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                filterGroup.add("CurrentAccountRelatedAccounts", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
                                        "=[VwAccountRelationship:RelatedAccount:Account].Account", currentAccount));
                                return filterGroup;
                        }                              
                }

Заранее благодарен.

Нравится

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

Доброго времени суток! Очень нужна помощь в реализации задачи по автоматическому заполнению добавленного поля Сегмент исходя из выбранного города в поле Город на странице лида. Как можно проще всего реализовать? Благодарен за любую помощь.

Нравится

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

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

Для решения данной задачи, Вам необходимо:

1) Добавить обработчик события изменения атрибута Город.
2) В обработчике события доставать значение из поля Город, выполнять запрос к базе данных и заполнять поле сегмент.

Пример добавления обработчика в методе init, где UsrCity - имя колонки справочника Города:

init: function() {
	this.callParent(arguments);
	this.on("change:UsrCity", function(){
		var city = this.get("UsrCity");
		if(city && city.value){
			var id = city.value;
			// запрос к бд.
		}
	})
}

Для заполнения справочного поля необходимо следующим образом:

this.set("Имя атрибута", { value: "Id записи", displayValue: "Отображаемое значение" })

https://academy.terrasoft.ua/sites/default/files/documents/docs/technic…

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

Всем привет, я только начал изучать платформу, но столкнулся с такой проблемой, как только пытаюсь схему, что бы по ней создать словарь при попытке сохранения мне пишет ошибку: Ошибка сохранения: Элемент с идентификатором "32e23f83-f058-49ff-9796-434470c48d5e" не найден. Как бы я не менял поля схемы оно её не создаёт((( Ответьте, пожалуйста в чём может быть моя ошибка... Если я слишком непонятно всё расписал, тогда просто напишите тут алгоритм создания своего справочника. Заранее спасибо.

Нравится

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

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

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

Также, детальная информация доступна на аккадемии, по ссылке
https://academy.terrasoft.ru/documents/service-enterprise/7-8/razdel-sp…

Я создал в разделе контактов новую колонку "Откуда узнал", но она не добавляется в реестр.

Создал справочник "Источники информации", сделал, как описано в 6.png

но справочник не добавляется в список.

Здравствуйте, Владимир!

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

Справочник добавляется в группу "Все", но не в выбранную подгруппу.

"Королёв Сергей Витальевич" написал:Ошибка сохранения: Элемент с идентификатором "32e23f83-f058-49ff-9796-434470c48d5e" не найден.

Скорее всего вы просто словили ошибку в метаданных, перегенерируйте исходные коды (для всех) и скомпилируйте всё.
вот в этой теме я ловил аналогичную ошибку.

Далее алгоритм по добавлению своего справочника:
1) Создаете новый объект, наследующийся от "Базовый справочник"
(обязательно именно так, не "Базвый объект"!)
в вашем пакете (по умолчанию - пакет Custom, если это Ваш пользовательский пакет - вам надо убедиться что Custom от него зависит, иначе как раз в мастере добавления справочника в выпадающем списке не будет Вашего объекта)
2) Далее в Дизайнере системы => Справочники => Добавить новый
Там в выпадающем списке уже будет объект который вы создали в предыдущем пункте, искать его надо не по имени объекта а по заголовку

Как-то так.

Исправил. Удалил справочник и добавил повторно. Результат тот же.

Записал для вас видео по созданию простейшего своего справочника
Там где-то посередине видео какой-то тупняк с неоткрывающимся разделом справочники - это демка, она лагает - это нормально :)

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

Добрый вечер коллеги!
Возникла проблема с формированием тела для отправки письма.
Я все выполнил в точности, как написано здесь, однако письмо приходит не с текстом, который я ожидаю, а прямо в виде:
"[#[IsOwnerSchema:false].[IsSchema:false].[Parameter:{b5e76cd0-4fa3-4004-9d26-144caa0b5973}]#]"
Что бы я не менял, результат такой же. Письмо отправляется, процесс работает нормально, в параметр передается правильное значение, ошибок не возникает, но в результате получаю не то, что мне нужно.
Подскажите, с чем это может быть связано?
Версия 7.8

Нравится

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

Александр, рекомендую использовать инструкцию:
http://www.community.terrasoft.ru/blogs/12527

"Демьяник Алексей" написал:

Александр, рекомендую использовать инструкцию:

http://www.community.terrasoft.ru/blogs/12527


Благодарю, помогло. Я не верно передавал значение формулы. А именно из формулы я передавал в созданный мной параметр, а уже потом в тело письма. Скорее всего происходила конвертация в строку, поэтому и получалось такое сообщение. Спасибо!

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

Добрый день!

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

Нравится

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

Говорят, что такая возможность для произвольного раздела появится в версии 7.9.

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

Говорят, что такая возможность для произвольного раздела появится в версии 7.9.


Ясненько, а не знаете, сейчас что-то подобное можно сделать самому?

Как-то так. Оф. ответ супорта. Только придется менять кучу конфигов.

Что-то кодировка сломалась. Вот, что там:

Здравствуйте, вот инструкция по написанию сервиса, вызывающего БП, доступного по HTTP\GET с передачей параметров в БП:
 
1.	Вносим правки в наш «UsrLaunchProccService», во-первых, добавим Usr, как в имени схемы, так и имени класса по коду,
во-вторых, переписываем его как обычный веб-сервис, принимающий параметры по GET, а в его теле уже вызываем нужный нам БП с нужным нам параметром,
в нашем тесте это БП: UsrTestProcc с параметром UstTestPhone.
 
Бизнес процесс может быть любым, с любым количеством параметров, в данной инструкции наш тестовый БП не рассматривается,
единственное что, в процессе должен стоять флаг "сериализовать в сессию", должен стоять флаг "принудительная компиляция", и не стоять "сериализовать в БД", а также процесс не должен содержать тега,
суть вопроса в другом,
а именно в вызове его при получении GET запроса с параметром, с стороннего сайта\службы\сервиса\чего-угодно по протоколу HTTP,
итак, код сервиса во вложении (UsrLaunchProccService.txt), там написан как CORS, так и вызов БП, теперь доработаем конфиги что бы позволить вызывать сервис по урл:
http(или https)://адрес-сайта/0/ServiceModel/UsrLaunchProccService.svc
 
2.	В папке сайта в котором написан наш сервис, *сайт*\Terrasoft.WebApp\ServiceModel
Создаем файл «UsrLaunchProccService.svc»
В содержимое файла пишем:
 
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.UsrLaunchProccService" CodeBehind="UsrLaunchProccService.svc.cs" %>
 
3.	В папке *сайт* \Terrasoft.WebApp в файле Web.config  рядом с другими локациями, добавляем:
 
<location path="ServiceModel/UsrLaunchProccService.svc">
   <system.web>
      <authorization>
         <allow users="*" />
      </authorization>
   </system.web>
</location>
 
4.	В папке *сайт*\Terrasoft.WebApp\ в файле Web.config в секции appSettings меняем  значение ключа AllowedLocations. В значение добавляем:
ServiceModel/UsrLaunchProccService.svc;
 
5.	В папке *сайт*\Terrasoft.WebApp\ServiceModel\http в файле services.config в блоке сервисов добавляем:
 
<service name="Terrasoft.Configuration.UsrLaunchProccService">
	<endpoint name="UsrLaunchProccServiceEndPoint"
      address=""
      binding="webHttpBinding"
      behaviorConfiguration="RestServiceBehavior"
      bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
      contract="Terrasoft.Configuration.UsrLaunchProccService" />
</service>
 
6.	В папке *сайт*\Terrasoft.WebApp\ServiceModel\https в файле services.config в блоке сервисов делаем то же самое, что и в пункте 5.
 
Все, сервис будет доступен по адресу:
http(или https)://адрес-сайта/0/ServiceModel/UsrLaunchProccService.svc
 
К примеру в нашем локальном примере, вызов БП с параметром телефона "123" выглядит так:
http://localhost:8006/0/ServiceModel/UsrLaunchProccService.svc/runUsrTestProcc/123/

Но это просто запуск извне процесса с параметрами. Если нужно какой-то пользовательский интерфейс, как в лендинге, то придётся его делать вручную.

Спасибо всем большое!

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

"Колебянов Виталий Романович" написал:Знает ли кто как включить CORS?

В сервисе:

[OperationContract]
        [WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
        public void GetWebFormLeadDataRequestOptions()
        {
            var outgoingResponseHeaders = WebOperationContext.Current.OutgoingResponse.Headers;
            outgoingResponseHeaders.Add("Access-Control-Allow-Origin", "*");
            outgoingResponseHeaders.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
            outgoingResponseHeaders.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source");
            outgoingResponseHeaders.Add("Access-Control-Request-Headers", "X-Requested-With, x-request-source, accept, content-type");
        }

Здравствуйте. По выше описанному добавил web сервис. При вызове ему передаються текстовые данные в формате JSON.

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
	RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted() {
	var Request = HttpContext.Current.Request;
	StreamReader reader = new StreamReader(Request.InputStream);
	string requestFromPost = reader.ReadToEnd();
	string result = "chatStarted result: " + requestFromPost;
	return result;
}

Но при получении InputStream, возвращаеться ошибка: Этот метод или свойство не поддерживается после вызова HttpRequest.GetBufferlessInputStream."
System.Web.HttpRequest.BinaryRead(Int32 count)
в Terrasoft.Configuration.UsrChatraWebhooks.chatStarted()
в SyncInvokechatStarted(Object , Object[] , Object[] )
в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Нашел статью https://stackoverflow.com/questions/21635815/how-should-i-use-httpreque…

добавил в Terrasoft.WebApp\web.config в configuration.appSettings

<add key="wcf:serviceHostingEnvironment:useClassicReadEntityBodyMode" value="true" />

После этого ошибка не повторяется, но InputStream пуст.

В чем может быть проблема? Может в BPM есть специальный способ для чтения тела входящего запроса?

Request.ContentLength > 0, .т.е. в теле запроса передается какая то информация.

"Дашкевич К." написал:Но при получении InputStream, возвращаеться ошибка:

Как-то слишком наворочено) Если надо принять строку, то

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
        RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted(string input) {...} ///автоматом десериализует в строку

Если надо принять Json, мы делаем так:

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
        RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted(newMessage input) {...}  ///автоматом десериализует в объект, который предварительно надо описать
 
[DataContract]
    public class newMessage
    {
        [DataMember]
        public string testName { get; set; }
 
        [DataMember]
        public DateTime testDate { get; set; }
    }

Если надо stream, то там немного сложнее. придётся выкидывать RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json. Короче, лучше без стрима)

Попробовал ваш метод первый и второй:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class UsrChatraWebhooks
{
 
	[OperationContract]
	[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
	public void GetWebFormLeadDataRequestOptions()
	{
		var outgoingResponseHeaders =WebOperationContext.Current.OutgoingResponse.Headers;
		outgoingResponseHeaders.Add("Access-Control-Allow-Origin", "*");
		outgoingResponseHeaders.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
		outgoingResponseHeaders.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source");
		outgoingResponseHeaders.Add("Access-Control-Request-Headers", "X-Requested-With, x-request-source, accept, content-type");
	}
 
	[OperationContract]
	[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
		RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
	public string chatStarted(NewMessage input) {
		var Request = HttpContext.Current.Request;
		var lngCount = Request.ContentLength;
		string tinput = "";
		if (input != null) {
			tinput = input.eventName;
		}
		string result = "ContentLength=" + lngCount.ToString() + "; input=" + tinput;
		return result;
	}  
}
 
[DataContract]
public class NewMessage
{
	[DataMember]
	public string eventName { get; set; }
 
}

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

Ответ: {"chatStartedResult":"ContentLength=32; input="}

"Дашкевич К." написал:WebMessageBodyStyle.Wrapped

Посылаемый запрос должен быть обёрнут, поэтому либо:

{
	NewMessage: {
		eventName: "значение"
	}
}

либо

WebMessageBodyStyle.Bare

запрос(если оставляем класс NewMessage):

{
	eventName: "значение"
}

"Варфоломеев Данила" написал:WebMessageBodyStyle.Bare

запрос(если оставляем класс NewMessage):
{
        eventName: "значение"
}

Спасибо большое, помогло.

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

Здравствуйте. Скажите пожалуйста, как можно в bpm'online sales team 7.8.2 в бизнес процессе получить тело входящего письма.
Процесс запускается по сигналу входящего письма, читаются данные письма а вот, как дальше быть? Как распарсить?
Скрин прилагаю.

Нравится

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

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

Тело письма хранится в поле Body. Парсить письмо можно элементом "Задание-сценарий", но нужны навыки программирования на языке C#.

"Демьяник Алексей" написал:

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

Тело письма хранится в поле Body. Парсить письмо можно элементом "Задание-сценарий", но нужны навыки программирования на языке C#.


Я уже разобрался как получить тело письма. Через параметры бизнес процесса.

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

Добрый день! Как сделать выпадающий список при наборе первых букв в полях КОМУ, КОПИЯ, СКРЫТАЯ КОПИЯ при создании нового письма?

Нравится

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

Евгений, данные колонки нельзя сделать выпадающими, так как они являются текстовыми. Сверху же этих полей добавлена доп. логика, которая в каком виде отображать данные поля как справочники. Логика реализована в схеме EmailPageV2 (UIv2). Это предположительно сделано из-за того, что в обычный лукап нельзя добавить больше одного значения.

Как вариант, можно сделать новые колонки с нужным типом (указать справочник «E-mail адреса»). Затем при выборе значений заполнять базовые колонки «Кому», «СС» и «BCC». Здесь уже нужно знать программирование - https://academy.terrasoft.ru/documents/technic-sdk/7-8/dokumentaciya-po….

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

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

Версия 7.8 sales.

Задача такая: на детали Средства связи на странице Контакта есть поля "Мобильный телефон" и "Основной телефон". Также у контакта есть своё поле "Мобильный телефон".

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

Возможно ли сделать так, чтобы это значение добавлялось также автоматически в поле "Основной телефон" вместо мобильного? (см. скриншот)

Спасибо.

Нравится

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

При сохранении контакта:
1й запрос на проверку, есть ли в contactcommunication этого контакта "Основной телефон"
2й запрос update если есть, insert если нет.

Просто так добавить, думаю, будет сложновато, ибо синхронизация вшита в БП, БП запускается при сохранении, он запускает функцию синхронизации, функция запускает хелпер, и уже в C# хелпере происходит синхронизация. Что-то неохота все это расковыривать ради доп. поля

Да, надо было бы вынести в настройки синхронизацию детали "Средста связи" с полями Контакта и Контрагента.

Как и поля детали "Адреса"

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