Есть родительское окно и в нем WindowContainer. Окно которое подтягивается через WindowContainer имеет еще один WindowContainer. Т.о. есть три вложенных окна, как из главного окна обратиться к компоненту расположенному на третьем самом глубоком окне?
Предполагаю, что должно быть похоже на:

this.ComponentsByName('wnd_2').ComponentsByName('wnd_3').ComponentsByName('любой контрол')

Нравится

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

Не работают события окна отображаемого компонентом WindowContainer. Если открыть окно непосредственно то код в scr_ работает. Если окно отображается в контейнере то наличие событий у него и файла scr_ игнорируется. Может нужно контейнеру показывать и файл scr_? Версия 3.4.0.141

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

Нравится

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

Здравствуйте, Михаил!
Окно в контейнере нужно вручную проинициализировать, как в приведенной Вами теме.

Забыли добавить Андрей, что вызов инициализации нужно вызывать из родительского Окна. А весь код инициализации уже да описать в Окне контейнера. Если вопрос не решен у Михаила пусть напишет, что у него за ситуация и какую цель он хочет достичь я приведу примеры из своего кода. Так как у меня есть алгоритмы Инициализации окон не только с Одинарной вложенностью.

Михаил, спасибо за уточнение!

Спасибо за ответы. Вопрос был решен кодом по ссылке.

Показать все комментарии
Пользовательский фильтр
Фильтры
Разработка

Добрый день.
Создал иерархический справочник "Варианты" со структурой (ID, ParentID, Name) и в таблице задач (tbl_Task) создал поле, ссылающееся на этот справочник.
Хочу сделать такой пользовательский фильтр, чтобы выбирал задачи, у которых значение варианта совпадает с выбранным в фильтре или было подчиненным ему.
Есть значения
1.0
|- 1.1
|- 1.2
|- 1.3
2.0
|- 2.1
|- 2.1.1
и т.п.
Я хочу,чтобы после применения этого фильтра при значении 1.0 отбирались задачи со значениями вариантов 1.0, 1.1, 1.2 и 1.3.

Я хотел реализовать это с помощью пользовательского фильтра справочника. Для этого я сделал табличную функцию, которая принимает ID записи из фильтра и возвращает ID этой записи и всех ее потомков. Но для пользовательского фильтра параметр запроса генерируется только при исполнении и не доступен в администраторе. Можно это как нибудь обойти?
Или другой вариант: можно ли обычный фильтр (не пользовательский) вывести на панель фильтров и заполнять параметр этого фильтра вручную?

Нравится

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

Я так понимаю ID и ParentID - ссылки на данные одной и той же таблицы? Тогда просто добавьте пользовательский фильтр по полю ParentID. Значения будете выбирать из общего пула записей в данной таблице, а в результате будете получать только подчиненный к выбранной записи данные.

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

Спасибо за ответ, но мне это не поможет, так как в справочнике может быть много уровней иерархии. Допустим, что узел 2.1.1 подчинен 2.1, а тот, в свою очередь, 2.0. Если я в фильтре укажу отобрать по 2.0, то получу только те задачи, у которых 2.0 и 2.1. 2.1.1 напрямую не подчинен и выведен не будет.
Я посмотрел в отладчике, при накладывании пользовательского фильтра генерируется что-то типа:

WHERE(([tbl_Task].[InformationTypeID] IN (:AutoGen_00160FA_4653CC2)))

Есть ли возможность добраться до этого механизма или это функционал самой платформы и из js не доступен?

Нет, нельзя... Генерация фильтров компонентом FuilterBuilder это ядровые механизмы.

ps: насколько я помню подчиненные элементы должны отрисоваться автоматом, т.е. при структуре

1
1.1
1.1.1
2
2.1
2.1.1

Если ввести в фильтр 1.1, то 1.1.1 у вас отобразится автоматом. Разумеется, если в выборке будет присутствовать и 1 (т.е. где запись ParentID = null). Это решается UNION'ом.

В любом случае - можете добавить какую либо кнопку и всю фильтрацию реализовать скриптом на JS.

