Работа с Таблицами
Для работы с табличными документами в системе используется специальный агрегатный тип данных «Таблица». Основным назначением табличного документа в системе 1С:Предприятие является создание печатных форм отчетов и первичных документов.
Печатные формы формируются при помощи встроенного языка с использованием агрегатного объекта «Таблица», создаваемого функцией СоздатьОбъект. Наиболее типичным способом заполнения табличного документа является включение в него секций. Для этого используется исходный табличный документ, который может располагаться в той же форме, в тексте программного модуля которого создан агрегатный объект «Таблица». Кроме того, исходная таблица может располагаться и в общих таблицах конфигурации и во внешнем файле. Назначение исходного табличного документа выполняется методом объекта «Таблица» — ИсходнаяТаблица.
Исходная таблица является заготовкой, содержащей текстовые фрагменты отчета, рамки, рисунки и т. д. Исходная таблица может быть включена в создаваемый отчет целиком. Однако часто необходимо включать в отчет отдельные фрагменты заготовки в определенной последовательности. Например, при печати накладной, нужно один раз вывести шапку и много раз вывести строку документа. Для этого части исходной таблицы выделяются в виде фрагментов-секций. Метод ВывестиСекцию позволяет включить выделенный фрагмент исходной таблицы в формируемый табличный документ.
В ячейках исходной таблицы может размещаться обычный текст или выражение встроенного языка 1С:Предприятия. При включении в табличный документ секции исходной таблицы автоматически происходит вычисление всех выражений и в табличный документ уже включается секция, содержащая результаты этих вычислений. Таким образом, происходит заполнение включаемых секций конкретными данными. Описанный способ, с одной стороны, позволяет наиболее наглядным образом визуально в исходной таблице спроектировать внешний вид и содержание отчета, а с другой, позволяет достаточно просто включать подготовленные фрагменты в заполняемый табличный документ.
Приведем пример формирования таким способом печатной формы документа.
Пример:
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ПечатьСчета");
Таб.ВывестиСекцию("Шапка");
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.Показать();
В приведенном примере в ячейках секций "Шапка" и "Строка" исходной таблицы располагаются выражения выдающие различные реквизиты документа.
Существует другой способ заполнения данными включаемых секций. Этот способ отличается от описанного тем, что в секциях ячеек не задаются выражения. Заполнение секции данными описывается прямо в алгоритме программного модуля. Для этого секция сначала выбирается из исходной таблицы, затем в ней заполняются значениями ячейки, в которых должны выводиться данные, а затем секция включается в табличный документ. Для получения секции из исходной таблицы используется метод ПолучитьСекцию. Полученная секция запоминается в переменной как специальный объект типа «СекцияТаблицы». Для того, чтобы в этом объекте можно было заполнять отдельные ячейки им нужно предварительно задать имена в исходной таблице. У объекта «СекцияТаблицы» отдельные именованные ячейки являются атрибутами, имеющими тип «ОбластьТаблицы» (область может содержать и несколько ячеек). Заполнение ячеек выполняется присвоением атрибуту "Текст" объекта «ОбластьТаблицы» необходимых значений.
Приведем пример формирования табличного документа этим способом.
Пример:
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ПечатьСчета");
Шапка = Таб.ПолучитьСекцию("Шапка");
Шапка.Клиент.Текст = Контрагент;
Шапка = Таб.ВывестиСекцию(Шапка);
......
ВыбратьСтроки();
Пока ПолучитьСтроку () = 1 Цикл
Строка = Таб.ПолучитьСекцию("Строка");
Строка.Товар.Текст = Товар;
......
Строка = Таб.ВывестиСекцию(Строка);
КонецЦикла;
Таб.Показать();
Этот способ может применяться в отдельных случаях для ускорения заполнения табличного документа, если для заполнения данными используются достаточно сложные выражения. Кроме того, этот способ позволяет манипулировать при включении секций различными свойствами ячеек. Например, можно для отдельных ячеек устанавливать жирный шрифт.
Кроме описанных способов существует способ заполнения табличного документа путем непосредственного обращения к ячейкам таблицы без использования в качестве заготовки исходной таблицы. Для этого используется метод Область, позволяющий по координатам строки и столбца исходной таблицы получить объект типа «ОбластьТаблицы». Атрибуты и методы этого объекта позволяют задать содержимое и элементы оформления ячеек (текст, цвета, рамки и т. д.).
Приведем фрагмент примера печати документа этим способом.
Пример:
Таб = СоздатьОбъект("Таблица");
Таб.Область(2, 3).Текст = Контрагент;
......
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Таб.Область(НомерСтроки + 3, 3).Текст = Товар;
......
КонецЦикла;
Таб.Показать();
Этот способ используется в основном для создания универсальных отчетов, для которых невозможно определить заранее их внешний вид. Заметим, что такой способ является наиболее трудоемким с точки зрения написания алгоритма.
Во всех описанных способах основным содержанием ячеек таблицы является текст. При заполнении ячеек все данные преобразуются к текстовому виду. Кроме того, у ячейки может заполняться значение расшифровки. Это дополнительная возможность, которая никак не влияет на внешний вид таблицы при просмотре и печати, а используется для создания связанных отчетов и открытия различных объектов, отображаемых в отчете. При просмотре сформированного отчета в режиме «только просмотр», при подведении курсора к ячейке, у которой заполнено значение расшифровки, курсор принимает форму крестика с лупой и при двойном щелчке мышью или нажатии клавиши <Enter> выполняется отработка значения расшифровки.
Стандартный механизм расшифровки позволяет открыть объект (документ, элемент справочника, счет). Кроме того, использование специальной предопределенной процедуры позволяет определить в модуле формы специальные действия по отработки расшифровки, например построение детализирующего отчета.
Заполнение значения расшифровки при включении секций из исходной таблицы выполняется автоматическим вычислением значения выражения указанного в поле «Расшифровка» закладки «Текст» свойств ячейки. При использовании двух других описанных способов значение расшифровки может быть заполнено с помощью метода Расшифровка объекта типа «ОбластьТаблицы».
Заметим, что указанием "#" в поле «Расшифровка» закладки «Текст» или параметра метода Расшифровка можно включить режим, при котором расшифровка будет действовать на всю строку таблицы, что позволит избежать Дублирования значений для нескольких ячеек и, тем самым, избежать излиш-иих затрат времени при формировании отчета на вычисление выражений расшифровки.
Описанный выше способ заполнения табличного документа созданного функцией СоздатьОбъект открывает табличный документ в отдельном окне при использовании метода Показать. Кроме того, при настройке формы отчета (обработки), существует возможность табличный документ разместить непосредственно в форме. Для этого в диалоге, вызываемом пунктом «Свойства формы» меню «Действия» в параметре «Использовать таблицу» выбирается вариант «Пустую». В этом случае при открытии формы непосредственно в ней размещается табличный документ. Он может заполняться так же, как и табличный документ, созданный функцией СоздатьОбъект. Для доступа к такой таблице используется атрибут контекста формы отчета (обработки) Таблица.
Кроме описанного использования табличного документа для вывода сформированных печатных форм, существует возможность использования табличного документа в специальном режиме для ввода данных. Этот режим доступен только в формах отчета (обработки). Данный режим использования табличного документа включается через свойства формы (вызов свойств формы выполняется из меню «Действия» пунктом «Свойства формы» в параметре «Использовать таблицу» выбирается вариант «Для ввода данных»).
Режим ввода данных позволяет совместить в одной форме отчета (обработки) диалог формы вместе с табличным документом или вовсе заменить диалог табличным документом. Этот режим предполагает обязательное наличие созданной в форме отчета (обработки) таблицы, которая выбирается в свойствах формы, как используемая для ввода данных. В этом режиме в свойствах ячеек табличного документа появляется дополнительная закладка, на которой определяется тип данных хранимых ячейкой, аналогично элементу диалога формы. Для ячеек, в которых предполагается вводить данные, в закладке «Текст» выключается признак «Защита». При открытии формы с установленным свойством использование таблицы для ввода данных, указанная таблица размещается в окне формы и пользователю предоставляется возможность интерактивно вводить значения ячеек, предназначенных для ввода, аналогично вводу в поля диалога.
Работа в режиме ввода данных имеет ряд особенностей с точки зрения обращения к таблице средствами встроенного языка. Прежде всего, доступ к используемой для ввода данных таблице в модуле формы отчета (обработки) осуществляется с помощью ключевого слова "Таблица". Кроме того, в модуле формы возможно непосредственное обращение к значениям именованных ячеек таблицы по их именам. При обращении к области таблицы, используемой в режиме ввода данных, кроме обычных атрибутов используется атрибут "Значение", также предоставляющий доступ к значению ячейки. При этом тип значения определяется типом, выбранным в закладке свойств ячейки «Данные».
Для таблицы, используемой для ввода, в свойствах ячеек данных задаются-формулы. Для ячеек, предназначенных для ввода, формула выполняется после ввода значений, как у реквизитов диалога и используется обычно для вызова процедуры заполнения других ячеек. У ячеек имеющих признак «Защита» формула является выражением и вычисляет собственно значение ячейки как у элементов диалога типа «Текст».
Применение табличного документа для ввода данных используется в специальных случаях, например, когда необходимо ввести большое количество данных или необходимо, чтобы форма ввода была оформлена с использованием разнообразных шрифтов, рамок, картинок и т. п.