Table.CopyByX

From SunFlurry wiki
Jump to: navigation, search
  CopyByX (Работа с шаблонами)
Объект:Электронная таблица
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число, неверные параметры, ошибка исполнения
Визуальность:Нет

Функция выполняет копирование указанной области ячеек и объектов, находящихся внутри этой области из таблицы-шаблона в текущую таблицу, начиная с ячейки, заданной атрибутами CurPutX и CurPutY. В момент копирования тексты и значения ячеек и объектов, являющиеся шаблонами, будут превращены в результаты их вычисления. Если третий аргумент равен 1, до начала копирования, функция переводит курсор копирования в левый столбик и производит сдвиг курсора по вертикали (размер сдвига по вертикали определяется высотой области, которая была скопирована в таблицу до текущей). После окончания копирования функция переводит курсор копирования вправо на ширину области копирования. Если четвертый аргумент равен 1, функция не будет изменять размеры строк или столбцов в соответствии с размерами строк и столбцов копируемой области, однако, при копировании текста в ячейки, автоматически рассчитываемые размеры строк или столбцов по-прежнему будут изменены, если это необходимо (данный режим полезен, к примеру, если ширина столбцов уже задана, а шаблон содержит неверную ширину, которая испортит установку). После копирования любого визуального объекта, функция вызывает событие OnFinishCopyObject, если оно существует в текущем или глобальном модуле.

На рисунке показан вид простой таблицы-шаблона. Области таблицы имеют свои имена. При использовании функции, для указания на область копирования, формат определения области следующий: <Имя области шаблона>[|<Имя области шаблона пересекающегося измерения>] либо <Имя области шаблона>[,<Имя области шаблона пересекающегося измерения>], либо прямое указание на область копирования <Левый столбец области>:<Верхняя строка области>,<Правый столбец области>:<Нижняя строка области> (нумерация начинается с единицы). Т.е., для именованных областей на рисунке, v1 будет подразумеваться область ячеек в диапазоне 1:1,<ширина таблицы>:6; для h1 подразумевается область 1:1,2:9 (9 -- высота таблицы); для h1|v2 подразумевается область 1:7,2:7.

При копировании в новую таблицу области "h1|v2" с рисунка с помощью функции CopyByX:

  1. Если второй аргумент равен 1, атрибут CurPutX примет значение 1, а CurPutY увеличится на высоту предыдущей области.
  2. Будут скопированы ячейки диапазона 1:7,2:7 в результирующую таблицу в область, начинающуюся с верхней левой ячейки <CurPutX>:<CurPutY>
  3. Будет произведен поиск переменной пДата и значение копируемой ячейки будет изменено на ее значение (если переменная не существует, будет вызвано исключение). Для копируемых ячеек, содержащих вычисляемые выражения, а не просто переменные, будет произведено вычисление выражений.
  4. Атрибут CurPutX увеличится на 2 (ширина области).
  5. Если третий параметр равен нулю, в таблице, в которую производится копирование, будет изменена ширина столбцов CurPutX-2 и CurPutX-1 в соответствии с шириной столбца 1 и 2 таблицы-шаблона, высота строки будет подсчитана автоматически исходя из высот всех ячеек, уже находящихся в строке CurPutY (так как строка на рисунке имеет установку автоматической высоты).
  6. Будут скопированы неразрывные регионы, попадающие в область (в данном примере отсутствуют).
  7. Будут скопированы разбиения страницы, попадающие в область (в данном примере отсутствуют).
  8. Будут скопированы объекты таблицы, попадающие в область (в данном примере отсутствуют), для значений объектов, с установленным флажком "значение для вычисления", значения будут вычислены, как это происходило для значений ячеек. Для каждого скопированного объекта, будет вызвано событие OnFinishCopyObject.

Синтаксис

Table.CopyByX(<Указание на область таблицы-шаблона (STRING)>,<Перейти на новую строку до добавления области (INT)>=0,<Не производить изменения размеров столбцов или строк (INT)>=0)

Аргументы

  • <Указание на область таблицы-шаблона (STRING)> - Строковой аргумент в формате наименований областей или прямого указания на ячейки таблицы-шаблона (см. выше).
  • <Перейти на новую строку до добавления области (INT)> - (необязательный аргумент) Если аргумент равен 1, атрибут CurPutX принимает значение 1, а CurPutY увеличивается на высоту предыдущей добавленной области до начала копирования (см. пример выше).
  • <Не производить изменения размеров столбцов или строк (INT)> - (необязательный аргумент) Задает режим, когда пересчета ширины столбцов или высоты строк таблицы результата, попадающих в диапазон копирования, для которых не установлен признак "автоматическое изменение", не будет происходить. Это немного увеличивает скорость копирования и может использоваться, если размеры уже заданы, и в шаблоне они неверные.