День добрый!!! вот в Интернете нашел интересную статью. http://www.getinfo.ru/article610.html
Всю задачу что описал Riptor я бы решил в террасофте один в один как в Статье. Если требуется помощь в реализации данной статьи в Террасофте обращайтесь помогу. Только вот если честно так и не понял зачем Задачи делать Иерархические и еще со сложными Древовидностями? Цель какая?

Здравствуйте, Михаил.

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

В любом случае, на Ваш вопрос лучше ответит автор данного "топика", г-н Riptor.

Показать все комментарии
отчет
печатная форма
Факсимиле
Отчёты
Разработка

Добрый день,друзья!
Мне необходимо добавить в печатную форму отчёта факсимиле, т.е. картинку с подписями разных организаций. Как это можно реализовать в TS? спасибо

Нравится

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

Для начала надо в отчете добавить Picture Object.
Если картинка стандартная, то открыть поле и загрузить картинку с диска.
Если же у вас для каждой организации своя подпись и она хранится в датасете, то выделите Picture Object, слева есть Object Inspector, в нем свойства объекта, в свойствах объекта Dataset и DataField выделите нужный вам датасет и поле.

для каждой организации своя подпись. в карточке клиента надо заводить новый реквизит наверное,да?

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

Александр, Спасибо! а где можно посмотреть данный пример?

А какой версии Terrasoft? В карточке контакта есть страничка "Фото"?

3.4.1.153. да, нашла, вижу

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

Вам в любом случаи надо добавлять поле, которое должно хранить подписи (в отчете картинка из воздуха не возникнет). Оно делается по аналогии с фото. Абсолютно скрытым для всех оно не может быть, ибо кто-то же должен добавить подписи в систему.
Его скрытие или открытие уже является другой задачей, а именно разграничения прав. В разделе администрирования есть страница "Права доступа к полям", выбрав нужную сущность и группу пользователей вы можете запретить видеть и/или редактировать данное поле. Еще как вариант вы можете запретить видеть саму страницу с фото в скрипте, например, не администраторам системы:

if (Connector.CurrentUser.IsAdmin) pPhoto.IsVisible = true;
else pPhoto.IsVisible = false;

Можно все проще сделать.

В Таблице tbl_Invoice создаем новое Булевское поле. К примеру IsVisibleStamp. Данное поле размещаем в SQL запросе, Датасете и на форме Редактирования Счета. Далее...

Все что сейчас будет описано требуется делать в Отчете FastReport. На форме отчета в определенном месте где должны располагаться печати Разместить N-ное количество картинок с печатями (ранее подруженных в отчет). по умолчанию в Свойствах картинок, Свойство Visible установить = false. Т.е в реальности это получиться как Бутерброд картинка на картинке. Каждой Картинки размещенной на форме отчета присвоить Имя. Далее Включение/Отключение картинок выполняем с помощью внутреннего языка Fastreport. к примеру на Паскале. К примеру на последней картинки размещенной на форме отчета по Событию "OnBeforePrint" создаем на языке паскаль процедуру. Язык конечно можно выбрать и C++ и другие из предложенных, на каком будет удобно кодить. Ниже привожу пример Процедуры события "OnBeforePrint" как я включал и отключал картинки. Пример приведен на PascalScript:

procedure Picture2OnBeforePrint(Sender: TfrxComponent);
begin
 
  //если на форме Счета Вкл. реквизит "Отображать печати и подписи", тогда в зависимости от выбранной организации включаем видимость правильной картинки, у остальных картинок видимость отключаем.
  if (<ds_TestDataset."IsVisibleStamp"> = 1) then
  Begin
       case (<ds_TestDataset."SupplierID">) of               
       '{7DCD5B5C-4BA8-4F84-A7D0-50118D75C36C}': - ID Организации Тест1
               begin                   
               Picture1.Visible := false;
               Picture2.Visible := true;
               end;                            
       '{A34D79E9-2D87-4955-8C67-736FFAC309BE}':  - ID Организации Тест2
               begin                   
               Picture1.Visible := true;
               Picture2.Visible := false;
               end;     
       end;
 
  end;

Спасибо,Михаил. так и поступила:smile:

Всегда пожалуйста Татьяна :smile: Обращайтесь всегда буду рад помочь и подсказать путь решения.

Показать все комментарии
2
Terrasoft
базы
выгрузка
Выгрузка в две базы 1С
данных
две
одна
Скрипты
Разработка

