Если Вы действуете в нарушение правил, Вас штрафуют,
если Вы действуете по правилам, Вас облагают налогом.
Принцип Лоуренса Дж.Питера.
.

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. для строк и столбцов создайте заголовки, как изображено на примере. Заголовки  должны быть красного цвета.

  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С:Зарплате, бухгалтерскому учету и Конфигурированию. В разделе "Бухгалтерский учет" есть книга "Бухучет для технарей".


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

Hosted by uCoz