Добрый день.



В последнее время создание документов(кнопка New Document в разделе Documents) в половине случаев успешно открывает страницу создания нового документа, и в другой половине случаев виснет на кольце загрузки и выдаёт в консоли ошибку

 

Module SectionModuleV2_DocumentSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000 cannot be rendered to container centerPanel as the chain is already used in container undefined. Module SectionModuleV2_DocumentSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000 will be rendered to container undefined

Как подобное чинить ? Куда копать ?

Нравится

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

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



Ошибка говорит о том, что страница не может быть загружена из-за отсутствия одного из элементов.

Рекомендую проверить привязки страниц редактирования к разделу, а именно что в таблице SysModuleEdit указана существующая страница редактирования записи. Для проверки связей поможет статья.

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

Добрый день.

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

Если ли возможность добавить поля для вложения документов в объект?
Если нет, то как это можно сделать?

Нравится

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

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

Предположим речь идет о продаже (объект Продажа) и 3 документах в продаже (объект Файл и ссылка продажи). Наличие документов получится определить только по названию вложенных файлов.
Подход к решению:
1. Читать данные в “Продажа”, где Id = Id целевой продажи
2. Читать кол-во записей в “Файл и ссылка продажи”, где (Продажа = Пункт 1. Id) && (Название содержит “Первый документ” || Название содержит “Второй документ”…)
От пункт 2 условный поток: Пункт 2. Кол-во записей = 3. В таком случае изменить стадию продажи.

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

Необходимо заполнять в Word документах поля с чек-боксами (прикрепил скриншот), возможно ли настроить эти поля в CRM и потом ответы на них экспортировать в файл вордовский (при формировании документов)?

Нравится

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

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

Вы создали тему в разделе "Terrasoft CRM 2.8".

Прошу уточнить, Вы не ошиблись или речь идет о другом продукте (Terrasoft 3.X, BPMonline)?

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

Добрый день!
В карточке документов было создано поле "Вендор", которое подтягивает контрагентов с типом "Вендор". Т.е. получилось 2 поля с контрагентами Контрагенты(стандартное) и Вендор.
В разделе "Контрагенты" -> деталь "Документы". В стандартном функционале данные о документах подтягиваются у тех контрагентов, которые были указаны в карточке документов в поле "Контрагенты". Нужно реализовать точно такой же функционал(что бы подтягивалась информация о документах) и для тех контрагентов, что были указаны в поле "Вендор"(карточка документов) на этой же детали "Документы".
Подскажите как это можно сделать?
Заранее спасибо!!

Нравится

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

в sq_Document создайте новы набор фильтров с логическим оператором OR:

в нем создайте два фильтра сравнения:
tbl_Document.AccountID = AccountID2 (parameter) с названием AccountID2 (главное чтобы не AccountID, т.к. такой уже существует)
tbl_Document.VendorID = VendorID (parameter) с названием VendorID

и соответствующие параметры
сделайте активным оба или только VendorID - главное не сам набор.

в scr_AccountsWorkspace
найдите место

