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

function CopyRight(RecordID, NewRecordID) {

//      debugger;

        var Dataset = Services.GetNewItemByUSI('ds_Cashflow');
        ApplyDatasetIDFilter(Dataset, NewRecordID, true);
        Dataset.Open();
        Dataset.GotoFirst();
                                                         
               
var DoumentsRightsDataset = Services.GetNewItemByUSI('ds_CashflowRight');
                ApplyDatasetFilter(DoumentsRightsDataset, 'RecordID', Dataset.Values('ID'), true);
               
                DoumentsRightsDataset.Open();
                DoumentsRightsDataset.GotoFirst();
                while(!DoumentsRightsDataset.IsEOF)
                {
                        DoumentsRightsDataset.Delete();
                }
               
                DoumentsRightsDataset.Close();
                                           
                var CanRead = true;
                var CanWrite = true;
                var CanDelete = true;
                var CanChangeAccess = true;
                                                           
ProcessGiveRecordRightsToContact(Dataset, Connector.CurrentUser.ContactID, CanRead, CanWrite, CanDelete, CanChangeAccess);                                                         
                                                           
        Dataset.Close();  
          }

Предполагаю, что удаление прав может быть лишним. Надеюсь на помощь профессионалов.

Нравится

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

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

Ниже замечания по реализованной Вами функции.

1. Вам не нужен датасет ds_Cashflow. Вы же в функцию уже передаете ID записи, откуда хотите копировать права (RecordID), и ID записи, куда хотите копировать (NewRecordID).
2. Перед открытием датасета ds_CashflowRight для установки фильтра используйте переменную RecordID:
ApplyDatasetFilter(CashflowRightDataset, 'RecordID', RecordID, true);
3. Вам нужен ещё один экземпляр датасета ds_CashflowRight, куда Вы будете добавлять нужные записи. Например, назовем его NewCashflowRightDataset.
var NewCashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
4. Удалять записи из CashflowRightsDataset, действительно, не нужно.
5. В цикле while нужно реализовать такой код:
NewCashflowRightDataset.Append();
NewCashflowRightDataset('ID') = Connector.GenGUID();
NewCashflowRightDataset('RecordID') = NewRecordID;
NewCashflowRightDataset('CanRead') = DocumentRightsDataset('CanRead');
NewCashflowRightDataset('CanWrite') = DocumentRightsDataset('CanWrite');
NewCashflowRightDataset('CanDelete') = DocumentRightsDataset('CanDelete');
NewCashflowRightDataset('CanChangeAccess') = DocumentRightsDataset('CanChangeAccess');
NewCashflowRightDataset.Post();
DocumentRightsDataset.GotoNext();
6. То, что ниже while не нужно. После цикла нужно закрыть оба датасета.

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

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

Копирование прав работает, но есть маленький нюанс:

Не подскажете как исправить? :)

Нужно в код, где Вы копируете права добавить ещё такую строчку:

NewCashflowRightDataset('AdminUnitID') = DocumentRightsDataset('AdminUnitID');

Cпасибо! Все работает.

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

Можно написать запрос на удаление, который будет удалять не нужные записи

Реализовал след. образом:

function CopyRight(RecordID, NewRecordID) {
 
//debugger;
 
 
	var CashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
	ApplyDatasetFilter(CashflowRightDataset, 'RecordID', RecordID, true);
	var NewCashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
	ApplyDatasetFilter(NewCashflowRightDataset, 'RecordID', NewRecordID, true);           
	NewCashflowRightDataset.Open();
	NewCashflowRightDataset.GotoFirst();
	//Чистим датасет от прав по умолчанию
                while(!NewCashflowRightDataset.IsEOF)
                {
                        NewCashflowRightDataset.Delete();
                }
    NewCashflowRightDataset.Close();
    NewCashflowRightDataset.Open();
	CashflowRightDataset.Open();
	CashflowRightDataset.GotoFirst();
	while(!CashflowRightDataset.IsEOF)
	{
		NewCashflowRightDataset.Append();
		NewCashflowRightDataset('ID') = Connector.GenGUID();
		NewCashflowRightDataset('RecordID') = NewRecordID;
		NewCashflowRightDataset('CanRead') = CashflowRightDataset('CanRead');
		NewCashflowRightDataset('CanWrite') = CashflowRightDataset('CanWrite');
		NewCashflowRightDataset('CanDelete') = CashflowRightDataset('CanDelete');
		NewCashflowRightDataset('CanChangeAccess') = CashflowRightDataset('CanChangeAccess');
		NewCashflowRightDataset('AdminUnitID') = CashflowRightDataset('AdminUnitID');
		NewCashflowRightDataset.Post();
		CashflowRightDataset.GotoNext();
	}
	CashflowRightDataset.Close();
	NewCashflowRightDataset.Close();
}

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

