Отчёты
Разработка

Можно ли перехватить факт печати отчета. Я обработал событие miPrintOnExecute, но там есть возможность отказаться от печати. Как проверить этот факт?

Нравится

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

Вы говорите об окне просмотра wnd_BaseFastReportPreview? Что мешает Вам дописать нужный функционал в обработчик miPrintOnExecute? Таким образом Вы перехватите печать, точнее выполните свои действия прямо перед ней. Можно и отменить, выйдя из функции. Стоит учитывать также, что это базовое окно, менять его нужно осторожно.

В wnd_BaseFastReportPreview я не вмешиваюсь, создал дочернюю форму на ее базе и прописал нужный функкционал в событие. Вопрос не в отмене печати, а в фиксации ее факта. Прописанный функционал выполняется даже при отказе от печати. В скрипте прописана функция frpMain.Print, но ее код я так и не нашел.

frpMain.Print - это функция печати самого FasteReport, она не прописана в конфиграции. При отмене Вы нажимаете на кнопку в диалоге печати, но обратной связи в Террасофт FastReport не дает.

Показать все комментарии
1с импорт
Интеграция и импорт данных
Разработка

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

Подскажите как лучше реализовать выбор по типу адреса при импорте контрагентов из 1С? В 1С адреса хранятся в различных полях (физ адрес или юр адрес), в ТС поле Адрес одно, но есть поле типа адреса. Используется утилита интеграции с 1С из каталога расширений.

Нравится

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

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

Ответ несколько не о том, что я спрашивал, но тоже актуален )

Можно подробнее о рекомендованной процедуре импорта?
1. Импортируем контрагентов
2. Импортируем юр. лица/физ. лица в платежные реквизити контрагентов, вставля в скрипт проверку на соответсвие контрагента TS<>1C (без скрипта мне не удалось это сделать, делал подчиненную интеграцию, родительское пол TS - Контрагент, в и тоге в платжные реквизиты каждого контрагента влетают все юрлица из 1с).

Я правильно рассуждаю?

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

А каким образом в подчиненной синхронизации можно получить данные вышестоящей? Это реально?

Кстати, если поставить поле родителя 1с равным "UUID", то схема работает и в платежные реквизиты (подчиненноая синхронизация) попадают данные соответсвующих юрлиц, а не все сразу.

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

Ну, на данный момент новых граблей не нашел ) Контрагенты и их юр.лица импортируются, работает без единого скрипта. Дальнейшая настройка, дмаю потребует вмешательства, но это по ходу пьесы.

Показать все комментарии
Blob
Image
stream
буфер обмена
изображение
Технические вопросы
Разработка

Здравствуйте, уважаемые коллеги!

Столкнулся с ситуацией: требуется вставить в ImageDataСontrol на карточке картинку из буфера обмена. Не важно, напрямую или через временный файл. Я испытал три различных способа, но все три - безуспешно:

http://community.terrasoft.ua/blogs/6286

Подскажите, пожалуйста, где я ошибся; возможно, кто-то уже решил подобную задачу. Версия 3.2.1.58

Нравится

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

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

edtScreenShot.DataField = System.EmptyValue;
edtScreenShot.DataField = Dataset.DataFields('ScreenShot');

Идея интересная, только, конечно, не датафилд обратить в Null, а просто поле отключить-подключить. Вот так:

edtScreenShot.DataFieldName = '';
edtScreenShot.DataFieldName = 'ScreenShot';

Но толку никакого. Мне кажется, что картинка не отрисовывается не из-за отсутствия данных, а именно из-за того, что двоичный Stream не содержит правильного заголовка картинки. Контрол просто не знает, что от него ожидают. Сунули, мол, каких-то каракатиц, а к чему они - неизвестно.

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

Показать все комментарии
Интеграция и импорт данных
Разработка

Импортируем данные из 1с из Платежных поручений в ресурсы для того чтобы правильно перенести поле статьи делаем скрипт
//-----------------------------------------------------------------------------
// Платежки вход (scr_1CConf_5D504782442D4D93AD4DA9889B812058)
// ({5D504782-442D-4D93-AD4D-A9889B812058})
//-----------------------------------------------------------------------------