/* MODULE DOCUMENTS */
	if (pcDetails.ActivePage.Name == pgDocumentsDetail.Name) {

и после него поменяйте второй AccountID на AccountID2
должно получиться:

/* MODULE DOCUMENTS */
	if (pcDetails.ActivePage.Name == pgDocumentsDetail.Name) {
		RefreshCommonDetail(BaseWorkspace, wndDocumentsDetail, 
			'AccountID', 'AccountID2');
	} else
/* ENDMODULE DOCUMENTS */

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

Добрый день Николай!!!

для решения вашего вопроса вам требуется сделать следующее:

1. в скрипте wnd_DocumentsGridArea, в DataGrid "grdData" добавить новый "DataGridView". к примеру назвать его "gvDocumentsVendor". Определить поля. На закладке Свойства, установить курсор FilterSetCode и присвоить Имя к примеру "DocumentsVendor"
2. открыть запрос sq_Document и добавить "Compare Filter" c именем "DocumentsVendor" и условием к примеру  tbl_Document.VendorID = :VendorID
3. в скрипте scr_AccountsWorkspace добавить следующий код

изменить функцию RefreshDetails() и добавить следующий код:

function RefreshDetails() {
        ...
/* MODULE DOCUMENTS */
	if (pcDetails.ActivePage.Name == pgDocumentsDetail.Name) {
		SetAttribute(wndDocumentsDetail.Window, 'ParentDataset', BaseWorkspace.GridDataset);  
		SetAttribute(wndDocumentsDetail.Window, 'ParentItemID', BaseWorkspace.GridDataset.ValAsStr('ID'));
		RefreshCommonDetail(BaseWorkspace, wndDocumentsDetail, 
			'AccountID', 'AccountID');
	} else
/* ENDMODULE DOCUMENTS */
        ...

4. в скрипте scr_DocumentsGridArea добавить следующий код

в самом начале скрипта

var DocumentsGridArea = new Object();

изменить функцию Initialize(Window) и добавить в начало функции следующий код:

function Initialize(Window) {
      DocumentsGridArea.ParentItemID = GetAttribute(Window, 'ParentItemID');
      ...
}

изменить функцию dlDataOnDatasetBeforeOpen(Dataset, DoOpen) и добавить следующий код:

function dlDataOnDatasetBeforeOpen(Dataset, DoOpen) {
      ...
      if (grdData.ActiveView.Name == gvDocumentsVendor.Name) {
            Dataset.Close();
            ApplyDatasetFilter(Dataset, 'DocumentsVendor', DocumentsGridArea.ParentItemID, true);
            Dataset.Open();
      } else {
            EnableDatasetFilters(Dataset, false, 'DocumentsVendor');
      }
 
      if (grdData.ActiveView.Name == dgvData.Name) {
            Dataset.Close();
            ApplyDatasetFilter(Dataset, 'AccountID', DocumentsGridArea.ParentItemID, true);
            Dataset.Open();
      } else {
            EnableDatasetFilters(Dataset, false, 'AccountID');
      }
      ...
}

вот и все и ваша задача будет решена.

Добрый день
Первое решение не дало результатов, контрагенты подтягиваются, а те кто стоят в вендорах нет.
Второе решение выдаёт ошибку что стек переполнен. Debugger прошёл, не входит в
if (grdData.ActiveView.Name == gvDocumentsVendor.Name) {
Может я что не так сделал в wnd_DocumentsGridArea. скрин прилагаю

"Арефьев Николай Николаевич" написал:Первое решение не дало результатов

действительно)
надо было tbl_Document.VendorID = AccountID :redface:

"Андросов Дмитрий" написал:
Арефьев Николай Николаевич пишет:

Первое решение не дало результатов

действительно)

надо было tbl_Document.VendorID = AccountID :redface:

Поменял, всё равно ничего.... скрин в аттаче

блин, простите :exclaim:
tbl_Document.VendorID = AccountID2

"Андросов Дмитрий" написал:

блин, простите :exclaim:

tbl_Document.VendorID = AccountID2

Огромное спасибо!!!) Получилось!)

Только теперь не показывает документы у контрагентов(((

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

"Андросов Дмитрий" написал:

не совсем понятно, я проверил у себя - все работает.

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


Всё) понял в чём проблема была, надо было везде AccountID2 выставить как параметр!) Всё ещё раз спасибо!)

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

Добрый день !

Наблюдаю следующую картину:

При входе в документы и генерации счетов на период, первые счета генерируются нормально.
Затем же..рандомно, можно после 100 счета, может раньше,может после 400-го SQL забирает себе почти всю оперативную память и вылетает дебаггер.

В чем может быть дело, куда смотреть ?

И кто смог бы проверить всю конфигурацию ? Это вопрос к местным форумчанам или конкретно к разрабам, что под нас дописывали функционал ?

Нравится

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

"Шамбрай Иван" написал:
Затем же..рандомно, можно после 100 счета, может раньше,может после 400-го SQL забирает себе почти всю оперативную память и вылетает дебаггер.