В Вашем коде есть ошибка.

Чтобы удалить все записи нужно после NewCashflowRightDataset.Delete(); выполнить NewCashflowRightDataset.GotoNext().

И ещё после цикла, где идет удаление закрывать не нужно. Эта строка лишняя:
NewCashflowRightDataset.Close();

Спасибо, сейчас подправлю :)

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

Добрый день.
Делаю настройку экспорта Операций из Террасофта 3.3.2 в РКО в 1С8.
Учитывая, что РКО это документ + табличная часть , то делаю двухуровневую структуру. Отдельно указываю синхронизацию полей документа, отдельно табличной части.
Документ создается. При попытке его открыть в 1С8 выдается ошибка

{Документ.РасходныйКассовыйОрдер.Форма.ФормаДокумента.Форма(569)}: Индекс находится за границами массива
ЭлементыФормы.РасшифровкаПлатежа.ТекущаяСтрока = РасшифровкаПлатежа[0];

В реестре 1С8 визуально видно что такие реквизиты как дата, организация, номер (те, которые первого уровня) заполняются.
Те, которые второго уровня (сумма, курс, сумма взаиморасчетов) пустые. Из-за этого документ в 1С8 и выдает ошибку.

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

Теперь вопросы. Для того, чтобы не перебирать все варианты поиска ошибок самой вручную.
Как правильно писать значения по умолчанию: 'Истина' или без кавычек, '1' или без кавычек ?
Как правильно перенести отрицательную сумму расходной операции в Сумму в РКО 1С, которая там с плюсом ?
Надо ли указывать все поля для синхронизации, даже те, где пустые поля?
Какие еще нюансы надо учесть?

Нравится

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

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

пс: лично я в таких случаях, когда в тс - это одна таблица, а в 1с - это реквизиты + табличная часть - делаю одну настройку. В скрипте же заполняю табличную часть на событии OnBeforeExport (т.к. ексть такие моменты когда нельзя сохранить документ без табличной части):

NewOffering = Select1C.Товары.Добавить();
NewOffering.Товар = Offering1CLink;
NewOffering.КодТовара = Dataset('Code');
NewOffering.ЕдИзм = Unit1CLink;
NewOffering.Коэффициент = Dataset('Koof');

Как получить ссылку на запись для заполнения ссылочных реквизитов:

 
var Offering1CLink = Param.Obj1C.Справочники.Номенклатура.
	ПолучитьСсылку(UID1C);

где UID1C - это значение колонки UID1C (ID записи 1с) преобразован следующим образом:

UID1C = UID1C.replace('{', '');
UID1C = UID1C.replace('}', '');
UID1C = Param.Obj1C.NewObject('УникальныйИдентификатор', UID1C);
return UID1C;

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

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

Ниже предоставлено описание, как создать опцию «Открыть папку с файлом» для кнопки "Операции"
.
1. Открываем окно wnd_FilesDetailGridArea
2. На вкладке «Невизуальные» создаем новый ActionMenuItem
3. Вводим необходимые свойства
4. На событие OnExecute добавляем в функцию подобный код:

var Dataset = dlData.Dataset;
var Link = Dataset.Values('Link');
var folderpath = Link.substring(0,Link.lastIndexOf("\\"))
var oShell = new ActiveXObject("Shell.Application");
oShell.Open(folderpath);

5. Сохраняем изменения

1

Нравится

Поделиться

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

Реализация регистрации типовых хозяйственных операций для производственного предприятия.

Для реализации поставленной задачи, рекомендуем следующее:

