Если Вы действуете в нарушение правил, Вас штрафуют,
если Вы действуете по правилам, Вас облагают налогом.
Принцип Лоуренса Дж.Питера..
1С:Школа.
Выпуск 35 .
"Работа с таблицами (часть 3)".
После небольшого перерыва мы продолжаем изучать таблицы. На предыдущих 2-х уроках мы рассмотрели, как строятся простейшие таблица. Сегодня разберем более сложный пример: как построить таблицу, которая растет не только сверху вниз, но и слева на право. Такие таблицы встречаются довольно часто. И их легко узнать - в этих таблицах неизвестно заранее, сколько будет столбцов. Например,
1. требуется построить прайс лист. В прайс листе должны быть
отражены цены, которые пользователь выберет в диалоге: закупочные, оптовые,
мелко-оптовые, розничные, ,,,,,.
2. требуется построить отчет по остаткам товаров. В отчете требуется отразить
остатки по выбранным пользователем складам.
В обоих случаях количество "выборов" пользователя трудно предугадать. Как строятся такие отчеты?
Для построения потребуется два метода: ВывестиСекцию() и ПрисоединитьСекцию(). Рассмотрим подробнее каждый из методов.
ВывестиСекцию(); - об этом методе мы уже упоминали на уроке №34. Там он использовался для вывода горизонтальных секций. Например Таб.ВывестиСекцию("Шапка"); Таб.ВывестиСекцию("Подвал"); - и так далее. Но в качестве параметра этого метода можно использовать не одну секцию, а пересечение горизонтальной и вертикальной секции. Например, Таб.ВывестиСекцию("Шапка|Основная"); Таб.ВывестиСекцию("Шапка|Дополнительная"); - В этих двух примерах в отчет будут выведены не целиком секции, а ячейки, находящиеся на пересечении указанных секций. В качестве пересечения может выступать как одна ячейка, так и несколько ячеек. Обязательное условие: в качестве параметра передаются 2 секции - одна вертикальная, другая горизонтальная. Иначе пересечения не будет.
ПрисоединитьСекцию(); - метод аналогичен методу ВывестиСекцию(); Все что написано про ВывестиСекцию() - в полном объеме применимо и к ПрисоединитьСекцию(); НО: Метод ВывестиСекцию(); - выводит в отчет новую строку, а метод ПрисоединитьСекцию(); присоединяет, указанные в пересечении ячейки, к ранее выведенным ячейкам с правой стороны. Грубо говоря: метод ПрисоединитьСекцию() - дописывает строку. Сколько он будет "дописывать" ячеек - Вам решать. Это ничем не ограничено. Но в результате, вполне может получиться таблица с разной длиной строк.
Рассмотрим пример. Пусть нам надо вывести таблицу:
11 | 12 | 13 | 14 | 15 |
21 | 22 | 23 | 24 | 25 |
31 | 32 | 33 | 34 | 35 |
41 | 42 | 43 | 44 | 45 |
51 | 52 | 53 | 54 | 55 |
Правило заполнения таблицы простое: первая цифра - это номер строки, вторая цифра - это номер столбца.
Решение: мы хотим сделать заранее универсальный алгоритм - ширина и высота таблицы не будут строго фиксированы. По этому нам не обойтись без ПрисоединитьСекцию(); Порядок действий:
1. Формируем таблицуР. В ней будет одна вертикальная секция ("верт") и одна горизонтальная секция ("гор"). В пересечении этих секций будет находиться одна ячейка и в ней будет выражение <зн>. О том как создавать секции и записывать в ячейки выражения - смотрите предыдущие уроки. Примерно это будет выглядеть так:
верт | ||
гор | <зн> | |
Комментарий: не удивляйтесь - мы пытаемся с помощью одной - единственной ячейки сформировать целую таблицу.
2. Теперь требуется создать процедуру, которая бы выводила таблицу:
//*******************************************
Процедура Сформировать()
таб=СоздатьОбъект("Таблица"); //без этого не получится
для строки=1 по 5 цикл //открываем цикл по строкам
для столбы=1 по 5 цикл //заполняем строку столбцами
зн=строка(строки)+строка(столбы); //формируем то, что будем выводить
Если столбы=1 Тогда //если первый столбец, то с новой строки
таб.ВывестиСекцию("гор|верт");
иначе //если столбец не первый, то продолжаем выводить строку
таб.ПрисоединитьСекцию("гор|верт");
КонецЕсли;
конецЦикла;
конецЦикла;
Таб.ТолькоПросмотр(1);
таб.Показать();//показываем таблицу
КонецПроцедуры
//*******************************************
Простенькая процедура. Вообще, методу ВывестиСекцию(); - синонимом служит "начать новую строку", а методу ПрисоединитьСекцию(); - синонимом служит "продолжить строку". Обращаю Ваше внимание на то, что после того, как Вы с помощью ВывестиСекцию() начали новую строку, Вы не можете подняться в таблице в предыдущие строки и что-то там изменить. Построение таблицы идет по принципу "слева - направо" и "сверху - вниз".
Задание для самостоятельной работы:
доработайте процедуру таким образом, чтобы в пользователь мог задавать правую и нижнюю границу таблицы.
для строк и столбцов создайте заголовки, как изображено на примере. Заголовки должны быть красного цвета.
1 | 2 | 3 | 4 | 5 | |
1 | 11 | 12 | 13 | 14 | 15 |
2 | 21 | 22 | 23 | 24 | 25 |
3 | 31 | 32 | 33 | 34 | 35 |
4 | 41 | 42 | 43 | 44 | 45 |
5 | 51 | 52 | 53 | 54 | 55 |
Для тех, кто ищет реальное применение приобретаемым знаниям, предлагаю сделать следующий отчет:
01.01.02 | 02.01.02 | 03.01.02 | .......... | |
ООО Ротон | ||||
ООО Лотос | ||||
ЗАО Донак | ||||
ЧП Васильев | ||||
Итого |
Столбцы - это даты. Строки - Ваши покупатели. На пересечении столбцов и строк - сумма отгрузки соответствующему покупателю. Период за который требуется сформировать отчет - выбирается в форме. Для тех, кто работает с зарплатой: строки - это сотрудники, столбцы - месяцы, пересечение - любое начисление/удержание по сотруднику за данный месяц. Не забудьте подсчитать итоговые суммы как по стокам, так и по столбцам.
Несколько задач повышенной сложности по этой теме, Вы сможете найти в разделе "Факультатив" на сайте 1С:Школы.
На сайте 1С:Школа можно скачать архив рассылки с 1 по 30 выпуск в rar-архиве. Так же на сайте, открылся новый раздел "Библиотека". В нем вы найдете подборку книг и методического материала по 1С:Бухгалтерии, 1С:Торговле, 1С:Зарплате, бухгалтерскому учету и Конфигурированию. В разделе "Бухгалтерский учет" есть книга "Бухучет для технарей".