В чем может быть дело, куда смотреть ?


Смотреть надо в дебаггер. На то он и существует.
"Шамбрай Иван" написал:
И кто смог бы проверить всю конфигурацию ? Это вопрос к местным форумчанам или конкретно к разрабам, что под нас дописывали функционал ?

Что понимается под проверить всю конфигурацию?
А чтоб дописывали конкретно под вас, то это уж как повезет: можно к разрабам (но не знаю занимаются ли они этим), можно найти фирму партнера террасофта и обратится к ней, может кто-то из форумчан заинтересуется и предложит вам свои услуги в качестве фрилансера.

"Шамбрай Иван" написал:SQL забирает себе почти всю оперативную память и вылетает дебаггер

а я вот не понял... у вас сервер SQL стоит на том же ПК, где вы печатаете отчеты и он забивает память при генерации отчета? интересно, что у вас за СУБД такая

Всем привет. SQL-сервер установлен там же, где и Террасофт, на том же сервере.

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

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

Здравствуйте, Иван!
Попробуйте провести отладку самостоятельно до появления ошибки, пока это возможно, чтобы понять в каком месте ошибка.
Или предоставьте дамп базы, чтобы мы провели отладку у себя.

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

Господа!
Вопрос по резервам Продуктов на Cкладе:

  1. Кто как организует: А) хранение в таблицах, Б) просмотр доступных товаров и В) контроль резервирования продуктов?

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

    В голове плавают способа четыре реализации, но у каждого свои минусы. — но, повторюсь, кто что посоветует?

  2. Кстати, а кто знает, что и как используют наши коллеги в различных WMS (Warehouse management system)?

P.P.S. Вопрос безотносительный к версии продукта, но конкретно интересует XRM или XRM Distribution
P.P.P.S. Есть, кстати, у клиента и несколько критериев использования, чуть позже попробую адаптировать для форума и кинуть.

Нравится

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

Добрый день, Глеб.

В TS_XRM резервов нет. Но они реализованы в базовой версии TS_XRM_Disctribution.
Реализована служебная табличка tbl_ReservedOffering, в которой хранятся идентификаторы зарезервированного продукта, количество и прочая необходимая информация.
Отследить резерв можно в композитной детали Продукт_в_Счете (версия 3.4.1+) или выводя в реестр раздела продуктов колонку Зарезервировано.
Также, есть системная настройка "Период резервирования продукта", в которой указывается количество дней, после которых резерв снимается.

"Maxim Gritsenko" написал:

В TS_XRM резервов нет. Но они реализованы в базовой версии TS_XRM_Disctribution.

Реализована служебная табличка tbl_ReservedOffering, в которой хранятся идентификаторы зарезервированного продукта, количество и прочая необходимая информация.

Отследить резерв можно в композитной детали Продукт_в_Счете (версия 3.4.1+) или выводя в реестр раздела продуктов колонку Зарезервировано.

Да, Максим, сталкивался в версиях 3.3.х с данной конфигурацией от IT-СФЕРА, но кажется, по складу был ряд несовершенностей.

Поясните, если не трудно, а как поведет себя данная система (XRM Distribution)
в следующих кейсах:

1) Уменьшение перечня/кол-ва товара:
1. Продукт "А" в Документе, 10 шт.
2. Резервируем. (Резерв "А" = 10 шт.)
3. Продукт "А" в Документе, уменьшаем до 9 шт.
4. Резервируем.
ВОПРОС: Резерв "А" будет "10 шт." или "9 шт."?

2) Дробление резерва
1. Продукт "Б" в Документе, 10 ед.
2. Резервируем. (Резерв "Б" = 10 ед.)
3. Продукт "Б" в Документе, увеличиваем до 12 ед.
4. Резервируем.
ВОПРОС: Резерв "Б" будет из двух записей (=10 ед. и =2 ед.) или одной (= 12 ед.)?

Кстати, коллеги из ИТ-Сферы, тоже подключайтесь к обсуждению! :wink:

Глеб, доброе утро.

Вертикаль XRM Distribution разработана компанией Terrasoft ;)

