Difference between revisions of "Table.CopyByX"
(No difference)
|
Revision as of 15:44, 8 August 2020
| 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, атрибут CurPutX примет значение 1, а CurPutY увеличится на высоту предыдущей области.
- Будут скопированы ячейки диапазона
1:7,2:7в результирующую таблицу в область, начинающуюся с верхней левой ячейки<CurPutX>:<CurPutY> - Будет произведен поиск переменной
пДатаи значение копируемой ячейки будет изменено на ее значение (если переменная не существует, будет вызвано исключение). Для копируемых ячеек, содержащих вычисляемые выражения, а не просто переменные, будет произведено вычисление выражений. - Атрибут CurPutX увеличится на 2 (ширина области).
- Если третий параметр равен нулю, в таблице, в которую производится копирование, будет изменена ширина столбцов CurPutX-2 и CurPutX-1 в соответствии с шириной столбца 1 и 2 таблицы-шаблона, высота строки будет подсчитана автоматически исходя из высот всех ячеек, уже находящихся в строке CurPutY (так как строка на рисунке имеет установку автоматической высоты).
- Будут скопированы неразрывные регионы, попадающие в область (в данном примере отсутствуют).
- Будут скопированы разбиения страницы, попадающие в область (в данном примере отсутствуют).
- Будут скопированы объекты таблицы, попадающие в область (в данном примере отсутствуют), для значений объектов, с установленным флажком "значение для вычисления", значения будут вычислены, как это происходило для значений ячеек. Для каждого скопированного объекта, будет вызвано событие 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;