1. Для фиксации отгрузку изготовленной продукции заказчику по накладной, перейдите в раздел «Склад» меню [Ресурсы]. Создайте новую расходную накладную нажав на кнопку «Расходная накладная» в контекстном меню кнопки «Добавить». Заполните необходимые данные, к примеру:
a3

2. Добавьте продукты, которые фигурируют в данной накладной. Для этого выделите созданную накладную, и перейдите на деталь «Продукты». Нажмите кнопку «Добавить»:
a4

Для того, чтобы отобразить движение товаров в оборотно-сальдовой ведомости, откройте созданную накладную и измените поле «Состояние» на «Проведен».
Для выставления счета-фактуры для оплаты заказчиком отгруженной продукции, создайте новую продажу. В разделе «Продажи» нажмите на кнопку «Добавить». Заполните карточку, примерно так, как показано на скриншоте ниже:
a5

На детали «Счета» созданной продажи, создайте новый счет, нажав на кнопку «Добавить» раздела [Счет] меню «Продажи». Заполните открывшуюся карточку нового счета, к примеру, как показано на скриншоте ниже:
a6

Перейдите на деталь «Продукты в счете», и добавьте продукты, связанные с этим счетом.
Для формирования счета-фактуры по созданному счету, нажмите кнопку «Счет фактура с НДС» в меню «Отчеты» раздела «Счета» (предварительно выделив нужный счет):
a7

Для фиксирования дебиторской задолженности, по выставленному счету, создайте новую операцию. Для этого перейдите в раздел «Операции» и нажмите кнопку «Добавить». Заполните открывшуюся карточку, к примеру, как показано на скриншоте ниже:
a8

Признак «Учитывать при взаиморасчётах» показывает что сумма по данной операции будет отнесена к взаимным расчетам. Просмотреть сумму возникшей задолженности можно на вкладке «Финансы» карточки «Контрагент»:
a9

После оплаты счета, отредактируйте нужный счет:
a10

Создайте новую операцию прихода денежных средств:
a11

На вкладке «Финансы» для контрагента, можно наблюдать погашение дебиторской задолженности:
a12

Нравится

Поделиться

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

Всем добрый день.Сегодня с удивлением обнаружила , что в разделе Операции нет детали напоминаний... Начала восстанавливать этот пробел.
Создала саму деталь в разделе, сделала функции по обновлению и инциализации детали. По образу и подобию этих деталей в других разделах.
Потом нашла перечисление, в котором кодируется тип объекта напоминания. Есть такое enm_RemindingSubjectType. Оказалось , что там уже прописан нужный тип rst_Cafhflow.
Видимо , до меня разработчики пытались создать напоминания в этом разделе, но передумали. :smile:
Потом еще изменила sq_Remindings, добавив туда CashflowSelect (опять же - по принципу и подобию с другими разделами). Скриншот в файле. Что интересно , параметр CashflowSubjectTypeID создавать не пришлось, до меня был создан :smile:
И вот после всех этих изменений, попробовала создать напоминание в детали Напоминания в разеделе Операции. Деталь открылась, напоминание добавить получилось. В момент его выполнения у меня появилась в скрипте scr_Remindings (в файле есть скриншот).
Как исправить?

Нравится

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

А если в отладчике нажать F5 (чтобы продолжить выполнение) - какую ошибку в лог записывает?

Сообщение об ошибке: OLE error 80020101 (и далее в файле). Ошибка будет повторяться потом до тех пор, пока в разделе Операции не удалить ошибочное напоминание.

Можете выложить sq_Remindings ?

Думала, что смогу, но оказалось , что при этом выдается лог:
[11.07.04 16.05.54.900] (W) Can't show Select Query text.
Details: Property 'Join.LeftField' not assigned

Перепроверила все Joinы, там все поля определены. Не пойму в чем же причина.

начала проверять другие Joinы, которые были в этом sq до моих изменений, и нашла такой "поломанный"... Исправила.
Странно, что напоминания из других разделов в системе уходили нормально. Напоминания из раздела Операции все равно не уходят.

Тект sql запроса в файле

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

