Каждое утро, проснувшись, я смотрю в "Форбосе"
список богатейших людей Америки.
Если меня там нет, я иду на работу.
Начало дня Роберта Орбена.
1С:Школа.
Выпуск 36.
"Работа с таблицами (часть 4) Расшифровка таблиц".
Вы уже, наверное, заметили, что 1С, позволяет делать так называемую расшифровку ячеек таблицы: если дважды щелкнуть по ячейке, то система раскрывает ее содержимое. На самом деле, расшифровка присутствует не везде, а только там, где ее предусмотрел автор конфигурации. Сегодня Вы познакомитесь с механизмом расшифровки. А на следующем уроке, мы с Вами рассмотрим подробно, как расшифровываются стандартные бухгалтерские отчеты в типовой конфигурации 1С бухгалтерии.
Для создания расшифровок таблиц используется свойство «Расшифровка» ячейки таблицы. Это свойство является полем, в которое можно записать любое выражение на встроенном языке 1С. В момент вывода ячейки, значение выражения будет вычислено и помещено в ячейку. НО: пользователю, при просмотре таблицы, значения выражений из поля «расшифровка» не видны. Эти значения надо специальным образом обрабатывать, после того, как пользователь дважды щелкнет по ячейке (или выделит ячейку и нажмет «Enter»). Но существует встроенный механизм, для обработки определенный значений. Автоматически будут выведены на экран значения типа:
Элемент справочника и документ будут открыты для просмотра в режиме редактирования. Но возможно и написать свой обработчик события двойного щелчка по ячейке. Хороший пример «рукописного» обработчика Вы можете найти в оборотно-сальдовой ведомости: если дважды щелкнуть по оборотам, то открывается меню, в котором пользователь может выбрать, что захочет. В своем обработчике Вы можете написать все, что угодно, например, удаление элементов справочника, по которым Вы будете дважды щелкать. Как написать? При двойном щелчке автоматически вызывается процедура ОбработкаЯчейкиТаблицы(). Эта процедура имеет на входе несколько параметров, но нам сейчас важно знать только 2.
ОбработкаЯчейкиТаблицы(знач, флаг);
знач – это значение, которое содержится в поле расшифровка, вычисленное в момент
вывода ячейки.
флаг – флаг стандартной обработки. Если Вы значение флага в теле процедуры
установите равным единицы, то система обработает ячейку стандартным образом,
после того, как Ваша обработка завершится. Например, откроет документ. Если же
флагу стандартной обработки присвоить значение 0, то стандартная обработка не
будет выполняться после завершения Вашей обработки.
Важно: ОбработкаЯчейкиТаблицы(…); может располагаться как в модуле формы, так и в глобальном модуле. Система, после двойного щелчка, сначала ищет процедуру в модуле формы, а затем, если не находит, то ищет ее в глобальном модуле. Таким образом, Вы можете написать один большой универсальный расшифровщик ячеек таблиц, расположив его в глобальном модуле.
Дополнение 1. Если у ячейки таблицы есть расшифровка, то курсор на этой ячейкой превращается в большой крест с лупой.
Дополнение 2: в свойстве «расшифровка» ячейки таблицы, после указания
выражения можно указать символы # и ##.
Указание символа # означает, что данное выражение расшифровки будет
использоваться во всех ячейках этой строки, где не указана своя расшифровка
(поле «расшифровка» - пустое).
Указание символа ## запрещает расшифровку этой ячейки. При двойном щелчке по
такой ячейке, процедура ОбработкаЯчейкиТаблицы() не вызывается.
Примеры расшифровок.
В том случае, если Вы строите отчет по справочнику, то в расшифровку, как правило пишут спр.ТекущийЭлемент(), где спр – это тот справочник, который Вы перебираете. В этом случае будет отрабатывать стандартный механизм обработки ячейки таблицы, и откроется элемент справочника.
В том случае, если Вы перебираете документы, то в расшифровку пишут док.ТекущийДокумент().В этом случае будет отрабатывать стандартный механизм обработки ячейки таблицы, и откроется документ.
В более сложных случаях, в качестве выражения указывают список значений. В список вносят параметры, которые нам могут понадобиться при расшифровке. Рассмотрим пример. Пусть нам надо построить таблицу умножения 10х10. На прошлом уроке мы с Вами изучали метод ПрисоединитьСекцию(). Он нам здесь пригодится. Сделаем простую таблицу – без заголовков столбцов и строк. Значение каждой ячейки будет равно произведению номера строки на номер столбца этой ячейки. Пользователь по двойному щелчку по ячейке, должен увидеть, произведением каких чисел является результат в ячейке. Для этого нам понадобится одна горизонтальная секция («гор») и одна вертикальная секцию («вер»). В качестве выражения укажите « к », а в поле расшифровка «сз». (надеюсь Вы указали без кавычек?) «Сз» - это будет список значений, который будет формироваться в момент вывода ячейки. В этом списке – в первой строке будет номер строки, а во второй строке – будет номер колонки.
Процедура Сформировать()
таб=СоздатьОбъект("Таблица");
сз=СоздатьОбъект("СписокЗначений");
для стр=1 по 10 цикл //цикл по строкам
для кол=1 по 10 цикл //цикл по колонкам
к=стр*кол; //это мы увидим в ячейке
сз.УдалитьВсе();
//а это будет записано в расшифровке
//но мы этого не увидим:)
Сз.ДобавитьЗначение(стр);
Сз.ДобавитьЗначение(кол);
//сформировали список
Если кол=1 Тогда
таб.ВывестиСекцию("гор|вер");
иначе
таб.ПрисоединитьСекцию("гор|вер");
КонецЕсли;
конецЦикла;
конецЦикла;
таб.ТолькоПросмотр(1);
таб.Показать();
КонецПроцедуры
Рассмотрим обработку двойного щелчка
Процедура ОбработкаЯчейкиТаблицы(список, фл)
фл=1;
тип=ТипЗначенияСтр(список);
Если тип="СписокЗначений" тогда //убедились, что это
списокЗначений
фл=0;
з1=Список.ПолучитьЗначение(1);//получаем
значения из списка
з2=Список.ПолучитьЗначение(2);
Предупреждение(""+з1+" х "+з2);
//выводим
конецЕсли;
конецПроцедуры
Все просто. Сначала убедились в том, что на входе у нас действительно список
значений, а потом, получив из него значения, обработали их нужным образом.
Важно: убеждаться в том, что на входе именно тот параметр, который Вам
нужен надо обязательно, так как в больших отчетах может быть все, что угодно. И
каждое значение надо будет обрабатывать своим способом.
Задание для самостоятельной работы. Напишите небольшой отчетик, который
бы выводил список дат за определенный период. При двойном щелчке по дате, должно
выдаваться название дня недели. Внешний вид отчета такой:
1 января 2002 |
2 января 2002 |
3 января 2002 |
4 января 2002 |
5 января 2002 |
Или такой:
1 января 2002 | 2 января 2002 | 3 января 2002 | 4 января 2002 | 5 января 2002 |
На сайте 1С:Школа можно скачать
архив рассылки с 1 по 30 выпуск в rar-архиве. Так же на сайте, открылся новый
раздел "Библиотека". В нем вы найдете подборку книг и методического материала по
1С:Бухгалтерии, 1С:Торговле, 1С:Зарплате, бухгалтерскому учету и
Конфигурированию.
Анонс: готовится большой раздел «Шпаргалка». В этом разделе, в
виде рабочих модулей, будут собраны основные приемы работы со всеми объектами в
1С.