Помогите разрешить кое какую проблему с выгрузкой 1с.
Как известно, в террасофте есть возможность выгрузки контрагентов в 1с. В базе данных имеются соответственно поля ...Объект1с УИД1с и конечно же Код1С. Так вот, все это работает.НО! для одной базы 1с. Есть необходимость выгружать одного контрагента в две базы данных. То есть Либу туда либо сюда, а может даже в обе. Как можно решить данную проблему? Ведь в полях Контрагентов(tbl_Account) есть место только для одной базы... Ну допустим я хочу выгрузитьь и туда и сюда..В поле UID1C соответственно запишется ID объекта 1с либо с той либо с иной базы данных. Как быть помогите пожалуйста! Начальство требует!

Нравится

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

Я вижу пока только 2 варианта:
1) Создать поля Code1C, Object1C, UID1C для второй базы, т.е. Code1CBase2 и т.д. и перенастроить интеграцию с одной из баз на них.
2) Забыть про все эти поля и действовать через универсальное поле, такое как ИНН.

Да, именно по первому варианту и хотел сделать.Добавил поля. Даже сделал выгрузку. Теперь , могу присвоить код. Но никак не могу понять где и как он заполняет поля UID1C и Object1C. Поискал в Администраторе. Нашел только огромную тучу стандартных скриптов, и то прототипы.. А где и как присваивается - непонятно.

А разве не просто в интеграции на настройке полей? По моему там же где и настраиваются все другие поля, просто они по умолчанию сразу проставляются на Code1C и Object1C, надо их просто на свои поменять.
Или я что-то не догоняю?

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

А еще я знаю не всю структуру и где менять.Сейчас наткнулся на таблицу AccountBillingInfo там тоже есть Коды 1с И УИДы1С.. И там дублировать получается.. Че то как то все через..

Вопрос остается... Где и как присваевается UID1C и Object1C??? В Синхронизации это не указывается..

В scr_Dataflow1CConsts описаны поля связанные с 1С:

var KeyFieldName1C = 'UID1C';
var KeyFieldName1CCaption = "UID записи в 1C";
var KeyCodeFieldName1C = 'Code1C';
var KeyCodeFieldName1CCaption = "Код записи в 1C";
var KeyDateFieldName1C = 'Date1C';
var KeyDateFieldName1CCaption = "Дата синхронизации записи с 1C";
var KeyObjectName1C = 'Object1C';
var KeyObjectName1CCaption = "Объект 1C";

А их присвоение идет в scr_Dataflow1CUtils.
Например UID1C:

...
var UID1C;
...
UID1C = Param.Obj1C.XMLString(Select1C[QueryLink].UUID());
...
Dataset(KeyFieldName1C) = '{' + UID1C + '}';
...

Вам будет легче все таки копаться не тут, а создать скрипт на интеграцию и присвоить эти поля в OnBeforeRecordImport

Александ конечно предложил интересный и правильный метод решения. В своем сообщение я только дополню и приведу пример Функции OnBeforeRecordImport в части получения из 1С и присвоения в Террасофте полей UID1C и Object1C. Пример получения UID1C и Object1C Справочника 1С "Организации":

function ParseUUIDtoGUID(input) {
	var TrimResult = Trim(input.toString());
	var Result = TrimResult.toUpperCase().replace(/^[\s\r\n]+|[\{\}]|[\s\r\n]+$/g, "");
 
	if ((/[A-F0-9]{8}\-[A-F0-9]{4}\-[A-F0-9]{4}\-[A-F0-9]{4}\-[A-F0-9]{12}/).test(Result)) {
		return Result;
	} else {
		return null;
	}
}
 
function OnBeforeRecordImport(Param, Dataset, Select1C) {
...
        var GUID1C = ParseUUIDtoGUID(Param.Obj1C.String(Select1C.Организация.Ссылка.UUID()));
        if (!IsEmptyValue(GUID1C)) {
                GUID1C = '{' + GUID1C + '}';
        }
...
	TestDS.Values('UID1C') = GUID1C;
	TestDS.Values('Object1C') = Select1C.Организация.Ссылка.Метаданные().ПолноеИмя();					
...
}
Показать все комментарии
FDatabaseLogCreatedByID
Технические вопросы
Разработка