Вопрос 1: Резерв будет уменьшен на единицу при уменьшении количества продукта в счете/договоре/продукте (не документе).

Вопрос 2: Резерв будет из двух записей.

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

От пользователя поступило следующее обращение:

Цитата:
Можно ли сделать так, чтобы в объекте «Документы» все документы которые просрочены подсвечивались иным цветом, или выделялись жирным шрифтом?

Для реализации данной задачи необходимо внесение доработок в конфигурацию.

Рассмотрим доработку на примере коробочной конфигурации:

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

Откройте Terrasoft Administrator (Пуск - Программы - Terrasoft) и найдите сервис wnd_DocumentsGridArea:

111

Выберите компонент grdData, и установите его свойство HasCustomDraw равным true:

111

Затем перейдите в События для данного компонента, и создайте обработчик события OnGetRowDrawInfo двойным кликом в поле напротив нужного события:

111

После создания события Вы автоматически перейдете в скрипт (для версий 3.3.2 и новее). добавьте в скрипт программный код обработки события:

        var GridDataset = DataGrid.DatasetLink.Dataset;
        var IsOverdue = GetDateDiff(DataGrid.DatasetLink.Dataset('Date'), new Date(), 'Day') > 0;
        var dsClosed = '{670FDB86-A5EB-4AC0-9CCF-E303C5A8016E}'; //состояние Утвержден
        if((GridDataset('StateID') != dsClosed)&& IsOverdue){
                Color.Value = clPink;
                Font.Bold = true;
        }

111

Сохраните скрипт. Сохраните карточку. Перезапустите Terrasoft.

Совет: Полный список констант цвета есть в скрипте scr_Consts. Вы можете также задать собственный цвет в формате 0xE6CCB7

Нравится

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

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

Нравится

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

Возможно, настроены права доступа к полям, либо данным полям, в карточке редактирования, признак IsEnabled установлен как false, либо в датасете ds_Document для указанных полей установлена галочка "только для чтения". Возможен вариант некорректного выполнения доработки.

Нет права все установлены как True, а в датасете ds_Document галочки только для чтения сняты

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

Все поля были добавлены через администратора и проблемные и не проблемные

Как бы боюсь, что не видя воочию все эти доработки сказать в чем проблема сложно:smile:
как минимум скрин карточки и какие поля "неправильно" неактивны в студию

Вот так выглядет поле документа

боюсь что вам первым делом к автору доработок:wink:
либо в TSAdmin разбираться в коде scr_DocumentEdit, scr_Document, датасете ds_Document (проверям галку Только для чтения для полей).
Ну и права доступа на поля в разделе проверить можно.

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

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

Появился вопрос:
Когда я удаляю созданный документ в разделе Документы, то файлы прикрепленные к нему на детали Файлы (файлы сохранены в базу данных) остаются в базе данных. Т.е. чтобы не оставлять этот мусор в базе мне приходиться перед удалением документа вручную удалить прикрепленные файлы.
Как сделать чтобы при удалении документа связанные с ним файлы (сохраненные в базу данных) удалялись автоматически ?
---------------
TS CRM 3.3.1.72
MSSQL 2005

Нравится

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

Наверное придется в обработчик клика кнопки "удалить" писать код для удаления файлов.
Или на вкладке деталей сначала поудалять файлы а потом удалить документ.
Можно еще каскадное удаление сделать для таблицы документ

Только что проверил на 3.3.1 SoftKey - действительно, есть такая проблема. Если удалить "Документ", то триггер (для каскадного удаления) удаляет только линк из таблицы tbl_FileInDocument, а вот сам файл остается в таблице tbl_Files (мусор). Но, если удалить файл из детали "Файлы", тогда он удаляет за собой (опять триггер) из tbl_Files.
Вот здесь бы и пригодилась идея Алексея: http://community.terrasoft.ua/ideas/2789 очень жаль, что отложили :cry:

--
www.it-sfera.com.ua

И все же вернемся к вопросу: каков на данный момент наиболее быстрый и простой способ решения данной ситуации ?