function OnBeforeImport(Param, Dataset, Query) {
//
}

//Если функция вернет значение true то "Post" не произойдет
function OnBeforeRecordImport(Param, Dataset, Select1C) {
//
var number = Param.Obj1C.XMLString(Select1C.СтатьяДвиженияДенежныхСредств);
Dataset.DataFields('ClauseID').value = GetDatasetFieldValueFromDatasetByUSI('ds_CashflowClause','Name',number,'ID');
return false;
ShowInformationDialog(number);
}

function OnAfterRecordImport(Param, Dataset, Select1C) {
//

}

function OnAfterImport(Param, Dataset, Select1C) {
//
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

function OnBeforeExport(Param, Dataset) {
//
}

function OnBeforeRecordExport(Param, Dataset, Select1C) {
//
}

function OnAfterRecordExport(Param, Dataset, Select1C) {
//
}

function OnAfterExport(Param, Dataset, Select1C) {
//
}

получаем ошибку в строке
var Result = ScriptItem.ScriptControl.Run(FunctionName, Param, Dataset, Select1C);

Функции
function SafeExecScriptFunction(ScriptItem, FunctionName, Param, Dataset, Select1C) {
if (!Assigned(ScriptItem) || IsEmptyValue(FunctionName)) {
return;
}
var Result = ScriptItem.ScriptControl.Run(FunctionName, Param, Dataset, Select1C);
return Result;
}

модуля

//-----------------------------------------------------------------------------
// scr_Dataflow1CUtils
//-----------------------------------------------------------------------------

FunctionName содержит "OnBeforeImport"

Нравится

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

Укажите пожалуйста версию 1-С и версию Terrasoft.
Загружали ли Вы обновления из каталого расширений?

terrasoft XRM версия октябрь 2010 3...42
1с 8.1 Бух. Предприятия 1.6 Проф.
Обновлений не загружали.
Если удалить скрипт импорт проходит нормально... Но не импортируется данное поле. т.к. в 1с оно перечислением а в терасофте справочником.

Откройте свой скрипт scr_1CConf_5D504782442D4D93AD4DA9889B812058
И слева, на панели подключенных скриптов, удалите скрипт scr_Dataflow1СUtils и заново добавьте его.

Чтоб данная ситуация не повторялась, отредактируйте также скрипт "scr_Dataflow1CConsts"
строку (16)

var Script1CConfIncludedScripts = new Array('scr_Dataflow1CUtils');

Буква "С" в слове scr_Dataflow1CUtils должна быть английская...

"Кривонос Максим" написал:Откройте свой скрипт scr_1CConf_5D504782442D4D93AD4DA9889B812058
И слева, на панели подключенных скриптов, удалите скрипт scr_Dataflow1СUtils и заново добавьте его.

Чтоб данная ситуация не повторялась, отредактируйте также скрипт "scr_Dataflow1CConsts"
строку (16)


Это уже исправлено сразу.
Скрипт поправлю спасибо.
Но это не помогает.

Какая именно ошибка возникает? Возможно скриншот поможет лучше понять проблему.

P.S.

function OnBeforeRecordImport(Param, Dataset, Select1C) {
var number = Param.Obj1C.XMLString(Select1C.СтатьяДвиженияДенежныхСредств);
Dataset.DataFields('ClauseID').value = GetDatasetFieldValueFromDatasetByUSI('ds_CashflowClause','Name',number,'ID');
return false;
ShowInformationDialog(number);
}

строка - ShowInformationDialog(number) никогда не выполнится.

Приложение закрывается сразу не выводя ошибок если отключить отладку.

"Кривонос Максим" написал:строка - ShowInformationDialog(number) никогда не выполнится.

Ошибка понятна, но до выполнения function OnBeforeRecordImport не доходит.
всё падает ещё при попытке вызвать function OnBeforeImport. о чем я писал в первом посте.

Выяснилась 1 интересная особенность.
База 1с 8.1 файловый доступ.
Если путь до базы указан локальный то возникает ошибка о которой я писал.
Если путь до базы указан сетевой то всё отлично ошибка не возникает.
Пользователь имеет администраторские права в windows.

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

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

Нравится

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

SSV, если мы говорим о версии выше 3.0.4 - напрямую обойти права нельзя, это контролирует СУБД. Но можно написать хранимку/представление, которая будет скрывать логику работы и "обходить" права на колонки и таблицы

Версия 3.0.2.244.

именно так я и поступил.

Данные рекомендации помогли? Требуется ли еще какая-либо помощь?

ну, вобщем-то я знал об этом способе, думал может как-то можно без ХП обойтись...

Версии до 3.0.4 включительно не требуют ХП для обхода прав.

"Осауленко Александр" написал:Версии до 3.0.4 включительно не требуют ХП для обхода прав.

т.е. можно вместо вызова ХП вставить update-запрос?

"SSV" написал:т.е. можно вместо вызова ХП вставить update-запрос?

да

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

Как при закрытии прибить окно? Или как сбросить фильтр, который был установлен в гриде, и который не нужен при открытии другой записи реестра?

Нравится

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

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

Как Вы вызываете окно? Все указывает на то, что окно кешируется и вновь отображает значение фильтра, хоть и не применяет его. Если через GetSingleItemByCode, то замените получение окна на System.GetNewItemByUSI('wnd_*') - так оно будет заново создаваться, а не получаться из кеша.

Окно создается по нажатию на кнопки Добавить/Изменить окна-потомка wnd_BaseGridArea. Т.е. получается, что в конце концов вызывается именно GetNewItemByUSI из scr_WindowUtils.

а функция WinCache_Get из скрипта scr_WindowUtils - это не она ли кэширует окно? и кэширует она получается по-умолчанию, ибо ShowEditWindowEx принимает параметр UseCache, который из scr_BaseGridAreaUtilsне передается и в этом случае окно кэшируется. Как передать этот параметр? Или только редактировать scr_BaseGridAreaUtils?

Именно об этом я и говорил. По умолчанию окна кешируются. Вы правильно нашли, где именно они берутся из кеша.
Обходной вариант - создать собственное окно выбора, унаследованное от wnd_SelectData и при его создании использовать Services.GetNewItemByUSI.
Данный подход реализован, в частности, и в базовом функционале. Например, раздел [Запросы] вызывает собственное окно выбора wnd_SelectReportTable, это происходит по нажатию на кнопку "Добавить", а точнее - в функции scr_QueryUtils.ShowTableSelectWindow()

неееет, только не это, создавать по-новой уже работающие окна желания совсем нет...

В таком случае нужно аккуратно изменить базовый вызов. Например, так:
В функцию ShowEditWindowEx передавать еще один параметр, в котором будет false. Но передавать придется из scr_BaseGridAreaUtils.AddGridAreaData(), поэтому напрямую писать false не стоит. Предлагаю передавать в качестве еще одного параметра значение BaseGridArea.WindowUseCache, которое на данный момент не определено. Заполнять же его из своего скрипта на обработчике кнопки "Добавить" BaseGridArea.WindowUseCache = false (доступ к BaseGridArea будет, так как Ваше окно унаследовано). Таким образом с одной кнопки "Добавить" вызов в результате произойдет без использования кеша, а в остальных случаях будет использовано неопределенное значение, которое и так имеет параметр UseCache в функции ShowEditWindowEx.

спасибо, Виталий, что-то подобное я уже сделал...

Показать все комментарии
msoutlook
макрос шаблон email
Интеграция и импорт данных
Разработка

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

В версии TS CRM 3.0.2.245 (под Firebird) при создании шаблона e-mail сообщения, есть возможность использовать только четыре системных макроса CurrentContact, CurrentUser, Quotes, SysDate.

Есть ли возможность добавить к ним другие макросы, как в более поздних версиях системы. Например: Контакт.Обращение, Контакт.Должность и т.д.

Либо может есть другой вариант решения вопроса создания шаблонов?

(Переход на текущую версию на данный момент просьба не предлагать)

Нравится

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

1. Объект MailUtils, который отсылает письма (см. scr_MailUtils) имеет свойство MacrosEngine (TSObjectLibrary.MacrosEngine) - см. scr_MailUtils
2. Этот объект обрабатывает 3 стандартных макроса
#SysDate#'
#CurrentUser#
#CurrentContact#
3. Кроме того, объект имеет свойства Dataset: IDataset и DatasetAlias: WideString
когда MacrosEngine имеет эти свойства - при парсинге макросов он заменяет макросы типа #Контакты.Имя# на текущее значение датасета.
Причем DatasetAlias должен был равен "Контакты" и заголовок датасета должен быть "Контакты". "Имя" - это заголовок нужного поля.
Вся эта схема реализована в модуле рассылки - там используется датасет ds_ContactCommunicationInMassMail.
Поэтому для добавления макросов, например при рассылке, нужно:

1. Датасету ds_ContactCommunicationInMassMail дать заголовок "Контакты".
2. Добавить в него нужное поле.
3. Создать шаблон в который вставить маросы #Контакты.Заголовок поля#

Прим.
Outlook иногда коверкает текст письма, заменяя символы на что-то вроде #8080#8811#8214#8120 - это невозможно отследить - так что нужно внимательно создавать шаблоны, чтобы макросы могли быть прочитаны системой.

Описанная функциональность будет работать только в разделе рассылка. Обращение к полям реализуется через заголовок поля, а не код.
Для реализации требуемой функциональности в остальных разделах необходимо изменить свойства (1, 2) объекта MacrosEngine (scr_MailUtils) - свойство объекта MailUtils.

1) Dataset (по умолчанию используется ds_contactCommunicationInMassMail )
2) DatasetAlias :WideString (в нашем случае нужно установить "Контакты")

