Когда работу теряет Ваш сосед - это экономический спад,
когда Вы сами - экономический кризис.
Г.Трумэн
.

1С:Школа.
Выпуск 34 .
"Работа с таблицами (2 часть)".


    В прошлом выпуске мы говорили о том, как работать с ячейками и создавать из них секции. Сегодня поговорим от том, как управлять из модуля секциями и получать готовые полноценные таблицы.

   При построении печатных форм отчетов и документов есть одно правило.  Когда вы строите отчет, то можете дописывать любую информацию снизу отчета или справа от только что выведенной секции. Это означает, что если Вы вывели строку товара в отчет,  то вставить, что-то выше (над этой строкой) будет уже нельзя. Так же нельзя будет сдвинуть наименование товара вправо, а слева, в освободившемся месте, написать, например,  код товара. Поэтому, Вы должны всегда помнить при построении отчета, что отчет строится слева на право и сверху вниз. Это легко запомнить, если вы пишете слева на право и сверху вниз:)  Сегодня поговорим о простейшей таблице, которая будет заполняться сверху вниз. Этот способ построения пригоден для создания печатных форм большинства документов. Но этот способ не позволит Вам построить отчет типа "Шахматки" или другой отчет, где количество столбцов заранее не известно.

Для работы с таблицейР из модуля служит объект "Таблица". При создании печатной формы, Вам не обойтись без этого объекта, поэтому в тексте должна быть строка
ИмяПерем=СоздатьОбъект("Таблица");
где имяПерем - имя переменной, через которую Вы будете обращаться к ТаблицеР. Я рекомендую Вам сразу определиться и использовать для работы с таблицами одну переменную - менбше ошибок будет. Я использую переменную "Таб"  и в тексте у меня всегда есть строка
Таб=создатьОбъект("Таблица);

Далее понадобится метод ИсходнаяТаблица. Этот метод позволяет задать таблицуР, с которой Вы намереваетесь работать. Имя таблицыР написано на закладке, на которой расположена ТаблицаР. По умолчанию это имя "Таблица". Но если Вы зайдете в общие таблицыР, то увидите, что имен может быть много и свой объект надо сориентировать на определенную таблицуР. Формат метода прост:
Таб.ИсходнаяТаблица("ИмяТаблицы"); 
В прошлом выпуске я говорил, что таблицыР могут быть - рядом с диалогом (модулем), в общих таблицах и во внешних файлах в каталоге базы. В этом порядке система ищет нужную ей таблицу - сначала у диалога, если не нашла, то идет в общие таблицы, а если нет в общих таблицах, то идет в файлах смотреть. Но как только находит - останавливается и дальше уже не ищет.

Интересно организована работа по подключению внешних печатных форм в типовой конфигурации. Посмотрите модуль формы документа "Платежное поручение".  В модуле организован просмотр существования внешнего файла, если файл существует, то форма берется их него. А если внешнего файла нет, то таблицаР берется из общих таблиц. "Вырезку" из модуля можно посмотреть ниже.

    Таб = СоздатьОбъект("Таблица"); //создали объект
    ИмяФайлаПечатнойФормы = КаталогИБ()+"ExtForms\PrnForms\1cbpp.mxl"; //вниешняя печатная форма
    Если ФС.СуществуетФайл(ИмяФайлаПечатнойФормы) = 1 Тогда//если она есть
        Таб.ИсходнаяТаблица(ИмяФайлаПечатнойФормы);//то используем ее
    Иначе//а если нет
        Таб.ИсходнаяТаблица("ПлПор");//то используем общую таблицу
    КонецЕсли;

    Это сделано для того, чтобы было удобней обновлять печатные формы документов. Пару лет назад прокатилась волна изменений печатных форм счетов-фактур и платежных поручений и это научило фирму 1С красивым приемам работы:) достаточно положить обновленную форму в нужную папку и назвать ее нужным именем, как система тут же начнет печатать новые бланки. Красота! Совет: используйте и Вы этот прием при создании своих отчетов и документов. Этот способ еще хорош тем, что печатные формы можно редактировать прямо в предприятии, не выгоняя пользователей для сохранения всей конфигурации. Кто хочет ознакомиться с более сложным примером использования внешних печатных форм - можете заглянуть в торговлю 9.0. Там, можно сказать гениальное решение, и весьма полезно для торговой конфигурации.

Следующий метод, который нам понадобится: ВывестиСекцию("ИмяСекции");  Этот метод выводит в таблицу нужную секцию. Важно помнить, что одну и туже секцию Вы можете выводить сколько угодно раз. Каждая секция выводится под предыдущей секцией. В каком порядке секции расположены в таблицеР - не имеет значения! Важен порядок использования метода ВывестиСекцию() в модуле. Посмотрите 2 примера ниже.Если Вы примените эти примеры к одной и той же таблицеР, то получите разные результаты!