К датасету ds_Document надо добавить обработчик события OnAfterDelete, в котором удалять те файлы из tbl_Files, на которые есть ссылки в tbl_FileInDocument, то есть:
- tbl_FileInDocument.DocumentID = ID удаленного документа
- tbl_FileInDocument.FileID = ссылки на tbl_Files

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

--------------------------------------------
Лабитек
Центр разработки приложений

Спасибо будем посмотреть.

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

      При работе с системой возникла необходимость следующей доработки конфигурации:
При работе с клиентами на основании договора выписываются счета. Большинство из них стандартные и отличаются разве что датой ну и естественно контрагентом, продуктом и тд. Вся необходимая информация заложена в договоре, карточке контрагента, продукте к договору, всё стандартно. Хотелось бы реализовать механизм, когда при выборе соотвествующего действия в разделе договора, на основании всех договоров (естественно отобранных фильтрами по тех или иных критериях) осуществлялось создание счетов. Поля, которые следует изменять (дата, период оплаты и др.) можно вывести в отдельном окне и уже используя ети данные плюс значения из других полей формировать счета.
      Получиться создание грубо говоря по "одному клику", что в свою очередь каждый раз будет сохранять время сотрудников (самое важное!), при правильной реализации исключит возникновение бесконечных поисков "кому же я забыл выставить счет" и тд. Такая схема применительна и в других случаях, например, в разделе Документы, когда выписываются акты на те же счета. 
      Думаю те, кто сталкивался с подобными медитациями в террасофте ("не трогайте меня - я счета выписываю"))) поддержат/дополнят/исправят меня или посоветуют другой механизм реализаци...
      Вот такая идея, вернее сказать необходимость в моей ситуации:-)
      Дискуссия неизбежна!

Нравится

Поделиться

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

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

"Fishi" написал:Дискуссия неизбежна!

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

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

TS X25 3.1.1.26. При выборе нескольких контактов и действии "Создать задачи" соответствующее количество раз открывается карточка редактирования задачи. Я же говорил об открытии карточки один раз и копировании полей в последующие. В данном случае действие для меня совсем не понятное, потому что вместо економии времени на вбивание полей в задачах, економится время разве что на выбор действия "Создать задачу" :confused: Возможно, в дальнейшых
"Агутин Алексей" написал:Также похожие действия неоднократно разрабатывались в различных конфигурация.

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

В Вашем случаем обычно применяется следующая схема:
1) В раздел Договора добавляется пункт меню "Создать счет".
2) В обработчике события этого пункта меню вызывается окно редактирования Счета с предварительным заполнением полей. Состав и содержание полей для заполнения определяется Вами.
Как добавить пункт меню и показать окно редактирования можно прочитать в
FAQ

Добрый день.
Мы эту проблему решили не много по другому.
Создали Бизнес процесс, который запускается автоматически по одному на каждый счет. (В wa_InvoiceAction добавили параметров, что бы потом клонировать был удобно.) В БП действия следущие: Создается счет, добавляются продукты, ставится задача ответственному отправить счет. После ее завершения через два дня ставится задача другому ответственному отследить приход денег. Если нет, то опять через 2 дня отследить приход.
Все вроде бы довольны :smile:

"Хомутов Кирилл" написал:Добрый день.
Мы эту проблему решили не много по другому.
Создали Бизнес процесс, который запускается автоматически по одному на каждый счет. (В wa_InvoiceAction добавили параметров, что бы потом клонировать был удобно.) В БП действия следущие: Создается счет, добавляются продукты, ставится задача ответственному отправить счет. После ее завершения через два дня ставится задача другому ответственному отследить приход денег. Если нет, то опять через 2 дня отследить приход.
Все вроде бы довольны

upd:(не ту ссылку вставил)
http://community.terrasoft.ua/ideas/4262
Я так и думал, что многие через БП будут реализовывать :)
Хотел поинтересоваться, используете ли Вы при этом планирование, и если да - то как ?