И еще, очень важно, может сразу и поможет - ваш подзапрос называется CashflowSelect. Назовите его tbl_Cashflow, в последних версиях Террасофта это неявное, но обязательное требование для корректного отображения напоминаний

Действительно, помогло!!!:smile:
Вот никогда бы не догадалась бы, ведь везде не так называется!

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

Добрый день!

Помогите разобраться с операциями.

Задача: Зафиксировать факт получения денег от клиента (аванс, услуги еще не оказывались).

Решение: Создаю операцию. Тип: Приход. CF. Плательщик: "Рога и копыта corp.". Дебитор/кредитор: они же. Получатель: Своя компания. Сумма: 1 руб.

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

Реальный мир жесток: Заходим в карточку контрагента, и видим:

  • Текущий баланс: -1
  • Остаток: -1

Почему так? Есть две версии:

  1. У контрагента начальный баланс = 0. Он заплатил нам 1 руб. Баланс стал -1. (Не согласен, так как в этом случае для корректных расчетов нам нужно знать реальный денежный баланс клиента :) а это по своей наглости сродни ключу от квартиры где деньги лежат...)
  2. А это и не баланс контрагента вовсе. Это наш баланс в разрезе данного контрагента. С точки зрения математики - все логично. Но не логично с точки зрения логики (вона как загнул!). Если я смотрю карточку контрагента, то я ожидаю увидеть его баланс в разрезе взаимоотношений с моей фирмой. Для примера - такой гештальт: менеджер, открыв карточку контрагента, и увидев в ней сумму с минусом, порываясь своим профессиональным инстинктам, что сделает? Правильно! Позвонит клиенту, и скажет: "У вас на балансе минус. Когда платить изволитес?" Могу ошибаться, но, вроде бы, большинство учетных систем придерживается именно такой логики

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

Нравится

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

Попробовал сделать, то что Вы описали, прямо здесь же, на демоверсии XRM. Баланс +1.
Вы ничего не перепутали?

Выполнила указанную Вами последовательность действий - баланс контрагента положительный (скриншоты прикреплены). Уточните, пожалуйста, какую версию Terrasoft Вы используете.

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

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

Нравится

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

"Штинов Антон Викторович" написал:должно ли это считаться автоматически в системе?

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

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

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

Добрый день! Подскажите пожалуйста, как в Terrasoft вводятся начальные остатки по взаиморасчетам? Как я понимаю для каждого контрагента нужно создать операцию на начало периода? Операции типа Расход и состояние = "В планах", если мы остались должны контрагенту. Операции типа приход и состояние = "Выполнена", если контрагент оплатил аванс. И главное, выбрать флаг "Учитывать при взаиморасчетах". Так?
Тогда в карточке контрагента на вкладке "Финансы" будет правильно отображаться "Текущий баланс"?

Нравится

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

В том случае если расчет остатков по взаиморасчетам Вы хотите видеть на закладке [Финансы] карточки контрагента Вам необходимо:

1. В разделе операции создать операцию с установленным признаком [Учитывать при взаиморасчетах] и полем [Дебитор / Кредитор] заполненным названием выбранного контрагента.

2. Так как для расчета остатков по взаиморасчетам Вы будете использовать фактические данные о поступивших денежных средствах, в карточке операции обязательно должно быть указано состояние, для которого в справочнике [Состояния операций] установлен признак [Фактическая транзакция]. По умолчанию это состояние [Выполнена].

3. В блоке полей [Обязательства] отображается сумма операций, в карточке которых установлен признак [PL]. То есть, по тем операциям, по которым Вы ожидаете поступления указываете данный признак. Для отображения фактически полученных денежных средства (блок [Оплаты]) в карточке операции укажите признак [CF].

В результате, поле [Текущий баланс, “Y”] будет указана сумма которую Вам должен клиент либо, которую Вы должны заплатить клиенту (минусовый показатель). Для просмотра операций, а также для обновления данных по обязательствам и оплатам используйте дополнительную кнопку с изображением молнии.

Вы также можете создать операцию с типом [Расход] в состоянии [Выполнена] с признаком [PL] для того, чтобы указать, что Вы оплатили долг клиенту и остатки по взаиморасчетам равны 0.

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