Здравствуйте!
У нас иногда возникает ошибка сохранения записи в разделке контактов: "Ошибка сохранения записи. Конфликт инструкции INSERT с ограничение FOREIGNKEY FDatabaseLogCreatedByID. Таблица tbl_Contact, column 'ID'. Чтобы избавиться от ошибки пришлось удалить эту связь. Ошибка ушла, но воссоздать эту связь невозможно - происходит та же ошибка.

Нравится

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

Владимир, а можно указать версию Террасофта?
Судя по ошибке полю CreatedByID подсовывается ID несуществующего контакта.
А удаляли связь в таблице tbl_DatabaseLog? (вопрос потому что FDatabaseLogCreatedByID указывает на эту таблицу, а сейчас смотрю в 3.4.0 CRM, то в этой таблице у меня нет такой связи, и нужна ли она вообще?)

Здравствуйте Александр!
Версия 3.2.1.62. Судя по ошибке, да. Только как может получиться ID несуществующего контакта?

Владимир, а просматривали конфигурацию? Может, захардкодили чей-то идентификатор?
А что записывается после удаления связи?

Здравствуйте Максим! Ошибка периодическая. После удаления связи проблемная запись дважды претерпевала изменения: Первый раз под Supervisor (до удаления связи это вызывало ошибку), второй раз под пользователем технического центра. ID супервизора занесся правильно, вместо ID контакта второго пользователя - чужой ID, природу его определить не могу, по крайней мере не из tbl_AdminUnit. За время праздников у других пользователей ничего подобного не было.

Какую конфигурацию рекомендуете посмотреть? Запись в tbl_DatabaseLiog происходит без моего участия.

Есть подозрение, что изменилась структура объекта контакта уже после создания таблицы логирования и происходит смещение параметров в инсерте, из-за чего происходит конфликт внешнего ключа. Я бы перенастроил логирование, чтобы таблица _Log создалась заново.

Как это перенастроить? Структура контактов не менялась довольно давно, но однажды такое случилось и с другой таблицей. Если бы было смещение параметров, работать было бы невозможно.

Здравствуйте, Владимир!
В принципе, такого ключа нет в "коробочной" базе, поэтому можете его удалить и проблема решится.

Показать все комментарии
автоматическое заполнение
Скрипты
Разработка

Добрый день. Я меня в каждой карточке прописаны (а кое-где так и было в системе изначально) действия по автоматическому заполнению других полей при изменении связей. Это происходит для любого датасета ХХХ на событие OnDatasetDataChange в функциях SelfOnDatasetDataChange скрипта ds_ХХХScript. Все хорошо и правильно работает, скорость заполнения карточек возрастает в несколько раз.
Но есть проблема. Скрипт не отрабатывает, если создавать новые записи в деталях. Работает какой-то другой скрипт, который только заполняет одно поле, по которому деталь привязана к разделу. И все.
Те есть я например создаю Операцию из раздела Продажи, то поле Продажа будет заполнено автоматически, а другие поля, которые должны заполняться в этой связи (допустим Клиент, Воздействие) останутся пустыми. При этом как бы получается, что заполнение поля Продажа не есть в этом случае событие OnDatasetDataChange.

Какой скрипт работает при создании карточки в детали? Как после заполнения связи "заставить" систему считать это изменением Dataseta?

Нравится

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

Здравствутйе, Виктория!
Для деталей обычно используются другие датасеты, не те, что в разделах:

Думаю, все дело в этом.

Но такие дополнительные датасеты есть не для всех деталей. Кроме того, в них нет ничего, кроме только ID самой связи, это не полноценный набор данных. И скриптов к таким датасетам нет, хотя бы те, которые отвечают за заполнение этой одной связи в созданной карточке. Где происходит это заполнение?
При этом , например, заполнение значений по умолчанию работает корректно. И в создаваемых карточках эти поля заполнены верно.

"Тихенко Виктория" написал:Где происходит это заполнение?

В функции AppendRecord скрипта scr_BaseDBEditUtils заполняется ссылка на раздел (там, где BaseDBEdit.ParentItemID) и значения по умолчанию:

