Локальная переменная в C#-скрипте и сценарии. Использование для копирования данных между шаблонами
Введение
Локальные переменные для кнопки позволяют передавать введённые пользователем значения из диалогового окна кнопки в сценарий или C#-скрипт. Например, можно передать идентификатор выбранной пользователем записи для её последующей обработки.
Здесь представлена инструкция по настройке копирования данных из одного шаблона записи в другой с использованием локальной переменной и C#-скрипта или сценария по нажатию кнопки.
Прикладная задача
Требуется копировать справочные данные (мастер-данные) в транзакционные данные, чтобы их можно было изменять в целевой записи, не влияя на исходный справочник.
Справочник (шаблон записи) «Номенклатура продукции» содержит наименования, единицы измерения и стандартную цену товаров.
Шаблон записи «Конкурсы» содержит информацию о проводимых конкурсах на закупку.
С конкурсами связан шаблон «Позиции в конкурсе», в котором хранятся сведения о товарах, добавленных в конкурс на закупку, включая, например, количество и сумму закупки.
Требуется настроить кнопку, которая будет добавлять позиции из справочника, выбранные в таблице, в конкурс на закупку. При этом сведения о выбранных товарах должны копироваться из справочника в шаблон «Позиции в конкурсе». В скопированных позициях можно будет изменять сведения для конкретного конкурса (например, цену), а сведения о товарах в справочнике должны оставаться неизменными.
Настройка шаблонов записей
-
Создайте шаблон записи «Номенклатура продукции» со следующими атрибутами:
Название Тип Свойства Наименование Текст Использовать как заголовок записей: флажок установлен Единица измерения Текст Цена Число Количество знаков после запятой: 2 -
Добавьте созданные атрибуты на форму и в таблицу «Все записи».
-
Создайте шаблон записи «Позиции в конкурсе» с атрибутами:
Название Тип Свойства Наименование Текст Использовать как заголовок записей: флажок установлен Единица измерения Текст Цена Число Количество знаков после запятой: 2 Количество Число Количество знаков после запятой: 0 Сумма Число Количество знаков после запятой: 2
Вычислять автоматически: флажок установлен
Вычисляемое значение: формула
PRODUCT($Tsena, $Kolichestvo)
Здесь:
PRODUCT()
— вычисляет произведение двух чисел.Tsena
— системное имя атрибута «Цена».Kolichestvo
— системное имя атрибута «Количество». -
Создайте шаблон записи «Конкурсы» с атрибутами:
Название Тип Свойства Название Текст Использовать как заголовок записей: флажок установлен Позиции конкурса Запись Связанный шаблон: Позиции в конкурсе
Хранить несколько значений: флажок установлен
Взаимная связь с атрибутом: с новым
Название: Конкурс
-
Добавьте атрибуты «Название» и «Позиции конкурса» на форму.
- Выберите для атрибута «Позиции конкурса» отображение в виде таблицы и добавьте в неё созданные атрибуты.
Настройка кнопки для копирования данных
Настройка кнопки с использованием C#-скрипта
- Создайте кнопку «Добавить позиции в конкурс» в шаблоне «Номенклатура продукции».
-
На вкладке «Локальные переменные» создайте переменную со следующими свойствами:
- Отображаемое название: Конкурс
- Тип данных: запись
- Системное имя: konkurs
- Шаблон: Конкурсы
-
На вкладке «Основные» настройте свойства кнопки:
- Отображаемое название: Добавить позиции в конкурс
- Контекст операции: запись
- Операция: C# скрипт
- Результат выполнения: обновить данные
- Отображать диалоговое окно: флажок установлен
-
Сохраните кнопку.
- Нажмите гиперссылку «Настроить диалоговое окно».
- Вынесите локальную переменную «Конкурс» на форму диалогового окна и сохраните её.
-
На вкладке «Скрипт» вставьте следующий код:
using System;
using System.Collections.Generic;
using System.Linq;
using Comindware.Data.Entity;
using Comindware.TeamNetwork.Api.Data.UserCommands;
using Comindware.TeamNetwork.Api.Data;
class Script
{
public static UserCommandResult Main(UserCommandContext userCommandContext, Comindware.Entities entities)
{
var data = userCommandContext.LocalVariables;
string konkursId = "";
string notify = "Позиции добавлены в выбранный конкурс";
// Получаем ID конкурса из локальной переменной с системным именем konkurs
data.TryGetValue("konkurs", out object obj_);
if (obj_ != null)
{
konkursId = (obj_ as object[]).FirstOrDefault().ToString();
}
// Проверяем, что в таблице выбрана хотя бы одна строка
if (userCommandContext.ObjectIds.Count() == 0)
{
var resultBad0 = new UserCommandResult
{
Success = false,
Commited = false,
ResultType = UserCommandResultType.Notificate,
Messages = new[]
{
new UserCommandMessage
{
Severity = SeverityLevel.Normal,
Text = "Ни одной позиции не выбрано"
}
}
};
return resultBad0;
}
Decimal posNum = 0;
foreach (string selectId in userCommandContext.ObjectIds)
{
Dictionary<string,object> data_new = new Dictionary<string,object>();
// Собираем данные из шаблона записи «Номенклатура продукции»
var data_selectId = Api.TeamNetwork.ObjectService.GetPropertyValues(new String[]{selectId}, new String[]{"Naimenovanie", "Edinitsaizmereniya", "Tsena"});
// Копируем значения атрибутов шаблона «Номенклатура продукции» в атрибуты позиции в конкурсе
if (data_selectId[selectId].ContainsKey("Naimenovanie"))
data_new.Add("Naimenovanie", data_selectId[selectId]["Naimenovanie"]);
if (data_selectId[selectId].ContainsKey("Edinitsaizmereniya"))
data_new.Add("Edinitsaizmereniya", data_selectId[selectId]["Edinitsaizmereniya"]);
if (data_selectId[selectId].ContainsKey("Tsena"))
data_new.Add("Tsena", data_selectId[selectId]["Tsena"]);
data_new.Add("Produktsiyanazakupku", data_selectId[selectId]["id"]);
// Если конкурс выбран, проставляем ссылку на него в текущую позицию
if (konkursId != "")
{
// Konkurs — системное имя атрибута «Конкурс» шаблона записи «Позиции в конкурсе»
data_new.Add("Konkurs", konkursId);
}
posNum++;
// Создаём запись в шаблоне Pozitsiivkonkurse (Позиции в конкурсе) со скопированными данными
Api.TeamNetwork.ObjectService.CreateWithAlias("Pozitsiivkonkurse", data_new);
}
// Завершаем работу скрипта
var result = new UserCommandResult
{
Success = true,
Commited = true,
ResultType = UserCommandResultType.Navigate,
NavigationResult = new UserCommandNavigationResult
{
Context = ContextType.Task,
},
Messages = new[]
{
new UserCommandMessage
{
Severity = SeverityLevel.Normal,
Text = notify
}
}
};
return result;
}
}
-
Сохраните С#-скрипт.
- Сохраните кнопку.
- Вынесите кнопку «Добавить позиции в конкурс» на область кнопок таблицы «Все записи» шаблона «Номенклатура продукции».
Настройка кнопки с использованием сценария
- Создайте в шаблоне «Позиции в конкурсе» атрибут типа «Запись» «Исходная позиция», связанный с шаблоном «Номенклатура продукции».
- Создайте кнопку «Добавить позиции в конкурс» в шаблоне «Номенклатура продукции».
-
На вкладке «Локальные переменные» создайте переменную со следующими свойствами:
- Отображаемое название: Конкурс
- Тип данных: запись
- Системное имя: konkurs
- Шаблон: Конкурсы
-
На вкладке «Основные» настройте свойства кнопки:
- Отображаемое название: Добавить позиции в конкурс
- Контекст операции: запись
- Операция: вызвать событие «Нажата кнопка»
- Результат выполнения: обновить данные
- Отображать диалоговое окно: флажок установлен
-
Сохраните кнопку.
- Нажмите гиперссылку «Настроить диалоговое окно».
- Вынесите локальную переменную «Конкурс» на форму диалогового окна и сохраните её.
- Вынесите кнопку «Добавить позиции в конкурс» на форму таблицы записей шаблона «Номенклатура продукции».
- Создайте новый сценарий «Добавить позиции в конкурс».
- В начальном событии «Нажата кнопка» выберите контекстный шаблон «Номенклатура продукции» и кнопку «Добавить позиции в конкурс».
- Добавьте новое событие «Создать запись» с целевым шаблоном «Позиции в конкурсе».
- Внутри события «Создать запись» добавьте событие «Изменить значения атрибутов».
-
Добавьте следующие атрибуты для изменения:
Атрибут Операция со значениями Значение Конкурс Заменить Формула:
$$dialogVariables->konkurs
Здесь:
dialogVariables
— объект с локальными переменными кнопки, которая вызвала сценарий по событию «Нажатие кнопки»konkurs
— системное имя локальной переменной «Конкурс».Исходная позиция Заменить Формула:
$$origin
Здесь:
origin
— системная переменная, хранящая ID записи, для которой была нажата кнопка.Наименование Заменить Атрибут: Исходная позиция→Наименование
Единица измерения Заменить Атрибут: Исходная позиция→Единица измерения
Цена Заменить Атрибут: Исходная позиция→Цена
Сценарий с использованием локальной переменной
Тестирование
-
Создайте и заполните несколько записей в шаблоне «Номенклатура продукции».
Добавление позиций из справочника продукции в конкурс -
Создайте запись в шаблоне «Конкурсы», например «Конкурс №1».
- Выберите одну или несколько позиций в таблице «Номенклатура продукции» и нажмите кнопку «Добавить позиции в конкурс».
-
Выберите «Конкурс №1» в раскрывающемся в списке и нажмите кнопку «Добавить позиции в конкурс».
Выбор конкурса для добавления позиций -
Откройте запись «Конкурс №1».
- В таблице «Позиции в конкурсе» должны отобразиться выбранные товары с единицей измерения и ценой из справочника.
- Отредактируйте цену продукции в любых позициях.
- Сохраните запись.
-
Удостоверьтесь, что исходные цены в справочнике остались неизменными.
Отображение добавленных позиций в конкурсе
Связанные статьи
Эта статья была полезна 1 чел.