Локальная переменная в 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 конкурса из локальной переменной с системным именем konkursdata.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 чел.