function AppendRecord(BaseDBEdit, Window) {
	var Dataset = BaseDBEdit.Dataset;
	var Attributes = Window.Attributes;
	var DoDisableEvents = !Attributes('DoNotDisableEvents');
	BaseDBEdit.RecordID = Connector.GenGUID();
	Dataset.DisableGettingDisplayValues();
	try {
	Dataset.Append();
	if (DoDisableEvents) {
		Dataset.DisableEvents();
	}
	try {
		Dataset.ValAsGUID('ID') = BaseDBEdit.RecordID;
		Window.Attributes('RecordID') = BaseDBEdit.RecordID;
		if ((!IsEmptyValue(BaseDBEdit.ParentItemID)) &&
			(!IsEmptyValue(BaseDBEdit.ParentItemFieldName))) {
			var DataField = Dataset.DataFields(BaseDBEdit.ParentItemFieldName);
			if (Assigned(DataField)) {
				DataField.Value = BaseDBEdit.ParentItemID;
			}
		}
		SetDefaultValues(BaseDBEdit);
		Window.Attributes('IsNewRecordAppend') = true;
	} finally {
		if (DoDisableEvents) {
			Dataset.EnableEvents();
		}
	}
	} finally {
		Dataset.EnableGettingDisplayValues();
	}
	if (!Attributes('DontSetWindowCaption')) {
		SetEditWindowCaption(BaseDBEdit, Window);
	}
}

Эта функция срабатывает при отытии любой карточки с новой записью.

Скрипт на изменение поля не отрабатывает, поскольку атрибут DoNotDisableEvents равен false, то есть в момент заполнения ссылки на раздел события специально отключены.

Чтобы их оставить включенными, надо в GridArea вашей детали сделать свой обработчик кнопки «Добавить» аналогично, например, wnd_ContractsDetailGridAreaScript. Примерно так:

function btnAddOnClick(Control) {
	var Attributes = GetNewDictionary();
	Attributes('DoNotDisableEvents') = true;
	AddGridAreaData(Self, Self, BaseGridArea, Attributes);
}

Если в большинстве случаев , в деталях идет ссылка на на специально созданное DetailGridArea для отражения связанных данных, а на основное (например сразу на wnd_OpportunitiesGridArea), то там тоже можно так прописать?
или это повлечет какие-то неприятные последствия в разделе (в данном случае в разделеOpportunity)?

Лучше добавить проверку.
Вроде такого, тут проверяется на деталь в конкретном разделе:

function btnAddOnClick(Control) {
	if (IsWindowProjectDetaill(Self)) {
		var Attributes = GetNewDictionary();
		Attributes('DoNotDisableEvents') = true;
		AddGridAreaData(Self, Self, BaseGridArea, Attributes);
	} else {
		scr_BaseGridArea.btnAddOnClick(Control);
	}
}
 
 
function IsWindowProjectDetail(Window) {
	try {
		var Result =
			Window.ParentContainer.ParentWindow.Name == 'wnd_ProjectWorkspace';
		return Result;
	} catch (E){
		return false;
	}
}

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

Виктория вопрос в своем обращение вы какую цель хотели достичь? В детали Операции Из раздела Продажи вы создаете операцию и желаете чтобы в Открытой карточке были заполнены по максимому Поля из Текущей записи Продажи. я правильно вас понял?

У меня целей много. И из Продажи создавать операции, инциденты, и еще кучу всего. И из других сущностей создавать Продажи. И т.д... Так что это лишь пример.
Мало того, в любой из этих ситуаций поля по разному заполняются на основании разной информации и связей. Все это прописано в карточках на изменении полей.
Цель - что бы эта же логика была в деталях.

Буду делать с проверкой , хотя вроде и без проверки ничего не поломалось.

Показать все комментарии
Технические вопросы
Разработка

При попытке открыть карточку редактирования некоторых объектов БД выпадает ошибка "Ошибка выполнения метода tmrClearIdleCallsOnTimer. Разрушительный сбой". С чем это может быть связано?
Версия 3.0.2.244

Нравится

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

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

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

1) Появляется ли ошибка при входе под Вашей учетной записью Terrasoft на другом компьютере?
2) Появляется ли ошибка при входе под другой учетной записью Terrasoft на Вашем компьютере?
3) Появляется ли ошибка под администратором Terrasoft?

Приятного дня!

Доброе утро.

Рекомендации на помогли.