Создали окошко, которое при onPrepare запускает БП, а в onShow закрывает само себя.
На сервере шедулер, там запускается террасофт с параметрами для запуска окна.
Сейчас там таких БП стало много и мы стали объединять окна.
Т.е. одна задача в планировщике запускает окошко, которое стартует серию БП.

Понятно, но хотелось бы реализовать функцмонал без помощи БП, следовательно через действие. И тут сразу возникает несколько вопросов.
Начнем с малого, чисто теоретически. Какой вариант посоветуете выбирать:
1. Действие в разделе Договора->Создать свой счет(станд. карточка счета)->Добавить продукт к счету(карт. продукт в счете)->Автоматически повторить действие для всех договоров.
2. Действие в разделе Договора->Окно редактирования (своя карточка с полями, которые будут вноситься в поля счета и продукта к счету)-> Создание скриптом счета и продукта к нему.
В первом случае необходимо использование TemplateWindow? Если да, то получается много лишних полей, которые могут заполнятся автоматически.
А во втором, если создавать окно, то какой датасет привязать, и можно ли обойтись одним окном?

Как мне думается, оба варианта имеют право на жизнь, оба имеют как преимущества, так и недостатки. Лично я бы склонился скорее ко второму, думаю, первый реализовать будет сложнее. Прокомментирую каждый.

1) упрощает задачу тем, что при подготовке карточек редактирования у Вас уже заполнены поля по умолчанию. Также в scr_DB есть функции, позволяющие скопировать в новый датасет все поля датасета, кроме системных (ID, CreatedOn, CreatedByID и т.д., полный список - в начале этого же скрипта) и вычисляемых. Это функции CopyRowData и CopyFullData. Думаю, основной недостаток - медленная работа (функции каждый раз проходят по всем полям датасета). Нужно также не забывать о полях, которые заполняются автоматически, но разные для каждой записи (например, номер счёта). Впрочем, последнее касается обоих вариантов.

2) в этом случае можно создать окно, наследуя wnd_BaseEdit. Датасет привязывать не нужно. При обработке btnOKOnClick можно выполнять необходимое действие: считывать установленные в окне значения и подставлять их в запросы на вставку в БД. Датасет раздела Договора можно передать в это окно как атрибут, а дальше - как удобнее: создать два сервиса InsertQuery или же использовать Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters). Одного окна вполне достаточно, но в запросах необходимо не забывать и о тех значениях, которые в окне редактирования заполняются автоматически: здесь их нужно включать в параметры.

Понимаю, что данные описания очень поверхностны, но надеюсь, кое-что прояснилось.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо за разъяснения ,теперь картина еще более прояснилась.
Думаю остановлюсь на втором варианте, но, закономерно возникает несколько вопросов:
1. В созданное окно добавил несколько DateTimeControl, NumericControl и LookupControl. Считывать последние, я так понимаю, нужно из LookupDataset, а вот DateTime и Numeric?
2. Можно ли в обработчике btnOKOnClick использовать function CreateInvoiceByContract() из wnd_ContractsWorkspaceScript? Если так, то вызов CreateNewWindowEdit(Self, 'wnd_InvoiceEdit', DefaultValues, Attributes) будет излишним и что вместо него прописать? И Attributes('IsCreatedByContractID') = ContractDataset.Values('ID') тоже ненужен, посколько там происходит вызов ProcessCopyOfferingDetail, а в данном случае продукт создается заведома известный и только некоторые поля берутся в зависимости от договора и созданной карточки. Но с другой стороны, Счет должен иметь привязку к Договору(или возможно лучше создавать связь самому в скрипте?).

Насчет CreateNewWindowEdit(), кажется, решение следующее:
InvoiceDataset.Append();
InvoiceID = Connector.GenGUID();
InvoiceDataset.Values('ID') = InvoiceID;
.....
InvoiceDataset.Post();

По первому пункту: значение LookupControl'a Вы можете получить так: LookupControlName.LookupDatasetLink.Dataset.Values('ID').