Показать все комментарии
Установка и Администрирование
Разработка

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

Нравится

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

Здравствуйте.
В стандартной конфигурации в web-форме поле "Ответственный" не вынесено, а его занчение может быть изменено через интерфейс Террасофт. При создании обращения через web-форму в это поле подставляется тот пользователь, кто прописан в конфигурационном файле web.config. Для изменения логики работы web-формы потребуется доработка конфигурации.
Terrasoft Support Team.

А как вообще предполагается делать?Пользователи создает инцидент через веб-интерфейс, а затем слуюба поддержки распредеят все эти инциденты по нужным owner-ом и сервис-инженерам?Еще такой вопрос-как в веб-форме разрешить web-пользователю ставить отзыв о законченном инциденте?В руководсстве написано, что можно разрешить но как?К сожалению я так и не смог найти руководство администратора для service desk.могли бы вы прислать?Спасибо...
Или как?
И еще если заказать доработку, то это будет что то стоить?Спасибо...

Здравствуйте.
Именно так. Пользователь создаёт обращение на web-форме, а потом оно редактируется через интерфейс Террасофт. Возможность оценки обращения на web-форме появляется, когда инцидент переводится в состояние, которое указано в с системной настройке с кодом "MarkReadyIncidentStatus" (во вложении скриншот). Руководство я отправлю Вам письмом. Что касается финансовых вопросов, то Вам нужно обратиться к менеджеру, который ответственный по Вашей компании.
Terrasoft Support Team.

Показать все комментарии
отчет word картинка
Отчёты
Разработка

Добрый день. Нужна помощь.
Нужно вывести в отчете (Word) изображение. Изображение хранится в БД в виде бинарного поля (файл jpg). В запросе данный тип поля не поддерживается. Возможно что то делаю не так. Подскажите решение, плз.
Спасибо.

Нравится

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

Пользовательские отчеты не позволяют выводить значение поля BLOB, т.к. нельзя это поле вытянуть в запрос.
Для решения необходимой Вам задачи выкладываю файл.

Спасибо. Статья помогла. Задача решена! =)

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

На одном компьютере стоят две разные версии 3.0 и 3.2, при попытке войти в версию 3.2 под супервизором выдает ошибку открытия конфигурации "Could not find stored procedure 'dbo.tsp_GetLoginInfo'". Раньше такой проблемы не было. Что могло произойти?

Нравится

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