Пример1.

Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Торг12");
Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("Содержание");
Таб.ВывестиСекцию("Подвал");
.....................................................

Пример 2.

Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Торг12");
Таб.ВывестиСекцию("Подвал");
Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("Содержание");
.....................................................

    Второй пример, в отличии от первого, выведет "кашу" с точки зрения здравого смысла: сначала подвал, потом шапку документа, а потом уже содержимое. Но с точки зрения встроенного языка - все нормально. Вы сами должны контролировать порядок вывода секций! Это никто за Вас делать не будет!

Показать() - этот метод выводит на экран сформированную печатную форму. Применяется после того, как все методы "ВывестиСекцию()" уже завершили работу и ничего больше не будет выводиться в таблицу.  В нашем случае это будет выглядеть так
Таб.Показать();

Мы рассмотрели с Вами минимальный набор методов, достаточных для построения печатной формы. Осталось закрепить все это на примере и самостоятельных задачах.

Пример. А изменяется от 1 до 10. Создайте таблицу следующего вида:

А 2*А А+2 А*А А^3
1 2 3 1 1
2 4 4 4 8
... ... ... ... ...
10 20 12 100 1000

Решение. Для этого нам понадобится 2 горизонтальных секции: одна для шапки ("Шапка") и одна, чтобы выводить строку ("Содержание").

Секция шапки будет точно такая же как  шапка в таблице, а вот секцию "Содержание" надо сделать следующим образом:

зн зн1 зн2 зн3 зн4

где зн, зн1, зн2, зн3, зн4 - переменные. у этих ячеек должен стоять тип "выражение"! Как только Вы установите тип "выражение",  вокруг переменных появятся знаки <>. Не надо пытаться их стирать, они свидетельствуют о том, что в ячейках стоят выражения. Секция будет выглядеть примерно так:

<зн> <зн1> <зн2> <зн3> <зн4>

Осталось только написать процедуру в модуле.

Процедура Печать()
Таб=СоздатьОбъект("Таблица");
таб.исходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");
Для а=1 по 10 цикл
///заполняем значениями переменные, которые в секции!!!
зн=а;
зн1=2*а;
зн2=а+2;
зн3=а*а;
зн4=а*а*а;
Таб.Вывестисекцию("Содержание"); //в цикле выводим строки
//каждый раз с новыми значениями переменных
конецЦикла;
Таб.Показать();
конецПроцедуры

Это был первый способ потсроения. Второй свособ. Секцию "Содержание" заполним мледующим образом:

<а> <2*а> <а+2> <а*а> <а*а*а>

Пояснение: в ячейки пишем не переменные, а арифметические выражения. Тип ячеек   устанавливаем "выражение". Наша процедура изменится чудесным образом!

Процедура Печать()
Таб=СоздатьОбъект("Таблица");
таб.исходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");
Для а=1 по 10 цикл
Таб.Вывестисекцию("Содержание"); //в цикле выводим строки
конецЦикла;
Таб.Показать();
конецПроцедуры

    В цикле переменная А каждый раз будет принимать новое значение, а содержимое ячеек будет автоматически пересчитываться каждый раз при выводе новой секции.  Хороший и быстрый способ создания таблиц. Но есть одно "НО"! Второй способ будет строить таблицу в несколько раз дольше! На быстром компьютере и маленькой таблице это будет не заметно, но если для Вас важна скорость, тогда таблицу строить надо только первым способом! В чем причина? Модуль инициализируется (читай "компилируется") при открытии формы, после этого он готов к работе. А выражения в ячейках таблицы будут инициализироваться каждый раз при выводе   секции. Сто раз выведите секцию "Содержание"   - система 100 раз (вместо одного, который в модуле) откомпилирует выражения в Вашей секции. Вот и получили проигрыш во времени.  А вообще-то в ячейку можно записать даже условие. Например, ?(а>=5, "А больше или равно 5", "А меньше пяти" );   Работать будет. Но медленно. Поэтому, если надо побыстрей сделать отчет, то первым способом, а если надо сделать быстрый отчет, то все вычисления в модуль!

Самостоятельно:

Дата Месяц (прописью) Год День недели
       

В следующих выпусках: как строить таблицы слева на право с неограниченным количеством колонок, как делать расшифровку таблиц, дополнительные методы и приемы работы с таблицами, таблица как форма для ввода данных. 


Новости: Вышли новые конфигурации: "Торговля и склад" 7.70.911  и  "Зарплата и кадры" 7.70.211. Также обновилась отчетность для бюджета за 2 квартал 2002 для 77 и отчетность для хозрасчета  за 1 квартал 2002 для 77.


На сайте, открылся новый раздел "Библиотека". В нем вы найдете подборку книг и методического материала по 1С:Бухгалтерии, 1С:Торговле, 1С:Зарплате, бухгалтерскому учету и Конфигурированию

В разделе "Уроки"  - есть архив первых тридцати выпусков рассылки.


Алексей Колосов

Hosted by uCoz