1. Ошибка происходит под любой учетной записью на двух ноутбуках.
2. На моем компьютере под любой учетной записью ошибки нет.
3. Я являюсь администратором. На двух ноутбуках ошибка есть, на других компьютерах ошибки нет.

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

Пользуетесь Call-центром? Может на этих ноутбуках не установлен какой либо софт-фон вроде Oktell или Infinity? Т.к. ошибка в функции очистки Idle состояний для звонков.
Можете найти эту функцию (tmrClearIdleCallsOnTimer) в конфигурации, установить отладчик, и посмотреть на какой конкретно строке происходит ошибка.

"SSV" написал:1. Ошибка происходит под любой учетной записью на двух ноутбуках.

А какая там версия Windows? После переустановки ошибка не исчезла?

Также при помощи Grep Search (если у вас он уже есть) найдите, где конкретно встречается код «tmrClearIdleCallsOnTimer». Это может помочь понять.

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

Версия Win7 на обоих ноутбуках. Переустановка, если речь идет о Террасофт, не помогла. Переустановку ОС мы посчитали слишком радикальной мерой.
wnd_GrepSearchScript у себя в сервисах не нашел.

Версия 3.0.2.244.

Попробуйте активировать отладчик в реестре + установить MS Script Debugger. Должен сработать отладчик в момент сбоя.

Пробовали включать отладчик на одном из этих ноутов, но он не запускается.

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

Попробуйте установить на ноутбук последнюю актуальную версию MS Script Debugger

Может, таки проще переставить Windows?

Именно MS Script Debugger и был установлен.
Переставлять ОС не будем.

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

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

Приятного дня!

Показать все комментарии
Бизнес-процессы
Разработка

Как получить WorkflowItemID из ScriptItem в скрипте БП? Это нужно, чтобы в конечном итоге добраться до id сервиса БП.

Нравится

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

Здравствуйте, Андрей!
До диаграммы процесса можно добраться так:

var pd = ScriptItem.ParentItems.ParentDiagram;
var pdID = pd.ID; // ID сервиса
Показать все комментарии
Spelling
Спелер
Технические вопросы
Разработка

Moжет кому посчатливилость решать задачу по проверке текста на коректность, т.е спеллинг?
Это на Террасофт 3.4

Нравится

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

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

Решалась задача перевода при помощи Yandex API:

function TranslateWithYandex(Word, SourceLang, DestLang) {
	if (IsEmptyValue(SourceLang)) {
		SourceLang = 'ru';
	};
	if (IsEmptyValue(DestLang)) {
		DestLang = 'en';
	};
	var URL = 
		FormatStr('http://translate.yandex.net/api/v1/tr/translate?lang=%1-%2&text=%3',
			SourceLang, DestLang, Word);
	var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
	xmlHttpReq.open('GET', URL, false);         
	xmlHttpReq.setRequestHeader('Cache-Control',
		'max-age=0');
	xmlHttpReq.setRequestHeader('Accept',
		'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
	xmlHttpReq.setRequestHeader('Accept-Encoding',
		'gzip,deflate,sdch');
	xmlHttpReq.setRequestHeader('Accept-Language',
		'ru,en-US;q=0.8,en;q=0.6,uk;q=0.4');
	xmlHttpReq.setRequestHeader('Accept-Charset',
		'windows-1251,utf-8;q=0.7,*;q=0.3');
	xmlHttpReq.setRequestHeader('User-Agent',
		'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31');
 
	xmlHttpReq.send();
	var TranslatedValue =      
		xmlHttpReq.responseXML.getElementsByTagName('text')[0].nodeTypedValue;
	return TranslatedValue;
 
}

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

Большое спасибо. Это вариант. Сделаю пробу. Только мне кажется что это спеллер будет работат хорошо с ru, en, de, fr, а другим языками может словарник имеет ограничение.

Добрый день Альберт!!!

поделитесь опытом после внедрение предложенного примера, с какими подводными камнями столкнулись при реализации? какие новшества добавили от себя. Поделитесь опытом пожалуйста. Спасибо!!!

Да, только сейчас тот проект( который вызвал такую потребность) стоить на этапе "клиент оценивает". Так как клиент почти год готовил требование то этот этап навернека не будеть короток.

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