Что касается остальных перечисленных контролов, их значения получить просто: ControlName.Value. У DateTimeControl'ов перед присвоением значения полю датасета полезно проверять свойство DateTimeControlName.IsNull.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Вот только для LookupControl'a ругается "Источник данных не открыт"

Тогда можно в обработке события OnNotify окна анализировать атрибуты объекта Sender:

var ControlText = Sender.Attributes('DisplayFieldValues').CommaText;
var KeyValues = Sender.Attributes('KeyValues');
var ParamsArray = new Array();
for (var i = 0; i < KeyValues.Count; i++) {
	ParamsArray[i] = KeyValues.Items(i);
}

Таким образом после выбора значения в окне справочника Вы получаете выбранные ID (KeyValues) и отображаемые значения. Можно записать их в глобальные переменные и использовать в обработке OKOnClick.

Если полей типа "Справочник" несколько, можно в обработке их событий OnPrepareSelectWindow присваивать окну атрибут с названием контрола, а потом в OnNotify его анализировать.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

По ходу выполнения возник еще один вопрос. На форуме ответ так и не нашел:
В разделе, например Счета добавил действие. В результате на основании счета создается документ в разделе Документы. Как реализовать автоматическое добавление созданного документа в Подчиненные к выбранному счету?
В Договорах, как я понял, для действия "Создать счет" реализовано передачей атрибута IsCreatedByContractID в CreateNewWindowEdit, или я ошибаюсь?

Если у Вас есть оба ID: счёта и документа, которые записаны в переменные InvoiceID и DocumentID, можно прямо в действии, после создания документа, выполнить следующее:

var Parameters = CreateSPParameters();
CreateSPParameter(Parameters, 'ID', pdtGUID, Connector.GenGUID());
CreateSPParameter(Parameters, 'InvoiceID', pdtGUID, InvoiceID);
CreateSPParameter(Parameters, 'DocumentID', pdtGUID, DocumentID);
var SQLText = 'insert into tbl_DocumentInDocument (ID, ParentInvoiceID, ChildDocumentID) values (:ID, :InvoiceID, :DocumentID';
Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

"Лабьяк Олег Игоревич" написал:Если у Вас есть оба ID: счёта и документа, которые записаны в переменные InvoiceID и DocumentID

ID счета есть, а вот документ создается вызовом CreateNewWindowEdit, следовательно нужно как-то после его создания передавать ID, как проще всего реализовать?

Проще всего реализовать через механизм нотификации.

Например, при создании документа в качестве объекта NotifyObject указываете раздел "Договора" с помощью одноимённого атрибута. Дальше, в скрипте раздела договоров при обработке события wnd_ContractsWorkspaceOnNotify анализируете сообщение и объект, отправивший его. Если сообщение равно MSG_OK и название отправителя - wnd_DocumentEdit, выполняете запрос, приведённый выше.

Атрибут IsCreatedByContractID на самом деле используется для копирования продуктов из договора в счёт.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

В wnd_InvoicesWorkspaceOnNotify получаю ID счета и созданного документа, но при выполнении запроса появляется ошибка: "Ошибка выполнения метода 'wnd_InvoicesWorkspaceOnNotify'. Object expected «Call Stack»". Возможно нужно дополнительно подключить какой-то скрипт?
И ещё - в предпоследней строчке запроса не должно быть ":DocumentID)';" вместо ":DocumentID';"?;

Да, действительно, я пропустил закрывающуюся скобку...

Если ошибка возникает при выполнении CreateSPParameters или CreateSPParameter, значит, к Вашему скрипту не подключен скрипт scr_DB, либо же в этом скрипте отсутствуют данные функции. Привожу их текст:

function CreateSPParameters() {
    return System.CreateObject('TSObjectLibrary.Parameters');
}
 
function CreateSPParameter(Parameters, Name, DataType, Value) {
	var Parameter = Parameters.CreateItem();
	Parameter.Name = Name;
	Parameter.DataType = DataType;
	Parameter.Value = Value;
	Parameters.Add(Parameter);
	return Parameter;
}

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Добавил функции, всё работает.:lol:
Спасибо!

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