Примеры

//Ниже приведен пример из статьи Электронная таблица SFT

//Переменные, которые были подготовлены заранее:
//спНоменклатура -- список номенклатурных позиций, выводящихся в отчет (горизонтальные строки отчета с папками)
//спТипыЦен -- список типов цен, которые будут следовать по горизонтали столбиками
//ДатаФормирования -- дата нахождения цены

//Выполняем запрос для получения горизонтального разреза
ТЗ:="зН:=Ref.Номенклатура;
|зСтатус:=Ref.Номенклатура.@STATUS;Condition(зСтатус=0);
|зПапка:=Ref.Номенклатура.@ISFOLDER;
|Condition(зПапка=0);
|Condition(зН IN спНоменклатура);
|Group зН with folders;";
  
З:=Query.Create();
З.Execute(ТЗ);

Т:=Table.Create();
Т.SetSourceName("Отчет");
//Здесь и далее переменные с префиксом "п" используются в таблице-шаблоне "Отчет" в соответствующих ячейках,
//  при копировании куска таблицы с помощью CopyByX, ячейки автоматически заполняются значениями нужных переменных.
пЗагол:="Отчет по ценам номенклатуры";

//Копирование из таблицы-шаблона будет осуществляться слева направо и затем сверху вниз
//Столбец "h1" в таблице-шаблоне содержит столбец с наименованием номенклатурной позиции, левый отступ, порядковый номер и пр.
//Столбец "h2" -- цена текущей позиции по типу цен из спТипыЦен
//Столбец "h3" -- завершает таблицу (правая граница)
//Строка "v1" таблицы-шаблона содержит заголовок отчета с заголовками столбцов
//Строка "v2" таблицы-шаблона содержит одну строку отчета
//Строка "v3" таблицы-шаблона содержит одну строку папки отчета, цены для папок не выводятся
//Строка "v4" таблицы-шаблона завершает отчет снизу (нижняя граница)

//Первый блок добавляется "с начала строки"
Т.CopyByX("v1|h1",1);
For i:=1 to спТипыЦен.Size() Do
  пТипЦен:=спТипыЦен.Get(i);
  //Последующие блоки добавляются слева направо без перевода на другую строку, пТипЦен выводится в заголовки столбцов
  Т.CopyByX("v1|h2");
EndDo;
//Окончание вывода блока заголовка таблицы
Т.CopyByX("v1|h3");
//Фиксирование заголовка, чтобы он всегда был на экране при перемещении курсора по таблице
Т.Options.FixedLine:=Т.Height();

пКолВо:=0;
While З.Next(1) Do
  //Переменные используются в столбце "h1"
  пН:=З.зН;
  пКод:=пН.Code;

  If пН.IsFolder() Then
    //Вывод строки с папкой
    Т.CopyByX("v3|h1",1);
    For i:=1 to спТипыЦен.Size() Do
      Т.CopyByX("v3|h2");
    EndDo;
    Т.CopyByX("v3|h3");
    пКолВо:=пКолВо+1;
  Else
    //Вывод обычной строки
    Т.CopyByX("v2|h1",1);
    For i:=1 to спТипыЦен.Size() Do
      пЦ:=глНайтиЦену(З.зН,спТипыЦен.Get(i),ДатаФормирования);
      Т.CopyByX("v2|h2");
    EndDo;
    Т.CopyByX("v2|h3");
  EndIf;

  //Вывод информации о состоянии формирования отчета
  пКолВо:=пКолВо+1;
  //Этот текст выводится в строку состояния
  Form.StatusText(""+пКолВо+" из "+З.ResultTable.Size());
  //Этот текст выводится в виде индикатора выполнения, как подсказка при наведении курсора мыши на кнопку задачи отчета
  Form.UpdateProgress(пКолВо,З.ResultTable.Size());
EndDo;
//Выведем нижнюю границу отчета
Т.CopyByX("v4|h1",1);
For i:=1 to спТипыЦен.Size() Do
  Т.CopyByX("v4|h2");
EndDo;
Т.CopyByX("v4|h3");

//Изменим параметры печати
Т.Printing.Orientation:=1;
Т.Printing.ScaleMode:=1;
//Режим просмотра для удобства пользователя
Т.EditorMode:=1;
//Выводим на экран или принтер?
If флВывестиСразуНаПринтер Then
  Т.Printing.Printer:=тПринтер;
  Т.Print();
Else
  Т.Show(пЗагол);
EndIf;