Текст
                    Д.И.Гончаров
Е. Ю. Хрусталева
Решение
специальных
прикладных задач
в «1С:Предприятии 8.2»
Москва
2012

УДК 658.012.011.56:004.42 ББК 65.29 Г65 Г65 Гончаров Д. И. Решение специальных прикладных задач в «1С:Предприятии 8.2» / Д. И. Гончаров, Е. Ю. Хрусталева. - М.: 1С-Паблишинг, 2012. - 300 с.: ил. - (Профессиональная разработка). ISBN 978-5-9677-1611-9 Данная книга посвящена углубленному изучению вопросов создания и модификации прикладных решений на платформе «1 С:Предприятие 8.2». Она является частичной переработкой популярной книги «Профессиональная разработка в системе 1С:Предприятие 8». В книге рассказывается о механизмах платформы «1 С:Предприятие», которые позволяют решать прикладные задачи узкой направленности. Это задачи описания и автоматизации бизнес-процессов, а также задачи статистического анализа данных и построения прогнозов на основе имеющейся выборки. Кроме этого, значительная часть книги посвящена использованию интерфейсных объектов, помогающих представить аналитическую информацию в удобном и понятном виде. Это различные диаграммы, включая диаграмму Ганта, географическая схема, табличный документ и графическая схема. Настоящее пособие рассчитано на разработчиков, обладающих некоторым навыком создания и модификации прикладных решений в системе «1 С:Предприятие 8.2» и желающих повысить свой профессиональный уровень. Также книга будет интересна IT-специалистам, не занимающимся разработкой, но желающим получить представление о возможностях системы, ее идеологии, архитектуре и реализации конкретных механизмов. Рассматриваемые в книге инструменты и механизмы описаны исходя из возможностей, предоставляемых версией 8.2.14.540 технологической платформы «1С:Предприятие 8.2». Данная книга является завершающей в серии «Профессиональная разработка». Ранее были выпущены книги «Реализация прикладных задач в системе 1 (^Предприя- тие 8.2», «Технологии интеграции 1С:Предприятия 8.2», «Инструменты для создания тиражируемых приложений 1С:Предприятия 8.2», «Архитектура и работа с данными 1С:Предприятия 8.2». Рекомендуем также обратить внимание на книгу «Разработка управляемого интерфейса», выпущенную вне серии. Книга выпущена под редакцией Максима Радченко. Группа подготовки издания: Дизайн обложки — Кира Федотова. Литературное редактирование, корректура — Елена Семененко. Верстка, препресс - Ольга Шестакова. 4 601546 092694 ISBN 978-5-9677-1611-9 Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Полное или частичное копирование материалов книги без письменного разрешения фирмы «1С-Паблишинг» запрещается. © ООО «1С-Паблишинг», 2012 © Оформление. ООО «1С-Паблишинг», 2012
Оглавление Введение.................................................................7 Глава 1. Механизм бизнес-процессов.......................................9 Первое знакомство.....................................................11 Карта маршрута........................................................12 Точки маршрута........................................................17 Точка старта, точка завершения......................................18 Точка действия......................................................19 Точка условия.......................................................23 Точка выбора варианта...............................................25 Точка разделения, слияния...........................................26 Точка обработки.....................................................27 Точка вложенного бизнес-процесса....................................28 Состояния бизнес-процесса.............................................28 Старт бизнес-процесса.................................................32 Программный старт бизнес-процесса...................................34 Интерактивный старт бизнес-процесса.................................34 Интерактивная активация бизнес-процесса.............................35 Старт бизнес-процесса как вложенного................................38 Старт бизнес-процесса с несколькими точками старта..................42 Завершение бизнес-процесса............................................44 Задачи................................................................45 Формирование задач..................................................47 Выполнение задач....................................................49 Проверка выполнения.................................................52 Форма списка задач..................................................54 Обратная связь...................................................... 58
4 Решение специальных прикладных задач в «1С Предприятии 8» Примеры реализации бизнес-процессов...............................................61 Единый объект «Задача»..........................................................61 Бизнес-процесс «Продажа товара».................................................71 Бизнес-процесс «Продажа товара с предоплатой»...................................80 Бизнес-процесс «Поручение»......................................................81 Бизнес-процесс «Обход»..........................................................90 Бизнес-процесс «Согласование»...................................................93 Глава 2. Использование механизма анализа данных и прогнозирования..................................................................105 Общие положения..................................................................106 Основные объекты механизма.....................................................107 Типы анализа данных............................................................109 Общая статистика.............................................................109 Поиск ассоциаций.............................................................109 Поиск последовательностей....................................................110 Кластерный анализ............................................................110 Дерево решений...............................................................110 Модели прогноза................................................................111 Тип анализа «Общая статистика»...................................................111 Тип анализа «Поиск ассоциаций»...................................................116 Типы отсечения правил..........................................................120 Отсечение покрытых правил....................................................121 Отсечение избыточных правил..................................................121 Тип анализа «Поиск последовательностей»..........................................122 Тип анализа «Дерево решений».....................................................126 Тип анализа «Кластеризация»......................................................132 Используемые метрики...........................................................137 Евклидова метрика............................................................138 Евклидова метрика в квадрате.................................................138 Метрика города...............................................................139 Метрика доминирования .......................................................139 Методы кластеризации...........................................................140 Ближняя связь................................................................140 Дальняя связь................................................................140 Центр тяжести................................................................141 к-средних....................................................................141 Вывод данных в дендрограмму..................................................142 Проведение прогнозов.............................................................143 Модель прогноза................................................................147 Глава 3. Географические схемы......................................................149 Основные понятия.......ь...................... ....................... ................................................................150 Основы работы с географическими схемами..........................................152
Оглавление Работа с объектами географической схемы из встроенного языка.............155 Примеры работы с географической схемой.................................156 Отображение географической схемы в форме.............................157 Выбор города на географической схеме.................................158 Отчет «Продажи по регионам»..........................................161 Глава 4. Диаграммы.........................................................173 Примеры работы с диаграммами.............................................175 Заполнение данными и отображение диаграммы.............................175 Круговая диаграмма...................................................175 Гистограмма..........................................................178 Измерительная диаграмма..............................................181 Глава 5. Диаграмма Ганта...................................................185 Примеры работы с диаграммой Ганта........................................186 Глава 6. Графические схемы.................................................195 Основы работы с графической схемой.......................................196 Примеры работы с графической схемой......................................198 Глава 7. Табличный документ................................................203 Общие свойства табличного документа......................................204 Области табличного документа.............................................211 Обращение к области ячеек..............................................211 Обращение по номерам строк и колонок.................................211 Обращение по адресу..................................................213 Обращение по имени...................................................214 Обращение к пересечению областей.....................................216 Общие свойства областей..............................................217 Оформление областей....................................................217 Скрытие областей.....................................................217 Защита областей......................................................218 Высота строк.........................................................218 Ширина колонок.......................................................219 Цвет фона и узор.................................................... 220 Объединение ячеек....................................................220 Группировка..........................................................221 Границы..............................................................222 Примечание...........................................................223 Очистка..............................................................224 Свойства области, относящиеся к тексту.................................224 Текст и шрифт........................................................224 Вертикальное и горизонтальное выравнивание...........................225 Ориентация...........................................................226 Отступ...............................................................226 Размещение...........................................................227
6 Решение специальных прикладных задач в «ЮПредприятии 8» Цвет...................................................................227 Выделение отрицательных................................................227 Работа с областями табличного документа..................................228 Тип области............................................................228 Текущая область........................................................228 Выделенные области.....................................................229 Копирование области....................................................231 Удаление области.......................................................234 Очистка................................................................235 Поиск текста...........................................................235 Рисунки табличного документа...............................................236 Общие свойства рисунков табличного документа.............................237 Имя и тип..............................................................238 Размеры рисунка........................................................238 Ограничивающая линия...................................................239 Заполнение рисунка.....................................................241 Защита рисунка.........................................................242 Рисунки типа «Текст».....................................................242 Рисунки типа «Картинка»..................................................245 Рисунки, содержащие объекты................................................246 Рисунки типа «Прямая»....................................................249 Использование макетов табличных документов.................................251 Формат макета табличного документа.......................................251 Процедура формирования табличного документа..............................253 Получение строк макета на разных языках................................264 Использование расшифровки в табличном документе..........................265 Печать табличного документа................................................270 Свойства областей и рисунков табличного документа, управляющие печатью...278 Использование табличного документа в форме.................................279 Использование события «ПриАктивизацииОбласти»............................282 Использование события «Выбор»............................................283 Расшифровка в поле табличного документа..................................285 Перетаскивание в табличном документе.....................................291
Введение В книге собрана и систематизирована наиболее важная информация, которая может понадобиться разработчику прикладных решений «1С:Предприя- тия 8.2». Несмотря на то, что в одной книге невозможно рассмотреть все ситуации, возникающие при разработке прикладных решений, на большинство вопросов в книге можно найти ответы. Причем читать будет одинаково интересно как начинающим, так и продвинутым разработчикам. При написании мы стремились к тому, чтобы книга стала серьезным инстру- ментом для разработчиков: к ней всегда можно было бы обратиться в случае затруднений, узнать что-то новое о хорошо известной предметной области или познакомиться с новым взглядом на привычные вещи. При подготовке материала были использованы различные источники инфор- мации: опыт преподавания на учебных курсах по платформе и прикладным реше- ниям «1С:Предприятия 8»; опыт внедрения прикладных решений; опыт, накопленный разработчиками фирмы «1С»; материалы информационно-технологической поддержки (ИТС); материалы форума партнеров-разработчиков на сайте http://partners.v8.1c.ru; общение на партнерских семинарах, проводимых фирмой «1С».
8 Решение специальных прикладных задач в «1С:Предприятии 8»
Глава 1. Механизм бизнес-процессов С точки зрения автоматизации деятельность любой организации, предпри- ятия представляет собой набор совершаемых сотрудниками операций. Очень часто эти операции не существуют по отдельности, а являются логическим следствием выполнения предыдущих действий (операций), т. е. являются элементом какой-либо технологической цепочки. Простым примером такой цепочки может являться процесс получения денег подотчетным лицом. В нем можно выделить следующие этапы: заявка на получение денежных средств; рассмотрение заявки руководителем подразделения (на предмет необходи- мости); и рассмотрение заявки главным бухгалтером (на предмет наличия денежных средств); выдача кассиром денежных средств; отчет об израсходованных средствах (авансовый отчет). Главный бухгалтер не будет рассматривать возможность выдачи денежных средств без наличия визы руководителя подразделения, кассир не будет выда- вать деньги без указания главного бухгалтера, или если денег попросту нет ит.д.
Решение специальных прикладных задач в «^Предприятии 8» Другим примером может являться операция продажи товара оптовому поку- пателю. В данной операции можно выделить следующие этапы: выписка заказа покупателя, получение оплаты за товар, сборка заказа на складе, отгрузка товара. В контексте последней цепочки представим одну из задач, которая может возникнуть перед руководством организации, предприятия. Компания стремительно набирает обороты (огромное спасибо сотрудникам отдела рекламы). Для того чтобы рост организации в какой-то момент не оста- новился, необходимо заранее подумать о своевременном наборе (и обучении) сотрудников, расширении штата. И вот он сам вопрос: «Кого набирать?». Набрать сотрудников в отдел рекламы... Но если не хватает персонала на выписке счетов, то это может привести не к росту, а, наоборот, к падению оборотов компании (за организацией может закрепиться репутация «не жела- ющих даже счет выписать»). Набрать менеджеров по выписке счетов... Но если сотрудники склада не будут справляться с задачей своевременной подготовки товара к отгрузке, это также может привести к плачевному резуль- тату. Что же делать? Спросить у персонала? Ответить на этот вопрос практически невозможно, если при решении задачи использовать данные только об отдельно осуществляемых операциях. Эти операции необходимо рассматривать как этапы единой цепочки действий. Только при рассмотрении данного процесса как единого целого можно опре- делить узкий (и потенциально опасный) участок. С другой стороны, в реальной жизни не бывает простых процессов. Обычно этапы, из которых они состоят, конкретные исполнители этих этапов опреде- ляются в ходе выполнения процесса и зависят от множества факторов. При отражении в учете таких сложных цепочек перед сотрудником (который ведет учет) может встать довольно сложная задача: какие документы использовать, в какой последовательности их вводить и как. Любая программа (конфигу- рация) дает пользователю определенную свободу действий по отражению той или иной отдельно взятой операции, но с точки зрения всего процесса может оказаться, что существует только один-единственный правильный вариант. Чтобы не ошибиться, сотрудник должен в полном объеме представлять особенности отражаемого процесса и особенности работы конфигурации, в которой ведется учет. Что при наличии большого количества таких цепочек (и определенной текучке в кадрах) не всегда достижимо. Кроме этого, конкретный исполнитель иногда (можно сказать, что и чаще всего) и не должен знать всю цепочку, он отвечает только за ее конкретный
Глава 1. Механизм бизнес-процессов В ] ] участок. Не зная всей картины, он по определению не может принять опти- мального (верного) решения. Как говорится, как он может думать, не зная всех входных условий процесса? Получается, что при таком варианте орга- низации работы конечного пользователя должен быть кто-то (или что-то), кто подсказывал бы пользователю, что именно сейчас нужно сделать именно так и никак иначе. Возложить эту операцию на человека? (См. абзац выше...) Идеальным вариантом (для учета сложных процессов) является переход от учета «от документа» (когда пользователь должен знать, какие документы, в какой последовательности, с какими особенностями он должен завести) к процессному учету (когда сам программный комплекс будет подсказы- вать пользователю, что он сейчас должен сделать). В соответствии с логикой процесса, особенностями его старта определяется текущий этап, по возмож- ности определяется исполнитель, особенности отражения операции и т. п. Для ведения учета (и автоматизации) цепочек действий в конфигурациях «1С:Предприятия» могут использоваться такие объекты, как бизнес-процессы и задачи. Первое знакомство Бизнес-процессы в «1С:Предприятии» позволяют объединить отдельные операции в цепочки взаимосвязанных действий, приводящих к достижению конкретной цели. Они позволяют формализовать процедуры обработки тех или иных событий, возникающих в деятельности организации, и обеспечить участие в них исполнителей. Цепочки взаимосвязанных действий бизнес-процесса представляются с помощью карты маршрута бизнес-процесса. Карта маршрута описывает логику бизнес-процесса и весь его жизненный цикл от точки старта до точки завершения. Она реализована в виде схематического изображения последо- вательности прохождения взаимосвязанных точек маршрута. Точка маршрута отражает определенный этап жизненного цикла бизнес- процесса и обычно связана с выполнением какой-либо операции (ручной или автоматической). Задачи в «1С:Предприятии» соответствуют пользовательским заданиям (что должен сделать определенный пользователь). Выполнение задачи приводит к продвижению бизнес-процесса от одной точки к другой. Сами задачи могут создаваться как бизнес-процессом (в соответствии с картой маршрута), так и программно. Опишем цепочку продажи товара с точки зрения введенных терминов.
] 2 Решение специальных прикладных задач в «^Предприятии 8» Цепочка действий, выполняемая по одному выписанному счету, будет являться элементом (экземпляром) бизнес-процесса. Можно провести аналогию со справочником. Как справочник Номенклатура хранит данные обо всей номенклатуре (соответствующий объект конфигурации определяет состав реквизитов, табличных частей, формы справочника), а отдельный элемент хранит данные о каком-либо одном товаре (но в соответствии со структурой, определенной для всего справочника), так и элемент бизнес- процесса содержит данные об отдельно взятом процессе (начатом с выписки конкретного счета), но состав этапов, логика их прохождения определяются в соответствии с объектом конфигурации Бизнес-процесс. При переходе к очередному этапу в рамках какого-либо процесса будет создаваться Задача. Задача содержит данные о бизнес-процессе, в рамках которого она создана, этапе этого бизнес-процесса. Кроме этого, задача может содержать данные о пользователе, который должен ее выполнить (либо какие-то другие характеристики такого пользователя, такие как должность, принадлежность к подразделению и т.п.). Например, после выписки счета может создаваться задача Оплата товара. При поступлении денежных средств от покупателя данная задача считается выполненной, и в соответствии с картой бизнес-процесса производится создание следующей задачи Подготовка к отгрузке (осуществляется переход к следующему этапу). Во вновь созданной задаче может быть указано, что она должна быть выполнена пользователем с ролью Кладовщик. Карта маршрута Для редактирования карты маршрута необходимо на закладке Прочее окна редактирования бизнес-процесса нажать кнопку Карта маршрута (рис. 1.1). После открытия окна карты маршрута для ее создания, корректировки можно использовать панель Вставка элементов схемы, в которой определены все возможные точки маршрута, кнопки вставки декораций, линий (рис. 1.2). Панель по умолчанию размещается в нижней части окна конфигуратора, но, как и любая панель инструментов, может быть размещена в любом его месте. При определении карты маршрута допускается использование следующих видов маршрутизации: Жесткая. Линейная, без каких-либо ветвлений; Свободная. Адресаты точки карты маршрута бизнес-процесса не уста- новлены и определяются программно или интерактивно в течение жизненного цикла бизнес-процесса;
Глава 1. Механизм бизнес-процессов Условная. Карта маршрута предусматривает проверку условий и переход по соответствующим ветвям. Переходы могут быть как бинарными (условие), так и множественными (выбор варианта); Параллельная. Карта маршрута предусматривает разделение бизнес-процесса на параллельные ветви с возможностью последующего слияния (ожидания). Продвижение бизнес-процесса по каждой из параллельных ветвей проис- ходит независимо по мере выполнения соответствующих задач. Бизнес-процесс Продажа! овара □ X Основные Подсистемы Функциональные опции Данные Модуль объекта Модуль- менеджера Карта маршрута Нумерация Формы Команды Макеты Ввод на основании Права Обмен данными Прочее Действия Бизнес-процесс Продажа! овара: Карта маршрута ® ОтделПрода Выписать счет [Д Р^ководительОтд,- Утвердить счет <На Скидка по счету выше стандартной? Счет Утвержден? Отмена Рис. 1.1. Редактирование карты маршрута U О В ® В -г - *4 I!) ф ч „ Рис. 1.2. Панель «Вставка элементов схемы»
Решение специальных прикладных задач в «1С:Предприятии 8» На рис. 1.3 приведен пример карты маршрута с жесткой маршрутизацией. Рис. 1.3. Пример карты маршрута с жесткой маршрутизацией В данном бизнес-процессе этапы расположены жестко друг за другом, задачи создаются, выполняются строго в соответствии с их порядком в карте маршрута. На рис. 1.4 приведен пример карты маршрута с условной маршрутизацией. Я Инициатор Доработать документ Рис. 1.4. Карта маршрута бизнес-процесса с условной маршрутизацией Данный бизнес-процесс реализует механизм согласования какого-либо доку- мента. После отработки задачи Утверждение в зависимости от результата (проверяемого в точке условия «Утвержден?») производится либо завер-
Глава 1. Механизм бизнес-процессов 5 }5 шение бизнес-процесса, либо переход к доработке документа с последующим возвратом на утверждение. К условному виду маршрутизации данная карта относится из-за отсутствия параллельных (сходящихся) ветвей. К параллельному виду маршрутизации можно отнести карту следующего вида (рис. 1.5). 4»_____ Менеджер Выписать счет г ____ Разделение Слияние Рис. 1.5. Пример карты маршрута бизнес-процесса с параллельной маршрутизацией В данном бизнес-процессе считается, что после выписки счета его оплата и подготовка к отгрузке (сборка заказа) могут выполняться параллельно, но отгрузка возможна только после выполнения обеих задач (и оплаты, и подго- товки отгрузки). Чаще всего в реальных бизнес-процессах встречаются смешанные виды маршрутизации (и условная, и параллельная и т. п.). При работе с бизнес-процессами существует возможность отображения карты маршрута в пользовательском режиме. При этом в ней будет отражаться текущее состояние бизнес-процесса. Для этой цели в форме бизнес-процесса можно создать реквизит формы КартаМаршрута типа ГрафическаяСхема, перетащить его на форму или создать поле формы вида Поле графической схемы, связанное с рекви- зитом КартаМаршрута. Затем при создании формы бизнес-процесса можно
Решение специальных прикладных задач в «1С:Предприятии 8» получать карту маршрута бизнес-процесса, отражающую его текущее состо- яние, методом ПолучитьКартуМаршрута(). Для этого в обработчике события формы бизнес-процесса ПриЧтенииНаСервере нужно поместить следующий фрагмент кода (листинг 1.1). Листинг 1.1. Пример отображения карты маршрута j &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) КартаМаршрута = ТекущийОбъект.ПолучитьКартуМаршрута(); КонецПроцедуры В результате, например, можно увидеть следующую картину (рис. 1.6). «Ч .W ' Л-> П Предприятие ’ Ц Э ’ - Г..Х; Продажа товара 000000001 от 24.10.2011 20:45:17 Стартовать м закрыть ут| •►Старт р- Все действия » । ^ I Номер Дата: Ведущая задача: Счет: 000000001 |Счет 000000001 от 05.08.2011 1 3131 Расходная накладная: (Расходная накладная 000000003 ст 27.12.2010 12:00:00 Q i Стартовая: Завершен- Карта маршрута: Да Нет Получить наличную Н оплату Рис. 1.6. Пример отображения карты маршрута 2, Отдел продаж Выписать счет DuwaHO счету выше стандартной? 2 Бухгалтер Гд Руководитель отдела Утвердить счет Счет УМверадей?' ± Пройденные точки маршрута отмечаются штриховкой, текущая точка (точки) отмечается красной пунктирной линией (точка, для которой существуют невыполненные задачи).
Глава 1. Механизм бизнес-процессов При необходимости просмотра карты маршрута в других формах (не в форме самого бизнес-процесса) можно использовать следующий фраг- мент кода (листинг 1.2). Листинг 1.2. Пример отображения карты маршрута в форме обработки IIБП - Ссылка на интересующий бизнес-процесс. БизнесПроцессОбъект = БП.ПолучитьОбъекг(); КартаМаршруга = БизнесПроцессОбъект ЛолучитьКартуМарщру^()‘ Результат будет таким же, как и в предыдущем случае. Приведенный пример можно посмотреть в демонстрационной конфигурации «Бизнес-процессы и задачи», прилагающейся к книге на компакт-диске, в обработке РаботаСБП. Точки маршрута Процесс определения карты маршрута (логики поведения бизнес-процесса) состоит в нанесении на карту точек маршрута, определении связей между ними, определении обработчиков событий, специфических для каждой точки. Существует несколько точек маршрута: точка старта, точка завершения, точка действия, точка условия, точка выбора варианта, точка разделения, точка слияния, в точка обработки, точка вложенного бизнес-процесса. У точек некоторых видов есть специфические свойства и события. Например, свойство Групповая есть только у точки действия, а событие ПроверкаУс- ловия - только у точки условного перехода. Также следует отметить, что по умолчанию (если иное поведение бизнес- процесса не описано программно) создание задачи (задач) происходит только при переходе на такие точки маршрута, как точка действия и точка вложен- ного бизнес-процесса. В остальных точках может производиться какая-либо
Решение специальных прикладных задач в «1С:Предприятии 8» обработка данных: проверка условия, выбор варианта продвижения по карте, обработка каких-либо объектов системы и т. п. Рассмотрим точки маршрута подробнее. Точка старта, точка завершения Схематическое изображение данных точек показано на рис. 1.7. Рис. 1.7. Точка старта и точка завершения I-------------------1 Т очка завершения ।___________________। С точки старта бизнес-процесс стартует, в точке завершения (если иное не определено программно) он завершается. У бизнес-процесса может быть определено несколько точек старта и (или) несколько точек завершения. Карта бизнес-процесса может иметь следующий вид (рис. 1.8). Старт с демонстрацией Продажа не состоялась Старт без демонстрации Продажа состоялась Рис. 1.8. Карта бизнес-процесса продажи товара с демонстрацией
Глава 1. Механизм бизнес-процессов 19 Предположим, что старт бизнес-процесса осуществляется оператором, прини- мающим заявки по телефону. В ходе разговора с потенциальным клиентом он выясняет, интересует ли клиента предпродажная демонстрация изделия (клиент уже может быть знаком с данной продукцией и вследствие этого откажется от демонстрации). В зависимости от варианта ответа клиента выбирается та или иная точка старта бизнес-процесса. Если после демонстрации клиент решает купить товар, выполняется цепочка действий, ответственных за продажу. Завершение бизнес-процесса производится либо при покупке товара (продажа состоялась), либо при отказе после демонстрации. Более подробно особенности работы с данными точками (их событиями) описаны в разделах «Старт бизнес-процесса», стр. 32 и «Завершение бизнес- процесса», стр. 44. Точка действия Точка действия является одной из точек, при переходе на которую созда- ется задача или несколько задач (если иное поведение не было определено программно). Допустим вариант, что при переходе на данную точку не будет создана ни одна задача. Эти и другие механизмы, связанные с определением обработчиков событий данной точки маршрута, рассматриваются в разделах, связанных с формированием и выполнением задач. Схематическое представление точки действия на карте маршрута имеет следу- ющий вид (рис. 1.9). 2, Адресация Точка действия Рис. 1.9. Точка действия Как уже сказано выше, обычно при переходе на точку действия производится формирование задачи (или нескольких задач). Одним из важных моментов, которому уделяется внимание (при создании задач), является определение их исполнителей. За данный механизм отвечает так называемая система адре- сации бизнес-процессов. Можно выделить два вида адресации (адресной маршрутизации), реализо- ванной в платформе: Персональная. Пользователь (исполнитель) определяется в явном виде; Ролевая. Исполнитель определяется исходя из назначенных ему ролей, принадлежности к подразделению, а также других реквизитов адресации.
Решение специальных прикладных задач в «^Предприятии 8» Примером персональной адресации может являться указание, что данная задача должна выполняться таким-то пользователем системы. При исполь- зовании ролевой адресации может указываться, что задача должна быть выполнена пользователем с ролью Кладовщик, работающим в подразделении Оптовый склад. Данные, используемые системой адресации, хранятся в регистре сведений. Каждое измерение такого регистра определяет возможный адресный разрез. Одно из измерений обычно связывают с персональной адресацией. Пример структуры такого регистра сведений приведен на рис. 1.10. Рис. 1.10. Структура регистра сведений Имея такой регистр, конкретную задачу можно адресовать либо отдельному сотруднику (измерение Сотрудник), либо сразу нескольким сотрудникам, имеющим одинаковую роль (измерение РольИсполнителя), либо сразу нескольким сотрудникам, относящимся к одному и тому же подразделению (измерение Подразделение). В табл. 1.1 приведен пример заполнения регистра сведений.’ Таблица 1.1. Пример заполнения регистра сведений Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Петров Бухгалтер Администрация Сидоров Кладовщик Оптовый склад Федоров Руководитель отдела Отдел продаж Привязка системы адресации (регистра сведений) к бизнес-процессу осущест- вляется через объект Задача (при конфигурировании бизнес-процесса в нем
Глава 1. Механизм бизнес-процессов указывается ссылка на объект конфигурации Задача). В самой задаче на закладке свойств Адресация определяется ссылка на используемый регистр сведений, и кроме этого необходимо определить используемые реквизиты адресации (рис. 1.11). Рис. 1.11. Установка свойств задачи В качестве основного реквизита адресации обычно выбирают реквизит адре- сации, отвечающий за персональную адресацию. В свойство Текущий исполнитель выбирается параметр сеанса, содер- жащий текущего пользователя (обычно значение в данный параметр сеанса записывается при запуске «1С:Предприятия», исходя из данных автори- зации). При определении реквизита адресации указывается его тип и производится привязка к измерению выбранного регистра сведений (рис. 1.12). Исходя из этого, при самостоятельном определении задачи (а именно свойств, связанных с адресацией) необходимо придерживаться следующего порядка действий: 1. Выбрать ссылку на регистр сведений. 2. Добавить реквизиты адресации. 3. Выбрать основной реквизит адресации.
Решение специальных прикладных задач в «ЮПредприятии 8» Рис. 1.12. Свойства реквизита адресации Для описания способа адресации в каждой точке действия карты маршрута можно использовать свойства группы Адресация (рис. 1.13). ▼ Адресация: Пояснение |Кладовщй| Г рупповая О Сотрудник Р .„:Х. РольИсполнителя «Кладовщик XS Подразделение ОтделПродаж ... х| Рис. 1.13. Свойства точки действия карты маршрута бизнес-процесса В этой группе каждому определенному в задаче реквизиту адресации соответ- ствует свойство. На этапе конфигурирования в них уже можно устанавливать необходимые значения. Однако следует помнить, что для того, чтобы именно в режиме Конфигуратор (создание, редактирование карты маршрута) можно было выбирать необходимые значения, они должны быть определены как предопределенные. Если в группе свойств Адресация точки действия установлены значения, показанные на рис. 1.13, то при переходе бизнес-процесса к данной точке
Глава 1. Механизм бизнес-процессов 23 будет создана одна задача (если иного не определено программно). В соответ- ствующих ее реквизитах адресации будут автоматически записаны указанные при конфигурировании значения (РольИсполнителя = Кладовщик и Подразделение = ОтделПродаж). При отметке свойства Групповая в данной точке будет создаваться столько задач, сколько записей в регистре сведений, ответственном за адресацию, будет найдено с установленными значениями реквизитов адресации. Например, если настройка группы свойств Адресация будет выглядеть так, как показано на рис. 1.14, а регистр сведений будет заполнен данными согласно табл. 1.2, то при переходе бизнес-процесса к данной задаче будут сформированы две задачи с соответствующими значениями реквизитов адре- сации (табл. 1.3). Адресация: Пояснение Групповая Сотрудник Ро льИ сполнигеля Подразделение Рис. 1.14. Свойства точки маршрута бизнес-процесса Таблица 1.2. Данные регистра сведений Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Петров Бухгалтер Администрация Сидоров Кладовщик Оптовый склад Федоров Руководитель отдела Отдел продаж Таблица 1.3. Значения реквизитов адресации Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Федоров Руководитель отдела Отдел продаж Точка условия Для реализации условного ветвления бизнес-процесса используется точка условного перехода. Точка условия обозначается в карте маршрута следу- ющим образом (рис. 1.15). Нет Условие Да. выполнено? Рис. 1.15. Точка условия
24 Решение специальных прикладных задач в «ЮПредприятии 8» Важной особенностью этой точки является обработчик проверки условия, наличие которого обязательно и контролируется при проверке карты марш- рута перед сохранением бизнес-процесса (листинг 1.3). Листинг 1.3. Синтаксис обработчика «ПроверкаУсловия» ПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат); , f у у В обработчике в параметре Результат (Истина, Ложь) возвращается результат проверки условия. Если в параметре возвращается Истина, то бизнес- процесс пойдет по той ветви, которая на карте обозначена особым образом (точкой - см. рис. 1.16). По умолчанию эта ветвь называется Да и находится справа. По умолчанию параметр Результат устанавливается равным значению Ложь. Это говорит о том, что если определить данный обработчик пустым (не содер- жащим внутри код на встроенном языке), то бизнес-процесс пойдет по ветви, не отмеченной точкой (по умолчанию - это ветвь Нет точки условия). Приведем пример обработчика события ПроверкаУсловия для карты марш- рута со следующей схемой (рис. 1.16). Рис. 1.16. Пример карты маршрута Отмена Приведенный пример (листинг 1.4) можно посмотреть в демонстрационной конфигурации «Бизнес-процессы и задачи», прилагающейся к книге на компакт-диске, в модуле объекта бизнес-процесса ПродажаТовара.
Глава 1. Механизм бизнес-процессов 25 ..... - В точке условия «Скидка по счету выше стандартной?» проверяется тот факт, чтобы в табличной части документа Счет (ссылка на него определена в реквизите бизнес-процесса Счет) не было скидки, превышающей значение, хранимое в константе (листинг 1.4). Листинг 1.4. Пример обработчика события «ПроверкаУсловия» Процедура УсловиеОграниченияСкидкиПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) II Определяем значение функции по умолчанию. СкидкаБольшеОбычной = Ложь; " 7777 йгЙЙ; ЙЙЙ ‘ " J . ’7 ^ЙШЙ'Я- яй Й< .‘ЙЙ ОбычнаяСкидка- Константы ОбычнаяСкидка Получить}); 77777;:J:J7:i<:7:7'7' " ' ЯЙЙ7Й7Й':'*Г ч Я® // Проверяем, что скидка не превышает обычную. | й; ..| Для Каждого Элемент Из Счет.Состав Цикл Если Элемент.Скидка > ОбычнаяСкидка Тогда СкидкаБольшеОбычной = Истина; Прервать; КонецЕсли;:. КонецЦикла; Результат = СкидкаБольшеОбычной; КонецПроцедуры; Не стоит путать значение по умолчанию, устанавливаемое обработчиком события, и функциональность переменной СкидкаБольшеОбычной. С по- мощью указанной переменной реализуется следующий алгоритм: «Если найдено превышение, то оставшиеся строки табличной части не перебира- ются». Точка выбора варианта Для реализации многовариантного выбора можно использовать несколько последовательно соединенных точек условного перехода, однако удобнее для этого применять точку выбора варианта. Точка выбора варианта обозначается в карте маршрута следующим образом (рис. 1.17). Точка Наличная .^еяйлаи^ая V, Й й Л Рис. 1.17. Точка выбора варианта
Решение специальных прикладных задач в «^Предприятии 8» Для определения нужного количества вариантов можно использовать пункты контекстного меню точки выбора Добавить вариант, Удалить вариант. Настройка имени варианта производится в свойствах варианта, в нижней его части (группа свойств Вариант), рис. 1.18. Рис. 1.18. Свойства точки выбора варианта Важной особенностью этой точки является обработчик выбора варианта, наличие которого обязательно и контролируется при проверке карты марш- рута перед сохранением бизнес-процесса (листинг 1.5). Листинг 1.5. Синтаксис обработчика события «ОбработкаВыбораВарианта» В переменную Результат должен быть записан один из определенных в точке маршрута вариантов. Для этой цели может использоваться следующий фраг- мент кода (листинг 1.6). Листинг 1.6. Пример установки значения параметра «Результат» Если в процедуре-обработчике выбора варианта не установить какое-либо значение параметра Результат, то это приведет к ошибке и откату тран- закции, в рамках которой выполнялся выбор варианта. Точка разделения, слияния Для разделения бизнес-процесса на несколько параллельно (одновре- менно и независимо) исполняемых ветвей используется точка разделения. Точка разделения имеет один вход и неограниченное количество выходов (рис. 1.19).
Глава 1. Механизм бизнес-процессов Разделение Рис. 1.19. Точка разделения и точка слияния Для синхронизации разделенных ранее ветвей используется точка слияния. Бизнес-процесс не будет выполняться дальше точки слияния, пока все входящие в нее ветви не будут пройдены. Таким образом, точка слияния явля- ется этапом бизнес-процесса, на котором должны быть завершены все задачи по разделенным ранее веткам (рис. 1.20). * Разделение Слияние Рис. 1.20. Использование точек разделения и слияния В приведенном выше примере, пока не будут выполнены обе задачи - и оплата товара, и подготовка к отгрузке, бизнес-процесс не пойдет дальше точки слияния. В ней бизнес-процесс ожидает закрытия всех сходящихся в ней веток. Разделение может быть и без слияния. В этом случае бизнес-процесс будет иметь несколько параллельных ветвей до своего завершения (в нем будет несколько точек завершения). Точка обработки Точка обработки предназначена для выполнения автоматических действий. Схематическое изображение точки на карте маршрута следующее (рис. 1.21). Точка обработки Рис. 1.21. Точка обработки Совершаемые в данном случае действия определяются в обработчике события Обработка (листинг 1.7).
28 Решение специальных прикладных задач в «1С:Предприятии 8» Листинг 1.7. Синтаксис обработчика события «Обработка» Обработка(ТочкаМаршрутаБизнесПроцесса); В данном обработчике события могут определят вся различные регламентные или другие операции, связанные с обработкой данных, выполняемые над объектами базы данных, если их выполнение необходимо для дальнейшего продвижения бизнес-процесса. Обработка проводится в автоматическом режиме и не приводит (в общем случае) к созданию задач. После завершения обработчика бизнес-процесс переходит к следующей точке маршрута в соответствии с картой. Точка вложенного бизнес-процесса Точка позволяет запустить вложенные бизнес-процессы. Схематическое пред- ставление на карте маршрута имеет следующий вид (рис. 1.22). Вло кенный процесс Рис. 1.22. Точка вложенного бизнес-процесса При переходе бизнес-процесса на данную точку маршрута формируется ведущая задача. Для этой ведущей задачи создается и стартует другой бизнес- процесс, который и является вложенным для данного бизнес-процесса. После завершения вложенного бизнес-процесса ведущая задача считается выполненной и осуществляется переход к следующей точке по карте марш- рута данного бизнес-процесса. В общем случае может создаваться не одна, а несколько ведущих задач, для каждой из которых создается и стартует собственный вложенный бизнес-процесс. Одно из важных свойств данной точки - это свойство БизнесПроцесс. Оно содержит ссылку на вид вложенного бизнес-процесса. Пример использования данной точки маршрута приводится в разделе «Бизнес-процесс «Обход», стр. 90. Состояния бизнес-процесса Бизнес-процесс может находиться в одном из трех состояний: Не стартовая - нет ни одной задачи, связанной с данным бизнес- процессом. Такое состояние устанавливается, если создать и записать бизнес-процесс без вызова метода Старт();
Глава 1. Механизм бизнес-процессов н, 29 ж Стартован - существует хотя бы одна задача, связанная с данным бизнес- процессом; Завершен - у бизнес-процесса установлено свойство Завершен. Наличие или отсутствие связанных с данным бизнес-процессом задач никак не влияет на это состояние. Состояние бизнес-процесса отражается с помощью одноименных свойств (Стартован, Завершен). Данные свойства имеют тип значения Булево и могут устанавливаться как интерактивно, так и программно. Следует помнить, что «самостоятельная» запись значений в данные свойства имеет определенные особенности. При записи в свойство Стартован значения Истина старт бизнес-процесса не производится (не создается ни одной задачи). Попытка после этого выпол- нить метод Старт () приведет к ошибке (бизнес-процесс уже стартован). Прямая установка свойства Стартован может использоваться в бизнес- процессах со свободной маршрутизацией. Это может позволить произвольным образом создавать задачи (с произвольной привязкой их к точкам маршрута карты бизнес-процесса). Если у бизнес-процесса, по которому уже существуют какие-либо задачи, установить данное свойство в значение Ложь, а потом выполнить старт бизнес-процесса, то он распараллелится. С одной стороны бизнес-процесс продолжит продвижение в соответствии с существовавшими до сброса свой- ства задачами, с другой стороны запустится его повторное прохождение с самой начальной точки схемы бизнес-процесса. Рассмотрим пример пове- дения бизнес-процесса, обладающего следующей схемой (рис. 1.23). Рис. 1.23. Карта маршрута бизнес-процесса Процесс рассматривается с учетом того, что не определено ни одного обра- ботчика событий, который меняет стандартный порядок формирования и завершения задач.
30 Решение специальных прикладных задач в «1С:Предприятии 8» Последовательность интерактивных действий и реакция системы на эти действия приведены в табл. 1.4. Таблица 1.4. Последовательность интерактивных действий и реакция системы Интерактивные действия : Реакция системы -> Старт бизнес-процесса Создание задачи Выписка счета Выполнение задачи Выписка счета Создание задачи Оплата товара Установка у бизнес-процесса свойства Стартован в значение Ложь Старт бизнес-процесса (например, по кнопке Старт) Создание задачи Выписка счета К этому моменту в бизнес-процессе существуют две невыполненные задачи: оплата товара (от первого старта), выписка счета (от второго старта). Дальнейшая последовательность действий представлена в табл. 1.5. Таблица 1.5. Последовательность интерактивных действий и реакция системы Интерактивные действия Реакция системы Выполнение задачи Оплата товара Не приводит к созданию задачи, система будет ожидать, когда параллельный процесс догонит ранее стартовавший Выполнение задачи Выписка счета Создание задачи Оплата товара Выполнение задачи Оплата товара Создание задачи Отгрузка товара Выполнение задачи Отгрузка товара Завершение бизнес-процесса Особый интерес представляет тот факт, что при выполнении задачи Оплата товара (созданной первой) не производится создание следующей по схеме задачи (Отгрузка товара). Можно сказать, что фактически бизнес-процесс выполнялся по схеме, изображенной на рис. 1.24. Даже если бы после рестарта бизнес-процесса стали бы исполняться задачи второй ветки, то, дойдя до точки слияния бизнеса-процесса для создания задачи Отгрузка товара, он ожидал бы выполнения задачи Оплата товара первой ветви. Свойство Завершен устанавливается системой автоматически в значение Истина при переходе бизнес-процесса на точку завершения при условии отсутствия невыполненных задач. Это свойство можно установить и само- стоятельно. Если у завершенного бизнес-процесса в свойство Завершен записать значение Ложь и создать невыполненную задачу (либо отменить статус выполненной у ранее существовавшей), то бизнес-процесс продолжит свою работу в соответствии с его схемой.
Глава 1. Механизм бизнес-процессов Второй старт Ожидание схождения ________ Я Кладовщик Отгрузить товар Рис. 1.24. Фактическая схема выполнения бизнес-процесса Если у незавершенного бизнес-процесса в это свойство записать значение Истина, то бизнес-процесс будет считаться завершенным и выполнение какой-либо его задачи не приведет к созданию новой в соответствии со схемой бизнес-процесса. При необходимости полностью завершить бизнес-процесс рекомендуется, помимо записи значения Истина в свойство Завершен, получать все невы- полненные задачи данного бизнес-процесса и устанавливать для них статус выполненных. Визуально (например, в форме списка) бизнес-процессы в разных состоя- ниях имеют разные значки (иконки), рис. 1.25. Все действия Продажа товара ^Создать ijg, 0 к (+*. QНайти Ц Рис. 1.25. Пиктограммы бизнес-процессов Нестартованный бизнес-процесс имеет серую иконку, в стартованном она красная, в завершенном - зеленая.
Решение специальных прикладных задач в «1С:Предприятии 8» Старт бизнес-процесса Жизненный цикл бизнес-процесса начинается с его старта. В карте бизнес- процесса место старта отражается с помощью точки старта (рис. 1.26). Рис. 1.26. Точка старта бизнес-процесса У данной точки маршрута можно определить обработчик события ПередСтартом. У данной процедуры два параметра. Первый параметр - это точка маршрута, с которой произошел вызов обработчика (у бизнес-процесса может быть несколько точек старта), второй параметр - Отказ. При записи в переменную Отказ значения Истина будет произведен отказ от старта бизнес-процесса. В обработчике события ПередСтартом можно проверять условия, необхо- димые для старта бизнес-процесса, создавать «сопутствующие» объекты, ссылки на которые нужно хранить в самом бизнес-процессе. Пример обработчика данного события для бизнес-процесса Продажа товара (считаем, что в бизнес-процессе должны храниться ссылки на документы Счет и Расходная накладная) приведен в листинге 1.8. Листинг 1.8. Пример обработчика события «ПередСтартом» Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) //Признак, определяющий, изменялся ли бизнес-процесс в данном обработчике. НужноЗаписать = Ложь; //Если реквизит бизнес-процесса "Счет" содержит пустую ссылку, //создадим документ и запишем ссылку на него. Если Счет.Пустая() Тогда СчетОбъект = Документы.Счет.СоздатьДокумент(); СчетОбъект.Дата = ТекущаяДата(); СчетОбъект.Записать(); ^четлШт^^ йй // Бизнес-процесс изменен (реквизит "Счет"). НужноЗаписать = Истина; КонецЕсли; II Если реквизит бизнес-процесса "РасходнаяНакладная" // содержит пустую ссылку, создадим документ и запишем ссылку на него. Если РасходнаяНакладная.Пустая() Тогда
Глава 1. Механизм бизнес-процессов 33 РасходнаяНакладнаяОбъект = Документы.РасходнаяНакладная.СоздатьДокумент(); РасходнаяНакладнаяОбъект.Дата = ТекущаяДата(); РасходнаяНакладнаяОбъект.Записать(); РасходнаяНакладная = РасходнаяНакладнаяОбъект.Ссылка; НужноЗалисать = Истина; КонецЕсли; Если НужноЗалисать Тогда Записать(); КонецЕсли; Сообщение = Новый СообщениеПользователю(); Сообщение. Текст = "Старт бизнес-процесса:" + ""пи + ЭтотОбъект.Метаданные().Синоним + """"j Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецПроцедуры Это событие происходит на сервере, поэтому в нем невозможно открыть различные диалоговые окна. Если перед стартом бизнес-процесса требуется организовать диалог с пользователем, то можно это сделать в обработчике клиентского события ПередСтартом формы бизнес-процесса, которое вызы- вается перед событием ПередСтартом точки Старт бизнес-процесса. Приведенный пример (листинг 1.8) можно посмотреть в демонстрационной конфигурации «Бизнес-процессы и задачи», прилагающейся к книге на компакт-диске, в модуле объекта бизнес-процесса ПродажаТовара. Сам старт бизнес-процесса может производиться по-разному: программный старт бизнес-процесса (из кода на встроенном языке); интерактивный старт (нажатие кнопки Старт формы бизнес-процесса) и т.п.; старт бизнес-процесса как вложенного. При использовании любого из перечисленных вариантов бизнес-процесс может иметь несколько точек старта (но в любом случае необходимо будет уточнять, какая из точек используется).
34 Решение специальных прикладных задач в «1С:Предприятии 8» Программный старт бизнес-процесса Для реализации старта бизнес-процесса из встроенного языка может исполь- зоваться следующий фрагмент кода (листинг 1.9). Листинг 1.9. Пример программного старта бизнес-процесса БП = БизнесПроцессы.ПродажаТовара.Созда ъБизнёсПроцесс(); II Дата должна быть определена явным образом. БП.Дата = ТекущаяДата(); II Перед стартом бизнес-процесс должен быть обязательно записан. БП.Залисатв(); БПС,а₽т?: В этом случае происходят следующие действия (рис. 1.27). Старт бизнес-процесса Вызов обработчика события точки старта Перед Стартом (Т очкаМ аршрутаБизнесПроцесса, Отказ) Продвижение по карте маршрута до точки действия Формирование задач Рис. 1.27. Действия, выполняемые при программном старте бизнес-процесса Интерактивный старт бизнес-процесса Пользователь может произвести запуск бизнес-процесса интерактивно. Возможны следующие варианты. Пользователь создает новый бизнес-процесс. В форме нового бизнес-процесса нажимается кнопка Стартовать и закрыть. Пользователь может после создания бизнес-процесса только записать его. Далее в форме самого бизнес-процесса, используя кнопку Старт или соответ- ствующую команду меню Все действия, произвести его старт (рис. 1.28).
Глава 1. Механизм бизнес-процессов П,. (1 (^Предприятиед Продажа товара 000000001 от 24.10.2011 20:45:17 у : Я . Стартовать н закрыть >;] «(з- Старт^ £ , Вее действия т: Номер: Дата: 000000001 яииии :Счет 000000001 от 05.08.2011 1:31:31 Стартовать и закрыть вписать Ведущая задача: Счет: ед. Перечитать Скопировать Расходная накладная: I Расходная накладная 000000003 от 27.12.201012:0 ~ Пометить на удаление / Снять пометку Стартован: Удалить Завершен: Карта маршрута: ! Стар г Активировать ' ’5] Изменять Форму... • ? Справка 1______________ rj _ g jr............................................... ‘2 .0тде.яг1родаж Выписать счет. ! счету выше стандарт ой? Да ' Руководитель отдела Утвердить счет -W ВУДГ Ж Бухгалтер Получить наличную г4~ оплату Да Г чет Утверждай Нет' н I 1 ЦТ £ Рис. 1.28. Интерактивный старт бизнес-процесса Интерактивная активация бизнес-процесса Пользователь может активировать бизнес-процесс, используя кнопку Акти- вировать или соответствующую команду меню Все действия в форме бизнес-процесса. Активацию бизнес-процесса можно производить не только для только что стартовавших процессов, но и для любых незавершенных (по которым существуют невыполненные задачи), рис. 1.29. При этом активируется текущая невыполненная задача (помеченная красной пунктирной рамкой) для пользователя, выполнившего активацию бизнес- процесса. Если процесс активирован пользователем, для которого не предназначена текущая задача, то ничего не происходит. Активация текущей задачи приводит к открытию формы этой задачи либо (если это специально оговорено, как показано в листинге 1.10) форм сопут- ствующих объектов конфигурации.
36 Решение специальных прикладных задач в «^Предприятии 8» V. W. ' Д.. ПС:Предприятие 1Ч I Продажа товара 000000001 от 24,10.2011 20:45:17 артовать и закрыть I jfrfl I Ч Есе действия Номер: 000000001 Стартовать и закрыть Дата: &1Й2О1Ш4! Записать Ведущая задача: Перечитать Счет: «Л л»' Счет 000000001 от 05.08.2011 1:31:31 Скопировать Пометить на удаление / Снять пометку Расходная накладная: Расходная накладная 000000003 от 27.12.2010 12: С Стартован: Завершен: Карта маршрута: Удалить Старт ’ Активировать П7| Изменить Форму.. (?: Справка , Г F1 £ Отдел продаж '''л Выписать счет U |_|ет Скидка по счету, выше стаадарпдай? Да * Руководитель отдела j > Утвердить счет Да ------- > ® Бухгалтер Получить наличную 4 оплату Рис. 1.29. Интерактивная активация бизнес-процесса Счет Утвержден? Нет 1 : При активации задачи вызывается обработчик события ОбработкаПолуче- нияФормы, размещенный в модуле менеджера задачи. Данный обработчик используется для переопределения открываемой формы. Например, когда пользователь захочет активизировать задачу Получение наличной оплаты, то будет крайне полезно, чтобы открылась не форма задачи, а форма счета (для того, чтобы на его основании ввести расходную накладную) и т. п. (листинг 1.10). Листинг 1.10. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормыЩидФормы, Параметры, ВыбраннаяФорма, ' v Дополнительная^ СтандартнаяОбработка) ь Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсы лка = Параметры.Ключ; ч ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
Глава 1. Механизм бизнес-процессов Обработчик события ОбработкаПолученияФормы вызывается при открытии любых форм задачи. Поэтому сначала проверяется, что открыва- ется форма объекта задачи (параметр ВидФормы = "ФормаОбъекта")- Ссылка на задачу передается в структуре параметров открываемой формы (Параметры. Ключ). В процедуре обработчика переопределяется параметр ВыбраннаяФорма (тем самым указывается форма, которая должна быть открыта вместо формы задачи) и параметр Ключ коллекции параметров открываемой формы (т. е. вместо ссылки на задачу параметр Ключ будет содержать ссылку на счет, являющийся реквизитом бизнес-процесса, породившего задачу). В результате будет открыта форма счета, форма задачи при этом открыта не будет, т. к. параметр СтандартнаяОбработка устанавливается в значение Ложь. Данный обработчик также можно использовать для регистрации задач в других объектах (например, произвести запись открываемой задачи в регистр сведений). Представим себе, что какой-либо пользователь (группа пользователей) решает задачи, которые могут формироваться в контексте большого количества бизнес-процессов. Заставлять таких пользователей постоянно просматривать все бизнес-процессы (задачи) не стоит. Им можно упростить процесс работы, создав «специализированные рабочие места» - обработки. Механизм работы таких обработок заключается в том, что при активации задач данные о задаче и текущем пользователе записываются в регистр сведений, содержимое которого и отображает соответствующее «рабочее место пользователя». Пример подобного обработчика события приводится в листинге 1.11. Листинг 1.11. Обработчик события «ОбработкаПолученияФормы»
Решение специальных прикладных задач в «^Предприятии 8» ЗадачаСсылка = Параметры Ключ; ЗадачаОбъекг = ЗадачаСсылка ПолучитьОбъект(), JI Регистр сведений "ПрбсмЬтр задач" используется для регистрами //данных по текущим;{невы ол е ным) задачам.'' НаборЗаписей = РегистрыСведении ПросмотрЗадач СоздатьНаборЗаписей )• НаборЗаписей Отбор.Задача Значение = ЗадачаСсылка; Набс исеи Отбор Задача Использование = Истина; Ч В параметре "Текущий исполнитель" находится ссылка на текущего пользователя; этот параметр сеанса ёыбран в свойство II "Текущий И полнитель'соотве ствующей задачи. НаборЗаписеи Отбор Сотрудник.Значение = ПараметрыСеанса ТекущииИсполнитель, НаборЗаписей.Отбор Сотрудник. Использование = Истина; НаборЗаписей Прочи ать(); Если НаборЗаписей. Количество^ = 0 Тогда IIВ набор записей добавляем новую запись, // характеризующую активизированную задачу. НоваяЗапись = НаборЗаписеи.Добавить(); НоваяЗапись.Задача = ЗадачаСсылка НоВаяЗаписЬ.Сотрудник = Па^ам'ётрыСМнбкТекущийИблблнит^пь; Попытка НаборЗаписей.Записать(); ,,:;д Исключение Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = ОписаниеОшибки(); Сообщение Сообщить() КонецПопытки КонецЕсли; КонецЕсли; КонецйроцедаЦ Приведенные примеры (листинги 1.10, 1.11) можно посмотреть в демонстра- ционной конфигурации «Бизнес-процессы и задачи», прилагающейся к книге на компакт-диске, в модуле менеджера задачи Задача. Старт бизнес-процесса как вложенного При определении карты маршрута можно предусматривать старт вложенных бизнес-процессов. В этом случае основной бизнес-процесс ждет завершения вложенного бизнес-процесса и только после этого переходит к следующей точке маршрута. На карте маршрута такая точка маршрута определяется с помощью следующего элемента (рис. 1.30).
Глава 1. Механизм бизнес-процессов fi**' •*.41- -«**rnn.,p.-'JVT- —* В лощенный процесс Рис. 1.30. Вложенный бизнес-процесс Одной из важных характеристик (свойств) данной точки маршрута является ссылка на запускаемый бизнес-процесс (свойство БизнесПроцесс). Кроме этого, есть возможность определить ряд обработчиков событий. Рассмотрим порядок вызова части из них (последовательность действий представлена на рис. 1.31). ^Начало транзакции Вызвать обработчик события точки маршрута ! Г П ередСозд аниемВ ложенныхБ изнесП роцессовО ! I t t jr____ | £. Вызвать обработчик события точки маршрута j П ередСозд аниемЗадачО ।. — еВЕЯйтвывшпи п шпггиит - - - —. „ . - Да Стандартная обрабст ка? .«Т Л * ** 1 i . ‘ ; _ - i Формирование масива задач ‘ Я Вь звать обработчик события точки маршрута j * — - -------------------------------------------I П рнСозданииЗадач(] I__________________________________________________J Запйсь.массива;.ёфбрмйреванныя задачи. ’ ./ создание, массива вле-женных бизнес-прсцесоое- ________ у Вызвать обработчик события точки маршрута ! > i П риСозданииВ ложенныхБ мзнесП роцессовО : Запись i-i старт сформированных бизнес-: процессов Завершение транзакции Рис. 1.31. Вызов событий при старте вложенного бизнес-процесса
40 Решение специальных прикладных задач в «1С:Предприятии 8» Сначала у точки вложенного бизнес-процесса происходит вызов обработчика ПередСозданиемВложенныхБизнесПроцессовО, в котором можно добавить свои бизнес-процессы в массив формируемых бизнес-процессов (по умолчанию в обработчик массив приходит пустым). Если были добав- лены бизнес-процессы в массив, то стандартная механика генерации бизнес-процессов будет отменена. Затем происходит формирование массива задач, при котором могут исполь- зоваться два обработчика событий: Перед созданием задач и При создании задач. Порядок работы с этими обработчиками более подробно рассматривается в разделе «Задачи», стр. 45. При формировании массива задач у точки маршрута сначала вызывается обработчик ПередСозданиемЗадач(). В него передается пустой, еще не сформированный массив задач. Если параметр СтандартнаяОбработка установлен в Ложь, то обработчик может использоваться для создания собственного массива задач. Если стандартная обработка не изменена, то сформированный массив задач будет очищен и заполнен задачами, исходя из поведения системы по умолчанию. В обработчике ПриСозданииЗадачО можно донастроить сформиро- ванные задачи и добавить к ним новые, в случае необходимости. Далее происходит запись сформированных задач, после чего по каждой из них создается вложенный бизнес-процесс установленного в точке марш- рута типа. У созданных бизнес-процессов устанавливается дата и ссылка на ведущую задачу. Затем происходит вызов обработчика ПриСозданииВложенныхБиз- несПроцессов(). Обработчик этого события может донастроить вручную (в обработчике ПередСозданиемВложенныхБизнесПроцессовО) или автоматически сформированные бизнес-процессы (их количество равно количеству задач после обработчика ПриСозданииЗадачО) или удалить некоторые из них, а также добавить к ним новые бизнес-процессы. После завершения обработчика будет осуществлена запись и старт сформи- рованных бизнес-процессов. Обработчик события Перед созданием вложенных бизнес-процессов рекомендуется использовать для определения массива бизнес-процессов по своему усмотрению. Если в этом обработчике событий сформировать массив бизнес-процессов, но при этом параметр Отказ оставить в значении Истина, созданные в обработчике бизнес-процессы будут сброшены, и сработает стандартный механизм формирования бизнес-процессов. Если параметр Отказ установить в значение Ложь, но при этом массив сформированных бизнес-процессов не будет содержать ни одного элемента, то ведущая задача будет считаться выполненной, и, если все задачи в данной точке маршрута выполнены, будет произведен переход бизнес-процесса к следующей точке маршрута.
Глава 1. Механизм бизнес-процессов 41 Пример соответствующего обработчика события (в нем принудительно созда- ется один вложенный бизнес-процесс) приведен в листинге 1.12. Листинг 1.12. Пример обработчика события « ПередСозд ан иемВл ожен н ыхБизнесП роцессов » Процедура ОбходПередСозданиемВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) БП = БизнесПроцессы.Поручение.СоздатьБизнесПроцесс(); БП.Дата = ТекущаяДата(); БП.Автор = ПараметрыСеанса .ТекущийИсполнитель; БП.Записать(): ФормируемыеБизнесПроцессы.Добавить(БП); Отказ--Ложь; КонецПроцедуры После того как массив вложенных бизнес-процессов сформирован (в обра- ботчике события Перед созданием вложенных бизнес-процессов или штатным образом), вызывается обработчик события При создании вложенных бизнес-процессов. Его рекомендуется использовать для корректировки (добавления, частичного удаления) массива сформированных вложенных бизнес-процессов. Если данный массив в результате таких изме- нений не будет содержать ни одного элемента (и иное не предусмотрено в обработчике события При создании вложенных бизнес-процессов), то соответствующая ведущая задача будет считаться выполненной. Предположим, что в исходном бизнес-процессе определена табличная часть Участники. В точке вложенного бизнес-процесса необходимо уточнить ряд характеристик (свойств) созданных вложенных процессов. Для этого используется обработчик события При создании вложенных бизнес- процессов (листинг 1.13). Листинг 1.13. Пример обработчика события «ПриСозданииВложенныхБизнесПроцессов» Процедура ОбходПриСозданииВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) II Обходим табличную часть. Для Каждого Элемент Из Участники Цикл //Обходим массив бизнес-процессов. Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл II Настраиваем вложенный бизнес-процесс. Процесс.Автор - ПараметрыСеанса .ТекущийИсполнитель; Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда Процесс.Тема = Процесс.ВедущаяЗадача.Наименование;
42 Решение специальных прикладных задач в «^Предприятии 8» Иначе Процесс.Тема = Элемент.НаименованиеЗадачи; КонецЕсли; Процесс.Исполнитель - Элемент.Сотрудник; Процесс. ИсполнительРоль = Элемент.РольИсполнителя; Процесс. ИсполнительОтдел = Элемент.Подразделение; Процесс.3аписать(); КонецЦикла; КонецЦикла; КонецПроцедуры Старт бизнес-процесса с несколькими точками старта Наличие нескольких точек старта предполагает, что выбор конкретной точки для старта определяется внешними по отношению к бизнес-процессу усло- виями. Если же бизнес-процесс обладает всей необходимой информацией, чтобы при старте самостоятельно принять решение о выборе того или иного марш- рута, то достаточно одной точки старта, следом за которой будет идти точка проверки условия или точка выбора варианта. Если бизнес-процесс имеет несколько точек старта, то при вызове метода Старт () необходимо указать конкретную точку, в противном случае будез выдано сообщение об ошибке. Поэтому при создании бизнес-процесса с несколькими точками старта необ- ходимо: переопределить команду Старт в форме списка и в форме объекта бизнес- процесса, переопределить кнопку Старт в форме объекта бизнес-процесса. Смысл всех модификаций, которые необходимо произвести, заключается в том, что при выполнении метода Старт () в него в качестве параметра необходимо передать точку старта бизнес-процесса. Примером бизнес-процесса с несколькими точками старта может быть торговля товаром, для которого возможна предварительная демонстрация (на дому, рабочем месте потенциального клиента). Заявка либо на покупку, либо на демонстрацию поступает к оператору (сотруднику компании). После опроса клиента он выясняет, какой из вариантов предпочтителен потенциаль- ному покупателю. Если выбирается предварительная демонстрация, то после ее окончания менеджер по продажам уточняет желание клиента приобрести товар. Если клиент согласен, выполняется ветка бизнес-процесса, связанная
Глава 1. Механизм бизнес-процессов с продажей товара. Карта такого бизнес-процесса может выглядеть следу- ющим образом (рис. 1.32). Нет Старт с демонстрацией Клиент согласен приобрести? Продажа не состоялась Оплатить товар Старт без демонстрации X Склад Отгрузить товар Продажа состоялась Рис. 1.32. Пример бизнес-процесса продажи товара с предварительной демонстрацией Если данный бизнес-процесс является вложенным для других бизнес- процессов, то в соответствующих точках маршрута нужно прописать обработчик При создании вложенных бизнес-процессов так, чтобы записывать и стартовать с нужной точки все бизнес-процессы из массива сформированных (листинг 1.14). Листинг 1.14. Пример обработчика события «ПриСозданииВложенныхБизнесПроцессов» Процедура ОбходПриСозданииВложеннь1хБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) // Обходим табличную часть. Для Каждого Элемент Из Участники Цикл
Решение специальных прикладных задач в «^Предприятии 8» //Обходим массив бизнес-процессов, , . й| Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл II Настраиваем вложенный бизнес-процесс. Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель; Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда Процесс.Тема = Процесс.ВедущаяЗадача.Наименование: Иначе Процесс.Тема = Элемент.НаименованиеЗадачи; КонецЕсли; Процесс.Исполнитель ? Элемент.Сотрудник; Процесс.ИсполнительРоль = Элемент.РольИсполнителя; Процесс. ИсполнительОтдел = Элемент.Подразделение; Процесс.3аписать(); //Явное указание точки старта. Процесс.Старт(БизнесПроцёссы.ДемонстрацияИПродажа.ТочкиМаршрута. СтартДемонстрации); КонецЦикла; КонецЦикла; КонецПроцедуры В остальном использование бизнес-процессов с несколькими точками старта ничем не отличается от обычных бизнес-процессов. Завершение бизнес-процесса Завершение является последним этапом в жизненном цикле бизнес- процесса. Бизнес-процесс автоматически становится завершенным (свойству Завершен устанавливается значение Истина) при достижении точки завер- шения и при отсутствии невыполненных задач по этому бизнес-процессу. У бизнес-процесса может быть несколько точек завершения. В карте бизнес-процесса они отмечаются с помощью элемента «точка завершения» (рис. 1.33). Рис. 1.33. Точка завершения бизнес-процесса При переходе на точку завершения вызывается обработчик При завер- шении. Если установить Отказ (параметр процедуры-обработчика) равным Истине, например если не выполнены все необходимые условия завершения бизнес-процесса, то обработка прерывается. Задача по точке маршрута, выполнение которой привело к переходу на точку завершения, при этом оста- ется невыполненной.
Глава 1. Механизм бизнес-процессов ... 45 Рассмотрим следующую ситуацию. Существует бизнес-процесс, который отслеживает процесс согласования и выдачи денежных средств под отчет. При завершении бизнес-процесса (переход к этой точке осуществляется после ввода очередного авансового отчета) необходимо проверить, что подотчетник полностью отчитался за полученные им средства. Такую проверку можно разместить в обработчике события При завершении точки завер- шения бизнес-процесса (листинг 1.15). Листинг 1.15. Пример обработчика события «ПриЗавершении» Процедура ПодотчетникПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ) //РКО - реквизит бизнес-процесса, содержащий ссылку //на документ "Расходный кассовый ордер". II Исполнитель - реквизит бизнес-процесса, содержащий ссылку // на подотчетника. Если Не обДолгПодотчетника(РКО,Исполнитель) = 0 Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Есть долг! Бизнес-процесс:" + ЭтотОбъект.Метаданные().Синоним + " не завершен"; Сообщение.Сообщить)); Отказ = Истина; КонецЕсли; КонецПроцедуры Если у бизнес-процесса установлено свойство ВедущаяЗадача, т.е. он является вложенным, то при своем завершении он помечает эту задачу как выполненную. Это, в свою очередь, приводит к продвижению основного бизнес-процесса дальше по маршруту. Установка свойству Завершен значения Истина (средствами встроенного языка или интерактивно) может использоваться для прерывания хода бизнес- процесса или для исключения его из списка активных (незавершенных) бизнес-процессов. При этом никакие обработчики, кроме ПередЗаписью и ПриЗаписи, не вызываются. Выполнение ведущей задачи при этом нс производится. Задачи При продвижении бизнес-процесса по карте маршрута в определенных его точках, а именно при переходе на точку действия или вложенный бизнес-процесс, могут создаваться задачи. Упрощенно их можно назвать пользовательскими заданиями, которые должны быть кем-то выполнены. Каждая задача (конкретный элемент) существует в контексте какого-либо экземпляра (элемента) бизнес-процесса и какой-либо его точки маршрута (в задаче содержатся ссылки на перечисленные объекты). Создать задачу,
46 Решение специальных прикладных задач в «ЮПредприятии 8» не связав ее с каким-либо бизнес-процессом и точкой этого бизнес-процесса, нельзя. Связь бизнес-процесса (как объекта конфигурации) с соответствующей за- дачей устанавливается при конфигурировании бизнес-процесса (в свойствах бизнес-процесса указывается объект конфигурации Задача, рис. 1.34. Рис. 1.34. Свойства бизнес-процесса Можно сказать, что у задачи существуют следующие предопределенные свойства: ПометкаУдаления; Дата (тип Дата, состав даты Дата и время); Номер (числовой или строковый); Наименование (тип Строка); Выполнена (тип Булево); БизнесПроцесс (ссылка на любой бизнес-процесс); ТочкаМаршрута (ссылка на точку маршрута бизнес-процесса). Кроме этого, в объекте конфигурации Задача могут определяться некие общие моменты (свойства), касающиеся «пользовательского задания», которые в общем случае не зависят от бизнес-процесса и его текущего состо- яния (один объект конфигурации Задача может быть связан с несколькими объектами конфигурации БизнесПроцесс). I !апример, в каждой задаче должны храниться данные о пользователе, выпол- нившем ее. С этой целью можно определить реквизит задачи Исполнитель.
Глава 1. Механизм бизнес-процессов Можно определить ряд других реквизитов: ДатаВыполнения, Дата Авто вы пол- нения (для реализации стратегии «время вышло, значит, задача выполнена») и т.д. При необходимости хранения списков можно определить любое коли- чество табличных частей с произвольным составом. Формирование задач При прохождении маршрута бизнес-процесс на точках действия или точках вложенных бизнес-процессов может создавать одну или несколько задач. Несколько задач будут сформированы в том случае, если у точки марш- рута установлен признак Групповая либо задачи формируются программно (в соответствующих обработчиках событий). Если в точке маршрута уста- новлен признак Групповая, бизнес-процесс отбирает в регистре сведений, ответственном за адресацию, все записи, соответствующие установленным в данной точке реквизитам адресации, и для каждой из них формирует свою задачу. Рассмотрим последовательность действий, порядок следования обрабатыва- емых событий, возникающих при формировании задач (рис. 1.35). Начало транзакции ; Вызвать обработчик события точки маршру) а П лредСозд анием Задач() Нет Стандартная соэаояка? Т Ч-'ормт рогание масива задач ♦________ JL Вызвать обработчик события точки маршрута ПриСозданинЗадач[] 1 & Вызвать обработчик события задачи П ередЗаписькД] Запись задачи Запись всех сформированных задач ________~ . .JK__ Вызвать обработчик события задачи ПриЗаписиЦ Завершение транзакции Рис. 1.35. Последовательность вызова событий при формировании задач
48 Решение специальных прикладных задач в «^Предприятии 8» Обработчик события Перед созданием задач может использоваться для создания собственного набора задач. Причем можно создавать как одну задачу, так и несколько, вне зависимости от установленного в свойствах точки маршрута признака Групповая. Если при создании собственного массива задач в параметр процедуры Стандартная обработка не запи- сать значение Ложь, то созданный массив очистится и заполнится задачами, исходя из поведения системы по умолчанию (так, как если бы этот обра- ботчик определен не был). Пример обработчика события ПередСозданиемЗадач приведен в листинге 1.16. Листинг 1.16. Пример обработчика события «ПередСозданиемЗадач» Процедура ОтгрузкаПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачуО; Задача.Дата = ТекущаяДата(); Задача.БизнесПроцесс = Ссылка; Задача.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.Отгрузка; Задача.Наименование = "Формирование расходной накладной"; ФормируемыеЗадачи.Добавить(Задача); СтандартнаяОбработка = Ложь; КонецПроцедуры При формировании задач стандартным образом для них автоматически опре- деляются следующие свойства: наименование устанавливается равным наименованию соответствующей точки маршрута, например Выписка счета; ссылка на экземпляр бизнес-процесса, породившего эту задачу; ссылка на точку маршрута бизнес-процесса; реквизиты адресации задачи устанавливаются равными реквизитам адре- сации соответствующей точки маршрута. При возникновении необходимости определения других свойств задачи либо для корректировки состава массива задач может использоваться обработчик события При создании задач (листинг 1.17). Листинг 1.17. Пример обработчика события «ПриСозданииЗадач» Процедура ОтгрузкаПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, 01 каз) Склад = Справочники.Подразделения.НайтиПоНаименованию(РасходнаяНакладная Склад): Если Не Склад.Пустая() Тогда Для Каждого Задача Из ФормируемыеЗадачи Цикл Задача. Подразделение = Склад; КонецЦикла; КонецЕсли; КонецПроцедуры
Глава 1. Механизм бизнес-процессов 49 Следует отметить, что допускается создание новых задач и в обработчике события При создании задач. В этом случае обработчик события Перед созданием задач может содержать одну строку (листинг 1.18). Листинг 1.18. Пример обработчика события «ПередСозданиемЗадач» Процедура ОтгрузкаПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КонецПроцедуры Выполнение задач Выполнение задач может производиться как интерактивно (с помощью ос- новных интерфейсных возможностей «I С:Предприятия»), так и программно. Под интерактивным выполнением задач будем понимать выполнение задачи, вызванной либо нажатием кнопки Выполнено или Выполнено, закрыть в форме задачи, либо выполнением соответствующей команды меню Все действия в форме задачи (рис. 1.36). Рис. 1.36. Интерактивное выполнение задачи Программное выполнение задач возможно с помощью метода Выпол- нитьЗадачу (), который существует у объекта Задача0бъект.<Имя>.
Решение специальных прикладных задач в «^Предприятии 8» Необходимо обратить внимание на тот факт, что у задачи есть свойство Выполнена (тип Булево). В данное свойство можно установить значение Истина как программно, так и в форме задачи (если данное свойство пред- ставлено в диалоге формы задачи с помощью соответствующего элемента управления). Но данное действие не приведет к вызову специфических обра- ботчиков событий (Перед выполнением и При выполнении) и, в случае выполнения всех задач в точке маршрута, к продвижению к следующей точке по карте маршрута бизнес-процесса. Выборка всех активных (невыполненных) задач и прямая установка в свой- ство Выполнена значения Истина рекомендуются при необходимости принудительного завершения бизнес-процесса. Порядок действий системы, последовательность вызываемых обработчиков событий при выполнении задачи представлены на рис. 1.37. Начало транзакции j Ж Обработчик события задачи П ередВ ыполнениемО £ Обработчик события точки маршрута П ередВ ыполнениемО < _____________________________________ ‘ Установка свойства “Выполнена’'у задачи в значение ‘Й стина" I- • -1 Обработчик события задачи /........—----------- ПриВыполненииО f 4 Запись объекта задачи ,________... ________i___________________ < Обработчик, собьп ия точки маршрута I з ПриВыполненииО ? г i Завершение транзакции Рис. 1.37. Последовательность вызова событий при выполнении задачи Следует отметить, что в рамках пункта «Запись объекта задачи» вызывается еще ряд обработчиков событий, показанных далее (рис. 1.38).
Глава 1. Механизм бизнес-процессов Запись всех сформированных задач Рис. 1.38. Обработчики событий, вызываемые в процессе записи объекта задачи Если хоть в одном из обработчиков (связанных с выполнением задачи) пара- метр Отказ установлен равным значению Истина, то дальнейшая обработка выполнения прекращается, и задача не помечается как выполненная. Рассматривая различные варианты выполнения задач, следует отметить, что выполнение метода ВыполнитьЗадачу () или команды Выполнено в форме задачи приводит к выполнению цепочки, находящейся в рамках транзакции (см. рис. 1.37). Обработчик события Перед выполнением задачи часто используется для заполнения реквизитов задачи, характеризующих ее выполнение (например, производится запись исполнителя и т.п.). Пример реализации обработчика события ПередВыполнением приведен в листинге 1.19. Листинг 1.19. Пример обработчика события «ПередВыполнением» Процедура ПередВыполнением(Отказ) — II ДатаВыполнения и Исполнитель - реквизиты: задачи. Если ДатаВыполнения = ’00010101' Тогда ДатаВыполнения = ТекущаяДата(); КонецЕсли; Если Исполнитель.Пустая() Тогда Исполнитель = ПараметрыСеанса.То Ф юлнитель; КонецЕсли; f чЙ КонецПроцедуры ; W' Обработчик события При выполнении задачи может использоваться для регистрации факта выполнения задачи в других объектах конфигурации. Например, таким объектом может быть регистр сведений, используемый при создании планировщиков - автоматизированных рабочих мест пользователей.
52 Решение специальных прикладных задач в «^Предприятии 8» Пример реализации обработчика события ПриВыполнении приведен в листинге 1.20. Листинг 1.20. Пример обработчика события «ПриВыполнении» * / ' ' ’ Л .м < > в. ьг. ‘ t • Г • * Vlrt 1 ъ пл». УН». .• .. ''baAtf'*iSf Процедура ПриВыполнении(Отказ) Сообщение = Новый СообщениеПользователюр; Сообщение.Текст = "Задача выполнена:" + + Наименование + Сообщение.Сообщить(); II Просмотр задач - регистр сведений, предназначенный II для отражения невыполненных задач II разных бизнес-процессов. НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей(); НаборЗаписей.Отбор Задача.Значение = Ссылка; НаборЗаписей.Отбор.Задача.Использование = Истина; Попытка II Попытка записать пустой набор записей. НаборЗаписей.Записать(Истина); Исключение Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; КонецПроцедуры В этом обработчике данные о выполненной задаче удаляются из регистра сведений путем записи пустого набора записей с отбором по задаче. Проверка выполнения Выполнение задач осуществляется не только пользователями, но и автома- тизированными процедурами. Мало того, в бизнес-процессе может быть предусмотрен этап, который выполняется не строго в цепочке бизнес- процесса (может быть выполнен раньше). В этом случае при переходе на какую-либо точку маршрута необходимо произвести соответствующую проверку: если действие выполнено, то выполнить и задачу, если нет, то инициировать выполнение действия и т.п. Например, если задача преду- сматривает проведение документа, то автоматическая процедуре! слежения за такими задачами может определять, что нужный документ уже проведен, и помечать задачу как выполненную путем вызова у нее метода Выпол- нитьЗадачу (). Для организации такого рода автоматизированных процедур предназначен метод ПроверитьВыполнение () у задачи и соответствующие ему обработ- чики у задачи и точки маршрута (листинг 1.21).
Глава 1. Механизм бизнес-процессов 53 Листинг 1.21. Пример использования метода «ПроверитьВыполнение()» Если Задача.ПроверитьВыполнение() Тогда Задача.ВыполнитьЗадачуО; / КонецЕсли; При вызове метода ПроверитьВыполнениеО выполняется следующая последовательность действий (рис. 1.39): Вызвать метод ПоверитьВыпопнениеО £ Вызвать обрабочш зобытия задачи О бработкаП роверкмВ ыпо лн*?ния( j Результат Истина? ” Вызвать обрабочик события точки маршрута О бработкаП роверкиВ ыпо лнен! <я() Результат = Истина7 Результат = Ложь Результат - Истина Рис. 1.39. Последовательность действий при вызове метода «ПроверитьВыполнениеО» Параметр Результат обработчика события и у задачи, и у точки маршрута по умолчанию имеет значение Ложь. Если в обработчике события задачи записать в параметр Результат значение Ложь или если этот обработчик оставить пустым, то обработка метода прекращается (вызов обработчика точки маршрута не производится), и он возвращает значение Ложь. Если обработчик ОбработкаПроверкиВыполнения (Результат) в мо- дуле задачи отсутствует или возвращает Истину, то исполнение переходит в одноименный обработчик точки маршрута. В случае автоматического выполнения задачи и проверки ее выполнения этот обработчик должен обязательно присутствовать в модуле бизнес-процесса и хотя бы формально возвращать Истину, иначе задача выполнена не будет (листинг 1.22).
54 Решение специальных прикладных задач в «^Предприятии 8» Листинг 1.22. Обработчик «ОбработкаПроверкиВыполнения()» точки маршрута Процедура ОтгрузкаОбработкаПроверкиВыполнения(ТочкаМаршрутаБизнесПроцесса, Задача. Результат) Результат = Истина; КонецПроцедуры Форма списка задач Для работы со списком задач пользователи могут использовать форму списка задач. Как и любая форма списка, она построена с помощью динамического списка. Поскольку динамический список использует систему компоновки данных, го разработчик может настроить группировку, отбор, порядок и условное оформление списка. Например, можно задать отбор в списке задач, в результате действия которого в списке отображаются только невы- полненные задачи. Для этого в конфигураторе, в форме списка задач, нужно открыть палитру свойств основного реквизита формы типа ДинамическийСписок и нажать гиперссылку Открыть (рис. 1.40). Свойства Реквизит X ?! х * ▼ Основные Имч «Список] Заголовок Q Tin Д|намическийСп!.сок ▼ ... Основной реквизит Использование Просмотр Открыть Редактирование Открыть Функциональные опции ▼ Объект ПроизеольныйЗапрос Динамичес оеСчитываниеДанных у ^jacTpowa сгцска , Основная!аблица ЗааачаЗааача ... X Рис. 1.40. Настройка отбора в динамическом списке
Глава 1. Механизм бизнес-процессов На приведенном рисунке создается отбор динамического списка по условию Выполнена = Ложь. Таким образом, при открытии списка задач будут пока- заны только те задачи, у которых свойство Выполнена имеем значение Ложь. Пользователь также может произвести аналогичную настройку списка в режиме 1С:Предприятие, выполнив команду Все действия ► Настроить список... Например, пользователь может удалить отбор и задать условное оформление списка, чтобы невыполненные задачи выделялись особым цветом. Часто при конфигурировании формы списка задач требуется установить отбор, чтобы при открытии списка задач текущий исполнитель видел только свои задачи. Для этого в свойствах динамического списка устанавливается соответствующее свойство ОсновнаяТаблица (рис. 1.41). Рис. 1.41. Свойства основного реквизита формы типа «ДинамическийСписок» Можно также установить эго свойство программно, например, при создании формы списка или при выполнении соответствующей команды (листинг 1.23). Листинг 1.23. Программная установка свойства «ОсновнаяТаблица» Список. ОсновнаяТаблица = "Задача.Задача.ЗадачиПоИсполнителю”; При отображении задач по исполнителю активно используются настройки объекта конфигурации Задача, размещенные на закладке Адресация. Предпо- ложим, что существует список задач (несколько экземпляров, а не несколько объектов конфигурации) с разными значениями реквизитов адресации. При открытии формы списка (рассматривается поведение по умолчанию) из параметра сеанса, указанного в свойстве задачи Текущий исполнитель, выбирается его значение.
56 Решение специальных прикладных задач в «^Предприятии 8» Из регистра сведений выбираются записи, у которых в измерении, выбранном в качестве основного реквизита адресации, находится значение, взятое из параметра сеанса, либо пустая ссылка. Далее все задачи проверяются на непротиворечивость значений остальных реквизитов адресации и измерений регистра сведений. Данный алгоритм можно представить в виде следующей схемы (рис. 1.42). Получение значения из параметров сеанса Нет Значение в основном адресации садад (Сотрданнк! - Значение парам стра сеанса (Т йкуй» й нсполнигепь» ? Да Выбираются записи регистра сведении ответственного за адресацию по пользователю, определенному в параметре сеанса * Значения остальных реквизитов адресации (без основного! строго Нет совпадают со значениями измерений какой либо записи регистра сведений - из отобранных под? I у пользователю? Задача не отображается в списке задач пользователя Задача отображается в списке задач пользователя Рис. 1.42. Алгоритм отображения задач по исполнителю Процесс определения основного реквизита адресации из остальных рекви- зитов адресации называется разыменованием. Для примера рассмотрим следующую ситуацию. Структура регистра сведений, отвечающего за адресацию, представлена в табл. 1.6. Таблица 1.6. Структура регистра сведений Измерение Тип измерения Сотрудник С п равоч н и кС с ы л ка. С отруд н и к и РольИснолнгпсля С правочникСсылка.РолиИсполни гелей 11 о1 (разделение СправочникСсылка.Подразделения
Глава 1. Механизм бизнес-процессов 57 Заполнение регистра данными показано в табл. 1.7. Таблица 1.7. Данные, содержащиеся в регистре сведений Сотрудник фоль исполнителя ПрДрЖЗделение Иванов Отдел продаж Петров Бухгалтер Сидоров Кладовщик Оптовый склад Федоров Отдел продаж Федоров Руководи гель отдела Отдел продаж Степанов Кладовщик Оптовый склад Объект конфигурации Задача имеет имя Задача, и для него заданы следу- ющие свойства (табл. 1.8). Таблица 1.8. Свойства объекта «Задача» Реквизиты адресации Тип реквизита * Сотрудник С11 ра воч н и кСсы лка.Сотруд н и ки РольИсполнителя С11 ра воч и и кС с ы л ка. Рол и Ис п ол н ител ей Подразделение С11 равоч 11 и кС сылка.Подразделен ия Есть следующий список задач (приводятся только значения их реквизитов адресации), табл. 1.9. Таблица 1.9. Список задач Ый Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение I Отдел продаж 2 Руководитель отдела Отдел продаж 3 Бухгалтер 4 Федоров Руководитель отдела Отдел продаж 5 Иванов Если в параметре сеанса будет ссылка на пользователя Петров, то, несмотря на тот факт, что нет ни одной задачи, в которой нужное значение было бы в основном реквизите адресации задач, список задач для данного исполни- теля будет содержать одну строку (табл. 1.10). Таблица 1.10. Список задач для пользователя «Петров» № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение 3 Бухгалтер
58 Решение специальных прикладных задач в «^Предприятии 8» Фактически среди задач отбираются те, у которых в реквизите адресации Роль исполнителя установлено значение Бухгалтер, а в остальных реквизитах адресации находятся пустые ссылки. Если в параметре сеанса будет записана ссылка на элемент справочника, представляющего пользователя Федоров, то перечень задач будет следующим (табл. 1.11). Таблица 1.11. Список задач для пользователя «Федоров» № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение I Отдел продаж 2 Руководитель отдела Отдел продаж 4 Федоров Руководитель отдела Отдел продаж В данном случае в список задач попадают те из них, которые в основном реквизите адресации содержат ссылку на сотрудника Федоров. Если в реквизите адресации находится пустая ссылка, то тогда в подразделении указывается Отдел продаж и в роли исполнителя либо пустая ссылка, либо значение Руководитель отдела (в регистре адресации на данного сотрудника существуют две записи). Для сотрудника Иванов список задач будет следующим (табл. 1.12). Таблица 1.12. Список задач для сотрудника «Иванов» № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение I Отдел продаж 5 Иванов Обратная связь Для эффективного использования механизма бизнес-процессов возни- кает необходимость автоматически выполнять соответствующие задачи при выполнении требуемых операций с другими объектами информационной базы. Например, при активизации задачи Выплата денежных средств лучше открыть форму нового документа Расходный кассовый ордер (для этой цели используется обработчик менеджера задачи ОбработкаПолученияФормы). Подробнее об открытии форм сопутствующих объектов конфигурации при активации задачи рассказывается в разделе «Интерактивная активация бизнес-процесса» на стр. 35. При проведении документа бизнес-процесс должен понять, что задача выполнена, и продолжить движение по карте маршрута. Такой механизм и называется обратной связью.
Глава 1. Механизм бизнес-процессов Обратная связь может настраиваться несколькими способами. Какой способ выбрать, зачастую зависит от особенностей прикладной задачи. Но, несмотря на это, можно выделить два основных варианта организации обратной связи: использование обработчиков ожидания, использование механизма оповещения. Строить механизм обратной связи на обработчиках ожидания (возможности процедур вызываться через установленные промежутки времени) лучше всего, когда критерий выполнения ие находится в информационной базе «ЮПредприятия». В этом случае можно периодически выполнять запрос и в случае получения нужного признака программно выполнять задачу. Реализовывать обратную связь на механизме оповещения лучше всего в том случае, когда выполнение задачи связано с каким-либо действием над объектом базы данных. Бывают ситуации, когда критерий выполнения задачи не простой, а составной (требуется создание ряда документов, окончание выполнения каких-либо механизмов). В этом случае предпочтительным вариантом (в общем случае) является распараллеливание участков карты бизнес-процесса и реализация механизма обратной связи с использованием механизма оповещения. Рассмотрим пример реализации механизма обратной связи с использованием механизма оповещения. Постановка задачи. В карте маршрута существует точка действия Выдача наличных денег (с именем ОформлениеВыплаты), при переходе на нее создается задача. При активации этой задачи создается документ Расходный кассовый ордер. Документ заполняется на основании данных бизнес-процесса. Кассир как исполнитель должен только сохранить и провести документ, чтобы данная задача считалась выполненной. Как это организовать? Предположим, что в бизнес-процессе определен реквизит РКО, содержащий ссылку на оформляемый документ. В модуле формы документа Расходный кассовый ордер (отслеживаем инте- рактивные действия пользователя) в обработчике события После записи определяем следующую строку (листинг 1.24). Листинг 1.24. Вызов метода «Оповестить()» &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи - РежимЗаписиДокументаЛроведение Тогда Оповестить{"ЗаписьРасходногоКассовогоОрдера”,, Объект.Ссылка); КонецЕсли; ||(|| КонецПроцедуры
60 Решение специальных прикладных задач в «1С:Предприятии 8» В модуле управляемого приложения определяем процедуру, которая будет являться обработчиком при оповещении (листинг 1.25). Листинг 1.25. Процедура «ОбработчикОповещения» Процедура ОбработчикОповещения(ИмяСобытия, Параметр, Источник) Экспорт РаботаСБизнесПроцессами.ВыполнитьЗадачуПЬДокументу(ИмяСобытия, Источник); КонецПроцедуры Из обработчика оповещения вызывается процедура серверного общего модуля РаботаСБизнесПроцессами (с установленными свойствами Сервер и Вызов сервера), которая выполнит все необходимые проверки и выполнит задачу (листинг 1.26). Листинг 1.26. Процедура серверного общего модуля Процедура ВыполнитьЗадачуПоДокументу(ИмяСобытия. ДокументСсылка) Экспорт Если ИмяСобытия = "ЗаписьРасходногоКассовогоОрдера” Тогда Запрос = Новый Запрос; Запрос.УстановитьПараметр("Парам”, ДокументСсылка); Запрос.Текст = "ВЫБРАТЬ Задача.Ссылка ИЗ Задача.Задача.ЗадачиПоИсполнителю КАК Задача ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.ВыдачаДенегПодотчетнику КАК ВыдачаДенегПодотчетнику ПО Задача.БизнесПроцесс = ВыдачаДенегПодотчетнику.Ссылка ГДЕ Задача.Выполнена = ЛОЖЬ И ВыдачаДенегПодотчетнику.РКО = &Парами; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.СледующийЦ Цикл ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъекг(); Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы.ВыдачаДенегПодотчетнику. ТочкиМаршрута. ОформлениеВыплатыТогда Если ТекущаяЗадача.ПроверитьВыполнение() Тогда ТекущаяЗадача.ВыполнитьЗадачу(); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; // ИмяСобытия = "ЗаписьРасходногоКассовогоОрдера" КонецПроцедуры
Глава 1. Механизм бизнес-процессов 61 В первую очередь в данном обработчике проверяется имя обрабатываемого события (в общем случае их может быть больше одного). После этого выполняется запрос. В выборку результатов запроса попадают (в общем случае) все невыполненные задачи бизнес-процесса, значение реквизита РКО которого совпадает со значением, переданным в параметр запроса (значение берется из параметра обработчика оповещения). Поэтому при работе с полученной выборкой необходимо проверять принадлежность задачи интересующей нас точке маршрута. При прохождении всех условий методом ПроверитьВыполнениеО прове- ряются условия выполнения найденной задачи. В случае положительного результата выполняется метод задачи ВыполнитьЗадачу() (приводит к отметке задачи как выполненной и продвижению бизнес-процесса к следующей точке по карте бизнес-процесса). Следует заметить, что если обработчики события ОбработкаПроверкиВыполнения и у точки марш- рута, и у самой задачи отсутствуют, то метод ПроверитьВыполнениеО вернет Ложь. Поэтому должен существовать хотя бы один обработчик события ОбработкаПроверкиВыполнения, в котором, хотя бы формально, пара- метр Результат устанавливается в значение Истина. То, что процедура ОбработчикОповещения () будет являться обработчиком оповещения, определяется выполнением следующей строки кода, разме- щенной в обработчике события При начале работы системы в модуле управляемого приложения (листинг 1.27). Листинг 1.27. Подключение обработчика оповещения Под1тючитьОбработчикОповещения(" ОбработчикОповещения"); Примеры реализации бизнес-процессов В данном разделе разберем реализацию ряда бизнес-процессов. Следует воспринимать их как примеры (не претендующие на истину в последней инстанции), иллюстрирующие механизмы бизнес-процессов. Познакомиться с различными примерами реализации бизнес-процессов можно в конфигурации «Бизнес-процессы и задачи», прилагающейся к книге на компакт-диске. Единый объект «Задача» Во всех рассматриваемых бизнес-процессах будет использоваться один объект конфигурации Задача и, соответственно, один регистр сведений РегистрАдресации, отвечающий за адресацию.
62 Решение специальных прикладных задач в «1С:Предприятии 8» Этот регистр сведении будет иметь следующий состав измерений (габл. 1.13). Таблица 1.13. Измерения регистра сведений Измерение Тип измерения Сотрудник Справочнике сылка.Сотрудники Роль Исполнителя СправочникСсылка.Рол и Исполни гелей Подразделение СправочникСсылка.Потраз деления Регистр имеет следующее наполнение (табл. I.14). Таблица 1.14. Данные регистра сведений Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Петров Бухгалтер Сидоров Кладовщик Оптовый склад Федоров Отдел продаж Федоров Руководитель отдела Отдел продаж Степанов Кладовщик Оптовый склад Объекл конфигурации Задача имеет имя Задача и следующие реквизиты (табл. 1.15). Таблица 1.15. Реквизиты объекта конфигурации «Задача» Реквизиты адресации Тип реквизита Сотрудник С п равоч 11 и кС с ы л ка .Сотруд н и ки РольИснолни геля СправочникСсылка.РолиИсполнителей Подразделение СправочникСсылка.Подразделения Реквизиты задачи Тип реквизита Кон гролызыйСрок Дата (состав Дата и Время) Да гаВыпол нения Дата (состав Дата и Время) Исполнитель СправочникСсылка.Сотрудники Приоритет Число Дата А вто В ы пол нения Дата (состав Дата и Время) В качестве основного реквизита адресации выбран реквизш адресации Сотрудник. В свойство Текущий исполнитель выбран параметр сеанса ТекущийИспол- нитель (тип СправочникСсылка. Сотрудники). Данный параметр сеанса инициализируется в обработчике события ПриУстановкеПараметровСеанса модуля сеанса (листинг 1.28).
Глава 1. Механизм бизнес-процессов 63 Листинг 1.28. Заполнение параметра сеанса «ТекущийИсполнитель» Процедура УстановкаПараметровСеанса() ПараметрыСеанса.ТекущийИсполнитель = Справочники.Сотрудники.НайтиПоНаименованию(ИмяПользователя()); КонецПроцедуры Считается, что имя пользователя, указываемое при входе в систему, совпа- дает с наименованием элемента справочника Сотрудники. Для заполнения ряда реквизитов задачи в модуле объекта Задача определен следующий обработчик события ПередВыполнением (листинг 1.29). Листинг 1.29. Обработчик события «ПередВыполнением» Процедура ПередВыполнением(Отказ) // Проверка даты на пустое значение. Если ДатаВыполнения = '000101 ОТ Тогда ДатаВыполнения = ТекущаяДата(); КонецЕсли; II Если исполнитель до начала выполнения не определен, II он записывается из параметра сеанса. IIВ этом случае записывается пользователь, в контексте которого запущено // «1 С:Предприятие». Если Исполнитель.Пустая() Тогда Исполнитель = ПараметрыСеанса.ТекущийИсполнитель; КонецЕсли; КонецПроцедуры Данный обработчик события определяет, что при выполнении задачи (программном или интерактивном) в ней сохраняется время выполнения и исполнитель. Для удобства работы пользователей со списком задач существует форма списка с именем ФормаСпискаПоИсполнителю. В свойствах основного реквизита формы, содержащего динамический список задач, свойство ОсновнаяТаб- лица установлено в значение Задача.Задача.ЗадачиПоИсполнителю (рис. 1.43). Выбор этой виртуальной таблицы позволяет без каких-либо дополни гсльпых действий показать только те задачи, которые адресованы пользователю, авто- ризовавшемуся в данном сеансе «1 С:Предприятия». Для удобства отображения списка задач в режиме 1 (^Предприятие в палитре свойств динамического списка можно настроить некоторые его свойства.
64 Решение специальных прикладных задач в «1С:Предприятии 8» Свойства: Рек виз иг X I "» Основные: Имя Список Заголовок Q | i __________________________________________________________ I Тип ’ ДинзмическийСписок | Основной реквизит !< | ▼ Использование: Просмотр Открыть Редактирование Открыть Функциональные опции ... ' ▼ Объект: ПроизвольныйЗзпрос Дин -ми чс> к oeL читыв зние Д анны:-: Настройка списка Открыть / Mbitl *'с 43 «. *1 *" * * *• 1 Рис. 1.43. Свойства основного реквизита формы типа «ДинамическийСписок» В окне настройки списка (гиперссылка Открыть), на закладке Настройки ► Порядок задана настройка сортировки динамического списка по убыванию поля Дата (рис. 1.44). Динамический снисик У Настройки ¥ Отбор | Порядок з Группировка X'' Условное оформление Доступные поля Поле П ч * анио Д'та е» Дата Бизнес-процесс Выполнена Отмена Рис. 1.44. Настройка сортировки динамического списка Направление сортировки Дата авто выполнения Дата выполнения Исполнитель Контрольный срок Наименование Номер Подразделение Пометка удаления Свойства таблицы формы, отображающей данные динамического списка, установлены следующим образом — АвтоОбновление = Истина и Пери- одАвтоОбновления = 5 (рис. 1.45). Теперь рассмотрим возможность организации просмотра списка задач для разных пользователей. Вообще говоря, такая возможность должна предо- ставляться только администратору, но для упрощения примера этот момент опущен.
Глава 1. Механизм бизнес-процессов 65 Свойства: Таблица X I ?! х v РежимВыделения Множественный ’Г Ж РежимВ ыде ленияСтроки i Я чеика 1 11 Шапка Подвал ) Вывод Авто тг АвтоВ водН овойСтроки CI | АвтоВводНезаполненного Авто *; АвтоОтметкаН езапо лненного Авто L—# 1 ПоискПриВводе Авто Сочетаниек.лавиш Г X 1 РазрешитьНачалоПеретзскивания РазрешигьПеретаскивание Подсказка п Q /АвтоО бновление ч/ \ПериодАвтоО бнов ления 5 С/ ВыборГруппИЗ лементов Элементы '» ! V В осстанавливатьТ екущуюСтроку □ ОтображатьК.орень ✓ РазрешитьВыборКорня I 0 бновлениеП риИ вменении Данных Авто иг Рис. 1.45. Свойства таблицы формы, отображающей список задач Для демонстрации этой возможности в форме списка существует реквизит Пользователь (тип СправочникСсылка.Сотрудники), связанный через свойство ПутьКДанным с одноименным элементом формы вида Поле ввода. В палитре свойств динамического списка установлено свойство Произволь- ныйЗапрос. В модуле формы определены обработчики событий ПриСозданииНаСер- вере формы (листинг 1.30) и ПриИзменении поля ввода (листинг 1.31). Листинг 1.30. Обработчик события «ПриСозданииНаСервере» формы списка &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Пользователь = ПараметрыСеанса.ТекущийИсполнитель; КонецПроцедуры Листинг 1.31. Обработчик события «ПриИзменении» поля ввода // Процедура-обработчик изменения поля ввода’’Пользователь". &НаКлиенте Процедура ПользовательПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметрарИсполнитеяь" Пользователь); КонецПроцедуры С
66 Решение специальных прикладных задач в «1С:Предприятии 8» В цервой процедуре (листинг 1.30) реквизит формы Пользователь инициали- зируется значением из параметра сеанса. Во второй процедуре (листинг 1.31) при изменении значения в поле ввода, связанном с реквизитом формы Пользователь, новое значение устанавливается в качестве параметра запроса методом УстановитьЗначениеПараметра () коллекции параметров динамического списка (Список. Параметры). В коллекции параметров есть параметр Исполнитель, и он передается как параметр запроса в виртуальную таблицу Задача.Задача.ЗадачиПоИсполни- телю, служащую источником данных для динамического списка. Это приводит к тому, что в списке отображаются задачи только по выбранному исполни- телю (рис. 1.46). Задачи для бизнес-процессов ,, Создать t * ч. Найти. Все действия ▼ Пользователь. Федоров ... Q' , Номер Наименование Дата Выполнена Бизнес процесс 1И OOOOQDOol 1 Выписка счета 24.10.2011 20:46:45 Продажа товара 0 000000027 Передача на согласование 16.08.2011 21:56:11 Согласование 000 I Рис. 1.46. Список задач по выбранному пользователю Запустив «1С:Предприятие», мы можем убедиться, что задачи в списке задач отобраны по указанному в форме списка исполнителю и отсортированы по убыванию колонки Дата. Также можно создать отбор по невыполненным задачам (Выполнена = Ложь), как показано в разделе «Форма списка задач» на стр. 54, можно просматривать значения реквизитов адресации, реквизитов задачи. В ряде случаев этого может быть недостаточно. Например, необходимо отслеживать, была ли хоть раз выполнена активация задачи (была ли хоть раз предпринята попытка открыть форм} задачи или форму сопутствующих объектов конфигурации). Для решения этой задачи можно использовать регистр сведений ПросмотрЗадач (табл. 1.16). Таблица 1.16. Структура регистра «ПросмотрЗадач» Измерение Тип измерения Задача ЗадачаСсылка.Задача Сотрудник СправочникСсылка. Сотрудники
Глава 1. Механизм бизнес-процессов 67 Ресурсов и реквизитов у данного регистра сведений нет. Сама идея механизма довольно проста: при активации задачи в регистр сведений будут записываться данные о задаче и ее текущем исполнителе. При выполнении задачи данные о ней будут удаляться из регистра сведений. Это можно реализовать с помощью обработчиков событий ОбработкаПолу- ченияФормы модуля менеджера задачи (листинг 1.32) и ПриВыполнении (листинг 1.33) модуля объекта Задача. Листинг 1.32. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры. ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; I/ Регистр сведений "Просмотр задач" используется для регистрации //данных по текущим (не выполненным) задачам. НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Задача.Значение = ЗадачаСсылка: НаборЗаписей. Отбор.Задача.Использование = Истина: IIВ параметре “Текущий исполнитель" находится ссылка на текущего II пользователя: этот параметр сеанса выбран в свойство // "Текущий Исполнитель соответствующей задачи. НаборЗаписей.Отбор.Сотрудник.Значение = ПараметрыСеанса ТекущийИсполнитель НаборЗаписей Отбор.Сотрудник.Использование = Истина. НаборЗаписей Прочитать(); Если НаборЗа исей.Количество() = 0 Тогда IIВ набор записей добавляем новую запись, // характеризующую активизированную задачу. НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Задача = ЗадачаСсылка; НоваяЗапись. Сотрудник = ПараметрыСеанса.ТекущийИсполнитель: Попытка Набор3аписей.3аписать(); Исключение Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; КонецЕсли; КонецЕсли; КонецПроцедуры
Решение специальных прикладных задач в «ЮПредприятии 8» Обработчик события ОбработкаПолученияФормы вызывается при акти- вации задачи, а также при открытии любых форм задачи. Поэтому сначала проверяется, что открывается форма объекта задачи (параметр ВидФормы = "ФормаОбъекта")- Ссылка на задачу передается в структуре параме- тров открываемой формы (Параметры.Ключ). Затем данные о задаче и ее текущем исполнителе заносятся в регистр сведений ПросмотрЗадач. В обработчике ПриВыполнении данные о выполненной задаче удаляются из регистра сведений путем записи пустого набора записей с отбором по задаче (листинг 1.33). Листинг 1.33. Обработчик события «ПриВыполнении» Процедура ПриВыполнении(Отказ) / Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Задача выполнена:" ++ Наименование + Сообщение.Сообщить(); ::''33 <i33-' 3:ЗЗ' 3:Н: •':' 'С;-.;-:?.:. . 3• Л 33 33'33-33• 33: . • 3'-:< ЗЗЗЗЗ33 ЗЗ-З33' 3: ЗЗЗЗЗЗЗЗЗЗЗ-'С-':. • '333'3' 3'' 3333'3^ ЗЗЗЗЗЗЗЗЗЗ3:3' О 333:3 '-3 3 -'33333 33';• 3'3' •"•З-3'333: 3•3;3 ' 3' ."?3:: 33- ЗзЗЗ НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Задача.Значение = Ссылка; НаборЗаписей.Отбор.Задача.Использование = Истина- з * з зз 'Попытка уз' Пзз- ;зпбззз-у ' з з К-. з:.з< /д ;з .>'з:.: д з<? ; // Пытаемся записать пустой набор записей в регистр, //фактически удаляем из него данные о задаче если они там были. НаборЗаписей.Записать(Истина); Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; Конег Одно дело - записать (и вовремя удалить) данные в регистр сведений, другое дело - это организовать для пользователя удобный механизм просмотра этих данных. Например, как сделать так, чтобы ни разу не активированные пользо- вателем задачи выделялись бы жирным шрифтом? Для решения этой задачи вернемся к форме списка. Сначала в произвольный запрос для динамического списка добавляется таблица регистра сведений ПросмотрЗадач. В палитре свойств динамического списка, нажав гиперссылку Открыть, можно увидеть и отредактировать текст запроса, который выполняется при форми- ровании динамического списка (рис. 1.47).
Глава 1. Механизм бизнес-процессов 69 Динамическийсписок : : Рис. 1.47. Текст запроса для динамического списка В запросе виртуальная таблица Задача.Задача.ЗадачиПоИсполнителю левым соединением связывается с таблицей регистра сведений ПросмотрЗадач, отобранной по текущему пользователю (поле Сотрудник = Пользователь). То есть в результате выполнения запроса в список задач попадут все задачи по исполнителю, но у задач, не найденных в регистре сведений, в поле Задача будет значение Null. В обработчик события ПриСозданииНаСервере добавляется строка для передачи параметра Сотрудник в запрос (листинг 1.34). Листинг 1.34. Обработчик события «ПриСозданииНаСервере» формы списка &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Пользователь = ПараметрыСеанса.ТекущийИсполнитель; Список.Параметры.УстановитьЗначениеПараметра("Сотрудник", Пользователь); КонецПроцедуры
70 Решение специальных прикладных задач в «1С:Предприятии 8» В окне настройки списка на закладке Настройки ► Условное оформление зада- ется условное оформление динамического списка (рис. 1.48). Запрос Настройки Г Отбор | Порядок ЗД Группировка Условное оформление !, X Подробно ; I Оформление у. Шрифт Условие Выполнена Г «а *'Ло<»ь’1И Зод-r Не заполнено Оформляемые поля X Отбор X Ц ’ X Подробно Левое значение Вид сравнения Правое значение Отбор I {*> =* Выполнена Равно Ложь у Задача Не заполнено ОК Отмена Рис. 1.48. Настройка условного оформления динамического списка Во втором элементе отбора условного оформления динамического списка выбираются записи, у которых поле Задача (из регистра сведений Про- смотрЗадач) не определено (ВидСравненияКомпоновкиДанных.НеЗа- полнено). Поскольку в списке задач оформляется полностью вся строка, оформляемые поля в настройках условного оформления не заданы. В результате в режиме 1С:Предприятие список задач будет выглядеть следу- ющим образом (рис. 1.49). f Задачи для бизнес-процессов j ♦ .«Создать 1(1 . & 'Х< :++) кНайги... Воздействия’ Пользователь: Петров ... Q Номер Наименование Дата Выполнена Бизнес пр А Получение оплаты- 26.10.2011 16:19:01 * Продажа! |\] 000000032 Получение оплаты 24.10.2011 22:... Продажа Рис. 1.49. Список задач в режиме «1С:Предприятие»
Глава 1. Механизм бизнес-процессов 71 Выполнив команду Все действия ► Настроить список..., пользователь может просмотреть, изменить, отключить или удалить сделанные разработчиком настройки в соответствии со своими предпочтениями. Бизнес-процесс «Продажа товара» Данный бизнес-процесс позволяет отследить всю последовательность действий: с выписки счета менеджером, получения оплаты бухгалтером и до отгрузки товара кладовщиком. При этом проверяется скидка, установленная менеджером. Если она превышает некий предел, установленный для фирмы, то такой счет предварительно идет на утверждение к руководителю отдела. У бизнес-процесса определено два реквизита: Счет (ссылка на документ); Расходная Накладная (ссылка на документ). Карта маршрута бизнес-процесса имеет следующий вид (рис. 1.50). ) ‘А? Д ОтделПрода... 1 Выписать счет Рис. 1.50. Карта маршрута бизнес-процесса Отмена Перед тем как перейти к рассмотрению внутренних механизмов данного бизнес-процесса, следует обратить внимание на тот факт, что для более удобной работы пользователей с задачами данного бизнес-процесса необ- ходимо организовывать так называемый механизм обратной связи. При активации задач будут открываться формы других объектов (документов Счет, Расходная накладная), а при их проведении и записи соответствующие им задачи будут выполняться.
72 Решение специальных прикладных задач в «^Предприятии 8» Для этой цели необходимо внести изменения в сами документы. Например, в обработчик события ПослеЗаписи основной формы документа Счет можно поместить следующую строку кода (листинг 1.35). Листинг 1.35. Вызов метода «Оповестить()» &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Оповестить("ЗаписьСчета",, Объект.Ссылка); КонецЕсли; КонецПроцедуры В одноименный обработчик формы документа Расходная накладная можно добавить аналогичную строку, но с другим именем события (листинг 1.36). Листинг 1.36. Вызов метода «Оповестить()» &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Оповестить("ЗаписьРасходнойНакладной",, Объект.Ссылка); КонецЕсли; КонецПроцедуры В модуле управляемого приложения следует определить процедуру, которая будет являться обработчиком при оповещении (листинг 1.37). Листинг 1.37. Процедура «ОбработчикОповещения» Процедура ОбработчикОповещения(ИмяСобытия, Параметр, Источник) Экспорт РаботаСБизнесПроцессами.ВыполнитьЗадачуПоДокументу(ИмяСобытия, Источник); КонецПроцедуры^}. Из обработчика оповещения вызывается процедура серверного общего модуля РаботаСБизнесПроцессами (с установленными свойствами Сервер и Вызов сервера), который выполнит все необходимые проверки и выполни! задачу (листинг 1.38). Листинг 1.38. Процедура серверного общего модуля Процедура ВыполнитьЗадачуПоДокументу(ИмяСобытия) ДокументСсылка) Экспорт Если ИмяСобытия = "ЗаписьРасходнойНакладной” Тогда Запрос = Новый Запрос* Запрос.УстанрвитьПараме¥р(’Ла'ра^,Д₽кумен?Ссь1лка); Запрос.Текст = "ВЫБРАТЬ | Задача.Ссылка
Глава 1. Механизм бизнес-процессов БизнесПроцесс.ПродажаТовара КАК ПродажаТовара ЛЕВОЕ СОЕДИНЕНИЕ Задача Задача.ЗадачиПоИсполнителю КАК Задача ПО ПродажаТовара.Ссылка = Задача БизнесПроцесс ГДЕ (Задача.Выполнена = ЛОЖЬ) И ПродажаТовара.РасходнаяНакладная = &Парам"; Выборка = Запрос.Выполнить() Выбрать(); Пока Выборка.Следующии) Цикл ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект(); Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы. ПродажаТовара ТочкиМаршрута.Отгрузка Тогда Если ТекущаяЗадача.ПроверитьВыполнение() Тогда ТекущаяЗа ача ВыполнитьЗадачу(), КонецЕсли; КонецЕсли; КонецЦикла, КонецЕсли ИмяСобытия = ’’ЗаписьРасходнойНакладной' Если ИмяСобытия = ’ ЗаписьСчета" Тогда " Запрос = Новый Запрос: Запрос.УстановитьПараметр("Парам’’, ДокументСсылка), Запрос.Текст = ’’ВЫБРАТЬ Задача.Ссылка ИЗ БизнесПроцесс.ПродажаТовара КАК ПродажаТовара ЛЕВОЕ СОЕДИНЕНИЕ Задача.Задача.ЗадачиПоИсполнителю КАК Задача ПО ПродажаТовара. Ссылка = Задача. БизнесПроцесс ГДЕ (Задача.Выполнена = ЛОЖЬ) И ПродажаТовара.Счет = &Парам"; Выборка = Запрос.Выполнить().Выбрать();; В Пока Выборка.Следующий() Цикл ТекущаяЗадача = Вь борка.Ссылка.ПолучитьОбъе! ) Если Теку щаяЗадача ТбчкаМаршрута = БизнесПроцессь ПродажаТовара ТочкиМаршрута.ВыпискаСчета ИЛИ ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессь ПродажаТовара ТочкиМаршрута По'лучёнйёОплаты ИЛИ ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы ПродажаТовара.ТочкиМаршрута.УтверждениеСчета Тогда Если ТекущаяЗадача.ПроверитьВыполнение() Тогда ТекущаяЗадача.ВыполнитьЗадачу(); ... КонецЕсли; » КонецЕсли; КонецЦикла, КонецЕсли; II ИмяСобытия = "ЗаписьСчета" КонецПроцедуры
74 Решение специальных прикладных задач в «1С:Предприятии 8» Остается в обработчике события При начале работы системы в модуле управляемого приложения назначить вышеописанную процедуру обработ- чиком оповещения. Сделать это можно с помощью строки следующего вида (листинг 1.39). Листинг 1.39. Подключение обработчика оповещения ПодключитьОбработчикОповещения("ОбработчикОповещения"); В итоге получается, что при записи какого-либо документа он опове- щает об этом систему. В обработчике оповещения производится поиск соответствующей задачи, и, если обработчик события ОбработкаПровер- киВыполнения соответствующей точки маршрута возвращает значение Истина, она выполняется. В дальнейшем (в данном разделе), когда будем говорить о выполнении задачи, при активации которой открывались формы документов (а форма самой задачи нет), будет подразумеваться вышеописанный механизм. Вернемся к бизнес-процессу. При запуске (старте) бизнес-процесса выполняется следующее событие (листинг 1.40). Листинг 1.40. Обработчик события «ПередСтартом» Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса. Отказ) НужноЗалисать = Ложь; Если Счет.Пустая() Тогда СчетОбъект = Документы.Счет.СоздатьДокумент(); СчетОбъект.Дата = ТекущаяДата(); СчетОбъект.Записать(); Счет = СчетОбъект. Ссылка: НужноЗалисать = Истина; КонецЕсли; Если РасходнаяНакладная.Пустая() Тогда РасходнаяНакладнаяОбъект = Документы.РасходнаяНакладная.СоздатьДокумент(); РасходнаяНакладнаяОбъект.Дата = ТекусцаяДата(); РасходнаяНакладнаяОбъект.Записать(); Расходная Накладная = РасходнаяНакладнаяОбъект.Ссылка; НужноЗалисать = Истина; КонецЕсли; Если НужноЗалисать Тогда Записать!): КонецЕсли; Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Старт бизнес-процесса:" + |’"'ш + ЭтотОбъект.Метаданные( Синоним + Сообщение .Сообщить!); КонецПроцедуры II СтартПередСтартом{ТочкаМаршрутаБизнесПроцесса, Отказ)
Глава 1. Механизм бизнес-процессов 75 В этом обработчике производится проверка на заполненность реквизитов Счет и РасходнаяНакладная. Если реквизиты содержат пустые ссылки, то тогда создаются документы соответствующих видов и ссылки на них запи- сываются в бизнес-процессе. После старта бизнес-процесс переходит к точке действия Выписать счет (имя точки действия ВыпискаСчета). В этой точке установлено значение реквизита адресации Подразделение в значение ОтделПродаж. В результате при пере- ходе к этой точке маршрута создается задача с установленным реквизитом адресации Подразделение. В случае, если соответствующая задача активирована, необходимо открыть форму счета, связанную через бизнес-процесс с соответствующей задачей. Для этого в обработчик события ОбработкаПолученияФормы модуля менеджера задачи нужно добавить следующий фрагмент кода (листинг 1.41). Листинг 1.41. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры. Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект{), Если ЗадачаОбъект ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ВыпискаСчета Тогда ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта”; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс Счет; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры В процедуре обработчика переопределяется параметр ВыбраннаяФорма (тем самым указывается форма, которая должна быть открыта вместо формы задачи) и параметр Ключ коллекции параметров открываемой формы (т. е. вместо ссылки на задачу параметр Ключ будет содержать ссылку на счет, являющийся реквизитом бизнес-процесса, породившего задачу). Результатом будет открытие формы счета, форма задачи при этом откры га не будет (СтандартнаяОбработка = Ложь). При попытке выполнения задачи точки маршрута Выписать счет срабатывает следующий обработчик события точки маршрута (листинг 1.42).
Решение специальных прикладных задач в «^Предприятии 8» Листинг 1.42. Обработчик события «ПередВыполнением» Процедура ВыпискаСчетаПередВыполнением(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) Если Счет.Состав.КоличествоО = 0 Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры В процедуре проверяется количество строк 1абличной части документа Счет. Если количество строк табличной части равно нулю, задача не будет выпол- нена и бизнес-процесс не пойдет дальше по карге маршрута. При выполнении задачи точки маршрута Выписать счет бизнес-процесс пере- ходит к точке условия Скидка по счету выше стандартной? (имя точки действия УсловиеОграниченияСкидки). Обработчик проверки условия имеет следующий вид (листинг 1.43). Листинг 1.43. Обработчик события «ПроверкаУсловия» II Процедура обработчик события "ПроверкаУсловия" II точки маршрута "УсловиеОграниченияСкидки". Процедура УсловиеОграниченияСкидкиПроверкаУсловия^ТочкаМаршрутаБизнесПроцесса, Результат) СкидкаБольшеОбычной = Ложь; ОбычнаяСкидка = Константы.ОбычнаяСкидка.Получить(); II Проверяем, что скидка не превышает обычную. Для Каждого Элемент Из Счет.Состав Цикл Если Элемент.Скидка > ОбычнаяСкидка Тогда СкидкаБольшеОбычной = Истина; Прервать; КонецЕсли; КонецЦикла; Результат = СкидкаБольшеОбычной; КонецПроцедуры Если скидка хотя бы в одной строке табличной части документа больше величины, определенной в константе, то в параметр процедуры Результат записывается значение Истина и бизнес-процесс идет по ветви Да (на утверждение скидки). В этом случае бизнес-процесс продвигается до точки Утвердить счет (имя точки действия УтверждениеСчета), в которой происходит создание задачи с установленным реквизитом адресации РольИсполнителя в значение Руко- водительОтдела, Подразделение в ОтделПродаж (соответствующие значения определены в свойствах группы Адресация точки гействия). Следует отме-
Глава 1. Механизм бизнес-процессов 77 тить, что в соответствии с такими значениями реквизитов адресации данная задача (в форме списка ФормаСпискаПоИсполнителю) будет отображаться только для пользователя Федоров. При активации созданной задачи выполняется следующий код обработчика события ОбработкаПолученияФормы модуля менеджера задачи (листин! 1.44). Листинг 1.44. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта” Тогда ЗадачаСсылка = Параметры. Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); ... Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.УтверждениеСчета Тогда ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта"; Параметры. Ключ = ЗадачаОбъект.БизнесПроцесс. Счет; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли, КонецПроцедуры При его выполнении открывается форма счета, а форма задачи не открыва- ется. После выполнения текущей задачи бизнес-процесс переходит к точке условия Счет утвержден? (имя точки действия УсловиеУтверждения). Обработчик проверки условия имеет следующий вид (листинг 1.45). Листинг 1.45. Обработчик события «ПроверкаУсловия» Процедура УсловиеУтвержденияПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса. Результат) // Проверяем, что скидки согласованы. Результат = Счет.СкидкаСогласована; КонецПроцедуры Признаком утверждения счета является отметка в документе Счет флажка СкидкаСогласована (запись в соответствующий реквизит значения Истина). Обратите внимание, что на карте маршрута бизнес-ироцесса у данной точки условия ве!ви Да и Нет направлены в противоположную сторону. В стан- дар! ном варианте по умолчанию ветка Нет находится слева. Поэтому, чтобы
78 Решение специальных прикладных задач в «^Предприятии 8» бизнес-процесс правильно реагировал на выполнение/невыполнение условия, в данном случае необходимо поменять местами ветви Да и Нет, перетащив их мышью на карте маршрута. Если в параметр Результат записано значение Ложь, бизнес-процесс пере- ходит к точке завершения Отмена и бизнес-процесс завершается. В другом случае бизнес-процесс переходит к точке карты маршрута Полу- чить наличную оплату (имя точки действия ПолучениеОплаты). К этой же точке маршрута бизнес-процесс перейдет в случае, если скидка в счете не превы- шает порогового значения. Эта точка является точкой действия, поэтому при переходе к ней создается задача с установленным реквизитом адре- сации РольИсполнителя в значение Бухгалтер (в соответствии с наполнением регистра сведений, ответственным за адресацию, данная задача будет присут- ствовать для пользователя Петров). При активации созданной задачи выполняется следующий код обработчика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 1.46). Листинг 1.46. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры. ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ПолучениеОплаты Тогда ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Откроется форма документа Счет (ссылка на который хранится в бизнес- процессе), форма задачи открыта не будет. После выполнения данной задачи (приема оплаты) бизнес-процесс перейдет к следующей точке карты маршрута Отгрузить товар со склада (имя точки действия Отгрузка). В данной точке свойство (группы свойств Адресация) РольИсполнителя установлено в значение Кладовщик
Глава 1. Механизм бизнес-процессов 79 Для данной точки определено два обработчика собы гий: ПриСозданииЗадач в модуле объекта бизнес-процесса (листинг 1.47) и ОбработкаПолуче- нияФормы в модуле менеджера задачи (листинг 1.48). Один из них срабатывает при создании задачи. Листинг 1.47. Обработчик события «ПриСозданииЗадач» Процедура ОтгрузкаПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) Склад = Справочники.Подразделения.НайтиПоНайменованию(РасходнаяНакладная.Склад): Если Не Склад.Пустая() Тогда Для Каждого Задача Из ФормируемыеЗадачи Цикл Задача.Подразделение = Склад; КонецЦикла; КонецЕсли; КонецПроцедуры В справочнике Подразделения ищется значение, равное по наименованию складу из документа Расходная накладная. В случае успеха (найденная ссылка не пустая) полученное значение записывается в реквизит адресации задачи Подразделение. При активации задачи открывается форма расходной накладной. Для этого в обработчик события ОбработкаПолученияФормы модуля менеджера задачи нужно добавить следующий фрагмент кода (листинг 1.48). Листинг 1.48. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры. Ключ; ЗадачаОбъект ~ ЗадачаСсылка ПолучитьОбъект(); Если ЗадачаОбъект Л очкаМаршрута = ВизнесПроцессы.ПродажаТовара.ТочкиМаршрута.01 грузка Тогда ВыбраннаяФорма = "Документ.РасходнаяНакладная.ФормаОбъекта"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс РасходнаяНакладная; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры
80 Решение специальных прикладных задач в «^Предприятии 8» Кладовщик уточняет перечень отгружаемых товарных позиций и выполняет задачу. После выполнения текущей задачи бизнес-процесс переходит к точке Нормальное завершение и завершается. Бизнес-процесс «Продажа товара с предоплатой» Автоматизируемый бизнес-процесс очень похож на ранее рассмотренный (бизнес-процесс Продажа товара, стр. 71). Но есть одна отличительная особенность. Во взаиморасчетах между покупателем и продавцом возможны случаи предоплат. Применительно к ранее рассмотренному бизнес-процессу это означает, что при переходе к точке маршрута Получение наличной оплаты в случае достаточности средств «на балансе покупателя» эта точка маршрута должна быть пройдена автоматически. Карта бизнес-процесса такая же, как и в предыдущем случае. Рассмотрим один из вариантов учета данной специфической особенности. Достаточно следующим образом определить обработчик события Перед созданием задач точки маршрута Получение наличной оплаты (листинг 1.49). Листинг 1.49. Обработчик события «ПередСозданиемЗадач» Процедура ПолучениеОплатыПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемйёЗадачи, СтандартнаяОбработка) // С помощью реализованной в общем модуле функции получаем // сумму возможного аванса. СостояниеВзаиморасчетов = ПолучитьСостояниеВзаиморасчетов(Счет.Контрагент); СуммаПоДокументу = Счет.Соетав.Итог('’Сумма"); Если СостояниеВзаиморасчетов > СуммаПоДокументу Тогда ЗафиксироватьОплату(Счет); СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры Смысл механизма заключается в том, что при выполнении щнного обработ- чика проверяется наличие предоплаты. Если суммы предоплаты достаточно для оплаты данного счета, параметр СтандартнаяОбработка устанавливается в значение Ложь. Это приводит к тому, что штатный механизм формиро- вания задач не срабатывает. А так как в данном обработчике массив задач не формировался (и обработчик При создании задач для данной точки
Глава 1. Механизм бизнес-процессов 81 также не определялся), это приводит к тому, что не создается ни одной задачи и бизнес-процесс автоматически переходит к следующей точке бизнес- процесса. Следует обратить внимание, что попытка реализации данного процесса приведет к изменению текста процедуры - обработчика оповещения. Бизнес-процесс «Поручение» Данный процесс автоматизирует последовательность выдачи поручений (на проведение какого-либо действия). Например, кто-то должен заказать авиабилеты для директора (поездки в командировку), кто-то этот процесс должен проконтролировать и т.п. У бизнес-процесса определены следующие реквизиты (табл. 1.17). Таблица 1.17. Реквизиты бизнес-процесса «Поручение» Реквизит Тип Автор СправочникСсылка.Сотрудники Исполнитель СправочникСсылка.Сотрудники Исполнител ь Рол ь СправочникСсылка.РолиИсполнителей Испол нител ьОтдел СправочникСсылка.Подразделения Контролер С п равоч н и кС с ы л ка. С отруд н и к и КонтролерРоль С правоч н и кСсылка. Рол и Исполнителей КонтролерОтдел С11равоч пи кСсыл ка. Подразделения Приоритет Число Тема Строка ТекстПоручения Строка ОтчетОВыполнен и и Строка Отч етОКонтрол е Строка Параллельный Контроль Булево ДатаВыполнения Дата ДатаКонтроля Дата КонтрольныйСрок Дата ОтметкаОВыполнении Булево ОтметкаОСняти иС Контроля Булево Карта бизнес-процесса имеет следующий вид (рис. 1.51). У данного бизнес-процесса определены две точки старта. Попытка запу- стить процесс штатными средствами приведет к ошибке (не определена точка старта). Забегая вперед, скажем, что данный бизнес-процесс будет исполь- зоваться как вложенный (в этом случае и будет использоваться точка старта
Решение специальных прикладных задач в «^Предприятии 8» СтартБезАвтора). Самостоятельный старт будет происходить с точки Старт. Как другую особенность данного бизнес-процесса можно отметить тот факт, что во всех точках действия не определено ни одно из свойств, ответственных за адресацию (эти свойства определяются программно). Старт без ЗЕТОрй Я Автор Выдать поручение Ч Нет Параллельный Да контроль’ t.. . £, Исполнитель .. .... Выполнить поручение Нет u „ Да Нужен конт'-рль^ Контролер Контроль исполнения 'м< Исполнитель Выполнить поручение Контролер j Контроль исполнения i Да Снято контроля2 Нет Рис. 1.51. Карта маршрута бизнес-процесса Старт бизнес-процесса можно реализовывать разными способами. Рассмо- трим вариант, когда в модуле общей команды определяется процедура (листинг 1.50). Листинг 1.50. Процедура, выполняющая старт бизнес-процесса Процедура АктивйроватьБП() Экспорт БизнесПроцесс = БизнесЛроцессы.Поручение СоздатьБизнесПроцесс(); БизнесПроцесс.Дата = ТекущаяДата(); БизнесПроцесс.Записать()’ БизнесПроцесс.Старт(БизнесПроцессь Поручение.ТочкиМаршрута.Старт); КонецПроцедуры В самой процедуре уточняется точка старта, и бизнес-процесс стартует с этой точки.
Глава 1. Механизм бизнес-процессов 83 При старте выполняется следующий обработчик точки старта бизнес- процесса (листинг 1.51). Листинг 1.51. Обработчик события «ПередСтартом» Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) Автор = ПараметрыСеанса.ТекущийИсполнитель; КонтрольныйСрок = КонецНедели(ТекущаяДата()); Записать(); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Старт бизнес-процесса:" + + ЭтотОбъект.Метаданные().Синоним + Сообщение.Сообщить(); КонецПроцедуры В нем в реквизит бизнес-процесса Автор записывается значение из параметра сеанса, содержащего текущего пользователя (элемент справочника). Устанав- ливается контрольный срок исполнения. После старта бизнес-процесс переходит к точке действия Выдать поручение. Следует отметить, что в данной точке отключен механизм создания задач по умолчанию. В ней определен обработчик события Перед созданием задач (листинг 1.52). Листинг 1.52. Обработчик события «ПередСозданиемЗадач» Процедура ВыдатьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачу(); Задача.БизнесПроцесс = Ссылка; Задача ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса; Задача.Дата = ТекущаяДата(); Задача.Сотрудник = Автор: Задача.Наименование = ТочкаМаршрутаБизнесПроцесса.НаименованиеЗадачи Если Не ПустаяСтрока(Тема) Тогда Задача.Наименование = Задача.Наименование +" + Тема: КонецЕсли, ФормируемыеЗадачиДобавить(Задача): СтандартнаяОбработка - Ложь; КонецПроцедуры В качестве значения реквизита адресации задачи устанавливается значение из реквизита бизнес-процесса Автор. Стандартный механизм создания задач отключается.
84 Решение специальных прикладных задач в «1С:Предприятии 8» При активации данной задачи выполняется следующий код обработчика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 1.53). Листинг 1.53. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = '’ФормаОбъекта" Тогда ЗадачаСсылка - Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(): Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Поручение.ТочкиМаршрута.ВыдатьПоручение Тогда ВыбраннаяФорма - "БизнесПроцесс.Поручение.Форма.ФормаПоручения"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс; Параметры.Вставить("Задача”,ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; * КонецПроцедуры При активации задачи открывается форма бизнес-процесса ФормаПору- чения - специфическая форма бизнес-процесса, в которой каждый из участ- ников процесса может оставлять какие-либо отметки, замечания. В ней реализовано разграничение прав доступа к различным полям (реквизитам бизнес-процесса) в зависимости от роли сотрудника. Например, исполнитель не может исправить текст поручения и т. п. При создании формы на сервере в реквизит формы ТекущаяЗадача в пара- метре формы передается текущая (активируемая) задача (листинг 1.54). Листинг 1.54. Обработчик события формы «ПриСозданииНаСервере» Процедура ПриСозданииНаСервере(Отказ. СтандартнаяОбрабо1ка) ТекущаяЗадача = Параметры.Задача; Если ТекущаяЗадача.Выполнена Тогда Элементы.ВыполнитьЗадачу .Доступность = Ложь. КонецЕсли, КонецПроцедуры Поскольку в бизнес-процессах Поручение и Согласование при активации задачи вместо формы задачи открываются специализированные формы бизнес-процессов, для выполнения этой задачи в формах существует команда
Глава 1. Механизм бизнес-процессов 85 ВыполнитьЗадачу и соответствующая ей кнопка. Эта кнопка доступна в случае, если задача не выполнена. При ее нажатии задача выполняется (листинг 1.55). Листинг 1.55. Выполнение текущей задачи Процедура ВыполнитьТекущуюЗадачуО // Если ТекущаяЗадача. ПроверитьВыполнениеО Тогда ТекущаяЗадача.ПолуиитьОбъект().ВыполнитьЗадачу(); II КонецЕсли; КонецПроцедуры При необходимости перед выполнением задачи можно проверить условия ее выполнения методом ПроверитьВыполнениеО. В дальнейшем этот механизм выполнения задач будет использоваться в других задачах бизнес-процессов Поручение и Согласование. Перед выполнением задачи Выдача поручений, созданной в точке Выдать пору- чение, необходимо проверить: не пустой ли текст поручения, определен ли его исполнитель. Данные проверки выполняются в обработчике события Перед выполнением. Текст обработчика приведен ниже (листинг 1.56). Листинг 1.56. Обработчик события «ПередВыполнением» Процедура ВыдатьПоручениеПередВы;толнением(ТочкаМаршрутаБизнесПрсцесса, Задача, Отказ) Отказ = Ложь; II Проверяется заполнение хотя бы одного реквизита, II который будет использоваться в качестве значений II реквизита адресации задачи. Если Исполнитель Пустая() И ИсполнительРоль.Пустая() И ИсполнительОтдел. Пуста я () Тогда Отказ = Истина КонецЕсли: Если ПустаяСтрока(ТексгПоручения) Тогда Отказ - Истина; КонецЕсли; КонецПроцедуры В идеальном случае такую же проверку необходимо было бы реализовать и для сотрудника, осуществляющего контроль исполнения поручения.
86 Решение специальных прикладных задач в «^Предприятии 8» После выполнения задачи бизнес-процесс переходит к точке проверки условия. В ней производится выбор варианта выполнения бизнес-процесса. Выбор осуществляется в соответствии со значением реквизита бизнес- процесса ПараллельныйКонтроль (установленным интерактивно). Обработчик проверки условия содержит фактически одну строку (листинг 1.57). Листинг 1.57. Обработчик события «ПроверкаУсловия» Результат = ПараллельныйКонтроль; Предположим (для начала), что был выбран вариант с параллельным контролем (т. е. контролер может установить отметку об успешности/неуспеш- ности результатов исполнения раньше, чем сам исполнитель зарегистрирует факт исполнения). При таком варианте бизнес-процесс распараллеливается и одновременно переходит к точкам действия Выполнить поручение и Контроль исполнения. В каждой из них формирование задач производится программно в обработчике события Перед созданием задач. Текст обработчика для точки действия Выполнить поручение имеет следующий вид (листинг 1.58). Листинг 1.58. Обработчик события «ПередСозданиемЗадач» Процедура ВыполнитьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачуО; Задача.БизнесПроцесс - Ссылка; Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцес са; Задача .Дата = Теку щаяДата(); Задача.Приоритет = Приоритет, Задача.КонтрольныйСрок = КснтрольныйСрок; Если Не Исполнитель.Пустая()Тогда Задача.Сотрудник = Исполнитель; КонецЕсли; Если Не ИсполнительРоль.Пустая() Тогда Задача.РольИсполнителя = ЙсполнительРоль; КонецЕсли; Если Не ИслолнительОтдел.Пустая() Тогда Задача.Подразделение = ИсполнительОтдел; КонецЕсли; Задача .Наименование = ТочкаМаршрутаБизнесПр цесса. НаименованйеЗадачи; Если Не ПустаяСтрока(Тема) Тогда -Задача.Найме^вание =.Задача.Наименовайие+*'',:’',,+ .Тёма: ‘ КонецЕсли; ФормируемыеЗадачи. Добавить(3адача); СтандартнаяОбрабо ка = Ложь; КонецПроцедуры
Глава 1. Механизм бизнес-процессов В качестве значений реквизитов адресации задачи устанавливаются значения из соответствующих реквизитов бизнес-процессов. Обработчик события Перед созданием задач для точки действия Контроль исполнения имеет такой же код, за исключением того, что реквизиты адресации задачи запол- няются значениями реквизитов бизнес-процесса, связанных с сотрудником, выполняющим контроль. При активации данной задачи выполняется следующий код обработ- чика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 1.59). Листинг 1.59. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы. Параметры, ВыбраннаяФорма, Дополнительн^яИнформация, СтандартнаяОбработка) ’ Если ВидФормы = "ФормаОбъекта" Тогда . ЗадачаСсылка = Параметры.Ключ;- ЗадачаОбъек! = ЗадачаСсылка.ПолучитьОбъекг();: Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Порученйе.ТочкиМаршрута.ВыполнитьПоручение Или ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Поручение ТочкиМаршрута ВыполнитьПоручение2 Или ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута. Контрол ьИсполнения Или ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Поручение.ТочкиМар рута.КонгрольИсполнения2 Тогда ВыбраннаяФорма = ”БизнесПроцесс.Поручение.Форма.ФормаПоручения’'; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс; Параметры .Вставить(“3адача",ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Ее выполнение приводит к открытию формы ФормаПоручения, форма задачи при этом не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 84. После того как обе задачи будут выполнены, бизнес-процесс пройдет точку слияния и перейдет к точке проверки условия Снято с контроля? В обработчике проверки условия проверяется значение реквизита Отмет- каОСнятииСКонтроля (устанавливается интерактивно в форме ФормаПору- чения сотрудником, осуществляющим контроль, и означает, что поручение выполнено). Если поручение не выполнено, производится возврат к точке проверки условия Параллельный контроль?, в другом случае бизнес-процесс завершается (осуществляется переход к точке завершения).
88 Решение специальных прикладных задач в «1С:Предприятии 8» Рассмотрим поведение бизнес-процесса в случае, когда в точке проверки условия Параллельный контроль? выполнение бизнес-процесса пойдет по ветви Нет. В соответствии с картой маршрута бизнес-процесс переходит к точке действия Выполнить поручение (2). Обработчик события Перед созданием задач для точки действия Выпол- нить поручение используется такой же, как и у точки Выполнить поручение при выполнении параллельного контроля (листинг 1.60). Листинг 1.60. Обработчик события «ПередСозданиемЗадач» Процедура ВыполнитьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачу(); Задача.БизнесПроцесс = Ссылка; Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса; Задача.Дата = ТекущаяДата(); Задача.Приоритет = Приоритет; Задача.КонтрольныйСрок = КонтрольныйСрок; Если Не Исполнитель. Пустая() Тогда Задача.Сотрудник = Исполнитель; КонецЕсли; Если Не ИсполнительРоль.Пустая() Тогда Задача.РольИсполнителя = ИсполнительРоль; КонецЕсли; Если Не ИсполнительОтдел.Пустая() Тогда Задача.Подразделение = ИсполнительОтдел; КонецЕсли; Задача. Наименование ~ Т очкаМаршрутаБизнесПроцесса. НаименованиеЗадачи; Если Не ПустаяСтрока(Тема) Тогда Задача Наименование = Задача.Наименование +” + Тема; КонецЕсли; ФормируемыеЗадачи.Добавить(Задача); СтандартнаяОбработка = Ложь: КонецПроцедуры В качестве значений реквизитов адресации задачи устанавливаются значения из соответствующих реквизитов бизнес-процессов. При активации вызывается та же процедура, что определена для точки Выпол- нить поручение при выполнении параллельного контроля (листинг 1.61).
Глава 1. Механизм бизнес-процессов 89 Листинг 1.61. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта* Тогда ЗадачаСсылка - Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Поручение.ТочкиМаршрута.ВыполнитьПоручение Или ЗадачаОбъект.ТочкаМаршрута" БизнесПроцессы.Поручение.ТочкиМаршрута.ВыполнитьПоручение2 Или ЗадачаОбъект.ТочкаМаршрута - БизнесПроцессы.Поручение.ТочкиМаршрута.КонтрольИсполнения Или ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Поручение.ТочкиМаршрута.КонтрольИсполнения2 Тогда ВыбраннаяФорма = ”БизнесПроцесс.Поручение.Форма.ФормаПоручения”; Параметры. Ключ = ЗадачаОбъект.БизнесПроцесс; Параметры.Вставить(”3адача",ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Ее выполнение приводит к открытию формы ФормаПоручения, форма задачи при этом не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в рекви- зите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 84. После выполнения задачи бизнес-процесс переходит к точке проверки условия Нужен контроль? Обработчик проверки условия содержит следующий текст (листинг 1.62). Листинг 1.62. Обработчик события «ПроверкаУсловия» Процедура НуженКонтрольПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Результат = Истина; Если Контролер.Пустая() И КонтролерРоль.Пустая() Жрд! . и КонтролерОтдел.Пустая() Тогда Результат = Ложь; КонецЕсли; КонецПроцедуры
90 Решение специальных прикладных задач в «^Предприятии 8» В процедуре производится проверка на заполненность какого-либо реквизита, значение которого может использоваться в качестве значения реквизитов адресации задачи. Если все соответствующие реквизиты содержат пустые ссылки, бизнес-процесс переходит по ветви Нет к своему завершению. Если выполнение пошло по ветви Да, в соответствии с картой бизнес-процесса производится переход к точке действия Контроль исполнения. Обработчики событий у данной точки описаны таким же образом, как и в точке Контроль исполнения при параллельном варианте проведения контроля. После выполнения задачи, созданной в точке маршрута Контроль испол- нения, бизнес-процесс переходит к точке проверки условия Снято с контроля? В случае успешного выполнения поручения (критерии были описаны ранее) бизнес-процесс завершается. Бизнес-процесс «Обход» Данный бизнес-процесс позволяет выдавать последовательные поручения (выполняемые друг за другом). Первоначально должен выполнить поручение сотрудник, значащийся первым в списке, потом второй и т.д. Карта бизнес-процесса имеет следующий вид (рис. 1.52). Обход участников по списку . СОШЛИ БсСЬ C K'J Рис. 1.52. Карта маршрута бизнес-процесса Следует обратить внимание на гот факт, что в данной карте нет ни одной точки действия, но есть точка вложенного бизнес-процесса. В свойстве БизнесПроцесс данной точки выбрано значение Поручение. У бизнес-процесса определена табличная часть Участники со еле дующим составом реквизитов табличной части (таблица Е18). Таблица 1.18. Реквизиты табличной части бизнес-процесса Реквизит табличной части Тип Сотрудник С правочникСсылка.Сотрудники Роль! !сполнителя С п равоч н и кСс ы л ка. Рол иИс пол 11 ите: ie й 11 од разделение СнравочникСсылка. Подразделен ня I [аименованиеЗадачи Строка ПризнакОбхода Булево
Глава 1. Механизм бизнес-прощ В точке старта обработчик события Перед стартом не определен, по ному после старта бизнес-процесс без предварительной обработки перекипи к точке вложенного бизнес-процесса. В данной точке определен обработчик события При создании вложенных бизнес-процессов. Текст обработ- чика приведен в листинге 1.63. Листинг 1.63. Обработчик события «ПриСозданииВложенныхБизнесПроцессов» Процедура ОбходПриСозданииВлсженныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) Для Каждого Элемент Из Участники Цикл Если Не Элемент.ПризнакОбхода Тогда Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл II Настраиваем вложенный бизнес-процесс. Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель; Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда Процесс.Тема = Процесс. ВедущаяЗадача Наименование; Иначе Процесс Тема = Элемент.НаименованиеЗадачи; КонецЕсли: Процесс. Исполнитель = Элемент.Сотрудник; Процесс.ИсполнительРоль = Элемент.РольИсполнителя; Процесс. Испол нител ьОтдел = Элемент. Подразделение; Процесс.ПараллельныйКонтроль = Ложь; Процесс.3аписать(); Процесс.Старт(БизнесПроцессы.Поручение.ТочкиМаршрута.СтартБезАвтора); Элемент. ПризнакОбхода = Истина, КонецЦикла; Записать(); Возврат; КонецЕсли; КонецЦикла: КонецПроцедуры При переходе к точке вложенного бизнес-процесса системой создается одна задача (иного не было определено программно). На каждую задачу (у нас она одна) создается вложенный бизнес-процесс. У созданного бизнес-процесса в свойство ВедущаяЗадача записывается ссылка на задачу, ее породившую. После этого производится вызов обработчика события При создании вложенных бизнес-процессов. Через параметр ФормируемыеБизнесПро- цессы передается массив сформированных вложенных бизнес-процессов (в нашем случае один элемент).
22 Решение специальных прикладных задач в «^Предприятии 8» После этого производится обход табличной части бизнес-процесса. Ищется строка, в которой реквизит табличной части ПризнакОбхода установлен в значение Ложь (обхода данной задачи еще не было). Следует отметить, что могут использоваться и другие данные по адресации (не обязательно явно указывать сотрудника). Для текущей строки табличной части (со значением признака, равным Ложь) настраиваем полученный через параметр бизнес-процесс. После этого стар- туем его, и при этом выбирается точка старта СтартБезАвтора бизнес-процесса Поручение. Реквизит табличной части ПризнакОбхода устанавливается в значение Истина. Далее производим выход из процедуры-обработчика. Исходя из заполняемых у вложенного бизнес-процесса свойств, можно с уверенностью сказать, что именно при такой настройке бизнес-процесса из всей определенной для вложенного бизнес-процесса карты маршрута будет использоваться следующий фрагмент (рис. 1.53). Старт без автора Нет Параллельный контроль? Не используется | Исполнитель Выполнить поручение Нужен контроль? Не используется Рис. 1.53. Карта маршрута бизнес-процесса После завершения вложенного бизнес-процесса ведущая задача (породившая бизнес-процесс) завершается, и осуществляется переход к точке проверки условия Обошли весь список? (с именем УсловиеОбхода). Обработчик проверки условия имеет следующий вид (листинг 1.64). Листинг 1.64. Обработчик события «ПроверкаУсловия» Процедура УсловиеОбходаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Для Каждого Элемент Из Участники Цикл Если Не Элемент.ПризнакОбхода Тогда Результат = Ложь; Возврат;
Глава 1. Механизм бизнес-процессов КонецЕсли; КонецЦикла; Результат = Истина; КонецПроцедуры В обработчике проверяется, есть в табличной части строки, в которых признак обхода установлен в значение Ложь. Если таких строк нет, то произ- водится завершение бизнес-процесса, в противном случае осуществляется переход на точку вложенного бизнес-процесса. Обобщенно вышеописанный алгоритм можно представить в виде следу- ющей схемы (рис. 1.54). Определение списка обхода Создается ведущая зедача Завершение ведущей задачи Завершение в ложенного бизнес- процесса Нет лакгнчипись строки с пр гадком “ПризнакОбхода'' =’• “Ложь"9 Да Рис. 1.54. Схема выполняемого алгоритма Бизнес-процесс «Согласование» В ходе деятельности предприятия, организации может возникать необходи- мость согласования каких-либо документов. В рамках задачи существует понятие «рецензент» (кто участвует в процессе рассмотрения). Рассмотрение документа рецензентами может осуществляться параллельно, но в каждом конкретном случае согласования их может быть произвольное количе- ство (решает инициатор). В качестве примера реализации такого механизма рассмотрим бизнес-процесс Согласование.
94 Решение специальных прикладных задач в «^Предприятии 8» У бизнес-процесса определены следующие реквизиты (табл. 1.19). Таблица 1.19. Реквизиты бизнес-процесса Реквизит Тип Документ! 1аСогласованис ДокумснтСсылка Инициатор СправочникСсылка.Сотрудники Контрольны йСрок Дата Важное Булево Согласовано Булево ОбработатьРецензии Булево ПовторносСогпасованнс Булево Пояснение Строка Определена табличная часть Рецензии (для указания списка рецензентов и получения рецензий), табл. 1.20. Таблица 1.20. Реквизиты табличной части бизнес-процесса Реквизит табличной части Тип Рецензент С пра воч н и кС с ы л ка. С отруд н и ки Рол ьИ с пол нт еля СправочникСсылка.РолиИсполнителей Подразделение СнравочникСсылка.Подразделения Рецензия Строка Исполнено Булево Карта маршрута бизнес-процесса имеет следующий вид (рис. 1.55). Бизнес-процесс имеет одну точку старта. В этой точке определен обработчик события Перед стартом (листинг 1.65). Рис. 1.55. Карта маршрута бизнес-процесса
Глава 1. Механизм бизнес-проце- >н 95 Листинг 1.65. Обработчик события «ПередСтартом» Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) Инициатор = ПараметрыСеанса.ТекущийИсполнитель; Записать^); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Старт бизнес-процесса: “ + + ЭтотОбъект.Метаданные().Синоним + Сообщение. Сообщить(); КонецПроцедуры В качестве инициатора бизнес-процесса записывается пользователь, в контексте которого был произведен старт бизнес-процесса. После старта в соответствии с картой маршрута бизнес-процесс переходит к точке действия Определить список рецензентов. В данной точке определен обработчик события Перед созданием задач (листинг 1.66). Листинг 1.66. Обработчик события «ПередСозданиемЗадач» Процедура ОпределитьСписокРецензентовПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Если Рецензии.Количество() = 0 Тогда НоваяЗадача = Задачи. Задача.СоздатьЗадачу(); НоваяЗадача.БизнесПроцесс = Ссылка; НоваяЗадача.ТочкаМаршрута = БизнесПроцессы.Согласование. ТочкиМаршрута. ОпределитьСписокРецензентов; НоваяЗадача.Дата = ТекущаяДата(); НоваяЗадача.Наименование = БизнесПроцессы.Согласование. ТочкиМаршрута. ОпределитьСписокРецензентов. НаименованиеЗадачи; НоваяЗадача.Сотрудник = ПараметрыСеанса.ТекущийИсполнитель; Если Важное Тогда НоваяЗадача.Приоритет = 1; КонецЕсли: ФормируемыеЗадачи.Добавить(НоваяЗадача): КонецЕсли; СтандартнаяОбработка = Ложь; КонецПроцедуры
96 Решение специальных прикладных задач в «ЮПредприятии 8» В обработчике события проверяется состав табличной части Рецензии. Если количество строк табличной части равно нулю, создается задача, в реквизит адресации Сотрудник которой (персональная адресация) записывается пользо- ватель, в контексте которого стартовал бизнес-процесс. Если к моменту выполнения обработчика Перед созданием задач список рецензентов уже определен (количество строк табличной части не равно нулю), задача не создается и, так как обработчик При создании задач не был определен, в точке действия не создается ни одной задачи. В резуль- тате она считается пройденной, и бизнес-процесс продолжает движение по карте маршрута. Вернемся к случаю, когда задача была создана. При активации данной задачи выполняется следующий код обработчика события ОбработкаПолуче- нияФормы модуля менеджера задачи (листинг 1.67). Листинг 1.67. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъекг = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута. ОпределитьСписокРёцензентов Тогда ВыбраннаяФорма = "БизнесПроцесс.Согласование.Форма.ОсновнаяФорма"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс; Параметры.Вставить("3адача",ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры В результате будет открыта форма бизнес-процесса с именем ОсновнаяФорма (в ней можно определить список рецензентов), форма задачи не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 84. При выполнении задачи выполнится следующий обработчик события (листинг 1.68).
Глава 1. Механизм бизнес-процессов 97 Листинг 1.68. Обработчик события «ПриВыполнении» Процедура ОпределитьСписокРецензентовПриВыполнении(ТочкаМаршрутаБизнесПроцесса, Зада^, Отказ) ПроверитьСогласование(); КонецПроцедуры В теле процедуры производится вызов процедуры ПроверитьСогласование. Текст процедуры приведен ниже (листинг 1.69). Листинг 1.69. Процедура «ПроверитьСогласование» Процедура ПроверитьСогласование() Для Каждого Элемент Из Рецензии Цикл Если Не Элемент.Исполнено Тогда Согласовано ~ Ложь; Возврат; . КонецЕсли; КонецЦикла; Согласовано = Истина; ЗаписатьО; КонецПроцедуры Можно сказать, что в данной процедуре устанавливается «общий» статус согласования. Если у какого-либо рецензента определен статус согласования Ложь, то в целом в реквизит бизнес-процесса Согласовано записывается это значение. Следует отметить тот факт, что задачи в данный момент непосредственно до рецензентов еще не дошли (еще не были созданы) и подобная ситуация Согласовано = Ложь характеризует пессимистическую оценку инициа- тором процесса согласования (при заполнении табличной части он может проставлять значения согласования по умолчанию для каждого рецензента). После выполнения задачи бизнес-процесс переходит к следующей точке действия Передать на согласование (с именем НаСогласование). Свойство определено таким образом лишь для того, чтобы визуально на карте отме- тить групповую особенность данной точки маршрута (стандартный механизм создания задач отключается, фактически установка свойства не работает). Определен обработчик события Перед созданием задач (листинг 1.70).
98 Решение специальных прикладных задач в «1С:Предприятии 8» Листинг 1.70. Обработчик события «ПередСозданиемЗадач» Процедура НаСогласованиеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КонецПроцедуры Установка параметра обработчика СтандартнаяОбработка в значение Ложь отключает стандартный механизм формирования задач. Это приводит к тому, что на входе в обработчик события При создании задач массив Формиру- емыеЗадачи не содержит ни одной задачи. Текст обработчика При создании задач представлен в листинге 1.71. Листинг 1.71. Обработчик события «ПриСозданииЗадач» Процедура НаСогласованиеПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) Для Каждого Элемент Из Рецензии Цикл II По умолчанию согласовано. Элемент.Исполнено = Истина; НоваяЗадача = Задачи.Задача.СоздатьЗадачу(); НоваяЗадача.БизнесПроцесс = Ссылка; НоваяЗадача.ТочкаМаршрута = БизнесПроцессы. Согласование. ТочкиМаршрута. Несогласование; НоваяЗадача. Дата = ТекущаяДата(); ' НоваяЗадача.Наименование = БизнесПроцессь Согласование ТочкиМаршруга. ,,,, НаСогласование. НаименованиеЗадачи; Если Важное Тогда НоваяЗадача.Приоритет = 1; > КонецЕсли; II Даты. НоваяЗадача.КонтрольныйСрок = КонтрольныйСрок; НоваяЗадача.ДатаАвтоВыполнения = КонтрольныйСрок; // Реквизиты адресации. НоваяЗадача.Сотрудник = Элемент.Рецензент; НоваяЗадача.РольИсполнителя = Элемент.РольИсполнителя; НоваяЗадача.Подразделение = Элемент.Подразделение;
Глава 1. Механизм бизнес-процессов ФормируемыеЗадачи.Добавить(НоваяЗадача); Новая3адача.3аписать(); КонецЦикла; Записать(); КонецПроцедуры Количество сформированных задач равно количеству строк табличной части (на каждого рецензента по задаче). Реквизиты адресации создаваемых задач совпадают с адресными данными, указываемыми при определении списка рецензентов в табличной части бизнес-процесса. Несмотря на пессимистический взгляд инициатора, статус согласования в каждой задаче проставляется равным Истина, хотя можно и прислушаться к автору бизнес-процесса. При активации каждой задачи выполняется следующий код обработчика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 1.72). Листинг 1.72. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры. ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута.НаСогласование Тогда ВыбраннаяФорма = "БизнесПроцесс.Согласование.Форма .ФормаРецензента"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс; Параметры.Вставить("Задача'.ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; 4 Г • КонецЕсли; КонецПроцедуры Открывается форма для работы рецензента, обеспечивающая его удобную работу, форма задачи не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в рекви- зите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 84.
100 Решение специальных прикладных задач в «1С:Предприятии 8» При выполнении задачи вызывается обработчик события При выполнении задачи. В теле процедуры содержится только одна строка (вызов процедуры, текст и назначение которой уже рассматривались выше), листинг 1.73. Листинг 1.73. Текст обработчика события «ПриВыполнении» ПроверитьСогласование();, . Назначение обработчика - определение общего статуса процесса согласо- вания. После выполнения задачи бизнес-процесс переходит на точку проверки условия Обработать рецензии? В теле процедуры обработчика проверки условия содержится одна строка (проверка значения реквизита бизнес- процесса, имеющего тип Булево), листинг 1.74. Листинг 1.74. Текст обработчика события «ПроверкаУсловия» Результат = ОбработатьРецензии; Если обрабатывать рецензии нет необходимости, то бизнес-процесс идет по ветви Нет и завершается (осуществляется переход к точке завершения). В противном случае бизнес-процесс переходит к точке действия Обработать результаты согласования (с именем ОбработатьРезультаты). При переходе к этой точке выполняется обработчик события Перед созда- нием задач, в нем производится создание задачи, в основной реквизит адресации которой записывается инициатор бизнес-процесса (листинг 1.75). Листинг 1.75. Обработчик события «ПередСозданиемЗадач» Процедура ОбработатьРезультатыПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) НоваяЗадача = Задачи.Задача.СоздатьЗадачу(); НойяЗадача.БизнесПроцесс = Ссылка: НоваяЗадача.ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута.ОбработатьРезультаты; НоваяЗадача Дата = ТекущаяДата(); НбваяЗадача.Наименование = БизнесПроцессы.Согласование.ТочкиМаршрута. ОбработатьРезультаты.НаименованиеЗадачи; НоваяЗадача.Сотрудник = Инициатор; Если Важное Тогда НоваяЗадача.Приоритет = 1; КонецЕсли; ФормируемыеЗадачи.Добавить(НоваяЗадача); СтандартнаяОбработка = Ложь; КонецПроцедуры g
Глава 1. Механизм бизнес-процессов ЮГ! Стандартный механизм формирования задач отключается. При активации каждой задачи выполняется следующий код обработчика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 1.76). Листинг 1.76. Обработчик события «ОбработкаПолученияФормы» ПроцедураОб работка По лученияФормы (Ви дФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъект.ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута.ОбработатьРезультаты Тогда ВыбраннаяФорма = "БизнесПроцесс.Согласование.Форма.ФормаОбработкиРецензий *; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс; Параметры.ВставитьС’Задача",ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Выполнение задачи осуществляется с помощью ссылки на задачу в рекви- зите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 84. После выполнения этой задачи бизнес-процесс переходит к точке проверки условия Согласовать повторно? Обработчик проверки условия содержит одну строку (листинг 1.77). Листинг 1.77. Текст обработчика события «ПроверкаУсловия» Результат = ПовторноеСогласование; Признак необходимости повторного согласования устанавливается в форме обработки рецензий самим инициатором. В случае установки этого флажка бизнес-процесс возвращается на согласование, в противном случае пере- ходит к точке завершения и завершается. Рассмотрение данного бизнес-процесса можно считать законченным, если не обратить внимание на строку обработчика события При создании задач (при создании задач для рецензентов), листинг 1.78.
102 Решение специальных прикладных задач в «^Предприятии 8» Листинг 1.78. Текст обработчика события «ПриСозданииЗадач» НоваяЗадача.ДатаАвтоВыполнения = КонтрольныйСрок- Предполагается, что если при наступлении даты автовыполнения рецензент не разобрался с задачей, она должна быть выполнена автоматически. Те сред- ства, которые до сих пор были рассмотрены, не позволяют этого сделать. Для выполнения автоматической обработки не исполненных в назначенный срок задач можно предусмотреть следующую процедуру (листинг 1.79). Листинг 1.79. Процедура «АвтоОбработкаЗадач» Процедура АвтоОбработкаЗадач() Запрос = Новый Запрос; Запрос Текст = "выбрать ЗадДчгг.Ссы’лка БизнесПро^есс. Согласование. КАк Согласование ' СОЕДИНЕНИЕ Задача.Задача КАК Задача ПО Согласование.Ссылка = Задача.Биз есПроцесс ГДЕ Задача.Выполнена = ЛОЖЬ"; Выёорка = Запрос.Й‘ыполнить().Вь1брать ) Пока Выборка.Следующий() Цикл ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект(); Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы. Согласование.ТочкиМаршрута.НаСогласование Тогда Если ТекущаяЗадача.ПроверитьВыполнение) Тогда ТекущаяЗадача.ВыполнитьЗадачу()- КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Следует отметить, что данный механизм является частным случаем так называемой «эскалации действия» (когда система может принять решение об эскалации - либо передать задачу другому, либо принять решение о ее выполнении). Смысл этой процедуры заключается в том, что выбираются все невыпол- ненные задачи, связанные с бизнес-процессом Согласование, и в точке маршрута НаСогласование вызывается метод, проверяющий их выполнение. В случае возвращения значения Истина задача выполняется. Для того
Глава 1. Механизм бизнес-процессов 103 чтобы этот механизм работал, остается в точке действия НаСогласование определить обработчик события Обработка проверки выполнения (листинг 1.80). Листинг 1.80. Обработчик события «ОбработкаПроверкиВыполнения» Процедура НаСогласованиеОбработкаПроверкиВыполнения(ТочкаМаршрутаБизнесПроцесса, Задача, > Результат) Результат = Ложь’ Если Задача.ДатаАвтоВыполнения <> ’00010101* Задача.ДатаАвтоВыполнения <= ТекущаяДата() Тогда Результат = Истина; * КонецЕсли; КонецПроцедуры В данном обработчике события проверяется: если время указано и вышло, то задача выполнена. Вызов процедуры АвтоОбработкаЗадач можно производить по-разному: определить процедуру в серверном общем модуле и вызывать из обра- ботчика ожидания, размещенного в модуле управляемого приложения, или связать эту процедуру с регламентным заданием, выполняющимся по расписанию, например, раз в час. Минусы: каждый час процедура будет вызываться в рамках каждого запуска «1С:Предприятия»; определить во внешнем модуле и вызывать с необходимой перио- дичностью из внешнего скрипта (в рамках информационной базы это действительно будет раз в час); 9 если в выполнении согласования заинтересован инициатор, поместить вызов процедуры в обработку (форму бизнес-процесса), являющуюся его рабочим местом.
104 Решение специальных прикладных задач в «^Предприятии 8»
Глава 2. Использование механизма анализа данных и прогнозирования Механизм анализа данных и прогнозирования позволяет реализовывать в прикладных решениях различные средства для выявления закономерностей, которые обычно скрываются за большими объемами информации. Например, проанализировав данные о продажах товаров, можно выявить группы товаров, которые обычно покупаются вместе. В дальнейшем (один из многочисленных вариантов) эта информация может использоваться при раскладке товара в розничном магазине. Товары могут располагаться рядом (пришел покупатель за мангалом, увидел рядом жидкость для растопки, угли, мясо, удочки, резиновую лодку... в итоге купил все), могут располагаться в разных углах торгового зала (пришел покупатель за молоком, пока дойдет до хлеба, пройдет через весь магазин и еще чего-нибудь купит). Другим примером использования механизма анализа данных является прогнозирование поведения контрагента, исходя из имеющихся данных о нем. Проведя такой анализ, можно выяснить, как зависит объем их закупок от территориального расположения, размера компании, времени сотруд- ничества и прочих показателей. На основании этих зависимостей можно спрогнозировать поведение нового контрагента и выбрать соответствующую стратегию для работы с ним. Используя возможность построения прогнозов, можно планировать заку- почную кампанию. Рассмотрим пример: в прошлом месяце зоомагазин продал 100 морских свинок. Нужно спланировать закупку товара на следу- ющий месяц. Одним из вариантов (очень часто используемых) является ввод
106 Решение специальных прикладных задач в «^Предприятии 8» поправочного коэффициента на продажи прошлых периодов. Считаем, что поправочный коэффициент (коэффициент повышения спроса) равен 1,5. В итоге при планировании закупок описанным методом будем к следующему месяцу планировать закупку 150 морских свинок. Но если проанализировать, что обычно покупают клиенты после покупки таких питомцев, то можно прийти к совершенно другому выводу. Воспользовавшись возможностью проведения анализа данных, построения прогноза по этому анализу, можно прийти к выводу, что закупать на следующий месяц нужно корм, различные наполнители, сено и другие «аксессуары». Следует отметить, что материал данной главы в первую очередь будет посвящен обзору механизмов «1С:Предприятия» и только косвенно будет касаться (на простых примерах) способов использования полученной инфор- мации. Общие положения Общую схему работы механизма анализа и прогнозирования данных можно представить следующим образом (рис. 2.1). Рис. 2.1. Схема взаимодействия элементов механизма анализа данных и прогнозирования
Глава 2. Использование механизма анализа данных и прогнозирования Механизм позволяет работать как с данными, полученными из инфор- мационной базы, так и с данными, полученными из другого источника, предварительно загруженными в таблицу значений или табличный документ. Применяя к исходным данным один из видов анализа, можно получить результат анализа. Результат анализа представляет собой некую модель пове- дения данных; может быть отображен в итоговом документе или сохранен для дальнейшего использования. Дальнейшее использование результата анализа заключается в том, что на его основе может быть создана модель прогноза, позволяющая прогнозировать поведение новых данных в соответствии с имеющейся моделью. Например, можно проанализировать, какие товары приобретаются вместе (в одной накладной), и сохранить созданную на основе данного анализа модель прогноза в базе данных. В дальнейшем при создании очередной накладной ранее сохраненную модель прогноза можно извлечь из информационной базы, подать ей на вход новые данные, содержащиеся в этой накладной, и на выходе получить прогноз - список товаров, которые очередной клиент тоже приобретет (с определенной долей вероятности), если их ему предложить. Основные объекты механизма Схематично взаимосвязь основных объектов механизма анализа данных и прогнозирования можно показать следующим образом (рис. 2.2). Рис. 2.2. Взаимосвязь основных объектов
108 Решение специальных прикладных задач в «ЮПредприятии 8» Анализ Данных - объект, непосредственно выполняющий анализ данных. Ему устанавливается источник данных, задаются параметры и исходные данные. Результатом работы данного объекта является результат анализа данных, причем для каждого типа анализа сущеетвует свой объект для работы с результатом анализа: РезультатАнализаДанныхОбщаяСтатистика, РезультатАнализаДанныхПоискАссоциаций, РезультатАнализаДанныхПоискПоследовательностей, РезультатАнализаДанныхДеревоРешений, РезультатАнализаДанныхКластеризация. Настройка колонок анализа данных — коллекция входных колонок анализа данных. Для каждой колонки указывается тип данных, содержащихся в ней, роль, выполняемая колонкой, дополнительные настройки, зависящие от типа производимого анализа. Параметры анализа данных - набор параметров производимого анализа данных. Состав параметров зависит от типа анализа. Например, для кластер- ного анализа указывается количество кластеров, на которые необходимо разбить исходные объекты, тип измерения расстояния между объектами и т. п. Источник данных — исходные данные для анализа. В качестве источникг! данных может выступать результат запроса, область ячеек табличного доку- мента, таблица значений. Результат анализа данных - специальный объект, содержащий информацию о результате анализа. Для каждого вида анализа предусмотрен свой результат. Например, результатом анализа данных Дерево решений будет объект типа РезультатАнализаДанныхДеревоРешений. В дальнейшем результат может быть выведен в табличный документ при помощи построителя отчета анализа данных, может быть выведен посредством программного доступа к его содержимому, может быть использован для создания модели прогноза. Любой результат анализа данных может быть сохранен для после- дующего использования. Модель прогноза — специальный объект, позволяющий выполпя гь прогноз на основании входных данных (выборка для прогноза, настройки колонок выборки и результата, результат анализа). Тип модели прогноза зависит от типа результата анализа данных. Например, модель, созданная для типа анализа Поиск ассоциаций, будет иметь тип МодельПрогнозаПоискАс- социаций. Такая модель сможет выдавать прогнозы тина: г. к. данный покупатель купил заданный набор товаров, то с определенной вероятностью он должен купить и другой набор товаров. На вход модели прогноза переда-
Глава 2. Использование механизма анализа данных и прогнозирования 109 ется источник данных для прогноза. Результатом является таблица значений, содержащая прогнозируемые значения. Настройка входных колонок - набор специальных объектов, показыва- ющих соответствие между колонками модели прогноза и колонками выборки прогноза. Например, колонке модели прогноза с именем Товар может соответ- ствовать колонка выборки Номенклатура. Настройка колонок результата - позволяет управлять тем, какие колонки будут помещены в результирующую таблицу модели прогноза. Например, для поиска ассоциаций мы можем вывести в результат номенклатуру, которую, скорее всего, приобретет клиент, и вероятность подобной покупки. Колонки результата - таблица значений, состоящая из колонок, указанных в настройках результирующих колонок, и содержащая прогнозируемые данные. Конкретное содержимое определяется типом анализа. Типы анализа данных В механизме анализа данных и прогнозирования реализовано несколько типов анализа данных: общая статистика, м поиск ассоциаций, v- поиск последовательное гей, кластерный анализ, дерево решений. Общая статистика Тип анализа Общая статистика представляет собой механизм для сбора общей информации о данных, находящихся в полученном источнике данных. Этот тип анализа предназначен для предварительного исследования анализи- руемой информации. Анализ показывает ряд характеристик дискретных и непрерывных полей. При выводе отчета в табличный документ заполняются круговые диаграммы для отображения состава полей. Поиск ассоциаций Данный тип анализа осуществляет поиск часто встречаемых вместе групп объектов или значений характеристик, а также производит поиск правил ассоциаций. Поиск ассоциаций может использоваться, например, для опреде- ления часто приобретаемых вместе товаров или услуг.
? 110 Решение специальных прикладных задач в «^Предприятии 8» Этот тип анализа может работать с иерархическими данными, что позволяет, например, находить правила не только для конкретных товаров, но и для их групп. Важной особенностью этого типа анализа является возможность рабо- тать как с объектным источником данных, в котором каждая колонка содержит некоторую характеристику объекта, так и с событийным источником, где характеристики объекта располагаются в одной колонке. Поиск последовательностей Тип анализа Поиск последовательностей позволяет выявлять в источнике данных последовательные цепочки событий. Например, это может быть цепочка товаров или услуг, которые часто последовательно приобретают клиенты. Этот тип анализа позволяет осуществлять поиск по иерархии, что дает возмож- ность отслеживать не только последовательности конкретных событий, но и последовательности родительских групп. Кластерный анализ Кластерный анализ позволяет разделить исходный набор исследуемых объектов на группы объектов таким образом, чтобы каждый объект был более схож с объектами из своей группы, чем с объектами других групп. Анализируя в дальнейшем полученные группы, называемые кластерами, можно опреде- лить, чем характеризуется та или иная группа, принять решение о методах работы с объектами различных групп. Например, при помощи кластер- ного анализа можно разделить клиентов, с которыми работает компания, на группы, для того, чтобы применять различные стратегии при работе с ними. При помощи параметров кластерного анализа пользователь может настроить алгоритм, по которому будет производиться разбиение, а также может динами- чески изменять состав характеристик, учитываемых при анализе, настраивать для них весовые коэффициенты. Результат кластеризации может быть выведен в дендрограмму - специальный вид диаграммы, предназначенный для графического отображения результатов кластерного анализа. Дерево решений Тип анализа Дерево решений позволяет построить иерархическую структуру классифицирующих правил, представленную в виде дерена. Для построения дерева решений необходимо выбран» целевой атрибут, по которому будет строиться классификатор, и ряд входных aipno\ той, которые будут использоваться для создания правил. Целевой атрнбх i можел содержать,
Глава 2. Использование механизма анализа данных и прогнозирования 111 например, информацию о том, перешел ли клиент к другому поставщику услуг, удачна ли была сделка, качественно ли была выполнена работа и т.д. Входными атрибутами, например, могут выступать возраст сотрудника, стаж его работы, материальное состояние клиента, количество сотрудников в компании и т. п. Результат работы анализа представляется в виде дерева, каждый узел которого содержит некоторое условие. Для принятия решения, к какому классу следует отнести некий новый объект, необходимо, отвечая на вопросы в узлах, пройти цепочку от корня до листа дерева, переходя к дочерним узлам в случае утвер- дительного ответа и к соседнему узлу - в случае отрицательного. Набор параметров анализа позволяет регулировать точность полученного дерева. Модели прогноза Модели прогноза, создаваемые механизмом, представляют собой специальные объекты, которые создаются из результата анализа данных и позволяют в дальнейшем автоматически выполнять прогноз для новых данных. Например, модель прогноза поиска ассоциаций, построенная при анализе покупок клиентов, может быть использована при работе с осуществля- ющим покупку кл иен гом, для того чтобы предложить ему товары, которые он с определенной степенью вероятности приобретет вместе с выбранными им товарами. Тип анализа «Общая статистика» Тип анализа Общая статистика может использоваться для предварительного анализа данных (перед выполнением другого вида анализа) и т. п. В качестве источника данных, которые будут подвергаться анализу, может использоваться результат запроса, таблица значений или область ячеек табличного документа. Данные в источнике (с точки зрения проводимого анализа) могут иметь непрерывный или дискретный вид. К непрерывным относятся такие типы, как Число, Дата. Остальные типы относятся к дискретным. Для колонок разных видов предусмотрено получение различной инфор- мации. Дискретные данные: is Количество значений. Количество значений, встреченных в колонке источ- ника данных (Null значением не считается);
Решение специальных прикладных задач в «^Предприятии 8» Количество уникальных значений (с исключением повторяющихся значений); Мода. Значение, которое в источнике данных встречается наиболее часто. Если в данных несколько значений, встречаемых с одинаковой частотой, в качестве моды берется первое найденное; я Частота. Количество вхождений значения в выборку данных; я Относительная частота. Определяется как отношение количества вхож- дения значения к общему количеству значений; Накопленная частота. Считается как сумма частоты значения и сумма частот предыдущих значений выборки данных; я Накопленная относительная частота. Считается как сумма накопленной частоты значения и сумма относительных частот предыдущих значений. Непрерывные данные: я Количество значений', я Минимум значения', я Максимум значения', я Среднее', я Размах. Разность между максимальным и минимальным значениями; я Стандартное отклонение (среднеквадратичное отклонение); я Медиана. Значение, лежащее в середине выборки. Следует отметить, что если анализируется одновременно несколько полей различных видов, их анализ проводится вне зависимости друг от друга (исключается взаимная корреляция). Рассмотрим указанные характеристики на примере. Познакомиться с приведенным ниже примером анализа данных можно в конфигурации «Анализ данных», прилагающейся к книге на компакт- диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является оборотный регистр накопления Продажи, в котором отра- жены движения документа Расходная накладная. Выборка данных (источник анализа) имеет следующее наполнение (табл. 2.1). Таблица 2.1. Состав источника данных Номенклатура Количество Стол кухонный раскладной 1 Табурет круглый 2 Диван «УЮТ» 1 Диван «Джинс» 1
Глава 2. Использование механизма анализа данных и прогнозирования 113 Номенклатура Количество Кресло «Джинс» 2 Стол «Kitchen» 0.9x1.7 1 Диван «Комфорт» 1 Стол «Kitchen» 0.9x1.7 1 Стул «Summer» 4 Диван «УЮТ» 1 Стол кухонный раскладной 1 Табурет прямоугольный 3 Кресло «УЮТ» 2 Кресло «УЮТ» 2 Шкаф «Wardrobe» I Стол кухонный раскладной 1 Табурет прямоугольный 2 Стол обеденный 1 Стул «Summer» 2 Табурет круглый 2 В результате анализа данных для поля Количество (вид данных анализа Непрерывные) будут рассчитаны следующие характеристики (табл. 2.2). Таблица 2.2. Характеристики, рассчитанные для поля «Количество» Характеристика Значение Значений 20 Минимум 1 Максимум 4 Среднее 1,6 Размах 3 Стандартное отклонение 0,8208 Медиана 1 Для поля Номенклатура будут получены следующие характеристики (табл. 2.3). Таблица 2.3. Характеристики, рассчитанные для поля «Номенклатура» Характеристика Количество значений 20 Количество уникальных значений 12 Мода Стол кухонный раскладной
114 Решение специальных прикладных задач в «^Предприятии 8» Таблица частот для значений номенклатуры будет иметь следующий вид (рис. 2.3). Таблица частот Значение Частота Относительная частота Накопленная частота Накопленная относительная частота Стол кухонный раскладной 3 15,00 3 15,00 Кресло "УЮТ" 2 10,00 5 25,00 Табурет прямоугольный ~г Z. 10,00 7 35,00 Стол "Kitchen" 0.9x1.7 2 10,00 9 45,00 Стул "Si immer” 2 10,00 11 55,00 Диван "УЮТ" 2 10,00 13 65,00 Табурет круглый 2 10,00 15 75,00 Стол обеденный 1 5,00 16 80,00 Шкаф ’Wardrobe" 1 5,00 17 85,00 Диван "Комфорт" 1 5,00 18 90,00 Диван "Джинс" 1 5,00 19 95,00 Кресло "Джинс” 1 5,00 20 100,00 Рис. 2.3. Таблица частот Относительная частота в виде диаграммы представлена на рис. 2.4. Диаграмма частот Номенклату_ Диван "УЮТ", 10% Т абурет круглый, 10% ШкаФ "Wardrobe", 5% Стол обеденный, 5% Кресло "Джинс", 5% Диван "Джинс", 5% Диван "Комфорт" 5% кухонный раскладной 15% Кресло "УЮТ", 10% Т абурет прямоуголь... Стол "Kitchen" 0.9x17.10% Стул "Summer", 10% Ц Стол. Ц Кресло... Т абурет.. Ц Стол. Стул.. Диван "УЮТ" | Т абурет... Стол.. Шкаф.. • Диван... Диван... | Кресло... Рис. 2.4. Относительная частота Для выполнения данного анализа может использоваться фрагмент кода, аналогичный приведенному (листинги 2.1,2.2). Листинг 2.1. Пример выполнения анализа «Общая статистика» &НаКлиенте Процедура ОбщаяСтатистика(Команда) Результат = АнализОбщаяСтатистика(); КонецПроцедуры
Глава 2. Использование механизма анализа данных и прогнозирования 115 Листинг 2.2. Пример выполнения анализа «Общая статистика» &НаСервереБезКонтекста Функция АнализОбщаяСтатистика() Анализ = Новый АнализДанных; Анализ.ТипАнализа = Тиг("АнализДанныхОбщаяСтатистика"); Запрос = Новый Запрос; Запрос.Текст = ” ВЫБРАТЬ Продажи.Номенклатура, Продажи. Количество |ИЗ | РегистрНакопления.Продажи КАК Продажи"; Анализ.ИсточникДанных = Запрос.Выполнить(); РезультатАнализа = Анализ.Выполнить(); Построитель = Новый ПостроительОтчетаАнализаДанных(); Построитель.Макет = Неопределено; Построитель.ТипАнализа = Тип(”АналшДашыхОбщаяСтатистика"); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа. ТабДок); Возврат ТабДок; КонецФункции Работа по проведению анализа данных выполняется в серверной внекон- текстной функции, которая возвращает на клиента табличный документ с результатами анализа. Сначала создается сам объект АнализДанных. После этого производится выбор типа проводимого анализа. Далее по тексту определяется запрос. Результат запроса устанавливается как источник данных анализа. Сам анализ выполняется в процессе работы метода Выполнить () объекта АнализДанных. Сам анализ не имеет средств по визуализации результата полученного анализа. Для этой цели используется объект ПостроительОтчетаАнализаДанных. При создании данного объекта повторно указывается тип проводимого анализа. Далее в качестве первого параметра метода Вывести () переда- ется результат полученного анализа, вторым параметром передается ранее созданный объект ТабличныйДокумент. В конце алгоритма табличный документ с результатом анализа возвращается на клиента в реквизит обработки Результат, имеющий тип ТабличныйДоку- мент. В результате будут получены данные, аналогичные рассмотренным выше.
П6 Решение специальных прикладных задач в «^Предприятии 8» Тип анализа «Поиск ассоциаций» Как уже было сказано ранее, данный тип анализа осуществляет поиск часто встречаемых вместе комбинаций объектов или значений характеристик. С его помощью можно определять группы одновременно закупаемых товаров, выявлять наиболее привлекательные источники информации (в процессе «оптимизации» затрат на них) и т. п. Схематично процесс проведения анализа Поиск ассоциаций можно предста- вить следующим образом (рис. 2.5). Информационная база 1С:Предприятия Параметры анализа Минимальный процент случаев Источник Объекты Элементы Минимальная достоверность Минимальная значимость Отсечение правил Результат анализа Информация сданных Ассоциативные группы Ассоциативные правила Рис. 2.5. Схема выполнения анализа «Поиск ассоциаций» В качестве источника данных может использоваться результат запроса, таблица значений или область ячеек табличного документа. С точки зрения данного типа анализа колонки источника можно разделить на следующие: н Неиспользуемая. Игнорируются анализом; н Объект. Данные из этой колонки используются как объекты (или события) проводимого анализа. Исходя из значения данной колонки, значения другой колонки (Элемент) относятся к одной ассоциируемой i руине; • Элемент. Данные из этой колонки используются для получения устой- чивых групп значений, построения ассоциативных правил. Кроме настройки типов колонок, на результат проводимою анализа влияют следующие параметры анализа: МинимальныйПроцентСлучаев. Определяется минимальный процент случаев, в которых должна встречаться комбинация элементов. Группы,
Глава 2. Использование механизма анализа данных и прогнозирования 117 у которых данное значение меньше указанного, не попадают в результат анализа; н МинимальнаяДостоверность. Показывает минимальное значение процента случаев, когда правило соблюдается; МинимальнаяЗначимость. Группы, у которых данное значение меньше указанного, не попадают в результат анализа; з ТипОтсеченияПравил. Один из вариантов системного перечисления ТипОтсеченияПравилАссоциации: Избыточные (отсекать избы- точные правила), Покрытые (отсекать правила, покрытые другими правилами). В результате выполнения анализа получаем: информацию о данных (количество объектов, количество элементов, среднее количество элементов в объекте, количество найденных групп, количество найденных правил ассоциаций); г найденные группы элементов. Указывается состав группы, количество случаев, процент случаев, в которых эта группа встречается; а найденные ассоциативные правила. Указывается исходный состав элементов, следствие (состав элементов), процент случаев, достоверность, значимость правила. Познакомиться с приведенным ниже примером анализа данных можно в конфигурации «Анализ данных», прилагающейся к книге на компакт- диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является оборотный регистр накопления Продажи, в котором отра- жены движения документа Расходная накладная. Рассмотрим особенности проведения данного типа анализа на следующей выборке данных (постараемся определить состав одновременно закупаемых товаров), табл. 2.4. Таблица 2.4. Список закупленных товаров Регистратор Номенклатура Расходная накладная № 000000001 Стол кухонный раскладной Табурет круглый Расходная накладная № 000000002 Диван «УЮТ» Расходная накладная № 000000003 Диван «Джинс» Кресло «Джинс» Расходная накладная № 000000005 Стол «Kitchen» 0.9x1.7 Диван «Комфорт» Расходная накладная № 000000004 Стол «Kitchen» 0.9x1.7 Стул «Summer» Диван «УЮТ»
] ] 8 Решение специальных прикладных задач в «1СПредприятии 8» Регистратор Номенклатура Расходная накладная № 000000006 Стол кухонный раскладной Табурет прямоугольный Расходная накладная № 000000007 Кресло «УЮТ» Расходная накладная № 000000008 Кресло «УЮТ» Расходная накладная № 000000009 Шкаф «Wardrobe» Расходная накладная № 000000010 Стол кухонный раскладной Табурет прямоугольный Стол обеденный Расходная накладная № 000000011 Стул «Summer» Табурет круглый Признаком, по которому данные относятся к одной группе, будем считать значение регистратора (номенклатура, указанная в одном документе, счита- ется закупленной одновременно). То есть Регистратор будет объектом анализа, Номенклатура - элементом. Для проведения анализа будем использовать следующий фрагмент кода (листинги 2.3, 2.4). Листинг 2.3. Пример выполнения анализа «Поиск ассоциаций» &НаКлиенте Процедура ПоискАссоциаций(Команда) Результат = АнализПоискАссоциаций(); КонецПроцедуры Листинг 2.4. Пример выполнения анализа «Поиск ассоциаций» &НаСервереБезКонтекста Функция АнализПоискАссоциаций() Анализ Новый АнализДанных; Аналйз.ТипАнализа7= Тип(’’АналйзДанныхПойскА’ссоциаций ’); _ _Запрос = Новый Запрос; Запрос Текст =" ВЫБРАТЬ Продажи. Регистратор, Продажи Номенклатура РегистрНакопления.Продажи КАК Продажи"- ’• .'/v-'?''i<•"•?••• 7:' '• ДД?ДТТ7Т<'?С-:7 7 7 V;;.:7.7'<77T.<<- 77;Т\У:Ъ7?.Д<Т'А7/. ''G?7:Т-/Д7;•7-7’7.:.7-?7.77; 5 'С7’;7’7''.'CS'/v"А:.7' Анализ. ИсточникДанных = Запрос.Выполнить(); //Строка приводится в качестве примера, // такое значение типа колонки по умолчанию. Анализ. НастройкаКолонок.Номенклатура.ТипКолонки = ; ТипКолбнкиАнализаДанныхПоискАссоциаций.Элемент;
Глава 2. Использование механизма анализа данных и прогнозирования //такое значение типа от( ия по умолчанию. Анализ.Параметры.Тип нияПравил. Значение = ТипОтсеченияПравилАссоциации.Избыточные; Резул ьтатАнализа = Анализ. Выполнить() Построитель = Новый ПостроительОтчета ных(); Построитель. Макет = Неопределено; Построитель.ТипАнализа = Тип("АнализДанныхПоискАссоциаций”); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАналйЗа; ТабДок)’ Возврат ТабДок; КонецФункции Результат анализа будет выглядеть следующим образом (рис. 2.6). Информация о данных Количество элементов: 12 Количест в о об ъекто в: 11 Среднее количество элементов в объекте: 1,82 Результат анализа Найдено часто встречаемых групп: 1 Найдено ассоциативных правил: 2 Рис. 2.6. Результат анализа «Поиск ассоциаций» В выборе используются данные из одиннадцати документов (ссылка содер- жится в поле Регистратор), количество различных номенклатурных позиций равно двенадцати (табл. 2.5). Таблица 2.5. Различные номенклатурные позиции Стол кухонный раскладной Табурет круглый Диван «УЮТ» Диван «Джинс» Кресло «Джинс» Стол «Kitchen» 0.9x1.7 Диван «Комфорт» Стул «Summer» Табурет прямоугольный Кресло «УЮТ» Шкаф «Wardrobe» Стол обеденный
120 Решение специальных прикладных задач в «1С:Предприятии 8» Найдена следующая группа товаров (рис. 2.7). Часто встречаемые группы № Количество случаев Процент случаев Состав 1 2 18,18 Номенклатура = Стол кухонный раскладной Номенклатура = Табурет прямоугольный Рис. 2.7. Найденная группа товаров Вся группа встречается в документе только в двух случаях из одиннадцати (это и показано в колонках Количество случаев и Процент случаев). Получены следующие ассоциативные правила (рис. 2.8). Ассоциативные правила Исходный набор Следствие Процент случаев Достоверность Значимость 1 18,18 100,00 3,67 Номенклатура = Табурет прямоугольный Номенклатура = Стол кухонный раскладной 2 18,18 66,67 3,67 Номенклатура = Стол кухонный раскладной Номенклатура = Табурет прямоугольный Рис. 2.8. Ассоциативные правила Разберем второе из них. В двух случаях из одиннадцати в документе вместе с позицией Стол кухонный раскладной встречалась позиция Табурет прямоу- гольный. Исходя из этого, и был рассчитан процент случаев: (2 / 11 * 100 = 18,18%). Достоверность была рассчитана следующим образом: обе номенкла- турные позиции закупались в двух случаях, товарная позиция Стол кухонный раскладной встречалась в покупках 3 раза. Исходя из этого, достоверность равна: 2/3 * 100-66,67%. Значимость определяется как отношение достоверности правила к проценту нахождения Табурет прямоугольный в закупаемых товарах. Эта позиция встре- чается в двух документах из одиннадцати (18,18 %). Значимость равна: 66,67%/ 18,18 % = 3,67. Типы отсечения правил Рассмотрим такой важный параметр данного типа анализа, как ТипОтсе- ченияПравил. Возможные значения отсечения содержатся в системном перечислении ТипОтсеченияПравилАссоциации, их состав: Покрытые, Избыточные. Перед тем как перейти к рассмотрению особенностей вариантов о течения, рассмотрим несколько общих моментов, применимых к ирави шм ассоциации.
Глава 2. Использование механизма анализа данных и прогнозирования ] 21 Любое правило состоит из предпосылки и следствия, например: Предпосылка: Если купили Товар № 1. в Следствие: То купят Товар № 2. При этом не нужно забывать, что следствие наступает с определенной досто- верностью. При отсечении правил вероятностные характеристики могут рассматриваться, а могут и игнорироваться (важно только содержание правила). Отсечение покрытых правил Рассмотрим вариант отсечения Покрытые. Правило может быть покрыто как по предпосылке, так и по следствию, например: н Правило № 1: Если купили товар № 1 и № 3, То купят товар № 2. Правило № 2: Если купили товар № 1, То купят товар № 2. В этом случае правило № 1 будет считаться покрытым, т. к. предпосылка первого правила получается «избыточной» по отношению к предпосылке второго правила. Пример покрытия по следствию: н Правило № 1: Если купили товар № 1, То купят товар № 2, № 3. Правило № 2: Если купили товар № 1, То купят товар № 3. Правило № 2 будет покрыто по следствию, так как следствие правила № 1 более полное. Отсечение избыточных правил Покрытие не учитывает вероятностных характеристик правил, они учитыва- ются в случае, если используется вариант отсечения Избыточные. Правило будет считаться избыточным по предпосылке, если оно покрыто по предпосылке и его достоверность равна достоверности покрывающего правила, например: Правило № 1: Если купили товар № 1 и № 3, То купят товар № 2 с досто- верностью 75 %. Правило № 2 Если купили товар № 1, То купят товар № 2 с достоверно- стью 75 %. Правило № 1 избыточно по отношению к правилу № 2 (оно содержит дополнительное условие, не вносящее «возмущения» в вероятностные харак- теристики правила). Правило № 1 будет считаться избыточным по следствию, если количество случаев данного правила равно количеству случаев покрывающего правила.
122 Решение специальных прикладных задач в «^Предприятии 8» Правило № 1: Если купили товар № 1, То купят товар № 2, № 3 в трех случаях. Правило № 2: Если купили товар № 1, То купят товар № 3 в трех случаях. Правило № 2 будет считаться избыточным по отношению к правилу № 1, так как оно содержит более простое следствие с теми же вероятностными харак- теристиками. Тип анализа «Поиск последовательностей» Данный тип анализа позволяет выявить цепочки возникающих событий (шаблоны последовательностей). Он может использоваться тогда, когда одним из важных анализируемых показателей является последовательность насту- пления событий во времени. Например, можно выявить последовательность товаров, которые закупаются друг за другом в течение какого-либо опреде- ленного промежутка времени и т. п. Схематично процесс проведения анализа Поиск последовательностей можно представить следующим образом (рис. 2.9). Информационная база 1 С: Предприятие Параметры анализа Минимальный процент случаев Источник Минимальный интервал Последовательность Элементы Время Максимальный интервал Интервал з квивалентности времени Минимальная длина последовательности Результат анализа Информация о данных Найденные последовательности Поиск по иерархии Рис. 2.9. Схема выполнения анализа «Поиск последовательностей» В качестве источника данных может использоваться результат запроса, таблица значений, область ячеек табличного документа. С точки зрения данного типа анализа колонки источника можно разделить па следующие: Неиспользуемая. Игнорируются анализом;
Глава 2. Использование механизма анализа данных и прогнозирования а Последовательность. Данные из этой колонки используются для анализа как объект события последовательности. По значению данной колонки анализ и ассоциирует данные с одной цепочкой событий; а Элемент. Данные из этой колонки используются как элементы последо- вательности; Время. Именно по данной колонке определяется время наступления события. Наличие данной колонки обязательно при проведении данного типа анализа; Кроме настройки типов колонок, на результат проводимого анализа влияют следующие параметры анализа: МинимальныйПроцентСлучаев. Минимальный процент последова- тельностей, в которых наблюдается найденный шаблон последователь- ности; н МинимальныйИнтервал. Признак установки минимального интервала последовательности (должна быть установлена единица измерения интер- вала, кратность); t МаксимальныйИнтервал. Признак установки максимального интер- вала последовательности (должна быть установлена единица измерения интервала, кратность); н ИнтервалЭквивалентностиВремени. Признак установки интервала эквивалентности времени (должна быть установлена единица интервала эквивалентности времени, ее кратность); МинимальнаяДлина. Минимальная длина искомых последовательностей. м ПоискПоИерархии. Признак осуществления поиска по иерархии (распространяется на колонки с типом Элемент). Ряд свойств оперирует таким понятием, как ТипЕдиницыИнтерва- лаВремениАнализаДанных. Данное системное перечисление содержит следующие значения (табл. 2.6). Таблица 2.6. Значения системного перечисления «ТипЕдиницыИнтервалаВремениАнализаДанных» Секунда Минута ТекущаяМинута Час ТекущийЧас День ТекущийДень Неделя ТекущаяНеделя Декада ТекущаяДекада Месяц ТекущийМесяц Квартал ТекущийКвартал Полугодие ТекущееПолугодие Год ТекущийГод
124 Решение специальных прикладных задач в «^Предприятии 8» Основным результатом анализа являются найденные шаблоны последова- тельностей. Эти шаблоны содержат следующую информацию: состав шаблона последовательности; количество случаев, в которых наблюдалась данная последовательность; • максимальные интервалы между событиями (в случае, если событий 2, то интервал один); минимальные интервалы между событиями (в случае, если событий 2, то интервал один); процент случаев, когда данная последовательность выполнилась; средние интервалы между событиями (в случае, если событий 2, то интервал один). Познакомиться с приведенным ниже примером анализа данных можно в конфигурации «Анализ данных», прилагающейся к книге на компакт- диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является оборотный регистр накопления Продажи, в котором отра- жены движения документа Расходная накладная. Особенности выполнения данного типа анализа рассмотрим на примере следующей выборки данных (табл. 2.7). Таблица 2.7. Выборка данных Контрагент Первая покупка Вторая покупка Третья покупка Интервал Бондарев В.И. Стол кухонный раскладной Табурет круглый Диван «УЮТ» Кресло «УЮТ» 25 дней, 31 день Иванов И.П. Диван «Джинс» Кресло «Джинс» Петров Б.С. С гол «Kitchen» 0.9x1.7 Стул «Summer» Диван «УЮТ» Кресло «УЮТ» 43 дня Сидоров Г.О. Стол кухонный раскладной Табурет прямоу- гольный Степанов В.К. Стол кухонный раскладной Табурет прямоу- гольный Стол обеденный Федоров Д.Е. Стол «Kitchen» 0.9x1.7 Шкаф «Wardrobe» Ciy I «Summer» 58 дней, 29 дней Диван «Комфорт» Га бу pci круглый
Глава 2. Использование механизма анализа данных и прогнозирования 125 Данные из колонки Контрагент будут определять принадлежность к конкретной цепочке событий, т. е. они определяют последовательность анализа. Номенклатура будет являться элементом получаемой последователь- ности. Для проведения анализа может использоваться фрагмент кода, аналогичный приведенному ниже (листинги 2.5, 2.6). Листинг 2.5. Пример выполнения анализа «Поиск последовательностей» &НаКлиенте Процедура ПоискПоследовательностей(Команда) Результат = АнализПоискПоследовательностей(); КонецПроцедуры Листинг 2.6. Пример выполнения анализа «Поиск последовательностей» &НаСервереБезКонтекста Функция АнализПоискПоследовательностей() Анализ = Новый АнализДанных; Анализ.ТипАнализа = Тип("АнализДанныхПоискПоследовательностей’’); Запрос = Новый Запрос; Запрос.Текст = " ВЫБРАТЬ Продажи. Контрагент, Продажи. Номенклатура, Продажи. Период ИЗ РегистрНакопления.Продажи КАК Продажи"; Анализ.ИсточникДанных = Запрос.Выполнить(); А.нализ.НастройкаКолонок.Период.ТипКолонки = Т ипКолонкиАнализаДанныхПоискПоследовательностей.Время; РезультатАнализа = Анализ.Выполнить(); Построитель = Новый ПостроительОтчетаАнализаДанных(); Построитель.Макет = Неопределено; Построитель.Тип Анализа = Тип(”АнализДанныхПоискПоследовательностей’'); ТабДок = Новый ТабличныйДокумент: Построитель.Вывести(РезультатАнализа, ТабДок); Возврат ТабДок; КонецФункции Поле Период определяется как Время непосредственно из кода (самостоя- тельно анализом не определяется). Параметры анализа, установленные по умолчанию (рис. 2.10).
Решение специальных прикладных задач в «1С:Предприятии 8» Параметры анализа Минимальный процент случаев: 10 Минимальный интервал: Максимальный интервал: И нтер в а л эк в и в алентности в ремени: Минимальная длина последовательности: 2 Рис. 2.10. Параметры анализа После проведения анализа получены следующие общие данные (рис. 2.11). Информация о данных Количество элементов: Ко личест в о пос ледо в ательностей: Результат анализа 12 6 Найдено последовательностей: 2 Рис. 2.11. Общие данные анализа Количество элементов равно двенадцати. Ровно столько номенклатурных позиций встречается в приведенной выборке данных. Найдены две последовательности (рис. 2.12). Последовательности № Количество случаев Процент случаев Средний интервал Минимальный интервал Максимальный интервал Состав •1 2 33,33 Номенклатура = Диван "УЮТ" Номенклатура = Кресло "УЮТ” 1 мес. 7 д. 1 мес. 1 д. 1 мес. 14 д. 2 I 16,67 Номенклатура = Стол "Kitchen" 0.9x1.7 Номенклатура = Стул "Summer" 2 мес. 26 д. 2 мес. 28 д. 2 мес. 28 д. Рис. 2.12. Найденные последовательности Первая последовательность встречается в двух случаях из пяти. Исходя из этого, процент случаев равен 40 %. Так как глубина последовательности равна 2, существует по одному значению каждого из приводимых интер- валов. Тип анализа «Дерево решений» С помощью данного типа анализа можно получить причинно-следственную иерархию условий, приводящую к определенному решению. Например, получить дерево условий, по которому (с определенной долей вероятности)
Глава 2. Использование механизма анализа данных и прогнозирования можно понять причину расторжения договоров с клиентами компании, опре- деления условий, влияющих на вариант заключаемого договора. Можно проводить «профилирование» менеджеров компании по различным видам ее клиентов и т. п. Схематично процесс проведения анализа Дерево решений можно представить следующим образом (рис. 2.13). Информационная база 1 С: Предприятие Параметры анализа Минимальное количество элементов в узле Источник Входная Прогнозируемая Максимальная глубина дерева Т ип упрощения дерева решений Результат анализа Информация о данных Результат анализа Дерево решений Ошибки классификации Рис. 2.13. Схема выполнения анализа «Дерево решений» С точки зрения данного типа анализа колонки источника можно разделить на следующие: Неиспользуемая, Входная, и Прогнозируемая. Используемые параметры анализа: МинимальноеКоличествоСлучаев - минимальное количество элементов в узле; МаксимальнаяГлубина - максимальная глубина дерева; ® ТипУпрощения - тип упрощения дерева решений. В результате проведенного анализа можно получить: и дерево решений, у ошибки классификации.
128 Решение специальных прикладных задач в «^Предприятии 8» Познакомиться с приведенным ниже примером анализа данных можно в конфигурации «Анализ данных», прилагающейся к книге на компакт- диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является справочник Контрагенты, группа Юридические лица. Разберемся с особенностью данного типа анализа на примере следующей выборки данных (табл. 2.8). Таблица 2.8. Исходная выборка данных Контрагент Количество розничных точек Количество автомобилей Время работы организации Время заключения договора Вид договора Состояние взаимоотношений ЗАО Игорь 1 0 Меньше года Меньше года Дилер Несоблюдение договора ЗАО ТогрМебель 15 4 От трех до десяти лет Меньше года Дистрибьютор Прекращение контрагентом ЗАО ТогрМебель 1 10 От трех до десяти лет От года до трех Дистрибьютор Прекращение контрагентом И ЧП Дубрава 1 1 От года до трех Меньше года Дилер Прекращение контрагентом Магазин № 15 1 1 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ООО Гросс 3 2 Меньше года Меньше года Постоянный партнер Не прекращены ООО Интарис 7 3 От трех до десяти лет От года до трех Постоянный партнер Прекращение контрагентом ООО ТогрТрест 2 2 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ПБОЮЛ Курочкин 0 1 Меньше года Меньше года Дилер Не прекращены Для проведения анализа может использоваться фрагмент кода, аналогичный приведенному ниже (листинги 2.7, 2.8). Листинг 2.7. Пример выполнения анализа «Дерево решений» &НаКлиенте Процедура ДеревоРешений(Команда) Результат = АнализДеревоРешений(); КонецПроцедуры
Глава 2. Использование механизма анализа данных и прогнозирования 129 Листинг 2.8. Пример выполнения анализа «Дерево решений» &НаСервереБезКонтекста Функция АнализДеревоРешений() Анализ = Новый АнализДанных; Анализ.ТипАнализа = Тип("АнализДанныхДеревоРешений"); Группа = Справочники.Контрагенты.НайтиПоНаименованию(”Юридические лица"); Запрос = Новый Запрос; Запрос.Текст =" ВЫБРАТЬ Контрагенты.Ссылка, Контрагенты.КоличествоРозничныхТочек, Контрагенты.КоличествоАвтомобилей, Контрагенты.ВремяРаботыОрганизации, Контрагенты.ВремяЗаключенияДоговора, Контрагенты.ВидДоговора, Контрагенты.ПрекращениеОтношений ИЗ ' Справочник.Контрагенты КАК Контрагенты ГДЕ (НЕ Контрагенты.ЭтоГруппа И Контрагенты.Родитель = &Родитель)"; Запрос.УстановитьПараметр("Родитель", Г руппа); Анализ.ИсточникДанных = Запрос.Выполнить(); Анализ.Параметры.Т ипУпрощения.Значение = ТипУпрощенияДереваРешений.НеУпрощать; РезультатАнализа = Анализ.Выгюлнить(); Построитель = Новый ПостроительОтчетаАнализаДанных(); Построитель.Макет = Неопределено; Построитель.ТипАнализа = Тип("АнализДанныхДеревоРешений"); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа, ТабДок); Возврат ТабДок; КрнецФункции В результате проведения анализа получено следующее дерево решений (рис. 2.14).
Mi Решение специальных прикладных задач в «1 С:Предприятии 8» Дерево решений Условие Решение Вероятность Количество Корень ПрекрашениеОтношений = Прекращение контрагентом 44,44 9 КоличествоДвтомобилей <= 0,5 ПрекрашениеОтношений = Несоблюдение договора 100,00 1 КоличествоДвтомобилей > 0,5 ПрекрашениеОтношений = Прекращение контрагентом 50,00 8 КоличествоДвтомобилей <= 2,5 ПрекрашениеОтношений = Не прекращены 80,00 5 ВремяРаботыОрганизации = Меньше года ПрекрашениеОтношений = Не прекращены 100,00 2 ВремяРаботыОрганитации = От года до трек ПрекрашениеОтношений = Прекращение контрагентом 100,00 1 ВремяРаботыОрганитации = Свыше десяти лет ПрекрашениеОтношений = Не прекращены 100,00 2 КоличествоДвтомобилей > 2,5 ПрекрашениеОтношений = Прекращение контрагентом 100,00 3 Рис. 2.14. Дерево решений Данное дерево можно представить в виде следующей схемы (рис. 2.15). Кс-рень } Да ...' Количество ?. :Й____________Нет_______ ’ ... .. ‘| I I Н ет г Да I I Лг_ I > ! s ; ч? , I J i ! I { I i I I . A I Несоблюдение договора. .Прекращение . контрагентом . *'хз " 'i Время рабсть) = От года до трех , т I .1 ________ 'Д _____ _ -______ _ J { X.... Врейя. йабШ1- -Свыше • _ десяти лет L_________________ 1 I т Не прекрЙащены. Время работы *: Меньше гида I Рис. 2.15. Представление дерева решения в виде схемы Ошибки классификации показывают, в каких случаях полученные правила расходятся с действительностью (исходной выборкой данных), рис. 2.16. Исходя из приведенных данных, видно, что ошибок в полученной класси- фикации нет, то есть данные в фактической выборке совпадают с данными классификации. Предыдущий пример получен, исходя из значения НеУпрощать параметра анализа ТипУпрощения. Данное значение параметра мы задали программно в листинге 2.8. Если установить значение Упрощать параметра, дерево решений примет такой вид (рис. 2.17).
Глава 2. Использование механизма анализа данных и прогнозирования ] 31 Ошибки классификации Факт'Классифицироеано ПрекрашениеОтношений = Несоблюдение договора ПрекрашениеОтношений = Прекращение контрагентом ПрекрашениеОтношений = Не прекращены Итого % Ошибки ПрекрашениеОтношений = Несоб 1 1 ПрекрашениеОтношений - Прещ 4 4 ПрекрашениеОтношений = Не пр 4 4 Итого 1 4 4 9 Рис. 2.16. Ошибки классификации Дерево решений Условие Решение Вероятность Количество Корень ПрекрашениеОтношений = Прекращение контрагентом 44,44 9 Количество Автомобилей <= 0,5 ПрекрашениеОтношений = Несоблюдение договора 100,00 1 КоличествоДвтомобилей >0,5 ПрекрашениеОтношений = Прекращение контрагентом 50,00 8 КоличествоАвтомобилей <= 2,5 ПрекрашениеОтношений = Не прекращены 80,00 5 КоличествоАвтомобилеи > 2,5 ПрекрашениеОтношений = Прекращение контрагентом 100,00 3 Рис. 2.17. Дерево решений Упрощение дерева заключается в том, что по определенным правилам (формулам, которые будут рассмотрены ниже) узлы дерева превращаются в листья (отсекается лишнее ветвление). При принятии решения о том, будет ли произведено преобразование узла в лист, учитываются следующие показатели: м Ошибок - количество ошибок в узле; и ОшибокДочерних - количество ошибок в дочерних узлах; । Листов - количество листов в узле; Случаев — количество случаев. СКОишбки - ... z- 7/ Листов. . ... „ ... Листов.. (ОшиоокДочериих + ) * (С. чучаев - {ОитоокДочерних + э )) Случаев
132 Решение специальных прикладных задач в «Ю.Предприятии 8» Решение о превращении узла в лист принимается в случае выполнения условия: Ошибок + 0,5 -< ОшибокДочериих + Листов + СКОшибки В нашем примере для узлов Время работы организации условие выполняется (0,5 < 1). В связи с использованием упрощений появились и ошибки в классификации, что показано в результате анализа (рис. 2.18). Ошибки классификации Факт ^Классифицировано ПрекрашениеОтношений - Несоблюдение договора ПрекрашениеОтношений = Прекращение контрагентом ПрекрашениеОтношений - Не прекращены Итого % Ошибки ПрекрашениеОтношений = Несоб 1 1 ПрекрашениеОтношений = Прещ: 3 1 4 25,00 ПрекрашениеОтношений = Не npi 4 4 Итого 1 3 5 9 11,11 Рис. 2.18. Ошибки классификации Например, существует один случай, когда в реальной выборке данных было значение Прекращение контрагентом, а по полученной классификации должно быть значение Не прекращены и т. п. Тип анализа «Кластеризация» Кластерный анализ-математическая процедура многомерного анализа, позво- ляющая на основе множества показателей, характеризующих ря i объектов, сгруппировать их в кластеры таким образом, чтобы объекты, входящие в один кластер, были более однородными, сходными, ио сравнению с объек- тами, входящими в другие кластеры. В основе данного анализа лежит вычисление расстояния между объектами. Именно исходя из расстояний между объектами и производится их группи-
Глава 2. Использование механизма анализа данных и прогнозирования ] 33 ровка по кластерам. Определение расстояния может проводиться разными способами (по разным метрикам). Поддерживаются следующие метрики: Евклидова метрика, м Евклидова метрика в квадрате, № Метрика города, Метрика доминирования. После определения расстояний между объектами может использоваться один из нескольких алгоритмов распределения объектов по кластерам. Поддержи- ваются следующие методы кластеризации: Ближняя связь, Дальняя связь, к-средних, Центр тяжести. Схематично механизм проведения кластерного анализа можно представить следующим образом (рис. 2.19). Информационная база 1 С: Предприятие Параметры анализа Количество искомых кластеров Источник Входная Стандартизация Мера расстояния Метод кластеризации Результат анализа Информация о данных Найдено кластеров Кластеры Центры кластеров Расстояние между кластерами Рис. 2.19. Схема выполнения кластерного анализа На вход объекту АнализДанных подается источник данных. В каче- стве источника может выступать результат запроса, таблица значений, область ячеек табличного документа. Колонки источника определяются как входные либо неиспользуемые. Следует отметить, что все значения колонок
Решение специальных прикладных задач в «1С:Предприятии 8» содержатся в системном перечислении ТипКолонкиАнализаДан- ныхКластеризация. В этом перечислении значений больше (не только неиспользуемые и входные), но другие значения используются при постро- ении прогнозов. Анализ производится в соответствии с установленными параметрами анализа. Познакомиться с приведенным ниже примером анализа данных можно в конфигурации «Анализ данных», прилагающейся к книге на компакт- диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является справочник Контрагенты, группа Юридические лица. В качестве примера, иллюстрирующего возможность проведения кластерного анализа, будем использовать следующий фрагмент кода (листинги 2.9, 2.10). Листинг 2.9. Пример выполнения кластерного анализа &НаКлиенте Процедура КластерныйАнализ(Команда) Результат=АнализКластеризация(); КонецПроцедуры Листинг 2.10. Пример выполнения кластерного анализа &НаСервереБезКонтекста Функция АнализКластеризация() Анализ = Новый АнализДанных; Анализ.ТипАнализа = Тип("АнализДанныхКластеризация"); Г руппа = Справочники.Контрагенты.НайтиПоНаименованию(”Юридические лица'*); Запрос = Новый Запрос; Запрос. Текст =" ВЫБРАТЬ Контрагенты.Ссылка, Контрагенты.КоличествоРозничныхТочек, Контрагенты.КоличествоАвтомобилей, Контрагенты.ВремяРаботыОрганизации, Контрагенты.ВремяЗаключенияДоговора, Контрагенты.ВидДоговора, , Контрагенты. ПрекрашениеОтношений ИЗ . Справочник.Контрагенты КАК Контрагенты ГДЕ (НЕ Контрагенты.ЭтоГруппа И Контрагенты.Родитель = йРодитель)’’; Запрос.УстановитьПараметрС’Родитель", Г руппа); Анализ.ИсточникДанных = Запрос.Выполнить();
Глава 2. Использование механизма анализа данных и прогнозирования 135 II Выбор метрики. Анализ.Параметры.МераРасстояния.Значение = ТипМерыРасстоянияАнализаДанных.ЕвклидоваМетрикаВКвадрате; //Выбор метода кластеризации. Анализ.Параметры.МетодКластеризации.Значение = МетодКластеризации.КСредних; РезультатАнализа = Анализ. Выполнить!); Построитель - Новый ПостроительОтчетаАнализаДанных(); Построитель.Макет = Неопределено; Построитель.ТипАнализа = Тип(”АнализДанныхКластеризация"); ТабДок = Новый ТабличныйДокумент; Построитель. Вывести(РезультатАнализа, ТабДок); Возврат ТабДок; КонецФункции Запрос выполняется по справочнику Контрагенты. По условию запроса выби- раются только детальные записи справочника из группы Юридические лица. Выполнение указанного кода приведет к тому, что в качестве начальных установок анализа данных будут определены следующие значения (часть установлена явно, часть - по умолчанию), рис. 2.20. Параметры анализа Количество искомых кластеров: Стандартизация. Мера расстояния Метод кластеризации: 3 Стандартизиров ать Евклидова метрика в квадрате Метод к-средних Колонки источника данных Входные колонки Пня колонки Тип данных Вес Ссылка Дискретный 1 Количест в оРозничныхТ очек Непрерывный 1 КоличествоАв томобилей Непрерывный 1 Врем яРаботыОр тонизации Дискретный 1 Врем яЗ аключени я До го в ора Дискретный 1 ВидДоговора Дискретный 1 Прекра ш ениеОтно ш ений Дискретный 1 Рис. 2.20. Параметры анализа Состав колонок определился, исходя из состава полей выборки запроса. По умолчанию они определены с равным весом. Для типов Число и Дата определен вид данных Непрерывные, для остальных типов - Дискретные. При необходимости изменить параметры колонок это можно сделать по аналогии с приведенным фрагментом (листинг 2.11).
Решение специальных прикладных задач в «^Предприятии 8» Листинг 2.11. Пример изменения параметров колонок Анализ.НастройкаКолонок.КоличествоАвтомобилей.ДополнительныеПараметрыВес = 2; В данной строке для колонки КоличествоАвтомобилей увеличен вес. Выборка данных, для которых будет произведен анализ, имеет следующее наполнение (табл. 2.9). Таблица 2.9. Исходная выборка данных Контрагент Количество розничных точек Количество автомобилей Время работы организации Время заключения договораж Вид договора Состояние вза имоотношен и й ЗАО Игорь 1 0 Меньше года Меньше года Дилер Несоблюдение договора ЗАО ТогрМебель 15 4 От трех до десяти лет Меньше года Дистрибьютор Прекращение контрагентом ЗАО ТогрМебель 1 10 От грех до десяти лет От года до трех Дистрибьютор Прекращение контрагентом ИЧП Дубрава 1 1 От года до трех Меньше года Дилер Прекращение контрагентом Магазин № 15 1 1 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ООО Гросс 3 2 Меньше года Меньше года Постоянный партнер Не прекращены ООО Интарис 7 3 От грех до десяти лет От года до трех Постоянный партнер Прекращение контрагентом ООО ТогрТрест 2 2 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ПБОЮЛ Курочкин 0 1 Меньше года Меньше года Дилер Не прекращены Результат анализа будет получен в следующем виде (рис. 2.21). Отметим тот факт, что в результате анализа получаются данные именно о найденных кластерах (их количество, центры, расстояния между ними). В результате анализа не получаются данные о том, какие объекты (в нашем случае контрагенты) в какие кластеры входят. Подобное поведение наблюда- ется в случае, если настройка параметров проводимого анализа не проводится явным образом (а именно параметра ТипЗаполненияТаблицы).
Глава 2. Использование механизма анализа данных и прогнозирования 137 Количество объектов: 9 Результат анализа Найдено кластеров: 3 Кластеры Не кластера Количество оьъектов Процент 1 6 66,67 2 2 22,22 3 1 11,11 Центры кластеров Поле \ Кластер 1 2 3 Ссылка = ЗАО То1рМебель 1,0000 Ссылка = ООО Интарис 0,5000 Ссылка = ЗАО МебельКрафт 0,5000 Ссылка = ПБОЮЛ Курочкин 0,1667 Ссылка = ЗАО Игорь 0,1667 Ссылка = ИЧП Дубрава 0,1667 Ссылка = Магазин № 15 0,1667 Ссылка = ООО ТогрТрест 0,1667 Ссылка = ООО Гросс 0,1667 Количест в оРозничныхТ очек 1,3333 11,0000 1,0000 Количеств оА в томобилей 1,1667 3,5000 10,0000 ВремяРаботыОрганизации - Свыше десяти лет 0,3333 ВремяРаботыОрганизации = От года до трех 0,1667 ВремяРаботыОрганизации = Меньше года 0,5000 ВремяРаботыОрганизации = От трех до десяти лет 1,0000 1,0000 ВремяЗаключенняДоговора = Меньше года 0,6667 0,5000 Врем яЗ аключени яД о го вора = От трех до десяти лет 0,3333 ВремяЗаключенняДоговора = От года до трех 0,5000 1,0000 ВидДоговора = Дилер 0,5000 ВидДоговора Постоянный партнер 0,5000 0,5000 ВидДоговора Дис трибьютор 0,5000 1,0000 ПрекрашениеОтношений Несоблюдение договора 0,1667 ПрекрашениеОтношений = Прекращение контрагентом 0,1667 1,0000 1,0000 ПрекрашениеОтношений = Не прекращены 0,6667 Расстояния между кластерами Кластеры 1 2 3 1 8,7740 15,4524 2 8,7740 11,5370 3 15,4524 11,5370 Рис. 2.21. Результат кластерного анализа Для того чтобы в результате анализа увидеть распределение объектов по кластерам, необходимо перед выполнением анализа (но после определения его типа) определить следующую строку кода (листинг 2.12). Листинг 2.12. Установка параметра «ТипЗаполненияТаблицы» Анализ.Параметры.ТипЗапслненияТаблицы.Значение = Тиг|ЗаполненияТабг,ицыРезультатаАнализаДанных.ИспользуемыеПоля; Используемые метрики Сразу отметим такой факт: несмотря на то, что в предыдущем примере входные колонки имели непрерывный тип (для этого типа очевидно понятие «расстояния»), при анализе могут использоваться и колонки дискретных типов (ссылки на справочники, значения перечислений и т.п.).
138 Решение специальных прикладных задач в «1С:Предприятии 8» Разберемся с метриками, которые могут использоваться при проведении кластерного анализа. Евклидова метрика В данной метрике расстояние между двумя объектами вычисляется по формуле: Расстояние = ~ D~) Где: X., Y. - значения атрибутов двух объектов (между которыми определяется расстояние); W. - весовой коэффициент атрибута (устанавливается в колонке анализа); i - номер атрибута, от 1 до п; п - число атрибутов. Предположим, что объекты характеризуются одним свойством, которое у одного объекта имеет значение 9, у другого - 5. Весовой коэффициент данного атрибута равен единице. Расстояние между объектами будет равно: =4- Евклидова метрика в квадрате В данной метрике расстояние между двумя объектами вычисляется по формуле: Расстояние = Где: X Y. - значения атрибутов двух объектов (между которыми определяется расстояние); « W - весовой коэффициент атрибута (устанавливается в колонке анализа); i - номер атрибута, от 1 до п; п - число атрибутов. Предположим, что объекты характеризуются одним свойством, которое у одного объекта имеет значение 5, у другого - 3. Весовой коэффициент данного атрибута равен двум. Расстояние между объектами будет равно: £(2, *(5,-3,
Глава 2. Использование механизма анализа данных и прогнозирования 139 Метрика города В данной метрике расстояние между двумя объектами вычисляется по формуле: Расстояние = * IЛ> ~ К ) Где: X, Y. - значения атрибутов двух объектов (между которыми определяется расстояние); W - весовой коэффициент атрибута (устанавливается в колонке анализа); i - номер атрибута, от 1 до и; п - число атрибутов. Предположим, что объекты характеризуются двумя атрибутами, которые имею! значения 3 и 5, 7 и 3. Вес первого равен 2, вес второго равен 1 (рис. 2.22). Рис. 2.22. Характеристики объектов Расстояние = *(| Х} -Y} |) + W2 * (| Х2 - У2 |) =2 * (| 3 - 7 |) + 1 *(| 5 -3 |) = К) Метрика доминирования В данной метрике расстояние между двумя объектами вычисляется по формуле: MAX(W*\Xt -Yi |) Где: а X, Y - значения атрибутов двух объектов (между которыми определяется расстояние); W - весовой ко >ффициент атрибута (устанавливается в колонке анализа); i - номер атрибута, от 1 до п; п - число атрибутов. Предположим, что объекты характеризуются двумя атрибутами, которые имеют значения 3 и 5, 7 и 3. Вес первого равен 2, вес второго равен 1 (см. рис. 2.22).
140 Решение специальных прикладных задач в «1С:Предприятии 8» Расстояние = MAX\W{ * (| - Y{ |), W, * (| Х2 - Г2 |)) = МАХ(2 * (| 3 - 7|),1 * (| 5 - 31) = 8 Методы кластеризации Вариант метода кластеризации определяет, исходя из каких принципов объект соотносится к той или иной группе, по какому алгоритму производится формирование кластеров. Можно сказать, что целью любого алгоритма кластеризации является: минимизация изменчивости внутри кластеров, максимизация изменчивости между кластерами. Различия между методами будем рассматривать на объектах, представленных на рисунке (рис. 2.23). Будем считать, что объекты образуют две группы. Первая состоит из объектов 1,2 и 3. Вторая группа состоит из объектов 4, 5 и 6. Рис. 2.23. Группы объектов Ближняя связь Метод кластеризации, в котором объект присоединяется к той группе, для которой расстояние до ближайшего объекта минимально. В рассматриваемом примере объект 7 будет включен в группу, в которой нахо- дится объект 4. Самыми близкими объектами двух групп являются объекты 4 и 3. Расстояние до объекта 4 минимально. Дальняя связь Метод кластеризации, в котором объект присоединяется к юй группе, для которой расстояние до наиболее дальнего объекта минимально.
Глава 2. Использование механизма анализа данных и прогнозирования В рассматриваемом примере объект 7 будет включен в группу, в которой нахо- дится объект 5. Самыми дальними объектами двух групп являются объекты 1 и 5. Расстояние до объекта 5 меньше. Центр тяжести Метод кластеризации, в котором объект присоединяется к той группе, для которой расстояние до центра тяжести минимально (рис. 2.24). J Рис. 2.24. Группы объектов В примере, рассмотренном на рисунке, объект 7 добавится в группу, содер- жащую объекты 4, 5 и 6. Расстояние до центра тяжести (некого мифического объекта со средними значениями атрибутов) минимально. к-средних В данном методе выбираются объекты, находящиеся первыми в выборке. Они считаются центрами кластеров. Далее выбирается следующий объект и, в соот- ветствии с расстоянием до центров кластеров, относится к тому или иному кластеру. I (ейip кластера, к которому был добавлен объект, пересчитывается. Процедура повторяется до полного перебора всех объектов. Далее опять производится новая выборка объектов (начиная с первого). Процедура повто- ряется до тех нор, пока изменяются центры кластеров (рис. 2.25). Рис. 2.25. Пример расположения объектов
142 Решение специальных прикладных задач в «1С:Предприятии 8» Предположим, что произвольно выбраны в качестве центров кластеров обьекты 1 и 2. Объект 3 добавляется к кластеру, центром которого является объект 1. Центр первого кластера перерассчитывается (он находится между объектом 1 и 3). Объект 4 добавляется ко второму кластеру (его центр также перерассчитывается). После перебора всех анализируемых объектов к первому кластеру относятся объекты 1 и 3, ко второму - остальные объекты (его центр предположительно находится в центре треугольника из объектов 4, 7, 6). Далее опять производится выборка объектов и распределение их по кластерам (относительно постоянно рассчитываемых центров кластеров). Где-то на третьей выборке объектов, скорее всего, объект 2, который изна- чально был центром второго кластера, станет относиться к первому кластеру. В конце алгоритма к первому кластеру будут относиться объекты 1, 2, 3. Ко второму - объекты 4, 5, 6, 7. Вывод данных в дендрограмму При выводе данных кластерного анализа, если используется алгоритм, отличный от алгоритма k-средних, результаты кластерного анализа выводятся в виде дендрограммы (алгоритм анализа должен предусматривать вывод распределения анализируемых объектов по кластерам), рис. 2.26. Рис. 2.26. Дендрограмма
Глава 2. Использование механизма анализа данных и прогнозирования 143 Проведение прогнозов Если рассмотреть задачу прогнозирования в общем, то в ней можно выделить две важные части: обучение модели на какой-либо выборке данных; использование обученной модели для работы с фактическими данными для получения какого-либо прогноза. Даже в реальной жизни, когда речь идет о каком-либо экспертном заключении, можно говорить об этих этапах. Прежде чем давать заключения, прогнозы, эксперт длительное время учится принимать правильные решения, изучает закономерности в интересующей его прикладной области и т.п. С точки зрения «1 С:Предприятия» в качестве такого эксперта выступает модель прогноза. Данный объект может быть получен только на основании проведенного анализа данных. Можно сказать, что при проведении анализа производится обучение будущей модели прогноза (правильнее сказать, что она создается после проведения анализа на некой аналитической выборке). После создания модели прогноза в нее может быть передана некая фактическая выборка данных, но которой (на основании закономерностей, полученных во время анализа) бу те г построен прогноз (рис. 2.27). анализ ।__________________________। Рис. 2.27. Схема прогнозирования Создание модели прогноза доступно для всех типов анализа, за исключением общей статистики. Поставим задачу - определить рекомендуемый товар клиенту, который подо- брал уже какой-то набор номенклатурных позиций.
144 Решение специальных прикладных задач в «ЮПредприятии 8» В конфигурации «Анализ данных», прилагающейся к книге на компакт-диске, в обработке Анализ данных и прогнозирование реализован пример прогнозиро- вания данных на основе двух моделей прогноза по анализу данных розничных продаж Поиск ассоциаций и Поиск последовательностей. Разберем подробно первую модель прогноза. Получение модели прогноза производится на закладке Анализ данных, при нажатии кнопки Поиск ассоциаций. При этом выполняется анализ (поиск ассо- циаций), направленный на выявление одновременно закупаемых позиций (рис. 2.28). Анализ данных и прогнозирование Анализ данный Прогнозирование Общая статистика Поиск ассоциаций Дереао решений Результат: Поиск ассоциативных правил Параметры анализа Колонки источника данных Входные колонки Информация о данных Результат анализа Часто встречаемые группы Ассоциативные правила Найдено часто встречаемых групп: Найдено ассоциативных правил: Количество элементов: Количество объектов: Среднее количество элементов в объекте: Минимальный процент случаев: Минимальная достоверность: Минимальная значимость: Отсечение правил: j ... _ . i । Поиск последовательностей ! ; Ы"Анализ Данны» прогно р в н е - Конфигурация [^Предприятие) 4 А? пчед-ль- - -дтищ* Все действия Кластерный анали 10 60 о Избыточные Пня колонки Тип данных j Номенклатура Дискретный | 12 11 1,82 Ns ^Количество случаев |Процент случаев Состав 1| 2| 18,18 Номенклатура = Стол кухонный раскладной 1 Номенклатура = Табурет прямоугольный Исходный набор Следствие Процент случаев Достоверность Значимость 1 18,18 100,00 3,67 Номенклатура = Табурет прямоугольный Номенклатура ~ Стол кухонный раскладной 2 18,18 66,67 3,67 Номенклатура ~ Стол кухонный раскладной Номенклатура = Табурет прямоугольный Рис. 2.28. Обработка «Анализ данных и прогнозирование»
Глава 2. Использование механизма анализа данных и прогнозирования Из обработчика нажатия кнопки Поиск ассоциаций вызывается серверная процедура АнализПоискАссоциаций() (листинг 2.13), в которой выпол- няется поиск ассоциативных правил. Более подробно данный вопрос рассматривался в разделе «Тип анализа «Поиск ассоциаций», стр. 116. После выполнения анализа создается модель прогноза и сохраняется в рекви- зите Модель типа ХранилищеЗначения предопределенного элемента (ПродажаТоваров) справочника Модели Прогноза. Листинг 2.13. Получение модели прогноза .онтекста Анализ = Новый Анализ! Анализ.ТипАнализа = Тип(”АнализДанныхПоискАссоциаций”) Запрос = Новый Запрос; Запрос.Текст = “ ВЫБРАТЬ ПродажиОбороты. Регистратор, ПродажиОбороты. Номенклатура ИЗ РегистрНакопления ПродажиПоискАссоциаций КАК ПродажиОбороты" й- I й й Анализ.ИсточникДанных = Запрос.Выполнить(); Результа! Анализа = Анализ. Вы полнить(); МодепьПрогноза = РезультатАнализа.СоздатьМодельПрогноза(); й // Сохранение модели прогноза в предопределенном элементе справочника. Объект = Справочники.МоделиПрогноза.ПродажаТоваров ПолучитьОбъекг(); Объект.Модель - Новый ХранилищеЗначения(МодельПрогноза); Обьект.3аписать(); Построитель = Новь и ПостроительОтчётаАнализаДанных(); Построитель.Макет - Неопределено; Построитель.ТипАнализа = Тип("АнализДанныхПоискАссоциаций"); : ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа, ТабДок); Возврат ТабДок; ВвЙй'й , ЙДй '/^-’^йй';?'й. КонецФункции Сам прогноз осуществляется на закладке Прогнозирование, при нажатии кнопки Получить прогноз ассоциаций. При этом выбирается документ, данные которого (табличная часть Состав, в которой определен реквизит Номенклатура) будут служить источником данных для модели прогноза (рис. 2.29).
146 Решение специальных прикладных задач в «^Предприятии 8» Рис. 2.29. Обработка «Анализ данных и прогнозирование» Из обработчика нажатия кнопки Получить прогноз ассоциаций (листинг 2.14) вызывается серверная процедура ПолучитьПрогнозПоискАссоциацийО (листинг 2.15), в которой сохраненная ранее модель получается из реквизита справочника, выполняется прогноз и данными прогноза заполняется реквизит РезультатПрогноза типа ТаблицаЗначений, отображаемый в форме. Листинг 2.14. Получение прогноза &НаКлиенте Процедура ПолучитьПрогноз(Команда) ПолучитьПрогнозПоискАссоциаций(); Если РезультатПрогноза.Количество() = 0 Тогда Предупреждение(пПредпожений нет”); КонецЕсли; КонецПроцедуры Листинг 2.15. Пример прогнозирования &НаСервере Процедура ПолучитьПрогнозПоискАссоциаций() РезультатПрогноза.Очистить();
Глава 2. Использование механизма анализа данных и прогнозирования 147 МодельПрогноза = Справочники.МоделиПрогноза.ПродажаТоваров.Модель.Получить(); ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); Если МодельПрогноза <> Неопределено Тогда МодельПрогноза.ИсточникДанных = ДокументОбъект Состав.Выгрузить(); МодельПрогноза.КолонкиРезультата.Очистить(); МодельПрогноза. КолонкиРезультата.Добавить(МодельПрогноза.Колонки.Найти( "Следствие", Т ипКолонкиМоделиПрогноза .Прогнозируемая)); МодельПрогноза.КолонкиРезультата.Добавить(МодельПрогноза.Колонки.Найти( "Достоверность", ТипКолонкиМоделиПрогноза Прогнозируемая)); ТЗРезультатаПрогноза = МодельПрогноза. Выполнить(); Если ТЗРезультатаПрогноза.Количество() > 0 Тогда Для Каждого Строка Из ТЗРезультатаПрогноза Цикл НоваяСтрока = РезультатПрогноза.Добавить(); НоваяСтрока.Следствие = Строка.Следствие; НоваяСтрока.Достоверность = Строка Достоверность; КонецЦикла; КонецЕсли КонецЕсли; КонецПроцедуры В результате в габлице формы содержится прогноз, какой товар чаще всего закупается совместно с геми, которые уже выбрал покупатель. Из рис. 2.29 видно, что, выбрав в качестве источника данных для прогноза документ, содержащий две номенклатурные позиции - Стол кухонный раскладной и Табурет круглый, на основе ассоциативных правил, содержащихся в модели прогноза, получаем предложение добавить в список товаров номенклатурную позицию Табурет прямоугольный, которую покупатели купят с достоверностью 66,67 %. Модель прогноза Модель прогноза обладает определенными свойствами, с помощью которых можно управлять проводимым прогнозом. При работе с коллекцией колонок Колонки можно указывать следующие типы колонок (значение системного перечисления ТипКолонкиМоде- лиПрогноза): Входная, КолонкаИсточникаДанных, Прогнозируемая.
Решение специальных прикладных задач в «^Предприятии 8» Следует отметить, что для кластерного анализа в коллекции Колонки опре- делено свойство ДополнительныеПараметры (определяется вес колонки и значение нормализации). Коллекция НастройкаВходныхКолонок содержит описание соответствия колонок источника данных (по которому строится прогноз) колонкам модели прогноза. Коллекция КолонкиРезультата содержит колонки, выводимые в результат прогноза. Пример работы с данными колонками приведен в листинге 2.16. Листинг 2.16. Пример работы с колонками модели прогноза МодельПрогноза.КолонкиРезультатаДобавить(МодельПрогноза.Колонки.Найти(''Следствие,,1 ТипКолонкиМоделиПрогноза. Прогнозируемая)); МодельПрйюзаЗСолонкиРезультатада | ТипКолонкиМоделиПрогноза.Прогнозируемая))
Глава 3. Географические схемы В этой главе речь пойдет об использовании географических схем при разра- ботке прикладных решений в системе «ЮПредприятие». 1 . Продажи по ре< конем Де< глист ршиенгия конфигураци. (1 СЛредприятие) I ]родажи по регионам к; Пред а к и по ре гмокам i г а все время. Сформировать Варианты «и. Печатная Форма Настройка И 325,00 1 6 092,50 560,00 15 740,00 7 906,50 73 ДО 41 023,30 22 060,65 3 098,00 ырскии АО Программное обеспеч Мурманская обл коми Реет Ямало-Ненев кий Корякский АО Саха/Якутия/Редт UeJL '*-? .<*'< Красноярский рай гюменска5оЛ»'аЯ1оБл Оренбургская об Услуги Ц Аппаратное обеспече Рис. 3.1. Отчет, основанный на географической схеме
150 Решение специальных прикладных задач в «1С:Предприятии 8» Географические схемы в основном используются для представления итоговых данных в разрезе их географического положения. Они позволяют создавать отчеты, иллюстрирующие, например, объемы продаж тех или иных товаров в различных регионах страны (рис. 3.1). Также географическая схема может быть использована просто для отобра- жения тех или иных географических данных, например, схемы проезда к офису или маршрута движения транспортного средства. Основные понятия Географическая схема представляет собой совокупность географических объектов, описывающую заданный регион земной поверхности. По сути это документ, в котором хранится топологическая информация о различных географических объектах. Как правило, географические схемы состоят из нескольких слоев, содер- жащих различные топографические объекты: регионы, области, реки, города, дороги и г.д. Каждый слой содержит объекты, сгруппированные по одному типу и, возможно, еще по некоторому признаку. Например, слой Города может содержать города с населением до 100 тыс. человек, а слой Столицы - столицы государств. Слой географической схемы предназначен для логической группировки топо- логических объектов. Слой хранит объекты, которые в него входят, и данные этих объектов, а также позволяет манипулировать этими данными. Объект слоя — элементарный объект, описывающий топологические данные конкретного географического объекта. Например, объект может описывать контуры области. Объекты делятся на следующие классы: Точечный объект. Точечный объект географической схемы предназначен для отображения на схеме объектов, которые могут быть отображены точкой. Такими объектами могут быть города, деревья и т.п. Каждый точечный объект идентифицируется географическими координатами широтой и долготой, которые доступны через свойство Координаты. Кроме того, можно задать цвет отображения объекта, тип отображения (символом текста, маркером, картинкой), собственно символ, его шрифт, маркер отображения и картинку. Для картинки также можно задать поло- жение опорной точки отрисовки. Многоточечный объект. Многоточечный объект географической схемы предназначен для отображения на схеме групп объектов, которые могут быть отображены совокупностью точек. Такими объектами могут высту- пать деревья и т.п. Многоточечный объект полностью соответствует
Глава 3. Географические схемы 151 точечному, за исключением того, что вместо координат объект имеет коллекцию с такими координатами. Полилинейный объект. Полилинейный объект предназначен для отображения на географической схеме объектов, которые могут быть представлены линиями. Такими объектами, например, могут быть дороги или реки. Каждый полилинейный объект содержит коллекцию Сегменты, через которую можно получить доступ к сегментам линии. Каждый сегмент представляет собой коллекцию географических координат. Поли- линейный объект рисуется заданным стилем линии и указанным цветом. Полигональный объект. Полигональный объект предназначен для отобра- жения на карте объектов-площадей: полей, районов, областей и т.д. Полигональный объект состоит из контуров, совокупности точек, обра- зующих замкнутую линию. Полигональный объект закрашивается указанным цветом и обводится указанным цветом границы. Слои содержал серии данных - произвольные данные, сгруппированные по некоторому признаку. Примером такой серии могут быть продажи по реги- онам за год. Значение серии данных - конкретное значение серии данных, ассоции- рованное с конкретным объектом. Например, существует серия данных «Продажи по регионам за год». Тогда значение продаж по отдельному городу будет являться значением серии данных. Легенда географической схемы предназначена для настройки шкалы значений диаграмм, отображаемых на географической схеме. Например, города числен- ностью до 100000 человек могут отображаться одним значком, допустим, кнопкой. Макет географической схемы может быть сохранен в файл *.део или получен из этого файла. Для добавления слоев географической схемы используются шейп-файлы. Шейп-файл (Shapefile) — это файл с топологическими данными, создава- емый с помощью программ семейства ESRI ArcGIS (подробнее об этих программах - на сайте http://www.esri.com/software/arcgis/index.html). Этот файл может содержать связанные с топологическими объектами данные. Каждый файл содержит один слой. Географическая схема позволяет считы- вать такие файлы в качестве слоя.
Решение специальных прикладных задач в «^Предприятии 8» Основы работы с географическими схемами Для того чтобы использовать географические схемы в своем прикладном решении, необходимо подготовить топологические данные, на основе которых будут отображаться диаграммы. Можно пойти двумя путями: использовать схему, поставляемую с «1С:Предприятием», или создать свою собственную схему. На сайте ИТС (http://its.lc.rU/db/metod81#content:2565:l в разделе Методи- ческие рекомендации по конфигурированию ► Географическая схема ► Географические схемы) можно скачать географические схемы мира и России. Демонстрационная схема, поставляемая с «1С:Предприятием», представ- ляет собой схему России, содержащую данные о регионах и городах России, а также информацию о реках, озерах и дорогах. Схема содержит: Для регионов (слой Регионы): □ название региона (Название); □ название экономического региона, в который входит регион (Экономи- ческий_Регион); □ площадь региона (Площадь); □ название столицы (Столица); □ код региона по классификатору МНС России (Код_Региона). Для городов (слой Города): □ название города (Название); □ статус города (город, населенный пункт и т.д.) - Статус; □ регион, в котором находится город (Регион); □ население (по данным на 1995 г.) - Население_95_Год; □ является ли город столицей региона (Столица); □ код региона, в котором находится город по классификатору МНС России (Код_Региона); □ код города по классификатору МНС России (Код Города). Если требуется создать схему с оригинальными данными, то для этого понадобятся шейп-файлы, которые содержат нужную топологическую инфор- мацию (например, подробную схему Ленинградской области) и, возможно, связанную с топологическими объектами информацию. Для того чтобы создать новую схему, необходимо выбрать пункт Новый в меню Файл конфигуратора «1С:Предприятия» и в появившемся окне указать тип документа Географическая схема (рис. 3.2).
Глава 3. Географические схемы Выбор вида документа X | Текстовый документ | J OK j ; ' £ Картинка >" ... ; I }~ ; Отмена i ! Т абличный документ ; ift/ Внешняя обработка ! Рис. 3.2. Создание новой географической схемы «1С:Предприятие» создаст новый документ географической схемы. Чтобы доба- вить новые слои в схему, необходимо открыть диалог Настройка слоев. Открыть его можно либо из контекстного меню схемы, либо из палитры свойств. Затем в открывшемся диалоге нужно выполнить команду Добавить в панели инструментов списка слоев и выбрать необходимый шейп-файл (рис. 3.3). : Организация источника.. В.. Р... Начало масштабного ди... Конец масштабного диа.. ! ? I Серии данный | Объекты 4 Имя • Текст Имя групп... Значение- ' Базовый ц.. ' Тип отобра... ‘ Отображат... ..Формат от.. . Цвет текста ' Шрифт те»;* * | Н ф j i 1‘ • ( ’ I i ih...... .........‘...ф...""...... ........ " ............... .....~...U - I— ---------------", | Закрыть i I Справка ; Рис. 3.3. Диалог настройки слоев После выбора шейп-файла откроется диалог, в котором можно указать, какие связанные данные необходимо импортировать вместе с топологическими объектами (рис. 3.4). Параметры импорта <• лоя Импортировать под именем SSSSS® “ — *•. . 1 Укажите серии данных, которые необходимо импортировать. 'Ж 1 л Имя е файле - Тип значения Импорт про. , Имя в слое !, ТипоГобра, : Н -•i- А 4 J OBJECTID Числовое OBJECTID Не отоб... j ®APT_NAME Текстовое APT_NAME Не отоб... '' И UADDRESS Текстовое К* ADDRESS Не отоб... < - 1 BLD_NO ; Текстовое < BLD_NO Не отоб... 1 1 ] J NOTES Текстовое V' NOTES Не отоб... 1 s " 1 [UNIT_NO Текстовое < UNIT_NO Не отоб... 1 ? .( s [.] Заполнить свойство "Значение" объектов слоя < Нслатьзовзгь для этого серого:• 0 S J Е СТ ID - <n .: 1 1 ./Импортедавать: ;' Не импортировать Отмена I, Справка i _ .-„я - .i£ Рис. 3.4. Диалог импорта слоя из шейп-файла
154 Решение специальных прикладных задач в «1С:Предприятии 8» В диалоге можно указать, под каким именем необходимо импортировать файл в схему, какие серии и под каким именем необходимо импортировать в слой, а также как серии будут отображаться. Кроме этого, диалог позволяет записать значения выбранной серии в свойство Значение связанных тополо- гических объектов. Это может помочь в идентификации объекта. Например, в поставляемой демонстрационной схеме в свойство Значение записан код классификатора ИМНС, что позволяет связывать клиентов с географическим положением по их адресу. После импорта можно произвести дополнительную настройку схемы, поль- зуясь диалогом настройки слоев (рис. 3.5). Рис. 3.5. Диалог настройки слоев Чтобы отредактировать данные, связанные с объектом, необходимо дважды щелкнуть на необходимом объекте на географической схеме (рис. 3.6). Свойства объекта Основные 1— 4 • / X ini * Данные Оформление , Серия Гип отрисовки ’ Значение |НАЗВАНИЕ Не отображать Псковская обл ЭКОНОМИЧЕСКИЙ.. Не отображать Северо Западный ПЛОЩАДЬ Не отображать 55,3 СТОЛИЦА Не отображать Псков КОД_РЕГИОНА Не отображать Б ООО 000 000 000 0... Рис. 3.6. Диалог свойств объекта
Глава 3. Географические схемы Диалог свойств объекта позволяет быстро отредактировать данные, связанные с конкретным объектом, изменить свойства его оформления, видимость и необходимость отображения связанных с объектом данных. Работа с объектами географической схемы из встроенного языка Для работы с географическими схемами предназначен объект встроенного языка ГеографическаяСхема. Географическая схема содержит слои (совокупность географических объектов, сгруппированных по некоторому признаку, - регионы, города и т.п.), доступ к которым осуществляется через коллекцию Слои. Для каждого слоя можно настроить текст (свойство Текст), видимость (свойство Видимость) и возможность интерактивного выбора (свойство РазрешитьВыбор) объекта слоя на географической схеме. Также для слоя можно задать свойства НачалоМасштабногоДиапазона и КонецМас- штабногоДиапазона. Если установленный масштаб карты не попадает в вилку этих значений, то слой не отображается. Все топологические объекты, хранящиеся в слое, доступны через коллекцию Объекты. Через свойство ТипЭлементов можно получить тип объектов, которые могу г храниться в слое. Этот тип устанавливается автоматически, если слой импортируется из шейп-файла или задается пользователем, если слой создается с помощью средств встроенного языка. Слой позволяет манипулировать данными объектов с помощью методов УстановитьЗначение и ПолучитьЗначение. С помощью метода НайтиОбъект можно найти объект в слое по комбинации серии и ее значения для этого объекта. С помощью метода НайтиПоЗначению можно найти объект в слое по значению свойства Значение объекта слоя. Для каждого объекта слоя можно настроить его видимость и необходимость отрисовки связанных с ним данных. Для этого предназначены свойства объектов Видимость и ОтображатьДанные. Слои содержат серии данных, предназначенные для группировки данных, ассоциированных с объектами, и настройки параметров отображения этих объектов. Серии данных, ассоциированные со слоем, доступны через коллекцию Серии. Для более легкой идентификации серия имеет свойство Значение. С помощью серии данных можно задать тип отображения данных (свойство ТипОтображения) на географической схеме. Также можно настроить текст, описывающий серию данных, формат отображения значения текстом, шрифт, ориентацию текста, цвет текста и цвет фигуры.
Решение специальных прикладных задач в «ЮПредприятии 8» Значения серии могут не отображаться совсем или отображаться: в виде простого текста, гистограммы, кругов различного диаметра (рис. 3.7), кругов, различного цвета, « кругов, различного оттенка цвета, круговой диаграммы, круговой диаграммы разного размера, картинки. М>.' А X % V Коми Респ . Орен ргская Продажи по регионам (За все время] Мурманская обя 11 325,00 Таймырский АО 6 092.50 Корякский Саха /Якутия/ F'₽ с п е Г * J- Красноярский край ТюмёнскаяТ(5Ф^Ркаяобл *'* , ‘ ГЛ Программное обеспечение 860,00 Услуги 15 740.00 7 906,50 73,00 Д Аппаратное обеспечение 41 023,30 ф 22 060,65 ® 3 098,00 Рис. 3.7. Отчет, основанный на географической схеме Легенда географической схемы предоставляет возможность просмотреть список элементов легенды, а также изменить порядок их отображения или удалить ненужные. Новые элементы легенды добавляются через диалог Настройка элементов легенды путем указания необходимых объектов или серий данных, а также программно через свойство ОбластьЛегенды объекта Географичес- каяСхема. Примеры работы с географической схемой Ниже будет рассмотрено несколько простых примеров, иллюстрирующих основные возможности работы с географической схемой из встроенного языка: как отобразить схему в форме;
Глава 3. Географические схемы как отобразить на схеме объект, выбранный пользователем; как отобразить на схеме данные отчета. Познакомиться с этими примерами работы с географической схемой можно в демонстрационной конфигурации «Географические схемы и диаграммы» (обработка Работа с Географической схемой, отчет Продажи по Регионам), прилагающейся к книге на компакт-диске. Отображение географической схемы в форме Для отображения географической схемы в форме необходимо создать реквизит типа ГеографическаяСхема (например, ГеоСхема) и связать его с полем формы вида Поле географической схемы. Затем методом Прочитать () схемы из файла (листинг 3.1). заполнить реквизит данными географической Листинг 3.1. Отображение файла географической схемы ГеоСхема.Прочитать(’’С:/ГеографическаяСхемаРоссии.део’’)* Можно также вывести в схему данные из макета географической схемы. Например, можно создать общий макет типа Географическая схема и загрузить в него данные из файла, например, данные географической схемы России, поставляемые «I С:Предприятием» (рис. 3.8). Имя: Г еограФическаяСхемаРоссии Синоним: Географическая схема россии Комментарий: ] f Выбериге тип макета:------------------------—----------------------- | О Т абличный документ : j i ,Т екстовый документ j | > J Двоичные данные j . । i ) Active document ! | ~ | HTML документ > (*) Географическая схема > I О Графическая схема , } j (_ ‘ Схема компоновки данных J О Макет оформления компоновки данных Загрузить из файла: ; САГеограФическаяСхемаРоссии.geo Готово ! ' Отмена j | Справка Рис. 3.8. Макет географической схемы
Решение специальных прикладных задач в «^Предприятии 8» Затем в форме обработки выполнить метод Вывести () схемы (листинг 3.2). географической Листинг 3.2. Отображение макета географической схемы ГеоСхема.Вывести(ПолучитьОбщийМакет(ТеографическаяСхемаРоссии")); Методом Записать () можно сохранить данные географической схемы в файл. Методом ПолучитьКартинку () можно получить изображение географической схемы в форматах *.bmp, *.png. Подробнее о свойствах и методах объекта ГеографическаяСхема можно прочитать в синтакс-помощнике, в разделе Общие объекты ► Географическая схема. Выбор города на географической схеме Для примера рассмотрим решение следующей задачи. Пусть необходимо вывести в форму географическую схему России в разрезе регионов и городов с показом местоположения и наименования столиц регионов. А также требу- ется предоставить пользователю возможность выбрать из списка некоторый город и затем отобразить этот город на карте России. Для решения этой задачи создадим обработку Работа с географической схемой, форму этой обработки и реквизит формы ГеоСхема типа Географичес- каяСхема. Перетащим реквизит в дерево элементов формы и получим поле формы вида Поле географической схемы, связанное с этим реквизитом. Это поле будет отображать географическую схему в форме обработки. Также создадим реквизит СписокГородов типа СписокЗначений, который будет содержать список городов географической схемы. Создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 3.3). Листинг 3.3. Обработчик события «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ГеоСхема.Вывести(ПолучитьОбщийМакет(ТеографическаяСхемаРоссии")); ЗаполнитьСписокГородов(); СписокГородов.СортироватьПоПредставлению(); КонецПроцедуры
Глава 3. Географические схемы 159 В обработчике данные из общего макета, содержащего географическую схему России, выводятся в форму. Затем в процедуре ЗаполнитьСписокГо- родов () заполняется список городов географической схемы и отображаются столицы регионов России (л истин! 3.4). После этого данные списка значений СписокГородов сортируются по представлению. Листинг 3.4. Процедура «ЗаполнитьСписокГородов()>> &НаСервере Процедура ЗаполнитьСписокГ ородов() // Запретить перерисовку схемы на время обновления. ГеоСхема.Обновление = Ложь; II Отобразить слой Регионы. ГеоСхема.Слои.Регионы.Видимость = Истина; II Задать тип отображения названий городов. СлойГорода = ГеоСхема.Слои.Города; СлойГ орода.Серии.Название.ТипОтображения = Т ипОтображенияСерииСлояГ еографическойСхемы.Т екст; СлойГорода.Видимость = Истина; // Отобразить слой Города. II Сформировать список городов и скрыть все города, кроме столиц. Для Счетчик = 0 По СлойГорода.Объекгы.Количество() -1 Цикл Город = СлоиГорода.Объекгы.Получить(Счетчик); НазваниеГорода = СлойГорода.ПолучитьЗначение(Город, СлойГорода.Серии. Название); НазваниеРегиона = СлойГорода.ПолучитьЗначение(Город, СлойГорода.Серии.Регион); НазваниеСтолицы = СлойГорода. ПолучитьЗначение(Город, СлойГорода.Серии.Столица); Если НазваниеСтолицы.Значение ="" Тогда Город. Видимость = Ложь; Иначе Город. Видимость = Истина; КонецЕсли; СписокГородов.Добавить(Счетчик, НазваниеГорода.Значение + * (" + НазваниеРегиона.Значение +")"); КонецЦикла; ГеоСхема.Обновление = Истина; II Обновить схему, КонецПроцедуры В процедуре запрещается обновление схемы до конца процедуры, затем устанавливается видимость слоев Регионы и Города, а также задается тип отображения названий городов в виде обычного текста.
160 Решение специальных прикладных задач в «1С:Предприятии 8» После этого осуществляется обход всех объектов слоя Города и формиру- ется список городов, который сохраняется в списке значений СписокГородов. В цикле обхода получаются значения серии данных Наименование, Регион и Столица для каждою города. Значения первых двух серий используются для представления списка значений городов. А значения серии Столица используются для определения, является ли город столицей, и в зависимости от этого устанавливается его видимость на географической схеме. В заключение включается обновление схемы. В результате в форму обра- ботки выводится географическая схема России в разрезе регионов и городов с указанием столиц регионов. Теперь реализуем вторую часть задачи: предоставим пользователю возмож- ность выбрать из списка некоторый город и затем отобразить этот город на карте России. Для этого создадим команду формы ОтобразитьГород и перетащим ее в дерево элементов формы. В обработчике этой команды напишем следующий код (листинг 3.5). Листинг 3.5. Обработчик команды «ОтобразитьГород» &НаКлиенте Процедура ОтобразитьГ ород(Команда) ВыбранныйГород = СписокГородов.ВыбратьЭлемент(); Если ВыбранныйГород <> Неопределено Тогда ОтобразитьГ ородНаСхеме(ВыбранныйГород.3начение); КонецЕсли; КонецПроцедуры В данном обработчике список городов открывается для выбора пользова- телю. Затем в процедуре ОтобразитьГородНаСхеме() выбранный город находится в коллекции объектов слоя Города и отображается на географи- ческой схеме (листинг 3.6). Листинг 3.6. Обработчик команды «ОтобразитьГородНаСхеме» &НаСервере Процедура ОтобразитьГород НаСхеме(ВыбранныйГород) СлойГорода = ГеоСхема.Слои.Города; СлойГорода.Серии.Название.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.Текст; ГородСхемы = СлойГорода. Объекты.Получить(ВыбранныйГород); ГородСхемы.ТипОтрисовки = ТипОтображенияТочечногоОбъектаГеографическойСхемы.Маркер; 4 ГородСхемы.Маркер = ТипМаркераГеографическойСхемы .МаленькийКруг;
Глава 3. Географические схемы 161 ГородСхемы.Цвет = ДОеЬЦвета.Синий; ГородСхемы.Видимость = Истина; II отобразить выбранный город КонецПроцедуры При выводе города задаются различные свойства отображения точечного объекта (Тип отрисовки, Маркер, Цвет), отличающие его от вывода городов-столиц регионов на географической схеме (рис. 3.9). Рис. 3.9. Отображение выбранного города на географической схеме России Отчет «Продажи по регионам» Рассмотрим использование географической схемы для анализа продаж по регионам России. Для получения такого отчета необходимо знать территори- альное расположение контрагентов. В демонстрационной конфигурации «Географические схемы и диаграммы», прилагающейся к книге на компакт-диске, содержатся: справочники номен- клатуры, контрагентов и расходные накладные, содержащие контрагента и список номенклатуры. При проведении этих документов формируются движения в оборотном регистре накопления, отражающем данные о продажах в разрезе контрагентов и номенклатуры.
162 Решение специальных прикладных задач в «1С:Предприятии 8» Для каждого контрагента в справочнике Контрагенты хранится код региона (реквизит КодРегиона) и код города (реквизит КодГорода) по классификатору ФНС, в которых он зарегистрирован. На основе этих данных формируется отчет Продажи по регионам, построенный с помощью географической схемы. Разберем этот пример подробно. Для реализации задуманного создадим отчет ПродажиПоРегионам и его основную форму. Создадим реквизит формы ГеоСхема типа Географи- ческаяСхема и реквизит РезультатОтчета типа ТабличныйДокумент, которые будут содержать результат отчета в виде географической схемы и в виде табличного документа. Разместим эти реквизиты в форме. Также для формирования отчета нам понадобится список значений ТаблицаГрупп, содер- жащий значения типа СправочникСсылка. Номенклатура и логический реквизит ВыводитьГруппировкуГородов. Создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 3.7). Листинг 3.7. Обработчик события «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ. СтандартнаяОбработка) II Получим таблицу верхних групп в справочнике номенклатуры. Запрос = Новый Запрос)); Запрос.УстановитьПараметр("Родитель", Справочники.Номенклатура.ПустаяСсылка()); Запрос.Текст = "ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура. Номенклатура.Ссылка.Код КАК Код Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.ЭтоГруппа = Истина И Номенклатура.Родитель = &Родитель": II Выполним запрос и получим выборку. Результат = Запрос.Выполнить().Выбрать(); II Заполним таблицу для хранения таблицы группировок. Пока Результат.Следующий() Цикл ИмяГруппировки = "Колонка," + СокрЛП(Результат.Код); ТаблицаГрупп.Добавить(Результат.Номенклатура, ИмяГ руппировки); КонецЦикла; КонецПроцедуры
Глава 3. Географические схемы 163 В данном обработчике запросом получается выборка верхних групп в спра- вочнике номенклатуры и в результате обхода этой выборки заполняется список значений ТаблицаГрупп, хранящий таблицу группировок для форми- рования отчета. Формирование отчета начинается при нажатии кнопки Сформировать. В обра- ботчике соответствующей команды напишем следующий код (листинг 3.8). Листинг 3.8. Обработчик команды «Сформировать» &НаКлиенте Процедура Сформировать(Команда) СформироватьОтчет(); КонецПроцедуры По команде Сформировать вызывается серверная процедура Сформиро- ватьОтчет() (листинг 3.9), в которой формируется структура и внешний вид географической схемы (листинг 3.10), получается макет отчета в виде табличного щкумеп га, и затем схема и макет результата отчета заполняются данными о продажах (листинг 3.11). Листинг 3.9. Процедура «СформироватьОтчет()» &НаСервере Процедура СформироватьОтчет() Сформирова гьСхемуф // Подготовим табличный документ, в котором будет храниться результат отчета РезультатОтчета.Очистить(); II Получим макет отчета. Макет = Отчеты.ПродажиПоРегионам.ПолучитьМакет("Макет"); II Получим область шапки данных из макета. Область = Макет.ПолучитьОбласть("ШапкаТаблицьГ); И Выведем полученную область в отчет. РезультатОтчета.Вывести(Область): 7/ Начнем автогруппировку строк. РезультатОтчета.НачатьАвтогруппировкуОтрок(); ЗаполнитьОтчетДанными(Макет); //Закончим автогруппировку строк. РезультатОтчета.ЗакончитьАвтогруппировкуСтрок(); ГеоСхема.Обновление = Истина; КонецПроцедуры
Решение специальных прикладных задач в «^Предприятии 8» Листинг 3.10. Процедура «СформироватьСхемуО» ЛНаСервере ' ||Т*.. ” ' ? Процедура СформироватьСхемуО ГеоСхема.Очистить(); ГеоСхема.Обновление = Ложь; II Запретить обновление схемы. ГеоСхема.Вывести(ПолучитьОбщийМакет(,,Географическая£хемаРрссии")); чтонам нужна легенда и заголовок. ГеоСхема.ОтображатьЛегенду = Истина; ГеоСхема.ОтображатьЗаголовок = Истина; А II Установим параметры заголовка. ГеоСхема.ОбластьЗаголовка.Рамка = Новый Рймка(ТипРамкиЭлементаУправления.БезРамки,О); ГеоСхема.ОбластьЗаголовка.Текст = "Продажи по регионам (За все время)”; #Скр^ - . Ж* ЙЯИй £££ JlRl ЧЛ1Й Й5Й' Й V' ' ЮтображатьДаннь!е", Ложь)р^^ йЯЯ //Установим видимость наименования. СерияНаименованиеРегионов = ГеоСхема. Слои. Регионы. Серии. Найти("НАЗВАНИЕ"); СерияНаименованиеРегионов.ТипОтображения = .Ту!Пртоб^же.цияСерииСлояПеографическойСхемы.Текст; Индекс = 1; Для Каждого Элемент Из ТаблицаГрупп Цикл - II Создадим в слое географической схемы серию для отображения данных Серия = ГеоСхема. Слои. Регионы. Серии. Добавить("ГруппаУ' + СокрЛП(Элемент.Значение.Код)); Серия.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.РазмерФигуры: Серия.РежимОтображенияЗначений = РежимОтображенияЗначенийСерии.ОтображатьКакЗначение; Серия. Значение = Элемент.Значение; Серия.Текст = "Продажи по группе+ Элемент.Значение.Наименование t Серия. ИмяГруппыСерий = "Продажи"; Серия.Формат = "ЧДЦ=2"; //Добавим в легенду. ЭлементЛегенды = ГеоСхема.ОбластьЛегенды.Элементы.Добавить(); ЭлементЛегенды.Серия = Серия; ЭлементЛегенды .ТекстПодписи = Элемент,Значение.Наименование; ЭлементЛегенды.ОтображатьШкалу = ТипОтображенияШкалыЭлементаЛегендыГеографическойСхемы.НеОтображать; ; ' ......................................... - - '/ -Индекс = Индекс +1; КонецЦикла; ... ........... Jiar Т'Ж'В Бели ВыводитьГруппировкуГородов Тогда . Й Z II Скроем видимость всех городов. '': Я
Глава 3. Географические схемы 165 ГеоСхема.УстановитьСвойствоОбъектов(ГеоСхема.Слои.Города.Объекты, "Видимость", Ложь); //Скроем видимость всех данных для городов. ГеоСхема.УстановитьСвойа юОбъектов(ГеоСхема.Слои.Города.Объекты, "ОтображатьДанные”, Ложь); // Установим видимость наименования. СерияНаименованиеГородов = ГеоСхема.Слои.Г орода.Серии.Найти("НАЗВАНИЕ"); СерияНаименованиеГ ородов.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.Текст; Индекс = 1; Для Каждого Элемент Из ТаблицаГрупп Цикл II Создадим в слое географической схемы серию для отображения данных. Серия = ГеоСхема.Слои.Г орода.Серии.Добавить(Труппа_'' + СокрЛП(Элемент.Значение.Код)); Серия.Тил Отображения = ТипОтображенияСерииСлояГеографическойСхемы.РазмерФигуры; Серия.РежимОтображенияЗначений = РежимОтображенияЗначенийСерии.ОтображатьКакЗначение; Серия.Значение = Элемент.Значение; Серия. Текст = "Продажи по группе""" + Элемент.Значение.Наименование + Серия.ИмяГруппыСерий = "Продажи"; Серия.Формат = иЧДЦ=2”; //Добавим в легенду. ЭлементЛегенды = Г еоСхема,ОбластьЛегенды.Элементы.Добавить(); ЭлементЛегенды.Серия = Серия; ЭлементЛегенды.ТекстПодписи = Элемент.Значение.Наименование; Индекс = Индекс + 1; j КонецЦикла; КонецЕсли; // Найдем на схеме столицы регионов. Структура = Новый Структура©; Структура.Вставить(ГеоСхема.Слои.Города.Серии.Столица.Имя, Истина); Столицы = ГеоСхема.Слои.Города.ВыбратьОбъекты(Структура); ГеоСхема.УстановитьСвойствоОбъектов(Столицы, "Видимость", Истина); ГеоСхема.УстановитьСвойствоОбъектов(Столицы, "ОтображатьДанные", Ложь); КонецПроцедуры Прокомментируем основное содержание процедуры. Сначала в схему выводятся данные из общего макета, содержащего геогра- фическую схему России, устанавливается видимость ее заголовка и легенды, и выводится заголовок географической схемы. Затем для объектов слоя Регионы скрывается видимость всех данных и уста- навливается видимость для серии данных Название, а также задается тип отображения названий регионов в виде обычного текста.
166 Решение специальных прикладных задач в «^Предприятии 8» Затем для каждой группы товаров номенклатуры верхнего уровня в слой Регионы добавляется серия данных, и устанавливаются различные свой- ства этой серии: Текст, Значение, ТипОтображения и т.п. А также серия добавляется в легенду, и устанавливаются свойства соответствующего элемента легенды. Если флажок ВыводитьГруппировкуГородов установлен, те же действия выпол- няются и для объектов слоя Города. В заключение в слое городов находятся столицы регионов, и устанавливается их видимость на географической схеме. Таким образом, схема подготовлена к заполнению данными отчета. Листинг 3.11. Процедура «ЗаполнитьОтчетДанными()» &НаСервере Процедура ЗаполнитьОтчетДанными(Макет) II Подготовим запрос для вытаскивания данных о продажах. Запрос = Новый Запрос(); // Сформируем текст запроса. Индекс = 1; Для Каждого Элемент Из ТаблицаГрупп Цикл Запрос.Текст = Запрос.Текст + ДобавитьТекстЗапроса(Индекс, Элемент.Значение); Запрос.УстановитьПараметр("Родитель” + Индекс, Элемент.Значение); Если Индекс <> ТаблицаГрупп.Количество() Тогда Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ « КонецЕсли; Индекс = Индекс +1; КонецЦикла; // Добавим в текст запроса необходимость итогов. ЗапросТекст = Запрос.Текст + и ИТОГИ СУММА(СуммаОборот), СУММА(КоличествоОборот) ПО ОБЩИЕ,” + Символы.ПС; Запрос.Текст = Запрос.Текст + ” КодРегиона,” + Символы.ПС; Запрос.Текст = Запрос.Текст +: ” КодГорода," + Символы ЛС; Запрос.Текст = Запрос.Текст +" Контрагент"; II Выполним запрос и получим выборку. Выборка = Запрос.Выполнить().Выбрать(); II Обойдем все записи в выборке.
Глава 3. Географические схемы 167 Пока Выборка.Следующий() Цикл //Очистим текущую область. Область = Неопределено; Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ОбщийИтог Тогда II Получим область данных из макета. Область = Макет.ПолучитьОбласть("СтрокаОбщийИтоги); II Заполним эту область данными. Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот; II Выведем эту область в отчет РезультатОтчета.Вывести(Область, 1); ИначеЕсли Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда II Получим область данных из макета. Область = Макет.ПолучитьОбластьССтрокаИтогПоИерархии"); II Заполним эту область данными. Область. Параметры. Контрагент = Выборка. Контрагент; Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот; II Выведем эту область в отчет. РезультатОтчета.Вывести(Область, 4) ИначеЕсли Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда Если Выборка.Группировка() = "КодРегиона" Тогда // Получим область данных из макета. Область = Макет.ПолучитьОбласть("СтрокаИтогПоГруппировке" + Выборка.ГруппировкаО); II Заполним эту область данными. Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот; // Попробуем найти объект с таким кодом. Регион = ГеоСхема.Слои.Регионы.НайтиПоЗначению(Выборка.КодРегиона); //Если смогли найти объект с таким кодом. Если Не Регион = Неопределено Тогда II Получим название региона из серии название. Название = ГеоСхема.Слои.Регионы.ПолучитьЗначениефегион, ГеоСхема. Слои. Регионы.Серии.Название).Значение; // Выведем значение в табличный документ.
168 Решение специальных прикладных задач в «1С:Предприятии 8» Область.Параметры.Регион = Название; II Выведем эту область в отчет. РезультатОтчета. Вывести(Область, 2); II Выделим регион на схеме. Регион.Цвет = МеЬЦвета.СветлоЗолотистый; Регион.ОтображатьДанные = Истина; Иначе II Не смогли найти на схеме регион. Сообщить("Регион + Выборка.КодРегиона +....отсутствует на схеме.", СтатусСообщения.Внимание); КонецЕсли; ИначеЕсли Выборка.Группировка() = "КодГорода" Тогда // Получим область данных из макета. Область = Макет.ПолучитьОбласть("СтрокаИтогПоГруппировке" + Выборка! руппировкаО); II Выведем значение в табличный документ. Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот; II Попробуем найти объект с таким кодом в схеме. Город = ГеоСхема.Слои.Города.НайтиПоЗначению(Выборка.КодГорода); II Получим название города из серии название. Название = ГеоСхема.Слои.Города.ПолучитьЗначение(Город, ГеоСхема.Слои.Города.Серии.Название).Значение; II Выведем значение в табличный документ. Область.Параметры.Город = Название; II Выведем эту область в отчет. РезультатОтчета.Вь®ести(Область, 3); Если ВыводитьГруппировкуГородов Тогда II Если смогли найти объект с таким кодом. Если Не Город = Неопределено Тогда // Выделим город на схеме графически. Город.Видимость = Истина; Город.ОтображатьДанные = Истина; Город.ТипОтрисовки = Т ипОтображенияТочечногоОбъектаГ еографическойСхемы .Маркер; Город.Маркер = ТипМаркераГеографическойСхемы.Нет; Иначе II Не смогли найти на схеме город Сообщить(Тород м"и + Выборка.КодГорода +отсутствует на схеме.", СтатусСообщения.Внимание); КонецЕсли; КонецЕсли;
Глава 3. Географические схемы 169 КонецЕсли; ИначеЕсли Выборка .ТипЗаписи() = ТипЗаписиЗапроса.ДетальнаяЗапись Тогда Регион = Г еоСхема.Слои.Регионы.НайтиПоЗначению(Выборка.КодРегиона); II Если смогли найти объект с таким кодом Если Не Регион = Неопределено Тогда Регион. Видимость = Истина; Регион.ОтображатьДанные = Истина; Регион. Расшифровка = Новый Структура(нКодТопологии, Номенклатура", Выборка.КодРегиона, Справочники.Номенклатура.ПустаяСсылка()); Серия ~ ГеоСхема.Слои.Рёгионы.Серии.Найти(Выборка.Родитель); ЗначениеСерии = ГеоСхема.Слои.Регионы.ПолучитьЗначение(Регион, Серия); Если ЗначениеСерии = Неопределено Тогда II Установим значение серии. ГеоСхема.Слои.Регионы.УстановитьЗначение(Регион, Серия, Выборка.СуммаОборот,, Новый Структура("КодТопологии, Номенклатура", Выборка.КодРегиона, Серия.Значение)); Иначе // Установим значение серии. Г еоСхема.Слои.Регионы.УстановитьЗначение(Регион, Серия, Выборка.СуммаОборот + ЗначениеСерии.Значение, ЗначениеСерии. Подсказка. ЗначениеСерии. Расшифровка); КонецЕсли; Иначе // Не смогли найти на схеме регион. Сообщить("Регион..+ Выборка.КодРегиона +""" отсутствует на схеме.", СтатусСообщения.Внимание); КонецЕсли: Если ВыводитьГруппировкуГородов Тогда Город = ГеоСхема.Слои.Города.НайтиПоЗначению(Выборка.КодГорода); II Если смогли найти объект с таким кодом. Если Не Город = Неопределено Тогда Город. Видимость = Истина; Город. ОтображатьДанные = Истина; Город.Расшифровка- Новый Структура("КодТопологии, Номенклатура”, Выборка.КодГ орода, Справочники. Номенклатура. ПустаяСсылка()); Серия = ГеоСхема.Слои.Города.Серии,Найти(Выборка.Родитель); ЗначениеСерии = ГеоСхема.Слои.Города.ПолучитьЗначение(Город, Серия); Если ЗначениеСерии = Неопределено Тогда II Установим значение серии. Г еоСхема.Слои.Города.УстановитьЗначение(Город, Серия, Выборка.СуммаОборот,, НовыйСтруктура(’’КодТопологии, Номенклатура",
170 Решение специальных прикладных задач в «ЮПредприятии 8» Выборка.КодГ орода, Серия.Значение)); Иначе II Установим значение серии. ГеоСхема.Слои.Г орода.УстановитьЗначение(Город, Серия, Выборка.СуммаОборот + ЗначениеСерии. Значение, ЗначениеСерии.Подсказка, ЗначениеСерии.Расшифровка); КонецЕсли; Иначе // Не смогли найти на схеме город. Сообщить(Тород + Выборка.КодГорода + *** отсутствует на схеме.”, СтатусСообщения.Внимание); КонецЕсли; КонецЕсли; II Получим область данных из макета. Область = МакетЛолучитьОбластьрСтрокаДетальнаяЗапись"); II Заполним эту область данными. Область.Параметры.Контрагент = Выборка.Контрагент; Область. Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот; // Выведем эту область в отчет. РезультатОтчета.Вывести(Область, 5); КонецЕсли; КонецЦикла; КонецПроцедуры Кратко поясним содержание процедуры. Сначала динамически (в цикле обходится список групп товаров) с помощью функции ДобавитьТекстЗапросаО (листинг 3.12) формируется текст запроса к регистру накопления Продажи. Затем запрос выполняется, и в цикле обхода результата запроса заполня- ются значения серий данных географической схемы и табличный документ с данными результата отчета. При заполнении отчета анализируется тип записи выборки. Если текущая запись-это итог по группировке (региона или города), то объект находится по коду региона или коду города в коллекции объектов соответствующего слоя. В табличный документ выводится запись об этом объекте. 11а географической схеме регион отображается цветом, а город (если флажок ВыводитьГруппиров- куГородов установлен) - выбранным типом маркера.
Глава 3. Географические схемы 171 Если текущая запись выборки - это детальная запись, то в схеме находится объект с соответствующим кодом (города или региона) и к значению необхо- димой серии добавляется значение суммы оборота продаж. Также значения детальной записи выводятся в табличный документ. Листинг 3.12. Функция «ДобавитьТекстЗапроса()» &НаСервере: Функция ДобавитьТекстЗапроса(Индекс, Группа) II Начнем собирать текст запроса. ТекстЗапроса = "ВЫБРАТЬ" + Символы.ПС; ТекстЗапроса = ТекстЗапроса + ПродажиОбороты.Контрагент.КодРегиона КАК КодРегиона," + Символы.ПС: ТекстЗапроса = ТекстЗапроса +" ПродажиОбороты.Контрагент.КодГорода КАК КодГорода," + Символы.ПС; ТекстЗапроса = ТекстЗапроса + ПродажиОбороты.Контрагент КАК Контрагент СУММА(ПродажиОбороты.СуммаОборот) КАК СуммаОборот, СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот," + Символы.ПС ТекстЗапроса = ТекстЗапроса + ""Группа/ + СокрЛП(Группа.Код) +""" КАК Родитель"; ТекстЗапроса = ТекстЗапроса + я |ИЗ РегистрНакопления. Продажи.Обороты КАК ПродажиОбороты " + Символы.ПС; ТекстЗапроса = ТекстЗапроса + ТДЕ ПродажиОбороты.Номенклатура В ИЕРАРХИИ (&Родитель" + Индекс +")" + Символы.ПС; ТекстЗапроса = ТекстЗапроса + II ^ГРУППИРОВАТЬ ПО" + Символы.ПС; ТекстЗапроса = ТекстЗапроса +" ПродажиОбороты.Контрагент.КодРегиона," + Символы.ПС; ТекстЗапроса = ТекстЗапроса +" ПродажиОбороты.Контрагент.КодГорода," + Символы.ПС; ТекстЗапроса = ТекстЗапроса + ” ПродажиОбороты.Контрагент" + Символы.ПС; Возврат ТекстЗапроса; КонецФункции
Решение специальных прикладных задач в «^Предприятии 8» В результате выполнения отчета данные о продажах товаров по реги- онам России отражаются на географической схеме (рис. 3.10) и выводятся в табличный документ (рис. 3.11). Рис. 3.10. Отчет «Продажи по регионам» к- * Продаж 1 пре< <ги-Фигург^ия рС.При-дпрм’гие) М Ц*.Н- . — Г2 X < Продажи по регионам Схема отчета Т абл) ца отчета - - - *— । J. Регион 1] Город Контраггн! Сумма Конически Итого по н.ем 321/46.W 2142Л4’ ' 1 | । { t КомиРесп 4263.00 22.00 1 — Войвож 4263.00 22.00 Русская одежда 305.00 15.00 11!: ч Русская одежда 860.00 5 00 Русская одежда 3 098 00 2 00 1i Се. е 'Якутия/Peer 26 724.00 127.00 1 || - Чагда 4 009.00 0.00 Турмесов Марат Сергеевич 4 009 00 8 00 1 i' ; 7.' СИ'ТЯл 22 630.00 118.00 Никитин Юрий 2 455.00 4.00 V 1 Никитин Юрий 4 435 00 51 001 Н-китин Юрий 15 740 00 63 00 1 4 1 Той оку 85.00 1.00 Филипенко 85 00 1 00 Красноярский край 26 643.00 140.00 । С-! B-pem/trwHo 26 643.00 140.00 ; Завод РТИ 5190.00 54.00 i | 1Н Завод РТИ 7 200.00 бО.ОСр 11' 3-звод РТИ 14 253 00 26 00 - Мурманская об л 39 548.00 204.00 1 ’ 1 '• 1 Красно щрлье 33 548.00 204.00 1 ! । ' Пугачев Максим Олегович 5120 00 67 00 1 : J i i 1 Пугачев Максим Олегович 11 325.00 45.00" I I Пу гаче е Мака м Оле го в ич 23103.00 92.00 |i 1 1 ( 1 - иренб' ргская збл 55 287.00 483.00 1 i";“e । " Сорочинск 55 207.00 483.00 Алекс-2002 5 725 00 37 00 1 i II Алекс-2002 8 772 00 128 00 1 1 1 Алекс-2002 40 7S0 00 18 00 1 • 1 «Томская обл 45 810.00 575.00 1 ' I . — Максим ин Яр 45 810.00 575.00 1 н i Эльбрус 3 040 00 20 00 Эльбрус 14 300 00 345 00 Эльбрус 28 470 00 210 00 Тюменская обл 34551.00 110.00 Большое Сорокине 34 561.00 110.00 Центр детского творчества 8 006.00 ~эдсР 1 |i * Центр детского т в орчест в а И 325 00 45 00 1 1; Центр детского творчества 15 220 00 56 00 I op як с кий АО 10 699.08 25.00 Ачайваям 16 699.00 25 00 Автохозяйство N.34 980 00 600 1 Автохозяйство №34 9 719 00 19 00 J } ! 1 I--I : Таймырский АО 47421.0В 196.00 г Фак терпя Пайтурма 9 318.00 М.00 J . ! ] ( Manci мус 9 318 00 24 00 г щие зы - сы: Д; о’грзел^нп» 0 прт*У5 т ;О -- — — -— Рис. 3.11. Отчет «Продажи по регионам»
Глава 4. Диаграммы В этой главе речь пойдет об использовании диаграмм при разработке прикладных решений в системе «ЮПредприятие». Диаграмма предназначена для размещения в формах и табличных документах диаграмм и графиков различного вида. Логически диаграмма является сово- купностью точек, серий и значений серий в точке (рис. 4.1). Рис. 4.1. Пример диаграммы Как правило, в качестве точек используются моменты или объекты, для которых требуется получить значения характеристик, а в качестве серий - характеристики, значения которых нужно проанализировать. Например, диаграмма продаж видов номенклатуры по месяцам будет состоять из точек - месяцев, серий - видов номенклатуры и значений - оборотов продаж.
174 Решение специальных прикладных задач в «ЮПредприятии 8» Для работы с диаграммами предназначен объект встроенного языка Диаграмма. Диаграмма имеет три области, которые позволяют управлять оформлением диаграммы: область построения, область заголовка и область легенды (рис. 4.2). Обг^сть построения Рис. 4.2. Области диаграммы Платформа «1 С:Предприятие» поддерживает работу с различными видами диаграмм, в том числе: график (обычный, по шагам, с областями и т.д.); гистограмма (обычная, с накоплением, объемная и т.д.); круговая (обычная и объемная); биржевая (обычная и «свеча»); изометрическая (обычная, непрерывная и т.д.); поверхностная (каркасная, выпуклая, вогнутая поверхность, сотовая и др.); радарная (с областями, с накоплением, нормированная и др.); измерительная диаграмма. Тип диаграммы определяется свойством ТипДиаграммы. Это свойство позволяет представить данные в наиболее удобном для восприятия графи- ческом виде. Любая диаграмма может быть вставлена в структуру отчета как отдельный элемент и заполнена с помощью системы компоновки данных. Но в данном разделе мы рассмотрим, как заполнять и использовать диаграммы самостоя- тельно, с помощью методов встроенного языка.
Глава 4. Диаграммы 175 Примеры работы с диаграммами Заполнение данными и отображение диаграммы Для отображения диаграммы в форме необходимо создать реквизит типа Диаграмма и связать его с полем формы вида Поле диаграммы. Затем нужно заполнить данными реквизит, содержащий диаграмму, и определить тип диаграммы (свойство Тип Диаграммы). Следует различать два режима работы диаграммы - связь с источником данных посредством свойства ИсточникДанных и наполнение диаграммы данными при помощи метода УстановитьЗначение(). Данные режимы не могут комбинироваться. В демонстрационной конфигурации «Географические схемы и диаграммы», прилагающейся к книге на компакт-диске, существует обработка Работа с диаграммой, в которой демонстрируются примеры работы с круговой, изме- рительной диаграммой и гистограммой. Круговая диаграмма Рассмотрим пример, позволяющий показать данные в круговой диаграмме. Данная диаграмма имеет одну точку и произвольное количество серий. Для большей наглядности ограничим количество выводимых серий диаграммы, при этом оставшиеся серии будут объединяться в общую сводную серию. Для решения этой задачи создадим форму обработки РаботаСДиаграммой и реквизит формы КруговаяДиаграмма типа Диаграмма. Перетащим реквизит в дерево элементов формы и получим поле формы вида Поле диаграммы, связанное с этим реквизитом. Это поле будет отображать диаграмму в форме обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатию которой диаграмма будет заполняться данными. В обработчике команды напишем следующий код (листинг 4.1). Листинг 4.1. Обработчик команды «Сформировать» &НаКлиенте Процедура Сформировать(Команда) СформироватьКруговуюДиаграмму(КруговаяДиаграмма); КонецПроцедуры По команде Сформировать вызывается внеконтекстная серверная процедура СформироватьКруговуюДиаграммуО, в которую передается реквизит КруговаяДиаграмма и заполняется данными методом Установить Зна- чение () (листинг 4.2).
Решение специальных прикладных задач в «^Предприятии 8» Листинг 4.2. Процедура «СформироватьКруговуюДиаграммуО» &НаСервереБезКонтекста Процедура СформироватьКруговуюДиаграмму(Диаграмма) // Установить тип диаграммы. Диаграмма.ТипДиаграммы = ТипДиаграммы.КруговаяОбъемная; II Очистить диаграмму. Возможно, ранее в нее уже выводились данные. Диаграмма.Очистить(); // Количество серий будет ограничиваться (не все значения будут показываться). Диаграмма.МаксимумСерий = МаксимумСерий.Ограничено; Диаграмма.МаксимумСерийКоличество •= 7; Диаграмма.ВидПодписей - ВидПодписейКДиаграмме. Процент; • 1 Диаграмма.ОбластьЗаголовка.Текст = "Обороты номенклатуры"; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПродажиКомпанииОбороты.Номенклатура, СУММА(ПродажиКомпанииОбороты. КоличествоОборот) КАК КоличествоОборот ИЗ РегистрНакопления.Продажи.Обороты(>,,) КАК ПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Номенклатура"; Ре этат = Запрос.Выполнить(); II Запретить обновление диаграммы на время вывода данных. Диаграмма.Обновление = Ложь; II Установить единственную точку. Диаграмма.КоличествоТочек = 1; ' я Диаграмма.Точки[0] Гекст = "Количество*; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл II Количество серий, если бы не ограничивали, II зависело бы от результата запроса. КоличествоСерий = Диаграмма.Серии.Количество(); Диаграмма.КоличествоСерий = КоличествоСерий + 1: Диаграмма.Серии[КоличествоСерий].Текст = Выборка.Номенклатура; // Установить значение "на пересечении" точки и сер м. II Первый параметр - 0, так как в диаграмме только одна точка. Диаграмма.УстановитьЗначение(0, КоличествоСерий, Выборка.КоличествоОборот); КонецЦикла; //Обновить диаграмму. Диаграмма.Обновление = Истина; КонецПроцедуры
Глава 4. Диаграммы 177 В данной процедуре диаграмма очищается и устанавливается тип диаграммы, а также ограничивается максимальное количество серий диаграммы. Затем выполняется запрос по оборотному регистру накопления Продажи, где данные группируются по номенклатуре и суммируются по полю Количе- ствоОборот. В процессе обхода выборки результатов запроса диаграмма заполняется данными методом УстановитьЗначениеО, где точка одна - Количество, сериями является Номенклатура, а значениями серии в точке - КоличествоОборот. Чтобы не перерисовывать диаграмму каждый раз при установке ее свойств и значений, обновление диаграммы выключается в начале процедуры и вклю- чается после того, как диаграмма полностью сформирована. В результате выполнения этого кода будет получена следующая диаграмма (рис. 4.3). Работа с диаграммой - Конфигурация (1 ^Предприятие) Работа с диагр<1ммой Все действия - КруговаяДиаграмма Гистограмма Измерительная диаграмма Диаграмма Ганта £ТЬ Обороты номенклатуры Мышь 2-кноп А4Т ech PS/2 5 56% 5.04% 5.42% Ц Мь шь !се Mouse MUS-2 „ Мьшь LOGITECH M-S48 «PS/2 Консультации по настройке 1С 20 31% Консультации по настройке ОС V/irid.'o> м Доставка Рис. 4.3. Пример круговой диаграммы с данными о продажах номенклатуры Заметим, что специфика круговой диаграммы заключается в том, что она содержит одну точку и некоторое количество серий. В других видах диаграмм для вывода аналогичных данных номенклатуру лучше назначать точкам диаграммы (см. следующий пример).
178 Решение специальных прикладных задач в «^Предприятии 8» Гистограмма В данном примере мы рассмотрим заполнение гистограммы данными о продажах, в которой в качестве точек выбрана номен латура, а в качестве серий - контрагенты. Кроме того, мы продемонстрируем возможность транс- понирования, т. е. перемены местами точек и серий диаграммы. Для решения этой задачи создадим реквизит формы Гистограмма типа Диаграмма, реквизит Транспонировать типа Булево и перетащим их в дерево элементов формы обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатию которой диаграмма будет заполняться данными. В обработчике этой команды вызывается внеконтекстт я серверная проце- дура СформироватьГистограмму(), в которую передается реквизит Гистограмма и заполняется данными с помощью свойства методом Устано- витьЗначение () (листинг 4.3). Листинг 4.3. Процедура «СформироватьГистограммуО» &НаСервереБезКонтекста Процедура*СформироватьГистограмму{Диаграмма,;Транспонирование) // Установить тип диаграммы. Диаграмма ТипДиаграммы = ТипДиаграммы.Г истограммаОбъемная; / Очистить диаграмму. Возможно, ранее в нее уже выводились данные. Диаграмма,Очистить(), Диаграмма.ВидПодписеи = ВидПодписейКДиаграмме.Значение’ Диаграмма.ОбластьЗаголовка Текст = “Обороты номенклатурь"; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПродажиКомпанииОбороты.Контрагент КАК Контра ент, ПродажиКомпанииОбороты.Номенклатура СУММА(ПродажиКомпанииОбороты СуммаОборо КАК СуммаС борот РегистрНакопления.Продажи.Обороты ЗДатаНачала &ДатаОкон|чания) КАК ПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Номенклатура, ПродажиКомпанииОбороты.Контрагент" Запрос.УстановитьПараметрСДатаНачала’1 ’2011.09.14 00:00 00 Запрос.УстановитьПараметр("ДатаОкончания‘* ‘2011 0915 23.59:59’); Результат = Запрос.Выполнить(); // Запретить обновление диаграммы на время вывода данных.
Глава 4. Диаграммы 179 Диаграмма.Обновление - Ложь; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Транспонирование Тогда ТекстТочки = Выборка .Контрагент Наименование; ТекстСерии = Выборка.Номёнклатура.Наименование; Иначе ТекстСерии = Выборка.Контрагент.Наименование; ТекстТочки = Выборка.Номёнклатура.Наименование; КонецЕсли; ТекущаяСерия = 0; СерияНайдена = Ложь; Для Каждого СерияДиаграммы И j Диаграмма.Серии Цикл Если СерияДиаграммы.Текст = ТекстСерии Тогда СерияНайдена = Истина; Прервать; КонецЕсли; ТекущаяСерия = ТекущаяСерия + 1; КонецЦикла; Если НЕ СерияНайдена Тогда Диаграмма.Серии.Добавить(ТекстСерии); КонецЕсли; ТекущаяТочка = 0; ТочкаНайдена = Ложь; Для Каждого ТочкаДиаграммы Из Диаграмма.Точки Цикл Если ТочкаДиаграммы.Текст = ТекстТочки Тогда ТочкаНайдена = Истина: Прервать; КонецЕсли; ТекущаяТочка = ТекущаяТочка + 1; КонецЦикла; Если НЕ ТочкаНайдена Тогда Диаграмма.Точки.Добавить(ТекстТочки); КонецЕсли; II Установить значение "на пересечении" точки и серии. Диаграмма.УстановитьЗначение(ТекущаяТочка. ТекущаяСерия, Выборка.СуммаОборот); КонецЦикла; II Обновить диаграмму. Диаграмма.Обновление = Истина; КонецПроцедуры •? . г ММДО _. г
180 Решение специальных прикладных задач в «ЮПредприятии 8» В данной процедуре диаграмма очищается и устанавливается тип диаграммы. Затем выполняется запрос по оборотному регистру накопления Продажи, где данные группируются по полям Номенклатура и Контрагент и суммиру- ются по полю СуммаОборот. В процессе обхода выборки результатов запроса диаграмма заполняется данными методом УстановитьЗначениеО, где точки и серии (Номенклатура или Контрагент) определяются в зависимости от значения флажка Транспонировать, передаваемого в процедуру вторым пара- метром, а значениями серии в точке являются значения поля СуммаОборот. В результате выполнения этого кода будет получена следующая диаграмма (рис. 4.4). Рис. 4.4. Пример гистограммы с данными о продажах номенклатуры 11ри установке флажка Транспонировать будет получена следующая диаграмма, в которой точки и серии меняются местами (рис. 4.5).
Глава 4. Диаграммы 1Й1 ' Работа с диаграммой - КрйФигурвция 11 С: Предприятие) Все действия - ?' Рабога с дот рамной Круговая диаграмма Гистограмма Измерительная диаграмма Диаграмма Г анта Сформировать Транспонировать' v* 18000 16000 |14000 t 112000* f 10000* t 8000 { 6000 4000' ; 1700 15000 6000 1Я0Г1 1600' 3< ЮАспект 7 7 2000 Никитин Юрий л консультации по настройке 1С 1 (^Бухгалтерия 7.7 Базовая версия Консультации по настройке ОС Windiws Windows ХР Professional Russian CD к, Обороты номенклатуры Wndows ХР Ноте Edtion Russian UPG CD Щ Достаька Рис. 4.5. Пример гистограммы с данными о продажах номенклатуры Измерительная диаграмма Рассмотрим пример, позволяющий заполнить данные в диаграмме с помощью свойства ИсточникДанных. Для решения этой задачи создадим реквизит формы типа Диаграмма и перетащим его в дерево элементов формы обработки. Затем создадим команду Сформировать и соответствующую ей к формы, по нажатию которой диаграмма будет заполняться данными. В ботчике этой команды вызывается внеконтекстная серверная прог СформироватьИзмерительнуюДиаграмму (), в которую пере; реквизит ИзмерительнаяДиаграмма и заполняется данными с помощью ства ИсточникДанных (листинг 4.4).
182 Решение специальных прикладных задач в «^Предприятии 8» Листинг 4.4. Процедура «СформироватьИзмерительнуюДиаграммуО» &НаСервереБезКонтекста Процедура СформироватьИзмерительнуюДиаграмму(Диаграмма) // Настроить свойства диаграммы Диаграмма.ТипДиаграммы = ТипДиаграммы.Измерительная; Диаграмма.АвтоМаксимальноеЗначение = Ложь; Диаграмма.МаксимальноеЗначение = 20000; Диаграмма.АвтоМинимальноеЗначение = Ложь; Диаграмма.МинимальноеЗначение = 0; // Создать три полосы. Полосы = Диаграмма.ПолосыИзмерительнойДиаграммы; НоваяПолоса = Полосы Добавить)); НоваяПолоса.Начапо = 0; НоваяПолоса.Конец = 3000; НоваяПолоса.ЦветФона = УУеЬЦвета.Красный; НоваяПолоса = Полосы.Добавить(); НоваяПолоса Начало = 3000; НоваяПолоса.Конец = 7000; НоваяПолоса.ЦветФона = УУеЬЦвета.Желтый: НоваяПолоса = Полосы.Добавить)): НоваяПолоса.Начапо = 7000; НоваяПолоса.Конец = 20000' НоваяПолоса.ЦветФона = МеЬЦвета.Зеленый; Запрос ;/= Новый Запрос)" ЬБРАТЬ ПродажиОбороты. Период, ПродажиОбороты.СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,) КАК ПродажиОбороты"); Запрос.УстановитьПараметр("ДатаНачала” . '2011.09.14 00:00:00'); Запрос.УстановитьПараметр("ДатаОкончания", '2011.09.15 23:59:59’); Диаграмма.ИсточникДанных = Запрос.Выполнить().Выгрузить{); КонецПроцедуры и В процедуре устанавливается тип диаграммы, задается максимальное и мини- мальное значение ее шкалы, а также настраиваются измерительные полосы диаграммы. Затем выполняется запрос по оборотному регистру накопления Продажи, в котором выбирается поле СуммаОборот с периодичностью День. После этого результат запроса выгружается в таблицу значений и становится источником данных для диаграммы.
Глава 4. Диаграммы 183 В результате выполнения этого кода 6yayi получены данные о продажах за два дня сентября 2011 года, которые отобразятся в измерительной диаграмме двумя стрелками, указывающими на объем продаж (рис. 4.6). Рис. 4.6. Пример измерительной диаграммы с данными о продажах номенклатуры по дням
184 Решение специальных прикладных задач в «^Предприятии 8»
Глава 5. Диаграмма Ганта Диаграмма Гайта представляет собой диаграмму интервалов на шкале времени и отражает использование объектами (точками) ресурсов (серий) (рис. 5.1). Рис. 5.1. Пример диаграммы Ганта Диаграмма Ганта широко используется для визуализации хода выполнения задач, планирования ресурсов, графика рабочего времени и других данных,
186 Решение специальных прикладных задач в «1С:Предприятии 8» которые представляются не конкретными числовыми значениями, а набором временных интервалов. Для работы с диаграммой Ганта предназначен объект встроенного языка ДиаграммаГанта. Значение диаграммы Ганта представляет собой специальный объект, который автоматически формируется системой на основании того, какие точки и какие серии определены для данной диаграммы. Этот объект является совокупностью (коллекцией) интервалов, то есть может содержать не один, а несколько интервалов, которые соответствуют паре серия-точка (создава- емый по умолчанию объект ЗначениеДиаграммыГанта не содержит ни одного интервала). Разработчик может получить значение диаграммы, указав интересующую его точку и серию, и затем добавить в коллекцию необхо- димое количество интервалов. Все интервалы всех значений диаграммы располагаются с привязкой к единой оси времени, что дает возможность видеть их взаимное расположение. Для диаграммы Ганта поддерживается возможность установки связей между различными интервалами. Таким образом, окончание одного интервала может быть связано с началом следующего интервала диаграммы. Примеры работы с диаграммой Ганта Рассмотрим пример, позволяющий заполнить данные в диаграмме Ганта, отра- жающей график дежурств для сотрудников. Этот пример можно посмотреть в демонстрационной конфигурации «Географические схемы и диаграммы», прилагающейся к книге на компакт-диске, в обработке Работа с диаграммой. Для решения этой задачи создадим реквизит формы ДиаграммаГанта типа ДиаграммаГанта и перетащим его в дерево элементов формы обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатию которой диаграмма будет заполняться данными. В обработчике этой команды вызывается внеконтекстная серверная процедура Сформиро- ватьДиаграммуГантаО, в которую передается реквизит ДиаграммаГанта. Для того чтобы заполнить диаграмму Ганта, необходимо создать нужные серии (в нашем случае это виды дежурств), точки (в нашем случае это сотрудники) и заполнить свойства значений диаграммы для каждой пары точка серия. Значение диаграммы представляет собой в общем случае совокуп- ность нескольких интервалов. В данном примере каждое значение диаграммы содержит лишь один интервал, для которого задается начало, конец и текст, выводимый в качестве подсказки при наведении курсора мыши на этот интервал (листинг 5.1).
Глава 5. Диаграмма Ганта 187 Листинг 5.1. Процедура «СформироватьДиаграммуГанта()» &НаСервереБезКонтекста Процедура СформироватьДиаграмму Г анта(Диаграмма) Диаграмма.Очистить(); // Запретить обновление диаграммы Диаграмма.Обновление = Ложь; // Установить заголовок диаграммы. Диаграмма.ОбластьЗаголовка Текст = Трафик дежурств"; // Интервал будем определять самостоятельно. Диаграмма.АвтоОпределениеПолногоИнтервала = Ложь; Ч Установить интервал. Диаграмма.УстановитьПолныйИнтервал(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата())); IIВ диаграмме будет две точки - сотрудники Петров и Сидоров... ТочкаП = Диаграмма.УстановитьТочку("Петров"); ТочкаС = Диаграмма.УстановитьТочку(”Сидоров"); II и две серии - дежурство на вахте и дежурство в центральном офисе. СерияНаВахте = Диаграмма.УстановитьСерию("На вахте”); СерияВЦентре - Диаграмма.УстановитьСерию("В центральном офисе”); II Задать цвета серий, отличные от цвета по умолчанию. СерияНаВахте.Цвет = УУеЬЦвета. Синий: СерияВЦентре. Цвет = МеЬЦвета.Желтый: ПервыйДень = НачалоМесяца(ТекущаяДата()); II Получить значение диаграммы - дежурство Петрова на вахте. Значение = Диаграмма.ПолучитьЗначение(ТочкаП СерияНаВахте); // В значении определить новый интервал. Интервал = Значение.Добавить(); Интервал.Текст = "Работает на вахте"; // Определить границы интервала. Интервал.Начало - ПервыйДень; Интервал. Конец = ПервыйДень + 10 * 24 * 60 * 60; II Получить значение диаграммы - дежурство Петрова в центральном офисе. Значение = Диаграмма.ПолучитьЗначение(ТочкаП, СерияВЦентре); Интервал = Значение.Добавить(); Интервал.Текст = “Работает в центральном офисе"; Интервал.Начало = ПервыйДень + 14 *24 * 60 * 60; Интервал.Конец = ПервыйДень + 24 * 24 * 60 * 60; // Получить значение диаграммы - дежурство Сидорова на вахте Значение = Диаграмма.ПолучитьЗначение(ТочкаС, СерияНаВахте); Интервал = Значение .Добавить(); Интервал.Текст = "Работает на вахте”;
188 Решение специальных прикладных задач в «1С:Предприятии 8» Интервал.Начало = ПервыйДень + 5 * 24 * 60 * 60; Интервал.Конец = ПервыйДень + 15 * 24 * 60 * 60; // Получить значение диаграммы - дежурство Сидорова в центральном офисе. Значение - Диаграмма.ПолучитьЗначение(ТочкаС, СерияВЦентре); Интервал = Значение .Добавить)); Интервал.Текст = "Работает в центральном офисе"; Интервал.Начало = ПервыйДень + 21 * 24 * 60 * 60; Интервал.Конец = ПервыйДень + 25 * 24 * 60 * 60; / Обновить диаграмму. Диаграмма.Обновление - Истина; КонецПроцедуры Диаграмма Ганта позволяет размещать на шкале времени непериодические метки, которые могут использоваться для обозначения контрольных точек или произвольных событий, связанных с отображаемыми в диаграмме данными. В качестве развития данного примера можно добавить в диаграмму две непе- риодические метки, которые будут обозначать события проверки дежурств, выполняемых сотрудниками. Добавим к приведенной процедуре следующий фрагмент кода (листинг 5.2). Листинг 5.2. Добавление непериодических меток ЭлементМеток = Диаграмма.ОбластьПостроения.ШкалаВремени.Элементы .Добавить)); ЭлементМеток. Единица = ТипЕдиницыШкалыВремени.День; // Скрыть периодические метки добавленного элемента. ЭлементМеток ОтображатьПериодическиеМетки = Ложь; II Установить метку: первая проверка -10 часов утра 9-го числа ПерваяПроверка = ПервыйДень + 8 * 24 * 60 * 60 + 10 * 60 * 60; Метка = ЭлементМеток. Метки Добавить(ПерваяПроверка); Метка.Текст = "Проверка"; Метка.ЦветТекста = УУеЬЦвета Красный; Метка.ЦветЛинии = Метка.ЦветТекста; // Установить метку: вторая проверка - 8 часов вечера 23-го числа. ВтораяПроверка = ПервыйДень + 22 * 24 *60 * 60 + 20 * 60 * 60; Метка = ЭлементМеток.Метки.Добавить(ВтораяПроверка) Метка.Текст = "Проверка"; Метка.ЦветТекста - УУеЬЦвета.Красный: Метка.ЦветЛинии = Метка.ЦветТекста; Для добавления непериодических меток в процедуре для более наглядного отображения меток используется дополнительный элемент шкалы времени. Те же самые метки можно было бы добавить и в существующий элемент шкалы времени. Также для каждой метки задается текст, цвет надписи и цвет линии, которая будет отображать эту метку в диаграмме.
Глава 5. Диаграмма Ганта W9 Диаграмма Ганта позволяет выделять цветом фона произвольные интер- валы. Эта возможность может использоваться, например, для «подсветки» выходных дней. Для иллюстрации этой возможности к примеру, приведен- ному в листинге 5.1, можно добавить код, который выделит выходные дни другим цветом фона диаграммы (листинг 5.3). Листинг 5.3. Выделение выходных дней цветом фона Неделя > 3600 * 24 * 7;' l|ft Выходные = 3600 * 48; МаксимальнаяДата = ПервыйДень + Неделя *4; ТекущаяДата = ПервыйДень; Пока ТекущаяДата <= МаксимальнаяДата Цикл; Конец = НачалоНедели(ТекущаяДата); Начало = Конец - Выходные; Выходной = Диаграмма.ИнтервалыФона.Добавить(Начало, Конец); Выходной.Цвет = \А/еЬЦвета.СветлоСерый; ТекущаяДата = ТекущаяДата + Неделя; КонецЦикла; Для выделения выходных дней нужные интервалы добавляются к коллекции интервалов фона диаграммы, и устанавливается светло-серый цвет создава- емых интервалов. В результате выполнения кода, приведенного в листингах 5.1, 5.2, 5.3, будет получена следующая диаграмма, отражающая график дежурств сотрудников, с подсветкой выходных дней и отметкой дней проверок (рис. 5.2). Рис. 5.2. Пример диаграммы Ганта, отражающей график дежурств сотрудников
190 Решение специальных прикладных задач в «Ю.Предприятии 8» Диаграмма Ганта позволяет устанавливать связи между различными интерва- лами диаграммы. Для иллюстрации этой возможности доработаем процедуру, приведенную в листингах 5.1, 5.2, 5.3, следующим образом (листинг 5.4). Листинг 5.4. Процедура «СформироватьДиаграммуГанта()» &НаСервереБезКонтекста Процедура СформироватьДиаграммуГ анта(Диаграмма) Диаграмма.Очистить(); II Запретить обновление диаграммы. Диаграмма.Обновление = Ложь; II Установить заголовок диаграммы. Диаграмма.ОбластьЗаголовка.Текст = Трафик дежурств'1; II Интервал будем определять самостоятельно. Диаграмма.АвтоОпределениеПолногоИнтервала = Ложь; II Установить интервал. Диаграмма.УстановитьПолныйИнтервал(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата())); IIВ диаграмме будет две точки - сотрудники Петров и Сидоров... ТочкаП = Диаграмма.УстановитьТочку("Петров"); ТочкаС - Диаграмма.УстановитьТочку("Сидоров"); II и две серии - дежурство на вахте и дежурство в центральном офисе СерияНаВахте = Диаграмма УстановитьСерию("На вахте"); СерияВЦентре = Диаграмма.УстановитьСерию("В центральном офисе"); // Задать цвета серий, отличные от цвета по умолчанию СерияНаВахте.Цвет = УУеЬЦвета.Синий' СерияВЦентре.Цвет = \А/еЬЦвета.Желтый; ПервыйДень = НачалоМесяца(ТекущаяДата()); II Получить значение диаграммы - дежурство Петрова на вахте. Значение = Диаграмма. ПолучитьЗначение(ТочкаП, СерияНаВахте); IIВ значении определить новый интервал. Интервал = Значение.Добавить(); II Запомнить интервал начала связи СвязьИнтервалНачало = Интервал; Интервал.Текст = "Работает на вахте"; II Определить границы интервала. Интервал.Начало = ПервыйДень; Интервал.Конец = ПервыйДень + 10 * 24 * 60 * 60; II Получить значение диаграммы - дежурство Петрова в центральном офисе. Значение = Диаграмма.ПолучитьЗначение(ТочкаП, СерияВЦентре); Интервал = Значение.Добавить(); II Запомнить интервал окончания связи. СвязьИнтервалКонец = Интервал;
Глава 5. Диаграмма Ганта 191 Интервал.Текст = "Работает в центральном офисе"; Интервал.Начало = ПервыйДень + 14 * 24 * 60 * 60; Интервал.Конец = ПервыйДень + 24 * 24 * 60 * 60; II Связать два интервала. Связь = СвязьИнтервалНачало.Добавить(СвязьИнтервалКонец); Связь.Цвет = УУеЬЦвета.Синий; II Получить значение диаграммы - дежурство Сидорова на вахте. Значение = Диаграмма.ПолучитьЗначение(ТочкаС, СерияНаВахте); Интервал = Значение.Добавить(): // Запомнить интервал начала связи. СвязьИнтервалНачало = Интервал; Интервал.Текст = “Работает на вахте"; Интервал.Начало = ПервыйДень + 5 * 24 * 60 * 60; Интервал.Конец = ПервыйДень + 15 * 24 * 60 * 60; II Получить значение диаграммы - дежурство Сидорова в центральном офисе Значение = Диаграмма.ПолучитьЗначениеГГочкаС. СерияВЦентре); Интервал = Значение.Добавить(); II Запомнить интервал окончания связи СвязьИнтервалКонец = Интервал; Интервал.Текст = "Работает в центральном офисе"; Интервал.Начало = ПервыйДень + 21 * 24 * 60 * 60; Интервал.Конец = ПервыйДень + 25 * 24 * 60 * 60; II Связать два интервала. Связь = СвязьИнтервалНачало.Добавить(СвязьИнтервалКонец); Связь.Цвет = ДОеЬЦвета.Синий; // Установить непериодические метки. ЭлементМеток = Диаграмма.ОбластьПостроения.ШкалаВремени.Элементы.Добавить(); ЭлементМеток. Единица = ТипЕдиницыШкалыВремени.День; II Скрыть периодические метки добавленного элемента. ЭлементМеток. ОтображатьПериодическиеМетки = Ложь; II Установить метку: первая проверка -10 часов утра 9-го числа. ПерваяПроверка = ПервыйДень + 8 * 24 * 60 * 60 + 10 * 60 * 60; Метка = ЭлементМеток.Метки.Добавить(ПерваяПроверка); Метка.Текст = "Проверка"; Метка.ЦветТекста = МеЬЦвета. Красный; Метка.ЦветЛинии = Метка.ЦветТекста: II Установить метку: вторая проверка - 8 часов вечера 23-го числа ВюраяПроверка = ПервыйДень + 22 * 24 * 60 * 60 + 20 * 60 * 60; Метка = ЭлементМеток.Метки.Добавить(ВтораяПроверка); Метка.Текст = "Проверка": Метка.ЦветТекста = УУеЬЦвета.Красный: Метка.ЦветЛинии = Метка.ЦветТекста; // Выделить выходные дни другим цветом фона. Неделя = 3600 * 24 * 7;
192 Решение специальных прикладных задач в «^Предприятии 8» Выходные = 3600 *48; МаксимальнаяДата = ПервыйДень + Неделя * 4; ТекущаяДата = ПервыйДень; Пока ТекущаяДата <= МаксимальнаяДата Цикл; Конец = НачалоНедели(ТекущаяД та); Начало = Конец - Выходные; Выходной = Диаграмма.ИнтервалыФона.Добавить(Начало, Конец); Выходной.Цвет = \А/еЬЦвета.Светл )Серый; ТекущаяДата = ТекущаяДата + Неделя; КонецЦикла; // Обновить диаграмму. Диаграмма Обновление = Истина; КонецПроцедуры Для добавления связи необходимо выполнить метод Добавить () того интер- вала диаграммы, который является началом связи. В качестве параметра этого метода необходимо передать интервал диаграммы, который будет являться окончанием этой связи. Кроме >гого, можно задать другие свойства связи, например цвет. В результате выполнения кода будет получена следующая диаграмма (рис. 5.3). Рис. 5.3. Связь интервалов диаграммы Ганта, отражающей график дежурств сотрудников
Глава 5. Диаграмма Ганта 1$ Итак, мы рассмотрели пример «ручного» заполнения диаграммы Ган В реальных механизмах данные для построения, скорее всего, будут по. чаться из базы данных, например, из регистра расчета для построения отч' о начислениях сотрудникам. Рассмотрим пример, показывающий заполнение диаграммы Ганта, кото] будет отображать для каждого сотрудника фактический период дейсп записи по каждому из видов расчета, имеющих место для этого сотрудни Точками диаграммы являются сотрудники, а сериями - виды расчетов. Так образом, для каждого сотрудника существует некоторое значение диаграм по каждой из серий, то есть по каждому из видов расчета. Для построения диаграммы Ганта можно использовать следующий i (листинг 5.5). Листинг 5.5. Процедура «СформироватьНаСервере()» &НаСервереБезКонтекста Процедура СформироватьНаСервере(Диаграмма) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ |||ЙС / НачисленияФактическийПериодДействия.Сотрудник НачисленияФактическийПериодДействия.ВидРасчета, НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФакгическийПериоДДействия.ПериодДействияКонец, НачисленияФактическийПериодДействия.Результат, НачисленияФактическийПериодДействия.Регистратор, НачисленияФактическийПериодДействия.Регистратор.Представление ИЗ <. РегистрРасчета.Начисления.ФактическийПериодДействия КАК НачислёнйяФактическийПериодДействия"; ВыборкаРезультата = Запрос.Выполнить().Выбрать(); II Запретить обновление диаграммы. Диаграмма.Обновление = Ложь; W Диаграмма.Очистить(); Диафамма.ОтображатьЗаголовок = Ложь; II Заполнить диаграмму. Пока ВыборкаРезультата.Следующий() цикл //Получить серию, точку и значение для них. ТекущаяСерия = Диаграмма.УстановитьСерию(ВыборкаРезультата.ВидРасчета); ТекущаяТочка = Диаграмма.УстановитьТочку(ВыборкаРезультата.Сотрудник); ТекущееЗначение - Диаграмма.ПолучитьЗначение(ТекущаяТочка, ТекущаяСерия); // Создать нужные нам интервалы в значении. ТекущийИнтервал = ТекущееЗначение.Добавить();
194 Решение специальных прикладных задач в «^Предприятии 8» •Л„Л ______________________________________________________________ ТекущийИнтервал.Начало = ВыборкаРезультата.ПериодДействияНачало; ТекущийИнтервал.Конец = ВыборкаРезультата.ПериодДействияКонец; ТекущийИнтервал.Текст = ВыборкаРезультата.РегистраторПредставление; ТекущийИнтервал.Расшифровка — ВыборкаРезультата.Регистратор; КонецЦикла; ,t, II Раскрасить серии своими цветами. Для Каждого Серия из Диаграмма.Серии Цикл Если Серия.Значение = ПланыВцдовРасчета.ОсновныеНачисления.Оклад Тогда (^ияДв^^ ИначёЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачйсления .ПремияТогда Серия.Цвет = УУЕВЦвёта.Зеленый; ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Невыход Тогда Серия.Цвет = МЕВЦвета.Красный; КонецЕсли; КонецЦикла; II Разрешить обновление Диаграммы. Диаграмма.Обновление = Истина; КонецПроцедуры Диаграмма заполняется данными в цикле обхода выборки результата запроса к регистру расчета. Сначала, используя методы УстановитьСериюО и Установить Точку(), получаются либо существующие, либо новые точка и серия. Точки и серии однозначно идентифицируются своими значениями, в качестве которых используются сотрудник и вид расчета из результата запроса. После этого с помощью метода ПолучитьЗначениеО получается соответ- ствующее точке и серии значение диаграммы. Затем в значение диаграммы добавляется новый интервал, задается его начало и конец, текст интервала, который будет показываться во всплывающей подсказке, и задается расшиф- ровка интервала, которая будет выполняться при двойном щелчке мышью на этом интервале. После того как все значения диаграммы сформированы, серии раскраши- ваются своими цветами. Серии диаграммы представляют собой коллекцию значений, которая перебирается при помощи конструкции Для каждого ... Цикл.
Глава б. Графические СХ6 М Ы В этой главе речь пойдет об использовании графических схем при разработке прикладных решений в системе «1С:Предприятие». Графическая схема (рис. 6.1) позволяет создавать различные организа- ционные, структурные и другие схемы для графического оформления прикладного решения. Она предназначена для оформления форм и отчетов, в которых требуется представить те или иные организационные процессы, блок-схемы и пр. Кроме этого, графическая схема может быть использо- вана как отдельный документ, являющийся частью оформления прикладного решения. С помощью графических схем удобно создавать иллюстрации, пояс- няющие состав тех или иных алгоритмов, структуру тех или иных процессов, организационные схемы и пр. Графическая схема широко применяется при создании карт маршрута бизнес-процессов. Этот вопрос подробно рассматривался в разделе «Точки маршрута», стр. 17. Однако графические схемы можно использовать для рисования любых произвольных схем и алгоритмов, иллюстрирующих рабочие процессы в орга- низации. В этой главе мы рассмотрим, как использовать графические схемы в формах и отчетах и обращаться к ним с помощью встроенного языка.
196 Решение специальных прикладных задач в «1С:Предприятии 8» W СЛЭлекф... ОСГоддопие) gj I W - ji| 7 Схема проведения электронных торгов Поставщики Заказчики Система Модуль проведения электронных тендеров Единый каталог товаров и услуг, унифицированные прайс-листы Блок маркетинговых исследований и анализа Система регистрации и аутентификации пользователей Рис. 6.1. Графическая схема Основы работы с графической схемой Для того чтобы создать новую схему, необходимо выбрать пункт Новый в меню Файл конфигуратора «I С:Предприятия» и в появившемся окне указать тип документа Графическая схема (рис. 6.2). Рис. 6.2. Создание новой графической схемы «1С:Предприятие» создаст новый документ графической схемы. Чтобы доба- вить новые элементы в схему, можно использовать панель Вставка элементов схемы, которая по умолчанию размещается в нижней части окна конфигура- тора, но, как и любая панель инструментов, может быть размещена в любом его месте (рис. 6.3). Рис. 6.3. Панель элементов графической схемы
Глава 6. Графические схемы 197 Для рисования произвольных графических схем удобно использовать элемент схемы Декорация &. По умолчанию декорация имеет форму прямоугольника, но можно изменить форму декорации, задав свойство Фигура (рис. 6.4). Свойства: Декорация я г uj X * ХаракIеристики. Г оризонта льноеП оло! Верт икальноеПолож' Подсказка Сз D Нет Блок Папка Файл Оформление: ЦветФона ЦветЛнн! и иветТекста Шрифт П оложениекартинки П розрачнь йФ он Картинка РазмерКартинки V Л О <» Стрелка вправо Стрелка влево Стрелка вверх Стрелка вниз Стрелка вверх-вниз Стрелка влево-вправо Скобки вертикальные Скобки горизонтальные Эллипс Фил Расположение: Леео Высота 60 Верх 60 40 Ширина 1Б0 Рис. 6.4. Свойства элемента «Декорация» графической схемы Используя свойства Картинка, ПоложениеКартинки и РазмерКар- тинки, можно задать для декорации картинку, установить ее положение и размер (рис. 6.5). Свойства: Декорация Основные: Имя Заголовок Поставщики =. Выбор картинки Поставка товара от поставщиков Библиотека Г иперссылка fj » Характеристики: ГоризонтальноеП сложение Ц ентрировать В ерт > кальноеП сложение Подсказка Центрировать Добавить новый элемент Создать элемент списка Добавить новый э лемен. Удалить текущий э лемент Удалить текущий элемент Изменить (или открыть) .. Выбранная картинка I------------------ Оформление. ЦветФона Цвет Л инии ЦветТекста Шрифт ПоложениеКартинки 5 Лево ПрозрачныйФон С Х~] Авто 48x48 стиль Рамка Выбрать из Файла Авто Очистить г | Сохранить ] ОК Отмена Справка X - X X V РазмерКартинк и /УЗТоРазмер^ ж Фигура [О Блок чг Расположение: Лево Ширина 200 Верх 40 260 Рис. 6.5. Свойства элемента «Декорация» графической схемы
198 Решение специальных прикладных задач в «^Предприятии 8» Для соединения элементов схемы используется элемент Декоративная линия 4. По умолчанию линия сплошная, но можно изменить тип линии, задав свойство Линия (рис. 6.6). Рис. 6.6. Свойства элемента «Декоративная линия» графической схемы Также можно управлять видом стрелок декоративной линии, используя свойства СтрелкаНачала. и СтрелкаКонца. Итак, используя описанные выше приемы, создадим графическую схему, описывающую работу склада по приему, учету и отгрузке товара (рис. 6.7). Далее мы покажем пример использования этой схемы в прикладном решении «1 С: Пред приятия». Сама схема будет храниться в файле *.grs, и затем в режиме Конфигуратор ее можно будет открыть (Файл ► Открыть) и отредактировать. Примеры работы с графической схемой Следует иметь в виду, что полностью работа с графической схемой средствами встроенного языка недоступна, поэтому в данном разделе будут рассмотрены только некоторые возможности такой работы. Для работы с графической схемой предназначен объект встроенного языка ГрафическаяСхема. Чтобы отобразить графическую схему в форме, необ- ходимо создать реквизит типа ГрафическаяСхема и связать его с полем формы вида Поле графической схемы.
199 ____ Глава 6. Графические схемы Поставка товара от поставщиков Схема работы складского комплекса распределительного типа Поставка товара клиентам Рис. 6.7. Графическая схема работы склада В демонстрационной конфигурации «Географические схемы и диаграммы», прилагающейся к книге на компакт-диске, существует обработка Работа с графической схемой, в которой можно посмотреть пример работы с графи- ческой схемой. Допустим, нам требуется разместить в форме (обработки или отчета) созданную ранее графическую схему и программно обрабатывать интерак- тивный выбор какого-либо элемента схемы. Для решения этой задачи создадим форму обработки РаботаСГрафичес- койСхемой и реквизит формы ГрафическаяСхема типа ГрафическаяСхема.
200 Решение специальных прикладных задач в «1С:Предприятии 8» Перетащим реквизит в дерево элементов формы и получим поле формы вида Поле графической схемы, связанное с этим реквизитом. Это поле будет отобра- жать графическую схему в форме обработки. Затем создадим команду ОтобразитьСхему и соответствующую ей кнопку формы, по нажатию которой графическая схема методом Прочитать () будет загружаться из файла *.grs. В обработчике команды напишем следующий код (листинг 6.1). Листинг 6.1. Обработчик команды «ОтобразитьСхему» &НаКлиенте Процедура ОтобразитьСхему(Команда); Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Заголовок = "Выбрать схему из файла"; Диалог.Фильтр = "Графические схемы (*.grs)|*.grs|Bce файлы Диалог. ИндексФильтра = 0; Диалог.МножественныйВыбор = ложь; Диалог.Расширение = "grs"; Если не Диалог.Выбрать() тогда Возврат1 КонецЕсли; ГрафичоскаяСхема.Прочитать(Диалог.ВыбранныеФайлы[0]); КонецПроцедуры Методом ПолучитьКартинку () можно получить изображение графической схемы в форматах *.bmp, *.png (листинг 6.2). Листинг 6.2. Обработчик команды «ПолучитьКартинку» &НаКлиенте Процедура ПолучитьКартинку(Команда) Диалог = Новый ДиалогВыбораФаила(РежимДиалогаВыбораФайла.Сохранение); Диалог.Заголовок - "Сохранить схему в файл"; Диалог.Фильтр = "Картинки (*.bmp)|* bmp|Bce файлы (*.*)|**": Диалог.ИндексФильтра = 0; Диалог.МножественныйВыбор = ложь; Диалог.Расширение = "bmp"; Если не Диалог. Выбрать() тогда Возврат; КонецЕсли; Картинка = ГрафическаяСхема.ПолучитьКартинку(,. ФорматКартинки.ВМР); Картинка.Записать(Диалог.ВыбранныеФайлы[0]); КонецПроцедуры
Глава 6. Графические схемы Загруженную графическую схему можно отредактировать с помощью палитры свойств выделенного элемента. Затем отредактированную схему методом Записать () можно сохранить в файл *.grs. Подробнее о свойствах и методах эбъскта ГрафическаяСхема можно прочитать в синтакс-помощнике, з разделе Общие объекты ► Графическая схема. Геперь обеспечим программную обработку выбора пользователем какого- 1ибо элемента схемы. Для этого создадим обработчик события Выбор поля })ормы, содержащего графическую схему, и заполним его следующим образом листинг 6.3). Чистинг 6.3. Обработчик события «Выбор» поля графической схемы кНаКлиенте Чроцеду ра Г рафическаяСхемаВыбор(Элемент) ЭлементСхемы = Элементы.ГрафическаяСхема.ТекущийЭлемент; ИмяЭлемента = ЭлементСхемы.Имя; Если ТипЗнч(ЭлементСхемы)= Тип("ЭлементГрафическойСхемы Декорация") Тогда Если ИмяЭлемента = "Поставщики" Тогда ОткрытьФорму("Справочник.Контрагенты.ФормаСписка”); ИначеЕсли ИмяЭлемента = "Покупатели" Тогда ОткрытьФормуГСправочникГонтрагенты.ФормаСписка"); ИначеЕсли ИмяЭлемента = "РасходныеНакпадные" Тогда ОткрытьФорму("Документ.РасходнаяНакладная.ФормаСписка") ИначеЕсли ИмяЭлемента = "Сборка" ИЛИ ИмяЭлемента = "Разгрузка" ИЛИ ИмяЭлемента = "Загрузка" Тогда ЭлементСхемы.ЦветФона = МЕВЦвета.ЛососьСветлый; КонецЕсли; КонецЕсли; КонецПроцедуры Зобыгие Выбор у поля графической схемы возникает при двойном щелчке лыши (нажатии клавиши Enter) на элементе графической схемы. В обра- ботчике события анализируется тип текущего элемента графической схемы Элементы. ГрафическаяСхема.ТекущийЭлемент) и его имя. В данном примере рассматриваются только элементы графической схемы с типом Декорация (Тип("ЭлементГрафическойСхемыДекорация")). Если имя декорации Поставщики или Покупатели, то для просмотра открывается форма :писка справочника Контрагенты. Если выбрана декорация с именем Расход- {ыеНакладные, то открывается форма списка документа Расходная накладная. Для демонстрации возможностей программного изменения свойств элемента рафической схемы, при выборе некоторых декораций, у них меняется цвет |зона. Можно также программно изменить фигуру, рисунок и другие свойства хекорации.
202 Решение специальных прикладных задач в «1С:Предприятии 8» Проверим результат. Вызовем обработку Работа с графической схемой и нажмем кнопку Отобразить графическую схему. Загрузим^ сх|ему из файла Схема работы складского комплекса.дгэ. Двойным щелчком мыши выделим на схеме элемент Поставка товара от поставщиков (с именем Поставщики). В результате будет открыта форма списка справочника Контрагенты (рис. 6.8). Рис. 6.8. Обработка «Работа с графической схемой»
Глава 7. Табличный документ В этой главе речь пойдет об использовании табличного документа при разра- ботке прикладных решений в системе «1С:Предприятие». Табличный документ «1С:Предприятия» является одним из основных средств для создания различных выходных форм и представления итоговых данных. Он может быть получен из файла табличного документа, сохранен в файлы различных форматов. Табличный документ может быть размещен в форме или в макете, работа с ним возможна средствами встроенного языка (рис. 7.1). Рис. 7.1. Схема использования табличного документа
204 Решение специальных прикладных задач в «^Предприятии 8» Он может содержать вложенные таблицы, картинки, различные элементы управления, может использоваться для ввода данных. Табличный документ поддерживает механизм расшифровок для получения связанных отчетов, открытия форм и иных действий. В демонстрационной конфигурации «Географические схемы и диаграммы», прилагающейся к книге на компакт-диске, существует обработка Работа с табличным документом, в которой можно посмотреть некоторые примеры работы с табличным документом. Общие свойства табличного документа Можно сказать, что табличный документ состоит из строк и колонок, на пере- сечении которых располагаются ячейки. Общее оформление табличного документа определяется несколькими свойствами. Прежде всего, это свойства ОтображатьЗаголовки и ОтображатьСетку. По умолчанию при создании нового табличного документа эти свойства имеют значение Истина (листинг 7.1), поэтому табличный документ имеет вид, представленный на рис. 7.2. Листинг 7.1. Отображение заголовков и сетки табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.Показать(); ' „да да "Ш-1 -□X.I J 2 5 2 3 4 Рис. 7.2. Отображение заголовков и сетки При необходимости разработчик может управлять отображением как заго- ловков, так и сетки документа (листинг 7.2). Внешний вид табличного документа с заголовками представлен на рис. 7.3. Листинг 7.2. Отображение заголовков табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; ТабДок.Показать();
Глава 7. Табличный документ 205 Рис. 7.3. Отображение заголовков Пример отображения только сетки табличного документа представлен в листинге 7.3. Внешний вид документа с сеткой показан на рис. 7.4. Листинг 7.3. Отображение сетки табличного документа ТабДок =Новый ТабличныйДокумент^); ТабДок.ОтображатьЗаголовки = Ложь; ТабДок.Показать(); Рис. 7.4. Отображение сетки Если оба свойства, ОтображатьЗаголовки и ОтображатьСетку, устано- вить в значение Ложь (листинг 7.4), то табличный документ будет иметь вид, представленный на рис. 7.5. Листинг 7.4. Табличный документ без отображения заголовков и сетки ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьЗаголовки = Ложь; ТабДок. ОтображатьСетку = Ложь; ТабДок.Показать(); Рис. 7.5. Табличный документ без заголовков и сетки Если заголовки табличного документа отображаются, разработчик может управлять цветом текста и цветом фона заголовков. Для этого используются свойства табличного документа ЦветТекстаЗаголовков и ЦветФонаЗа- головков, которые имеют значения типа Цвет. По умолчанию эти свойства
206 Решение специальных прикладных задач в «1С:Предприятии 8» имеют значения, соответствующие цветам текста формы и фона формы из стиля, используемого в качестве основного для конфигурации (свойство Основной стиль). Табличный документ позволяет фиксировать первые строки и колонки. Такую возможность удобно использовать для просмотра больших таблиц. В этом случае можно зафиксировать, например, шапку таблицы, и при верти- кальной прокрутке документа она всегда будет присутствовать в верхней части видимой области документа. Для того чтобы задать количество фиксируемых строк или колонок, использу- ются свойства табличного документа ФиксацияСверху и ФиксацияСлева. Они принимают значения типа Число, которые указывают количество фикси- руемых строк или колонок. Например, можно зафиксировать три строки и четыре колонки документа (листинг 7.5). В этом случае при горизонтальной и вертикальной прокрутке документа первые четыре колонки и первые три строки всегда будут присут- ствовать в окне документа (рис. 7.6). Листинг 7.5. Использование горизонтальной и вертикальной фиксации в табличном документе ТабДок = Новый ТабличныйДокумент(); ТабДок. ОтображатьСетку = Ложь; ТабДок.ФиксацияСверху = 3; ТабДок.ФиксацияСлева = 4; ТабДок.Показать(); Рис. 7.6. Фиксация строк и колонок Для оформления табличного документа может использоваться фоновый рисунок. Этот рисунок будет располагаться «под» текстом документа и может быть как зафиксирован (то есть при любой прокрутке документа фоновый рисунок перемещаться не будет), так и не зафиксирован. При этом фоновый рисунок при прокрутке документа будет перемещаться вместе с ячейками табличного документа.
Глава 7. Табличный документ 207 Для задания фонового рисунка используется свойство табличного документа ФоноваяКартинка, имеющее тип Картинка. Для управления фиксацией фоновой картинки используется свойство ФиксированныйФон, имеющее тип Булево. По умолчанию фон не зафиксирован (свойство имеет значение Ложь). Пример добавления картинки и фиксации фона табличного документа приведен в листинге 7.6. Листинг 7.6. Использование фиксированной фоновой картинки в табличном документе ТабДок = Новый ТабличныйДокумент(); Картинка - Новый Картинка(”С:\^с1.рпд”); ТаёДок.ФоноваяКартинка "Картинка; ТабДок.ФиксированныйФон = Истина; ТабДок.Показать(); Табличный документ может быть отображен на экране в окне редактора табличных документов. При этом можно управлять видом отображения: цветной или черно-белый. Черно-белый вид отображения может использо- ваться для того, чтобы оценить, например, внешний вид цветного документа, распечатанного на черно-белом принтере. Для управления видом отображения табличного документа используется свой- ство ЧерноБелыйПросмотр. По умолчанию это свойство имеет значение Ложь, то есть документ отображается в цветном виде. Ячейки и области табличного документа могут быть защищены от редактиро- вания, так же как и весь документ. Для того чтобы защитить весь документ, следует использовать свойство ТолькоПросмотр. Если его установить в значение Истина, то можно будет редактировать только те ячейки, для которых свойство Защита не установлено. По умолчанию для всех ячеек табличного документа свойство Защита имеет значение Истина, а для самого документа - Ложь. Также независимо от свойств отдельных ячеек можно запретить редакти- рование и копирование табличного документа. Для этого следует свойство Защита документа установить в значение Истина. В том случае, если редактирование табличного документа разрешено, можно задать направление перехода после редактирования значения очередной ячейки. Для этого используется свойство НаправлениеПерехода, которое принимает значения системного перечисления ТипНаправленияПерехо- даТабличногоДокумента. По умолчанию значение этого свойства равно ПоКолонкам, но разработчик может задать также значения ПоСтрокам и БезПерехода. В последнем случае, после того как нажата клавиша Enter, положение текущей области табличного документа изменяться не будет.
Решение специальных прикладных задач в «1С:Предприятии 8» Табличный документ может быть прочитан из файла табличного документа. Для этого используется метод Прочитать(). В качестве параметра переда- ется строка, содержащая путь к файлу табличного документа. Чтобы отобразить табличный документ в окне редактора табличных доку- ментов, используется метод Показать(). В качестве параметров этого метода передается заголовок окна, который будет установлен при открытии документа, путь к сохраняемому файлу и признак активизации открываемого окна. Для обеспечения привычного поведения открытого файла при вызове метода Показать () обязательно должен быть указан путь для сохранения изменен- ного файла. Тогда если пользователь модифицировал документ, при закрытии окна редактора будет задан вопрос о необходимости сохранения измененного файла. Если при вызове метода Показать () путь не указан, то окно редактора, содержащего модифицированный документ, будет закрываться без вопросов и изменения, выполненные пользователем, будут потеряны. Признак активизации по умолчанию имеет значение Истина. Таким образом, окно, содержащее открытый табличный документ, становится активным, открывается поверх существующих окон. Если установить его в значение Ложь, то активным будет оставаться то окно, из которого была вызвана обра- ботка (листинг 7.7). Листинг 7.7. Открытие табличного документа без активизации окна Поскольку метод табличного документа Прочитать () исполняется на сервере, то документ сначала помещается во временное хранилище и адрес данных в хранилище передается во внеконтекстную серверную функцию ЧтениеТабличногоДокументаО (листинг 7.8), в которой документ получается из временного хранилища, записывается во временный файл и производится чтение документа.
Глава 7. Табличный документ 209 Листинг 7.8. Чтение табличного документа на сервере &НаСервереБезКонтекста ? ДД Функция ЧтениеТабличногоДокумента(АдресДокументаВХранилище) (^ф®:К ;йц йййЙ'i®;®й® ®:®®й® Й®:ЙЙЙЙ ::® Й йЙййй йй" !®>:йй::Э йй:й®;йййййййййЙЙЙ Ййй ййййййййй ВременногоХранилища(АдресДокументаВХранилище); ныхФайлов() + "temp.mxr Документа); ТабДок = Новый ТабличныйДокумент(); |абДок.Прочитать(ИмяДокумента); • . возвратТабДок; ; -Я.• ®-^Э. ’й й"й"<й®й'й’й й /й'ййй'-'й'Й ' '-йй®'' .Й'.й'йй.й й; й'.;® .•:'• йй:.®йй?;/’ :® '® \ 'V® . 1 ' ' ’ ~ 1 ’®. ’ - ® , • Л. ,. ’; ’ ?.;С® ’ ® . ? й’- 'й" ® ’ йй®йй..й.\®ййййДйй . ’ . • йй''й' г. - й''^. ?:й й ' й; й ’ < КойецФункции ^11111118 llliilllllillllllllili!'® Затем считанный табличный документ возвращается на клиента и там пока- зывается методом Показать(). Табличный документ является полностью интерфейсным объектом и отображается только на клиенте. Открытое окно табличного документа может быть скрыто - для этого исполь- зуется метод Скрыть () табличного документа. Скрытое окно может быть снова отображено с помощью метода Показать (). Запись табличного документа в файл можно выполнить с помощью метода Записать(). При этом необходимо указать путь к записываемому файлу, а также можно указать и формат создаваемого файла. По умолчанию файл будет записан в формате табличного документа «1С:Предприятия» (*.mxl), но также поддерживаются и другие форматы файлов. Формат файла задается с помощью системного перечисления ТипФайлаТабличногоДокумента (табл. 7.1). Таблица 7.1. Значения системного перечисления «ТипФайлаТабличногоДокумента» Значение BIHIIIIMIlJlilll ANSITXT Формат текстового файла в кодировке ANSI DOCX Формат файла *.docx Word 2007 HTML Файл в формате HTML последней версии, поддерживаемой «ЮПредприятием» HTML3 Формат файла HTML версии 3 HTML4 Формат файла HTML версии 4 MXL Файл табличного документа «1С:Предприятия» MXL7 Файл табличного документа «1С:Предприятия» версии 7.7 ODS Электронная таблица ODF TXT Текстовый файл XLS Файл в формате Microsoft Excel, используемом по умолчанию XLS95 Файл в формате Microsoft Excel 95 XLS97 Файл в формате Microsoft Excel 97 XLSX Формат файла *.xlsx Excel 2007
210 Решение специальных прикладных задач в «1С:Предприятии 8» Для табличного документа, открытого для просмотра, могут быть установлены различные свойства, влияющие на его отображение, например отображение заголовков, сетки документа, отображение групп, отображение именованных строк/колонок и т.д. Для того чтобы при повторном открытии документа эти свойства также были применены к документу, используется установка свой- ства документа СохранятьСвойстваОтображения в значение Истина. По умолчанию это свойство имеет значение Ложь. Табличный документ имеет два свойства. В процессе редактирования или заполнения документа они позволяют определить размеры области таблич- ного документа, которая содержит или может содержать данные. Это свойства ВысотаТаблицы и ШиринаТаблицы. Оба свойства доступны только для чтения и содержат соответственно количество строк и количество колонок в таблице. По умолчанию (при создании нового табличного документа) оба свойства имеют значение 0. В процессе редактирования или заполнения табличного документа они изменяют свои значения так, чтобы показывать реальное коли- чество строк или колонок документа, которые заполнены данными. При интерактивном редактировании табличного документа область ячеек табличного документа, ограниченная значениями ВысотаТаблицы и Шири- наТаблицы, выделяется пунктирными линиями (рис. 7.7). Рис. 7.7. Высота и ширина таблицы При очистке значений строк или колонок значения свойств ВысотаТаблицы и ШиринаТаблицы не изменяются (рис. 7.8). Рис. 7.8. Высота и ширина таблицы
Глава 7. Табличный документ J’ф£ В приведенном примере данные пятой колонки были очищены, однако ширина таблицы осталась равной 5. Для того чтобы свойство ШиринаТаблицы приняло значение 4 (в соответствии с реально заполненными ячейками), необходимо удалить пятый столбец. В противном случае будет считаться, что этот столбец принадлежит таблице, т.к. может содержать, например, неко- торое оформление, необходимое для документа. Области табличного документа Основной логической частью табличного документа, с которой осуществля- ется работа, является область ячеек табличного документа, или сокращенно просто область. Область может представлять собой как отдельную ячейку документа, так и совокупность нескольких ячеек, соответствующую опреде- ленным правилам. В качестве области может выступать: а одна или несколько соседних строк; & одна или несколько соседних колонок; в группа ячеек, находящихся на пересечении одной или нескольких соседних строк с одной или несколькими соседними колонками. Для обращения к области ячеек табличного документа используется метод табличного документа Область(). Этот метод позволяет обращаться к конкретным областям табличного документа, причем поддерживается обра- щение в нескольких вариантах. Обращение к области ячеек Обращение по номерам строк и колонок В этом варианте в параметрах метода перечисляются номера строк и колонок, которые образуют нужную область (листинг 7.9). Листинг 7.9. Синтаксис получения области по номерам строк и колонок Пример указания прямоугольной области на пересечении 2-4 строк и 2-4 колонок представлен в листинге 7.10. В результате выполнения этого примера получается область типа ОбластьЯчеекТабличногоДокумента, пока- занная на рис. 7.9.
212 Решение специальных прикладных задач в «^Предприятии 8» Листинг 7.10. Получение прямоугольной области табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; НоваяОбласть = ТабДок.Область(2,2,4,4); НоваяОбласть.Имя = “НоваяОбласть"; ТабДок.Показать(); Рис. 7.9. Прямоугольная область ПРИМЕЧАНИЕ Области, показанные на рисунках 7.9-7.12, выделены в табличном документе для визуального представления, а не как результат выполнения кода. Пример указания области, состоящей только из 2-4 строк, представлен в листинге 7.11. В результате выполнения этого примера получается область типа ОбластьЯчеекТабличногоДокумента, показанная на рис. 7. Ю. Листинг 7.11. Получение области, состоящей из строк табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; НоваяОбласть ~ ТабДок.Область(2,, 4); НоваяОбласть.Имя = "НоваяОбласть"; ТабДок.Показать(); Рис. 7.10. Область строк Пример указания области, состоящей только из 2-4 колонок, представлен в листинге 7.12. В результате выполнения этого примера получается область типа ОбластьЯчеекТабличногоДокумента, показанная на рис. 7.11.
Глава 7. Табличный документ Листинг 7.12. Получение области, состоящей из колонок табличного документа ТабДок = Новый ТабличныйДокумент}); ТабДок.ОтображатьСетку = Ложь; Новаяббласть=ТабДок, Область}, 2,, 4); НоваяОбласть.Имя = "НоваяОбласть"; ТабДок.Показать(); Рис. 7.11. Область колонок Пример указания области, состоящей из одной ячейки, представлен в лис- тинге 7.13. В результате выполнения этого примера получается область типа ОбластьЯчеекТабличногоДокумента, показанная на рис. 7.12. Листинг 7.13. Получение области, состоящей из одной ячейки табличного документа ТабДок - Новый ТабличныйДокумент}); НоваяОбласть = ТабДок.Область(2,4); НоваяОбласть.Имя = "Новая область"; ТабДок.Показать}); Рис. 7.12. Область, состоящая из одной ячейки Обращение по адресу Обращение к области может быть выполнено также и по адресу области (листинг 7.14). Листинг 7.14. Синтаксис получения области по адресу Область(<адрес области>) Адрес области указывается координатами левого верхнего и правого нижнего углов области в формате R1C1 :R2C2. Число после R обозначает номер строки,
214 Решение специальных прикладных задач в «1С:Предприятии 8» число после С - номер колонки, символом «:» (двоеточие) разделяются коор- динаты левого верхнего и правого нижнего угла области. Пример обращения к прямоугольной области на пересечении 2-4 строк и 2-4 колонок показан в листинге 7.15. Листинг 7.15. Получение прямоугольной области табличного документа ТабДок = Новый ТабличныйДокумент(); НоваяОбласть = ТабДок.Область("Р2С2:Р4С4"); Пример обращения к области, состоящей из 2^4 строк, показан в листинге 7.16. Листинг 7.16. Получение области, состоящей из строк табличного документа ТабДок = Новый ТабличныйДокумент!),* НоваяОбласть = ТабДок.Область(''Р2:Н4"); Пример обращения к области, состоящей из 2-А колонок, показан в листинге 7.17. Листинг 7.17. Получение области, состоящей из колонок табличного документа . . ТабДок = Новый ТабличныйДокумент!); НоваяОбласть = ТабДок.Область(”С2:С4"); Пример обращения к области, состоящей из одной ячейки, которая находится на пересечении второй строки и четвертой колонки, представлен в листинге 7.18. Листинг 7.18. Получение области, состоящей из одной ячейки табличного документа ТабДок = Новый ТабличныйДокумент!); НоваяОбласть = ТабДок.Область(”Р2С4"); Обращение по имени Любая область табличного документа может иметь уникальное имя. Имя области может быть задано при визуальном редактировании документа в редакторе табличных документов или программно. По умолчанию любая область имеет имя, совпадающее с ее адресом. Однако разработчик имеет возможность присвоить области собственное, уникальное в пределах данного табличного документа, имя. Для этого используется свойство области ячеек табличного документа Имя.
Глава 7. Табличный документ ш Для управления отображением именованных областей служат две команды редактора табличных документов. Команда Таблица ► Имена ► Отображение именованных строк/колонок позволяет отобразить имена областей, которые являются совокупностью соседних строк или соседних колонок. Команда Таблица ► Имена ► Отображать именованные ячейки позволяет отобразить имена прямоугольных областей табличного документа. Из встроенного языка управление отображением имен областей недоступно. Пример обращения к области по имени представлен в листинге 7.19. Листинг 7.19. Получение области табличного документа по имени ТабДок = ПолучитьМакетДокумента("Макет"); НоваяОбласть = ТабДок.Область("НоваяОбласть"); Области, для которых заданы имена, отличные от имен по умолчанию, входят в коллекцию именованных областей табличного документа. Доступ к этой коллекции возможен через свойство табличного документа Области. Обход коллекции именованных областей возможен с помощью итератора Для Каждого ... Из ... Цикл. Пример перечисления всех именованных областей, содержащихся в табличном документе, представлен в листингах 7.20, 7.21. Листинг 7.20. Перебор именованных областей табличного документа &НаКлиенте Процедура МакетДокумента(Команда) ТабДок = ПопучитьМакетДокумента("Макет"); ИменованныеОбласти = ТабДок.Области; Собб^еНие = Новый СообщениеПользователю; К • •’ ; Для ; Какого Область из ИменованныеОбласти Цикл Сообщение.Текст = Область.Имя; Сообщение.Сообщить(); КонецЦикла; ЙбНецПроцедуры lllllf- Поскольку метод глобального контекста ПолучитьОбщийМакет () испол- няется на сервере, то сначала вызывается внеконтекстная серверная функция ПолучитьМакетДокументаО, в которую передается имя макета таблич- ного документа (листинг 7.21). Затем макет возвращается на клиента, где в цикле обходятся элементы коллекции именованных областей табличного документа и выводятся пользователю.
216 Решение специальных прикладных задач в «1С:Предприятии 8» Листинг 7.21. Перебор именованных областей табличного документа &НаСервереБезКонтекста Функция ПолучитьМакетДокумента(ИмяМакета) Возврат ПолучитьОбщийМакет(ИмяМакета); КонецФункции Кроме этого, для коллекции именованных областей доступны методы полу- чения индекса области (Индекс()), получения количества именованных областей (Количество()), поиска по имени области (Найти()) и получения области по индексу (Получить ()). ВНИМАНИЕ Следует заметить, что в коллекцию именованных областей табличного документа входят также и рисунки табличного документа, для которых заданы имена, отличные от имен по умолчанию. О рисунках более подробно рассказывается в разделе «Рисунки табличного документа», с. 236. Обращение к пересечению областей Помимо явного указания области по имени или в виде адреса, можно обра- щаться к пересечению двух областей. В этом случае синтаксис вызова метода Область () выглядит следующим образом (листинг 7.22). Листинг 7.22. Синтаксис получения области как пересечения именованных областей Область(<имя области 1 >|<имя области 2>) В качестве имени области может быть использовано имя по умолчанию (адрес) или имя, назначенное разработчиком. Например, если в табличном документе определены две области - Гори- зонтальнаяОбласть и ВертикальнаяОбласть (рис. 7.13), то обратиться к их пересечению можно так, как это показано в листинге 7.23. Рис. 7.13. Именованные области
Глава 7. Табличный документ Листинг 7.23. Получение области табличного документа на пересечении двух областей Общие свойства областей Область ячеек табличного документа обладает набором свойств и методов, которые позволяют оформить ее и получить характеристики области. Свойство Имя позволяет получать и изменять имя области. Свойство ТипОбласти предназначено для чтения и содержит значения системного перечисления ТипОбластиЯчеекТабличногоДокумента. Если область представляет собой совокупность строк или колонок, то ТипОбласти будет содержать, соответственно, значения Строки или Колонки. Если область прямоугольная, то в этом свойстве будет значение Прямоугольник. Если область представляет собой весь табличный доку- мент, то тогда значение свойства ТипОбласти будет равно Таблица. Для определения координат имеющейся области служат свойства Верх, Лево, Низ и Право. Они доступны только для чтения и содержат номера соот- ветственно первой строки, первой колонки, последней строки и последней колонки области. Если область состоит из строк, то тогда свойства Лево и Право будут иметь значение 0. Если область состоит из колонок, то в этом случае свойства Верх и Низ будут равны нулю. Оформление областей Скрытие областей Области, состоящие из строк или колонок, могут быть скрыты при отобра- жении табличного документа в окне редактора табличных документов. Для этого используется свойство Видимость, значение которого необходимо установить в Ложь. По умолчанию для всех областей табличного документа свойство Видимость имеет значение Истина. Например, скрыть 2-4 колонки можно с помощью кода, представленного в листинге 7.24. Листинг 7.24. Скрытие колонок табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок. ОтображатьСетку = Ложь; НоваяОбласть = ТабДок.Область(, 2, ,4); НоваяОбласть.Видимость = Ложь; ТабДок. Показать();
Решение специальных прикладных задач в «1С:Предприятии 8» В результате табличный документ будет иметь вид, представленный на рис. 7.14. Рис. 7.14. Колонки 2-4 скрыты Защита областей Области табличного документа могут быть защищены, для этого использу- ется свойство Защита. Использование этого свойства имеет смысл только вместе со свойством самого табличного документа Защита. Если у таблич- ного документа свойство Защита установлено в значение Истина, то в окне редактора табличных документов пользователю будет недоступно редакти- рование тех областей табличного документа, для которых свойство Защита также установлено в значение Истина. По умолчанию свойство Защита имеет значение Истина для всех областей табличного документа. Высота строк Свойства ВысотаСтроки и АвтоВысотаСтроки позволяют задать различные варианты расчета высоты строк, участвующих в области таблич- ного документа. В зависимости от значения свойства АвтоВысотаСтроки свойство Высо- таСтроки определяет либо собственно фиксированную высоту строки (АвтоВысотаСтроки = Ложь), либо максимальную высоту строки (АвтоВысотаСтроки = Истина). Высота строки задается в пунктах. Если свойство ВысотаСтроки имеет значение 0, то свойство АвтоВысо- таСтроки имеет значение Истина, и изменить его присвоением другого значения невозможно. Это значит, что высота строки будет установлена авто- матически, в зависимости от текста, который содержится в области. Если свойству ВысотаСтроки присвоить значение, отличное от 0, то свойство АвтоВысотаСтроки автоматически будет установлено в значение Ложь. Это значит, что высота строки будет фиксированная и равна указанной величине. В этой ситуации свойство АвтоВысотаСтроки можно установить в значение Истина, и тогда свойство ВысотаСтроки будет использоваться как макси- мальная высота строки. Другими словами, высота строки будет переменная, от значения по умолчанию до указанного в свойстве ВысотаСтроки.
Глава 7. Табличный документ Ширина колонок Табличный документ может иметь строки с различной шириной колонок. Такая возможность используется для создания форм отчетности, содержащих по сути несколько различных таблиц с различной шириной колонок в каждой из них. Для установки ширины колонок используется свойство области ячеек табличного документа ШиринаКолонки. Если это свойство применяется к прямоугольной области или области колонок (листинг 7.25), то новая ширина колонок будет установлена для всех колонок, участвующих в указанной области (рис. 7.15). Листинг 7.25. Установка ширины колонок табличного документа Если ширину колонок задать для области, состоящей из строк, то новая ширина колонок будет установлена для всего табличного документа. Для того чтобы установить другую ширину колонок только в некоторых строках, необходимо предварительно создать новый формат строк (метод СоздатьФорматСтрокО) и затем заново получить требуемую область (листинг 7.26). После этого можно будет задать для этой области требуемую ширину колонок (рис. 7.16). Листинг 7.26. Установка ширины колонок для выбранной области табличного документа
Решение специальных прикладных задач в «^Предприятии 8» Рис. 7.16. Установка формата строк Цвет фона и узор Для области табличного документа может быть задан цвет фона, а также узор и цвет узора. Причем если область включает в себя несколько ячеек доку- мента, то эти свойства будут установлены для каждой ячейки, входящей в область. Для задания цвета фона и цвета узора используются, соответственно, свойства ЦветФона и ЦветУзора, принимающие значение типа Цвет. Для задания узора используется свойство Узор, которое принимает значения системного перечисления ТипУзораТабличногоДокумента. Это системное перечис- ление позволяет определить 17 различных узоров (рис. 7.17). Узор1 Узор2 УзорЗ Узор4 Узор5 Узорб Узор7 Узор8 УзорЭ Узор1О Узор11 Узор12 Узор13 Узор14 Узор15 Узор16 Узор17 '///////' иш Рис. 7.17. Значения и внешний вид узоров Кроме этого, возможны значения БезУзора и Сплошной. Значение БезУзора позволяет не использовать узор вообще и является значением по умолчанию, а использование значения Сплошной с заданным цветом узора аналогично установке фона области с этим цветом. Объединение ячеек Несколько ячеек, входящих в область табличного документа, могут быть объединены в одну ячейку. Для этого используется метод области ячеек табличного документа Объединить ().
Глава 7. Табличный документ Пример объединения ячеек представлен в листинге 7.27. Листинг 7.27. Пример объединения ячеек области табличного документа ТабДок - Новый ТабличныйДокумент(); Область = ТабДок.Область(2,2,4,4); Область.Объединить(); ; ТабДок.Показать(); . . ; Результат выполненного объединения показан на рис. 7.18. Рис. 7.18. Объединение ячеек области Если к области, состоящей из объединенных ячеек, применить метод Разъ- единить (), то в области будет сформировано то же количество ячеек, что и до объединения. Группировка Области табличного документа, представляющие собой строки или колонки, могут быть сгруппированы. Для этого используется метод Сгруппировать (). Обратное действие выполняется с помощью метода Разгруппировать (). Группировка строк или колонок табличного документа позволяет при просмотре документа скрывать/раскрывать строки/колонки, детализирующие основную строку/колонку. Эта возможность используется, например, при выводе отчетов с группировками, например, остатков товаров по складам. Тогда строки, относящиеся к остаткам товаров на одном и том же складе, можно сгруппировать, и отчет удобнее читать. При просмотре отчета поль- зователь сможет сворачивать/разворачивать отдельные группировки или все группировки одного уровня. Пример группировки 2-4 строк табличного документа представлен в лис- тинге 7.28. Листинг 7.28. Пример группировки строк табличного документа
222 Решение специальных прикладных задач в «1 С:Предприятии 8» Внешний вид табличного документа, получающийся в результате выполнения этого кода, показан на рис. 7.19. Рис. 7.19. Группировка строк Маркеры уровней (1 и 2) позволяют сворачивать/разворачивать все группи- ровки, находящиеся на данном уровне, в то время как маркеры отдельных группировок позволяют сворачивать/разворачивать отдельные группировки. Метод Разгруппировать () позволяет, соответственно, разгруппировать строки или колонки области ячеек табличного документа. Границы Для области табличного документа может быть задано отображение границ области целиком и отдельных ячеек, входящих в область. Для этого исполь- зуются свойства ГраницаСверху, ГраницаСлева, ГраницаСнизу и ГраницаСправа. Эти свойства имеют тип Линия. Если они применяются к области, содержащей несколько ячеек, то соответствующее свойство будет установлено у каждой ячейки, входящей в область. Цвет границы задается с помощью свойства ЦветГраницы, принимающего значения типа Цвет. Также для задания границ области можно использовать метод ОбвестиО, которому передаются объекты типа Линия, описывающие левую, верхнюю, правую и нижнюю границы области. В этом случае оформление будет приме- нено только к внешним границам ячеек, находящимся на границе области. Метод ОбвестиО, так же как и прямое указание границ, может быть применен как к прямоугольным областям, так и к областям, состоящим из строк или колонок. ВНИМАНИЕ При использовании конструктора объекта Линия следует помнить, что для линии ячейки табличного документа может быть задан отступ линии от краев ячейки, а толщина двойной линии может быть задана только равной единице. Пример оформления областей табличного документа линиями представлен в листинге 7.29.
Глава 7. Табличный документ Листинг 7.29. Пример оформления областей табличного документа линиями ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; й ЛинияСОтступом = Новый Линия(ТипЛинииЯчейкиТабличногоДокумёнта.Двойная,1, Истина); ЛинияБезОтступа = Новый Линия(ТилЛинииЯчейкиТабличногоДокумента.Двойная, 1); Область = ТабДок.Область(2,4,3.5); Область. ГраницаСверху = ЛинияСОтступом; Область.ГраницаСлева = ЛинияСОтступом; ОбластьТраницаСнизу = ЛинияСОтступом; ь ОбласТь.ГраницаСправа = ЛинияСОтступом; Область = Т абДок.Область(5,2,6,3); Область.Обвести(ЛинияБезОтступа, ЛинияБезОтступа, ЛинияБезОтступа, ЛинияБезОтступа); ТабДок.Прказать(); Внешний вид табличного документа, получающийся в результате выполнения этого кода, показан на рис. 7.20. Рис. 7.20. Оформление областей линиями Примечание Область ячеек табличного документа может иметь примечание, которое будет отображаться при наведении курсора на маркер, расположенный в правом верхнем углу ячейки. Примечание представляет собой объект Рису- нокТабличногоДокумента, имеющий тип Текст. О рисунках таблич- ного документа подробно рассказывается в разделе «Рисунки табличного документа», с. 236. Здесь же скажем только, что существует возможность установить текст примечания для области ячеек, получив из свойства Приме- чание области объект РисунокТабличногоДокумента и обратившись к его свойству Текст (листинг 7.30).
Решение специальных прикладных задач в «ЮПредприятии 8» Листинг 7.30. Установка текста примечания для области ячеек табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(2,2,4,4).Примечание.Текст = "Текст примечания области"; ТабДок.Показать(); В результате, если текст примечания был установлен для области, содержащей одну ячейку, соответствующий маркер будет установлен у этой ячейки. Если же текст примечания был установлен для области, содержащей несколько ячеек, примечание будет установлено у левой верхней ячейки этой области (рис. 7.21). Рис. 7.21. Примечание Очистка Метод Очистить () табличного документа позволяет очистить весь табличный документ и переводит его в состояние, которое табличный документ имеет после его создания конструктором. Этот метод может приме- няться, когда необходимо повторно использовать тот же самый экземпляр объекта табличного документа без его пересоздания. Метод Очистить () есть также и у области ячеек табличного документа. Для области ячеек метод Очистить () имеет три параметра, которые позво- ляют уточнять, что именно должно быть очищено: текст, форматирование, рамки. Все три параметра имеют тип значения Булево; по умолчанию очища- ется только текст, содержащийся в области ячеек табличного документа. Свойства области, относящиеся к тексту Текст и шрифт В самом простом случае область содержит текст, который доступен для чтения и изменения через свойство Текст. Следует учитывать, что это свой- ство применимо только для прямоугольных областей. При этом если область содержит несколько ячеек, то свойство Текст будет установлено для каждой ячейки, входящей в область. Для области табличного документа может быть задан шрифт текста (свойство Шрифт), содержащегося в этой области. Шрифт также задается один для всех ячеек, содержащихся в области.
Глава 7. Табличный документ 225 Вертикальное и горизонтальное выравнивание Свойства ВертикальноеПоложение и ГоризонтальноеПоложение позволяют задавать положение текста внутри области. Свойство Верти- кальноеПоложение принимает значения системного перечисления ВертикальноеПоложение - Верх, Низ, Центр (по умолчанию Низ), а свойство ГоризонтальноеПоложение принимает значения системного перечисления ГоризонтальноеПоложение - Авто, Лево, ПоШирине, Право, Центр (по умолчанию Авто). Значение Авто выравнивает числовые значения по правой границе, остальные - по левой. Значение ПоШирине располагает текст таким образом, чтобы занимать всю ширину области табличного документа. Если область состоит из нескольких ячеек, то эти свойства применяются к каждой ячейке области. При использовании горизонтального выравнивания может также приме- няться свойство ПоВыделеннымКолонкам. Если это свойство установлено в значение Истина, го горизонтальное выравнивание будет выполняться по следующему правилу. Если справа от текущей ячейки, содержащей текст, находится ячейка с текстом, выравнивание будет применено только к текущей ячейке. Если справа от текущей ячейки находится одна или несколько пустых ячеек, го выравнивание будет применено к области, начинающейся с текущей ячейки и заканчивающейся перед последней непустой ячейкой справа. В качестве примера рассмотрим использование этого свойства при выравни- вании текста в области, показанной на рис. 7.22. Рис. 7.22. Исходная область табличного документа Если в этом случае к области применить горизонтальное выравнивание по центру и установить свойство ПоВыделеннымКолонкам (листинг 7.31), то надпись «первая» будет выровнена в пределах второй колонки, надпись «вторая» будет выровнена в пределах 3-5 колонок, а надпись «третья» будет выровнена в пределах 6-7 колонок (рис. 7.23).
226 Решение специальных прикладных задач в «1С:Предприятии 8» Листинг 7.31. Использование выравнивания по выделенным колонкам ТабДок = ПолучитьМакетДокумента("Макетв); Область = ТабДок. Область(2,2,2,7); Область! оризонтальноеПоложение = Г оризонтальноеПоложение. Центр; Область.ПоВыделеннымКолонкам = Истина; ТабДок.Показать(); Рис. 7.23. Результат выравнивания по выделенным колонкам Ориентация Текст в области табличного документа может располагаться под разными углами наклона относительно горизонтального положения. Для задания угла наклона используется свойство ОриентацияТекста. Угол наклона задается в градусах. Если угол наклона равен 0, текст будет расположен горизон- тально. Угол наклона 90 соответствует расположению текста снизу вверх, угол наклона 270 - сверху вниз, а угол наклона 180 соответствует располо- жению текста, повернутого на 180 градусов (рис. 7.24). Рис. 7.24. Ориентация текста Отступ Свойство Отступ задает отступ текста от правого или левого края ячейки в средних символах шрифта. Отступ будет применен в зависимости от гори- зонтального положения, указанного для этой области.
Глава 7. Табличный документ 227 Размещение Свойство РазмещениеТекста позволяет задать тип размещения для текста, соторый не помещается целиком в ячейку. Возможные варианты задаются значениями системного перечисления ТипРазмещенияТекстаТаблично- гоДокумента: I Авто - текст будет показан в соседних по горизонтали ячейках, если в них нет текста; s Обрезать - видимая часть текста будет ограничена левой и правой грани- цами ячейки; Забивать — видимая часть текста будет ограничена левой и правой границами ячейки, все символы видимой части будут отображаться как Такой способ отображения может применяться для предотвращения неправильного восприятия длинных чисел; в Переносить - текст будет переноситься на следующие строки ячейки. Для того чтобы текст был отображен в ячейке целиком, необходимо, чтобы свойство ВысотаСтроки было установлено в значение 0 (при этом свой- ство АвтоВысотаСтроки будет установлено в значение Истина). 1римеры использования различного размещения текста представлены ia рис. 7.25. ы r.<J &J -л -м* м~ \£, ». 1 2 _ _!____3_____! 4 б 6 < ' й по г т 2 _ Авто Текст, который не помешается в ячейку а 3 Обрезать Текст, который i 4 ~ Забивать ############# Текст, который не помешается в 5 Переносить ячейку Рис. 7.25. Размещение текста Ггобы задать цвет текста, содержащийся в области табличного документа, ^пользуется свойство ЦветТекста, которое принимает значения типа Цвет. :сли область состоит из нескольких ячеек, то свойство будет применено : каждой ячейке области. выделение отрицательных Свойство ВыделятьОтрицательные позволяет выделить специальным щетом текст, содержащийся в области. Выделение будет осуществляться для ех текстов, которые начинаются с символа «-» (минус). При выделении таких
228 Решение специальных прикладных задач в «1С:Предприятии 8» текстов будет использоваться цвет Отрицательное число стиля, использу- емого конфигурацией. Работа с областями табличного документа Тип области В процессе выполнения различных действий с областями табличного доку- мента необходимо знать, какую форму имеет та или иная область. Для этого можно использовать свойство области ячеек табличного документа ТипОбласти. Это свойство предназначено только для чтения и содержит значения системного перечисления ТипОбластиЯчеекТабличногоДо- кумента. Тип области может принимать значения Колонки, Строки, Прямоугольник и Таблица. Если область является областью строк или колонок табличного документа, то тип области будет соответственно Строки или Колонки. Если область прямоугольная, то тип области будет Прямоугольник. Тип области Таблица означает, что область представляет собой весь табличный документ. Такая область может быть получена, например, в результате выполнения метода Область () без параметров (листинг 7.32). Листинг 7.32. Получение области с типом «Таблица» ТабДок = Новый ТабличныйДокумент(); ОбластьВесьДокумент = ТабДок.Область(); Сообщить(ОбластьВесьДокумент.ТипОбласти); Текущая область У табличного документа всегда есть текущая область. По умолчанию при создании табличного документа текущей областью становится область с адресом R1C1. В режиме просмотра эта область выделяется жирной рамкой (рис. 7.26). Рис. 7.26. Текущая область по умолчанию Текущая область может быть изменена интерактивно или программно. Для программного определения и изменения текущей области табличного
Глава 7. Табличный документ 229 документа используется свойство документа ТекущаяОбласть (листинг 7.33). Например, текущей может быть назначена область, состоящая из нескол ьких ячеек табличного документа (рис. 7.27). Листинг 7.33. Назначение текущей области табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ТекущаяОбласть = ТабДок.Область(2,2,4,4); ТабДок.Показать(); Рис. 7.27. Текущая область, состоящая из нескольких ячеек Белым цветом выделяется ячейка, с которой было начато интерактивное выде- ление данной области. Эта информация носит чисто визуальный характер. Если текущая область определяется программно, то белым цветом будет выделена ячейка, находящаяся в левом верхнем углу области. Выделенные области Табличный документ позволяет выделять одновременно несколько областей. В интерактивном режиме это выполняется с помощью мыши при нажатой клавише Ctrl. Для программного выделения нескольких областей используется коллекция выделенных областей табличного документа, которая доступна через свойство документа ВыделенныеОбласти. В этом свойстве содержится объект ВыделенныеОбластиТабличногоДо- кумента. Этот объект представляет собой коллекцию объектов двух типов: ОбластьЯчеекТабличногоДокумента и РисунокТабличногоДоку- мента, т. е. коллекция может содержать одновременно значения как одного, так и другого типа. Принцип работы с этой коллекцией не зависит от типа элемента, поэтому здесь мы рассмотрим работу с этой коллекцией на примере области ячеек табличного документа (про рисунки табличного документа подробно рассказывается в главе «Рисунки табличного документа», с. 236). Коллекция выделенных областей всегда содержит одну область табличного документа - это текущая область. Для добавления областей в коллекцию используется метод Добавить(), которому передается область ячеек или рисунок табличного документа '(листинги 7.34, 7.35). При этом добав-
Решение специальных прикладных задач в «1С:Предприятии 8» ленная область становится текущей для табличного документа (рис. 7.28). В коллекции выделенных областей текущая область всегда имеет индекс 0. Листинг 7.34. Выделение нескольких областей &НаКлиенте Процедура ОбластьДокумента(Команда) ТабДок = ДобавитьОбласть(); КонецПроцедурь Поскольку метод Добавить () исполняется на сервере, то вызывается внекон- текстная серверная функция ДобавитьОбласть () (листинг 7.35), которая добавляет выделенные области в табличный документ и возвращает его на клиента, где он показывается пользователю. Листинг 7.35. Выделение нескольких областей &НаСервереБезКбн текста Функция Добавить|Ооле|сть() ТабДок = Н(|)вый ТабличныйДокумент(); Та б Док. Вы/е лен ыеОбласти.Добавить( ТабДок. Область(2,2, 3,3)); ТабДок. ВылеЛенныеОбласти.Добавить( ТабДок.Область(1,5 .4,5)); Возврат Та Док. КонецФункции Рис* 7.28. Выделение нескольких областей i Коллекция выделенных областей табличного документа содержит методы, позволяющие вставлять, сдвигать, удалять, получать по индексу и подсчиты- вать количество выделенных областей. Кроме этого, коллекция содержит метод Очистить(), который удаляет все области из коллекции выделенных областей. При этом текущей областью становится область с адресом R1C1, и она же включается в коллекцию выде- ленных областей.
Глава 7. Табличный документ Копирование области Область ячеек табличного документа может быть скопирована в дру- гую область документа. Для этого используется метод документа ВставитьОбласть (). В качестве параметров метода передается область- источник, область-приемник, направление смещения при вставке и признак заполнения параметров в области-приемнике. Если указано использование сдвига по горизонтали (листинги 7.36, 7.37), то область-источник будет скопирована на место области-приемника, а область- приемник и ячейки, расположенные правее, будут сдвинуты вправо (рис. 7.29). Листинг 7.36. Вставка области со сдвигом по горизонтали &НаКлиенте li ж* Процедура МакетДокумента(Команда) ТабДок = ВставитьОбласть(); ТабДок.Показать(); КонецПроцедуры Поскольку метод ВставитьОбласть () исполняется на сервере, то вызы- вается внеконтекстная серверная функция ВставитьОбласть () (листинг 7.37), которая вставляет указанные области в табличный документ и возвра- щает его на клиента, где он показывается пользователю. Листинг 7.37. Вставка области со сдвигом по горизонтали &НаСервереБезКонтекста Функция ВставитьОбласть() ТабДок = ПoлyчитьOбщийMaкeт("Maкeт"); OблacтьИcтoчник=TaбДoк.O6лacть(212))• ОбластьПриемник = ТабДок Область(3,3); ! ТабДок ВставитьОбласть(ОбластьИсточник,ОбластьПриемник, ТйпСмещенияТабличногоДокумента.ПоГоризонтали); ОбластьИсточник.ЦветФона = А/УеЬЦвета.Желтый; ОбластьПриемник.ЦветФона = \Л/еЬЦвета. Голубой; Возврат ТабДок; КонецФункции Рис. 7.29. Вставка области со сдвигом по горизонтали
232 Решение специальных прикладных задач в «^Предприятии 8» Если указано использование сдвига по вертикали (листинг 7.38), то область- источник будет скопирована на место области-приемника, а область-приемник и ячейки, расположенные ниже, будут сдвинуты вниз (рис. 7.30). Листинг 7.38. Вставка области со сдвигом по вертикали &НаСервереБезКонтекста Функция Встав итьОбласть() ТабДок — ПолучитьрбщийМакет("Макет"); ОбластьИсточник =*ТабДок.Облааь(2,2); Облает! ^Приемник* ТабДок.Область(3,3); ТабДок. ВставитьОбласть(ОбластьИсточник, ОбластьПриемник, ТипСмещенияТабличногоДокумента.ПоВертикали); ОбластьИсточник.ЦветФона = УУеЬЦвета.Желтый; ОбластьПриемник. ЦветФона = We ЬЦвета. Голубой; Возврат ТабДок; КонецФункции Рис. 7.30. Вставка области со сдвигом по вертикали Если указан тип сдвига БезСдвига (это значение используется по умолчанию, листинг 7.39), то фактически выполняется замещение области- приемника копией области-источника (рис. 7.31). Листинг 7.39. Вставка области без сдвига &НаСервереБезКонтекс1 i Функция ВстаиитьОбласть() ТабДок = ПолучитьОбщийМакет("Макет"); ОбластьИсточник = ТабДок.Область(2,2); ОбластьПриемник - ТабДок.Область(3,3); ТабДок. ВставитьОбласть(ОбластьИсточник, ОбластьПриемник); ОбластьИсточник.ЦветФона = МеЬЦвета.Желтый; ОбластьПриемник.ЦветФона = МеЩвета.Голубой; Возврат ТабДок; КонецФункции
Глава 7. Табличный документ 233 Рис. 7.31. Вставка области без сдвига Если область-приемник не указана, то копирование выполняется в область, расположенную сразу за областью-источником в соответствии с типом сдвига (по вертикали или по горизонтали). Если тип сдвига также не указан (листинг 7.40), то будет выполняться вставка в область, расположенную справа, сразу за областью-источником без сдвига (рис. 7.32). Листинг 7.40. Вставка области без указания области приемника и сдвига &НаСервереБезКонтекста Функция ВставитьОбласть() ТабДок = ПолучитьОбщийМакет(”Макет"); ОбластьИсточник = ТабДок. Область(2,2); ОбластьПриемник = ТабДок. Область(3,3); ТабДок. ВставитьОбласть(ОбластьИсточник); ОбластьИсточник,ЦветФона = МеЬЦвета.Желтый; ОбластьПриемник ЦветФона = Webljsera. Голубой; Возврат ТабДок; КонецФункции ‘*5 с . т 4 л 3L М м* ? - □ х Рис. 7.32. Вставка без указания области-приемника и сдвига При выполнении вставки области ячеек табличного документа размеры области-источника и области-приемника должны совпадать, иначе будет выдана ошибка. ПРИМЕЧАНИЕ При указании типа сдвига следует учитывать, что если вставляется область строк, то не имеет смысла задавать тип сдвига равным ПоГоризонтали, а при вставке области колонок не имеет смысла задавать тип сдвига равным ПоВертикали.
Решение специальных прикладных задач в «ЮПредприяти и 8» Удален ие области |И 1 Область] табличного документа может быть удалена. Для этого использу- ется метод табличного документа Удали]тьОбласть ()ч которому передается удаляемая область, а так^с вариант смешения строк или колонок табличного докумеь та. Вариант смещения задается значением системного перечисления ТипСмс щенияТабличногоДокументб|. Для значений ПоГоризонтали (рис. 7.33) и ПоВертикали (рис. 7.34) выполняется соответствуь иций сдвиг ячеек документа для заполнения удаля- емой области. Рис. 7.34. Удаление области со сдвигом по вертикали Значение БезСмещения по сути означает очистку указанно i области, так как сдвиг ячеек документа не производится (рис. 7.35). Рис. 7.35. Удаление области без сдвига По умолчанию удаление области выполняется без смещения.
Глава 7. Табличный документ 235 Очистка Метод Очистить () позволяет очистить весь табличный документ и пере- водит его в состояние, которое табличный документ имеет после его создания конструктором. Этот метод может применяться, когда необходимо повторно использовать тот же самый экземпляр объекта табличного документа без его пересоздания. Поиск текста Табличный документ позволяет выполнять поиск определенного текста в табличном документе. Для этого используется метод табличного документа НайтиТекст (), который содержит следующие параметры: Строка - имеет тип Строка и представляет собой текст, который необхо- димо найти в табличном документе; Начало — имеет тип ОбластьЯчеекТабличногоДокумента. Представ- ляет собой область, после которой начинается поиск. Если этот параметр не указан, то поиск будет выполнен с начала табличного документа (начиная с области R1C1); я Где — имеет тип ОбластьЯчеекТабличногоДокумента. Представляет собой область, в пределах которой осуществляется поиск текста. Если этот параметр не указан, то поиск будет осуществляться во всем табличном документе. я Искать по строкам - имеет тип Булево. Определяет способ поиска - по строкам или по колонкам. Значение по умолчанию - Истина, что означает поиск по строкам. При этом поиск будет осуществляться в соот- ветствии со значением параметра Искать вперед. Например, поиск по строкам вперед означает следующую последователь- ность перехода (рис. 7.36). Первая строка области поиска Последняя строка области поиска Рис. 7.36. Поиск по строкам вперед Последовательность перехода при поиске по строкам назад показана на рис. 7.37.
23^ Решение специальных прикладных задач в «^Предприятии 8» Первая строка области поиска Последняя строка области поиска Рис. 7.37. Поиск по строкам назад Ячейка целиком - имеет тип Булево. Значение по умолчанию - Ложь. Это означает, что будет искаться вхождение указанной подстроки в текст области. Значение Истина означает, что будет найдено только полное соответствие указанной строки тексту области; Искать вперед - имеет тип Булево и определяет направление поиска. Значение по умолчанию - Истина — искать вперед. Значение Ложь озна- чает поиск назад; Игнорировать регистр— имеет тип Булево. Значение по умолчанию— Ложь. Это означает, что при поиске регистр будет игнорироваться. Значение Истина означает поиск с учетом регистра. Таким образом, по умолчанию метод осуществляет поиск первого вхождения указанной подстроки в текст какой-либо области, причем поиск выполня- ется во всем документе, начиная с ячейки R1C1, по строкам вперед, без учета регистра (листинг 7.41). Листинг 7.41. Пример поиска текста в табличном документе ТабДок= ента("Макет") еннаяОбласть = ТабДок.НаитиТекст( Остатки"); В случае успешного завершения поиска метод возвращает найденную область табличного документа (или рисунок табличного документа, если текст найден в нем). Если текст не найден, возвращается значение Неопределенен. Рисунки табличного документа Помимо данных, размещенных непосредственно в ячейках, табличный доку- мент может содержать рисунки. Коллекция рисунков табличного документа доступна через его свойство Рисунки. Элементами этой коллекции являются объекты РисунокТаб- личногоДокумента, каждый из которых описывает отдельный рисунок, содержащийся в табличном документе. Существует 13 типов рисунков, которые могут быть размещены в табличном документе и которые описываются значениями системного перечисления ТипРисункаТабличногоДокумента (табл. 7.2).
Глава 7. Табличный документ 237 Таблица 7.2. Типы рисунков табличного документа Illi 1МНМЯВ1 l| НВНМММО:: . г ГеографическаяСхема Рисунок, предназначенный для отображения в табличном документе объекта ПолеГеографическойСхемы Группа Рисунок, представляющий собой группу рисунков Дендрограмма Рисунок, предназначенный для отображения в табличном документе объекта Дендрограмма Диаграмма Рисунок, предназначенный для отображения в табличном документе объекта Диаграмма ДиаграммаГанта Рисунок, предназначенный для отображения в табличном документе объекта ДиаграммаГанта Картинка Рисунок, отображающий картинку Объект Рисунок, предназначенный для отображения в табличном документе объекта ActiveX Прямая Рисунок, являющийся прямой линией Прямоугольник Рисунок, являющийся прямоугольником СводнаяДиаграмма Рисунок, предназначенный для отображения в табличном документе объекта СводнаяДиаграмма Текст Рисунок, содержащий текст Эллипс Рисунок, являющийся эллипсом Добавление рисунков в табличный документ может быть выполнено с помощью метода Добавить () коллекции рисунков табличного документа. При этом обязательно должен быть указан тип добавляемого рисунка. Метод Добавить () возвращает добавленный рисунок, после чего устанавливаются требуемые свойства рисунка (листинг 7.42). Листинг 7.42. Добавление рисунка в табличный документ НовыиРисунок = Коллекция рисунков табличного документа обладает также методами, позволяющими очищать коллекцию, удалять, получать рисунки по индексу и определять количество рисунков табличного документа. Общие свойства рисунков табличного документа Объект РисунокТабличногоДокумента имеет набор свойств, которые позволяют работать с теми или иными типами рисунков. Не все из существу- ющих свойств могут быть использованы с любым типом рисунка, однако существует ряд свойств, которые, за небольшим исключением, используются с рисунками любого типа.
Решение специальных прикладных задач в «^Предприятии 8» Имя и тип Прежде всего это свойства Имя и ТипРисунка. Все рисунки, добавляемые в табличный документ, получают имена по умолчанию D1, D2 и т. д. При необ- ходимости разработчик может назначить собственное имя рисунку. При этом рисунок будет включен в коллекцию именованных областей табличного доку- мента (свойство табличного документа Области), листинг 7.43. Листинг 7.43. Назначение имени рисунку ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка); Сообщить(НовыйРисунок.Имя); НовыйРисунок.Имя = "Логотип"; Сообщить(ТабДок.Области.Логотип.Имя); Сообщить^ абДок. Рисунки. Логотип. Имя); Свойство ТипРисунка принимает значения системного перечисления ТипРисункаТабличногоДокумента и задается при добавлении рисунка в табличный документ. В дальнейшем значение этого свойства может быть только прочитано. Размеры рисунка Каждый рисунок, добавляемый в табличный документ, ограничивается прямоугольной областью, размеры которой задаются с помощью свойств Верх, Высота, Лево и Ширина. Все эти свойства принимают значения типа Число. Свойство Верх задает расстояние от верхней стороны табличного документа до границы рисунка, от которой будет отсчитываться высота в миллиме- трах. Свойство Высота задает высоту рисунка в миллиметрах. Свойство Лево задает расстояние от левой стороны табличного документа до границы рисунка, от которой будет отсчитываться ширина в миллиметрах, а свойство Ширина задает ширину рисунка в миллиметрах. По умолчанию для нового рисунка значения всех перечисленных свойств равны нулю, поэтому их нужно задавать в явном виде (листинг 7.44). Листинг 7.44. Установка размеров рисунка
Глава 7. Табличный документ 239 НовыйРисунок.Высота = 5; НовыйРисунок.Ширина = 30; ТабДок.Показать(); В результате выполнения приведенного кода будет добавлен следующий рисунок (рис. 7.38). Рис. 7.38. Рисунок в табличном документе Следует отметить, что при положительных значениях ширины и высоты рисунка высота рисунка будет отсчитываться вниз от верхней границы рисунка, а ширина - вправо от левой границы рисунка. Если же свойствам ширина и высота присваиваются отрицательные значения, то высота будет отсчи гываться вверх от верхней границы рисунка, а ширина - влево от правой границы рисунка. Поэтому приведенный па рис. 7.38 табличный документ также может быть получен с помощью следующего кода (листинг 7.45). Листинг 7.45. Использование отрицательных значений ширины и высоты рисунка ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст); НовыйРисунок.Текст = "Текст рисунка"; НовыйРисунок.Верх = 15; НовыйРисунок.Лево = 40; НовыйРисунок.Высота = -5; НовыйРисунок.Ширина = -30; ТабДок. Показать(); ПРИМЕЧАНИЕ Для рисунков типа Группа применимы только те свойства, которые были перечислены: Имя, ТипРисунка, Верх, Высота, Лево и Ширина. Свойства, описываемые далее, не применимы к рисункам типа группа. Ограничивающая линия Для всех типов рисунков может быть использовано свойство Линия. Это свойство задает тип линии, которая будет ограничивать рисунок. Исключение составляют лишь рисунки типов Прямая и Эллипс: для них это свойство
240 Решение специальных прикладных задач в «1С:Предприятии 8» задает тип линии, которой рисуется отображаемая фигура, а сами рисунки этих типов не содержат ограничивающей линии. Свойство Линия принимает значения типа Линия, которые, как правило, созда- ются с помощью конструктора объекта Линия (листинг 7.46). При этом следует учитывать, что в конструкторе должен быть использован тип линии ТипЛи- нииРисункаТабличногоДокумента. В противном случае будет выдано сообщение о несоответствии типов при установке значения свойства Линия. Листинг 7.46. Пример использования свойства «Линия» ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок. Рисунки. Добавить(Т ипРисункаТабличногоДокумента.Эллипс); НовыйРисунок.Верх= 10; НовыйРисунок. Лево = 10; НовыйРисунок. Высота = 5; ; НовыйРисунок.Ширина = 30; НовыйРисунокЛиния = Новый Линия(ТйпЛинииРисункаТаблйчногоДокумента.Точечная); ТабДок.Показать(); В результате выполнения приведенного кода будет добавлен следующий рисунок (рис. 7.39). Рис. 7.39. Использование свойства «Линия» По умолчанию после добавления нового рисунка в его свойстве Линия уста- новлена линия типа Сплошная с толщиной, равной 1. Цвет линии задается с помощью свойства ЦветЛинии, которое принимает значение типа Цвет. По умолчанию для нового рисунка цвет линии задается черным с помощью абсолютных значений составляющих цвета. Свойства ГраницаСверху, ГраницаСлева, ГраницаСнизу и Грани- цаСправа имеют тип Булево и определяют отображение соответствующих линий, ограничивающих рисунок. Эти свойства неприменимы для рисунков типов Прямая и Эллипс, т. к. такие рисунки не имеют ограничивающих линий. По умолчанию в этих свойствах установлены значения Истина, поэтому для того, чтобы скрыть какие-либо ограничивающие линии рисунка (рис. 7.40),
Глава 7. Табличный документ 241 следует установить соответствующее свойство в значение Ложь (листинг 7.47). Листинг 7.47. Пример скрытия границы рисунка ТабДок = НовыйТабличныйДокумент; НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента. Прямоугольник); НовыйРисунок.Верх = 10; НовыйРйеунок.Лево = 10; Т||| НовыйРисунок.Высота = 5; НовыйРисунок.Ширина = 30; НовыйРисунок.ГраницаСверху = Ложь; ТабДок.Показать(); Рис. 7.40. Скрытие верхней границы рисунка Заполнение рисунка Для всех рисунков, кроме рисунка типа Прямая, может быть задан заполня- ющий узор, цвет узора и цвет фона рисунка. Узор задается с помощью свойства рисунка табличного документа Узор, которое принимает значения системного перечисления ТипУзораТаблич- ногоДокумента (эти значения описаны на с. 220), листинг 7.48. Листинг 7.48. Использование узора рисунка табличного документа ТабДок = Новый ТабличныйДокумент; 1 НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник); НовыйРисунок.Верх = 10; НовыйРисунок.Лево = 10; . НрвыйРисунок.Высота = 5; ДВу J НовыйРисунок.Ширина = 30; НовыйРисунок.Узор = ТипУзораТабличногоДокумента.Узорб; ТабДокЛоказать(); „у... ||к Ц В результате выполнения приведенного кода в табличный документ будет вставлен прямоугольник, заполненный узором (рис. 7.41).
242 Решение специальных прикладных задач в «^Предприятии 8» Рис. 7.41. Использование узора рисунка Цвет узора и цвет фона рисунка задаются с помощью свойств ЦветУзора и ЦветФона, которые принимают значения типа Цвет. По умолчанию для новых рисунков цвет узора задается черным, а цвет фона - белым с помощью абсолютных значений составляющих цвета. Для рисунков, являющихся примечаниями, по умолчанию цвет фона задается равным фону подсказки из стиля, используемого конфигурацией (свойство Основной стиль конфигу- рации). Защита рисунка Для рисунка, так же как и для области ячеек табличного документа, может быть задано свойство Защита. Использование этого свойства имеет смысл только вместе со свойством самого табличного документа Защита. Если у табличного документа свойство Защита установлено в значение Истина, то в окне редактора табличных документов пользователю будет недоступно редактирование тех рисунков табличного документа, для которых свойство Защита также установлено в значение Истина. По умолчанию свойство Защита имеет значение Истина для всех рисунков табличного документа. Рисунки типа «Текст» Рисунки табличного документа, имеющие тип Текст, используются для отображения текста и значений различного типа в табличном документе. Кроме этого, они используются для отображения примечаний к ячейкам табличного документа. Есть три основных отличия в использовании рисунка типа Текст самого по себе и в качестве примечания. Первое отличие заключается в том, что для добавления рисунка типа Текст в табличный документ используется метол Добавить () коллекции рисунков табличного документа (листинг 7.49). Листинг 7.49. Добавление рисунка типа «Текст»
Глава 7. Табличный документ 243 Примечания в табличный документ добавлять не нужно. После создания табличного документа каждая его ячейка уже содержит примечание, доступ к которому можно получить через свойство области ячеек таблич- ного документа Примечание. При установке примечанию свойства Текст, отличного от пустой строки (листинг 7.50), это примечание будет отображено в табличном документе (рис. 7.42). Если свойству Текст рисунка, который является примечанием, присвоить значение нустой строки, то отображение примечания будет прекращено. Листинг 7.50. Установка примечания ТабДок = Новый ТабличныйДокумент; ТабДок.Область(2,2).Примечание.Текст = “Текст примечания”; Рис. 7.42. Примечание Второе отличие заключается в том, что примечания не отображаются в коллекции рисунков табличного документа. Поэтому, если доступ к обыч- ному рисунку типа Текст можно получить через коллекцию рисунков табличного документа или через коллекцию именованных областей таблич- ного документа (листинг 7.44), доступ к примечанию осуществляется только через область табличного документа, которой «принадлежит» данное приме- чание (листинг 7.50). Третье отличие заключается в том, что рисунок типа Текст, используемый в качестве примечания, может отображать только текст, в то время как обычный рисунок типа Текст может отображать текст, а также может отображать значения других типов, которые задаются при помощи параметров рисунка. Рассмотрим общие свойства рисунка типа Текст - свойства Текст, ЦветТекста и Шрифт. Свойство Текст задает собственно сам текст, который будет отображен в рисунке. Свойство ЦветТекста описывает цвет, которым будет отображен указанный текст. По умолчанию для обычных рисунков типа Текст это черный цвет, заданный абсолютными значениями составляющих цвета, а для рисунков, являющихся примечаниями, это цвет текста подсказки из стиля, используе- мого конфигурацией.
244 Решение специальных прикладных задач в «^Предприятии 8» Свойство Шрифт имеет значение типа Шрифт и задает вид шрифта, исполь- зуемого для отображения указанного текста. По умолчанию используется шрифт Arial, 8. Свойства РазмещениеТекста, ВертикальноеПоложение, Горизон- тальноеПоложение, ОриентацияТекста, Отступ и ВыделятьОтри- цательные аналогичны одноименным свойствам области ячеек табличного документа, о которых более подробно можно прочитать в разделе «Свойства области, относящиеся к тексту», с. 224. Свойство АвтоРазмер позволяет использовать возможность автоматичес- кого задания размеров рисунка на основе текста, содержащегося в рисунке. Для обычных рисунков по умолчанию это свойство установлено в значение Ложь, что подразумевает указание размеров рисунка в явном виде (свойства Высота и Ширина). Для рисунков, являющихся примечаниями, по умол- чанию свойство АвтоРазмер установлено в значение Истина. Это означает, что размер примечания будет определяться автоматически. Если необходимо явное указание размеров примечания (рис. 7.43), следует свойство Авто- Размер установить в значение Ложь и задать нужные значения свойств Высота и Ширина (листинг 7.51). Листинг 7.51. Установка размеров примечания ТабДок = Новый ТабличныйДокумент; Примечание = ТабДок.Область(2,2).Примечание; Примечание.Текст = "Текст примечания"; Примечание.АвтоРазмер = Ложь; Примечание.Ширина = 50; Примечание.Высота = 50; ТабДок.Показать(); Рис. 7.43. Установка размеров примечания
Глава 7. Табличный документ Рисунки типа «Картинка» Рисунки типа Картинка используют два специальных свойства, которые не используются рисунками других типов. Это свойства Картинка и Раз- мерКартинки. Свойство Картинка имеет тип Картинка и позволяет указать собственно ту картинку, которая будет отображена в рисунке. Свойство РазмерКартинки имеет тип системного перечисления Раз- мерКартинки и позволяет указать способ отображения картинки в рисунке. Поддерживаются следующие значения этого перечисления (табл. 7.3). Таблица 7.3. Значения системного перечисления «РазмерКартинки» Значение Описание АвтоРазмер Если область, в которой отображается картинка, больше чем размеры картинки, используется режим РеальныйРазмер, в противном случае используется режим Пропорционально Пропорционально Картинка растягивается или сжимается таким образом, чтобы занять всю высоту или ширину отведенной для нее области, сохраняя при этом соотношение высоты и ширины оригинальной картинки Растянуть Растянуть или сжать картинку таким образом, чтобы она занимала всю область, отведенную для ес отображения РеальныйРазмер Сохранять реальные размеры картинки. Если область, в которой отображается картинка, меньше ее размеров, из середины картинки вырезается прямоугольник нужного размера Черепица Картинка, сохраняя свои оригинальные размеры, будет периоди- чески повторяться, заполняя всю отведенную для нее область Например, для добавления рисунка типа Картинка в табличный документ можно использовать следующий код (листинг 7.52). Листинг 7.52. Добавление рисунка типа «Картинка» ТабДок = Новый ТабличныйДокумент; РисунокКартинка = Т абДок.Рисунки.Добавить(Т ипРисункаТабличногоДокумента.Картинка); РисунокКартинка.Картинка = Новый Картинка(яС:/1одо.йГ); РисунокКартинка.Верх = 10; РисунокКартинка.Лево = 10; РисунокКартинка.Высота = 45; РисунокКартинка.Ширина = 60; РисунокКартинка.РазмерКартинки = РазмерКартинки.АвтоРазмер; РисунокКартинка.ГраницаСверху = Ложь; РисунокКартинка. ГраницаСлева =Ложь; РисунокКартинка. ГраницаСнизу = Ложь; РисунокКартинка.ГраницаСправа = Ложь; ТабДок.Показать();
246 Решение специальных прикладных задач в «^Предприятии 8» В результате выполнения приведенного кода будет создан следующий табличный документ (рис. 7.44). Рис. 7.44. Добавление рисунка типа «Картинка» Рисунки, содержащие объекты Помимо рисунков табличного документа, отображающих текст, картинки, те или иные геометрические фигуры, существуют рисунки, предназна- ченные для отображения различных объектов и предоставляющие доступ к самим отображаемым объектам. Такими рисунками являются рисунки типа Диаграмма, ДиаграммаГанта, СводнаяДиаграмма, Дендрограмма, ГеографическаяСхема и Объект. Все перечисленные типы рисунков, кроме рисунка типа Объект, могут быть добавлены в табличный документ средствами встроенного языка (метод Добавить() коллекции рисунков табличного документа). Рисунок типа Объект может быть добавлен в табличный документ только интерактивно, т. к. при добавлении такого рисунка будет предложено выбрать один из заре- гистрированных в операционной системе ActiveX объектов. ПРИМЕЧАНИЕ Следует заметить, что не все ActiveX объекты, зарегистрированные в операционной системе, могут быть размещены в табличном документе. Также список ActiveX объектов, предлагаемых для размещения в табличном документе, будет отличаться от списка ActiveX объектов, предлагаемых для размещения, например, в форме. Это объясняется различным функциональным назначением формы и табличного документа. Алгоритм работы со всеми перечисленными типами рисунков одинаков. Сначала нужно добавить рисунок в табличный документ, затем получить
Глава 7. Табличный документ 247 объект, отображаемый в рисунке, и после этого выполнить необходимые действия по настройке отображаемого объекта. Например, для того чтобы отобразить в табличном документе результаты отчета в виде диаграммы (рис. 7.45), можно выполнить код, представленный в листингах 7.53, 7.54. Листинг 7.53. Пример вывода результатов отчета в диаграмму, расположенную в табличном документе &НаКлиенте Процедура Диаграмма(Команда) ТабДок = СформироватьДиаграммуО; Т абДок.ОтображатьСетку = Ложь; ТабДокЛоказатЦ); КонецПроцедуры Диаграмма формируется в серверной внеконтекстной функции Сформи- роватьДиаграммуО (листинг 7.54). Сначала диаграмма добавляется в коллекцию рисунков табличного документа. Затем объект Диаграмма заполняется данными отчета, и настраиваются свойства диаграммы. После этого табличный документ, содержащий диаграмму, возвращается на клиента и показывается пользователю. Листинг 7.54. Пример вывода результатов отчета в диаграмму, расположенную в табличном документе &НаСервереБезКонтекста Функция СформироватьДиаграммуО ТабДок = Новый ТабличныйДокумент;; II Добавить рисунок типа "Диаграмма” и задать его размеры. РисунокДиаграмма = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Диаграмма); РисунокДиаграмма.Верх = 5; РисунокДиаграмма.Лево = 5; РисунокДиаграмма. Ширина = 150; РисунокДиаграмма.Высота = 70; //Получить объект "Диаграмма”, отображаемый в рисунке. Диаграмма = РисунокДиаграмма.Объект; Диаграмма.ОбластьЗаголовка.Текст = "Продажа товаров"; // Настроить Свойства диаграммы. Диаграмма.ТипДиаграммы = ТипДиаграммы.Измерительная; Диаграмма, АвтоМаксимальноеЗначение = Ложь; Диаграмма.МаксимальноеЗначение = 20000; Диаграмма.АвтоМинимальноеЗначение = Ложь; Диаграмма.МинимальноеЗначение = 0;
248 Решение специальных прикладных задач в «Ю.Предприятии 8» II Создать три полосы. Полосы = Диаграмма ПолосыИзмерительнойДиаграммы; НоваяПолоса = Полосы.Добавить(); НоваяПолоса. Начало = 0; НоваяПолоса.Конец = 3000; НоваяПолоса.ЦветФона = \А/еЬЦвета.Красный; НоваяПолоса = Полосы.Добавить(); НоваяПолоса. Начало = 3000; НоваяПолоса.Конец = 7000; НоваяПолоса.ЦветФрна = МеЬЦвета.Желтый; НоваяПолоса = Полосы.Добавить(); НоваяПолоса.Начало = 7000; НоваяПолоса.Конец-20000; НоваяПолоса.ЦветФона = ДОеЬЦвета.Зеленый; Запрос = Новый Запрос(" ВЫБРАТЬ ПродажиОбороты.Период, ПродажиОбороты.СуммаОборот ИЗ РегистрНакопления.Продажи.Обороть^&ДатаНачала, &ДатаОкончания, День ) КАК ПродажиОбороты"); Запрос.УстановитьПараметр(‘ДатаНачала" , '2011.09.14 00:00:00’); Запрос.УстановитьПараметрСДатаОкончания". '2011.09.15 23:59:59’); Диаграмма.ИсточникДанных = Запрос.Выполнить().Выгрузить(); Возврат ТабДок; КонецФункции Рис. 7.45. Использование рисунка типа «Диаграмма»
Глава 7. Табличный документ 249 Рисунки типа «Прямая» В заключение рассказа о рисунках табличного документа остановимся н. некоторых особенностях, связанных с использованием рисунка типа Пряма; в табличном документе. Прямая всегда рисуется из левого верхнего угла рисунка в правый нижний Таким образом, изменяя ширину и высоту рисунка (листинг 7.55), мы може^ нарисовать практически любую прямую, имеющую угол наклона от 271 градусов (вертикально, Ширина = 0), до 360 градусов (горизонтально, Высот; = 0), рис. 7.46. Листинг 7.55. Пример рисования линии ТабДок = Новый ТабличныйДокумент; Для ВысотаПрямой = 0 По 50 Цикл Прямая = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямая); Прямая.Лево = 5; Прямая.Верх = 5; Прямая.Ширина = 50; Прямая.Высота = ВысотаПрямой; ВысотаПрямой = ВысотаПрямой + 4; КонецЦикла: Для ШиринаПрямой = 0 По 50 Цикл Прямая = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямая); Прямая.Лево = 5; Прямая. Верх = 5; Прямая. Ширина = ШиринаПрямой; Прямая.Высота = 50; ШиринаПрямой = ШиринаПрямой + 4; КонецЦикла; ТабДок. ОтображатьСетку = Ложь; ТабДок.Показать(); Рис. 7.46. Пример рисования линии
250 Решение специальных прикладных задач в «^Предприятии 8» Но как же быть, если требуется нарисовать прямую, имеющую угол наклон от 180 до 270 градусов? Для этого можно использовать задание отрица- тельных значений высоты или ширины рисунка (листинг 7.56). Отрицательное значение высоты позволяет отразить рисунок вертикально, а отрицательное значение ширины - отразить рисунок горизонтально (рис. 7.47). Листинг 7.56. Пример рисования линий ТабДок = Новый ТабличныйДокумент; ПрямаяОбычная = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямая); ПрямаяОбычная.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 2); ПрямаяОбычная.Верх = 30; ПрямаяОбычная.Лево = 55; ПрямаяОбычная.Ширина = 50; ПрямаяОбычная.Высота = 25; ПрямаяОтображениеВертикально = Т абДок. Рисунки. Добавить(Т ипРисункаТ абл ичногоДокумента .Прямая); ПрямаяОтображениеВертикально.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента. Пунктир); ПрямаяОтображениеВертикально.Верх = 30; ПрямаяОтображениеВертикально.Лево = 55; ПрямаяОтображениеВертикально.Ширина - 50; ПрямаяОтображениеВертикально.Высота = -25; ПрямаяОтображениеГоризонтально = ТабДок. Рисунки. Добавить(ТипРисункаТабл ичногоДокумента Прямая); ПрямаяОтображениеВертикально.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента Точечная); ПрямаяОтображениеГоризонтально.Верх = 30: ПрямаяОтображениеГоризонтально.Лево = 55; ПрямаяОтображениеГ оризонтально. Ширина = -50; ПрямаяОтображениеГоризонтально.Высота = 25; Надпись! =ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст); Надпись!.Текст = "Исходная прямая"; Надпись! .АвтоРазмер = Истина; Надпись!.Верх = 50; Надпись! .Лево = 70; Надпись2 = ТабДок. Рисунки. Добавить(ТипРисункаТабличногоДокумента.Текст): Надпись2.Текст = "Отражение вверх", Надпись2 АвтоРазмер = Истина; Надпись2.Верх = 5: Надпись2 Лево = 70, НадписьЗ = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента Текст); НадписьЗ. Текст = "Отражение влево"; НадписьЗ.АвтоРазмер = Истина; НадписьЗ Верх = 50‘ НадписьЗ. Лево = 14; ТабДок. ОтображатьСетку = Ложь; ТабДок.Показать();
Глава 7. Табличный документ Рис. 7.47. Пример рисования линий Использование макетов табличных документов Помимо непосредственного заполнения табличных документов данными, существует возможность формирования табличного документа на основе макета. Макет табличного документа описывает неизменяемые части таблич- ного документа, содержащие оформление, и области, в которые могут быть ыведены данные. Процесс заполнения табличного документа на основе макета заключается в считывании определенных областей макета, циклическом заполнении их цанными и последовательном выводе полученных частей документа в резуль- тирующий табличный документ (рис. 7.48). Кроме этого, в процессе формирования результирующего табличного доку- мен та можно использовать возможность автоматической установки некоторых свойств документа, таких, например, как группировки и отступы. Формат макета табличного документа Макет табличного документа представляет собой табличный документ, у которого свойство Макет установлено в значение Истина. Изменение этого свойства возможно только интерактивным способом, т. к. создание пакета выполняется средствами визуального конструирования в редакторе табличных документов. После того как табличному документу установлено свойство Макет, для областей и рисунков табличного документа становится доступной возмож- ность указать, чем будет заполняться та или иная область (рисунок) макета.
252 Решение специальных прикладных задач в «Ю.Предприятии 8» Рис. 7.48. Схема использования макета табличного документа Для этого используется свойство Заполнение области и рисунка таблич- ного документа (следует заметить, что для рисунков свойство Заполнение может быть использовано, только если рисунок имеет тип Текст). Свойство Заполнение принимает значения системного перечисления ТипЗаполне- нияОбластиТабличногоДокумента. Возможны три значения: Текст - при выводе области/рисунка в табличный документ будет выведен текст, содержащийся в свойстве Текст области/рисунка;
Глава 7. Табличный документ 253 п Параметр - при выводе области/рисунка в табличный документ будет выведено значение параметра, имя которого указано в свойстве Пара- метр области/рисунка; Шаблон - при выводе области/рисунка в табличный документ будет выведен текст в соответствии с шаблоном, который описан в свойстве Текст области/рисунка. Шаблон представляет собой строку, содержащую имена параметров. Для указания имени параметра используются символы «[» и «]» (листинг 7.57). Листинг 7.57. Пример шаблона Налогоплательщик: [НазваниеОрганизации] В приведенном примере НазваниеОрганизации - это имя параметра, значение которого будет выведено в табличный документ после строки «Налогопла- тельщик: ». Как правило, в макете табличного документа определяется набор имено- ванных областей, соответствующих логическим частям будущего табличного документа. Например, если на основе шаблона будет формироваться отчет, содержащий табличные данные, то, скорее всего, макет такого отчета будет содержать области Шапка, Строка и Подвал. Процедура формирования табличного документа Для того чтобы заполнить значения параметров области макета необходимыми данными, эта область должна быть получена в виде табличного документа. Для этого используется метод табличного документа ПолучитьОбласть (), которому в качестве параметра передается имя области. После этого к параме- трам области можно обратиться с помощью свойства табличного документа Параметры. Обращение возможно по имени параметра (листинг 7.58). Листинг 7.58. Обращение к параметрам области макета по имени ТабМакет = ПолучитьОбщийМакет("Макет''); ОбластьШапки = ТабМакет. ПолучитьОбласть(''Шапка"); ОбластьШапки.Параметры.НачалоПериода = НачалоМесяца(ТекущаяДата()); ОбластьШапки .Параметры. КонецПериода = КонецМесяца(Т екущаяДата()); Свойство Параметры содержит коллекцию параметров табличного доку- мента. Помимо обращения по имени, коллекция содержит метод Запол- нить (), который позволяет заполнить значения всех параметров, содержащихся в области, значениями одноименных свойств переданного ей объекта. Такой способ заполнения параметров удобно использовать, например, при выводе в табличный документ результата запроса.
Решение специальных прикладных задач в «^Предприятии 8» Например, пусть создан следующий макет (рис. 7.49). Рис. 7.49. Макет Тогда фрагмент кода, выводящий данные запроса в табличный документ, формируемый на основе этого макета, может выглядеть следующим образом (листинг 7.59). Листинг 7.59. Пример заполнения значения параметров области макета Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ТоварыНаСкладахОбороты.Номенклатура.Представление КАК Номенклатура, ТоварыНаСкладахОбороты.КоличествоРасход КАК КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.Обороты КАК ТоварыНаСкладахОбороты 1АВТОУПОРЯДОЧИВАНИЕ" Выборка = Запрос. Выполнить().Выбрать{); II Получить макет. Т абМакет = ПолучитьОбщийМакет(' ’Макет"); // Получить область макета для вывода данных запроса. СекцияСтрсжа = ТабМакет.ПолучитьОбласть("Строка"); Пока Выборка.Следующий() Цикл // Заполнить значения параметров области. СекцияСтрока.Параметры.Заполнить(Выборка); КонецЦикла; После того как значения параметров области заданы, табличный доку- мент, содержащий область макета, может быть выведен в результирующий табличный документ. Для этого могут быть использованы два метода таблич- ного документа: Вывести() и Присоединить(). Метод Вывести () выводит переданный ему табличный документ в резуль- тирующий табличный документ, добавляя его со следующей строки вслед за самой нижней выведенной строкой, начиная с первой колонки. Метод Присоединить () также выводит переданный ему табличный доку- мент в результирующий табличный документ, но помещает его в следующей
Глава 7. Табличный документ 255 колонке правее самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий табличный документ. Как правило, метод Вывести () используется для формирования линейных отчетов, когда области макета являются областями строк и должны выво- диться последовательно, друг за другом. Например, пусть существует макет, у которого определена область строк Строка, содержащая параметр Название (рис. 7.50). Д . Конфигурация Конфи! урацмя: Макет _ □ X I I 2 >____3_________ --------11 ±_--------------------------------------------------н । Строка 2 «Название*___________________________________ ; з j 4 .1 15 Н Рис. 7.50. Макет Тогда результирующий табличный документ, для формирования которого использовался метод Вывести() (листинги 7.60, 7.61), будет выглядеть следующим образом (рис. 7.51). Листинг 7.60. Пример использования метода «Вывести()» &НаКлиенте Процедура МакетДокумента(Команда) ТабДок - ВывестйПараметрыр ТабДок.Показать(); КонецПроцедуры Листинг 7.61. Пример использования метода «Вывести()» &НаСервереБезКонтекста Функция ВывестиПараметры() ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("Макет"); ОбгастьСтрс ка = ТабМакет.ПолучитьОбласть(''Строка''); ОбластьСтрока.Параметры.Название = "Первая область"; Т абДокВывести(ОбластьСтрока);. ОбластьСтрока.Параметры.Название = "Вторая область”; ТабДок. Вывести(ОбластьСтрока); ОбластьСтрока.Параметры.Название = "Третья область"; ТабДок.Вывести(ОбластьСтрока); Возврат ТабДок;; КонецФункции
256 Решение специальных прикладных задач в «^Предприятии 8» Рис. 7.51. Результирующий табличный документ Теперь предположим, что используется макет, в котором определена прямоу- гольная область Строка с параметром Название (рис. 7.52). Рис. 7.52. Макет Для вывода этой области макета будем использовать как метод Вывести(), так и метод Присоединить () (листинг 7.62). Листинг 7.62. Пример использования метода «Присоединить()» &НаСервереБезКонтекста Функция ВывестиПараметры() ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакетр'Макет"); ОбластьСтрока = ТабМакет.ПолучитьОбласть("Строка"); ОбластьСтрока.Параметры.Название = "Первая область"; ТабДок.Вывести(ОбластьСтрока); ОбластьСтрока.Параметры.Название = "Вторая область"; ТабДокВывести(ОбластьСтрока); ОбластьСтрока.Параметры.Название = "Третья область"; ТабДок.Присоединить(ОбластьСтрока); ОбластьСтрока.Параметры.Название = "Четвертая область"; ТабДок.Присоединить(ОбластьСтрока); Возврат ТабДок; КонецФункции В этом случае результирующий табличный документ будет выглядеть так, как показано на рис. 7.53.
Глава 7. Табличный документ 257 Рис. 7.53. Результирующий табличный документ Метод Присоединить () используется, как правило, при создании кросс- отчетов, для вывода колонок отчета. Количество выводимых колонок отчета может изменяться в зависимости от состава данных отчета и заданных пара- метров. Поэтому обычно создается прямоугольная область макета, которая присоединяется к заголовку строки нужное количество раз при формиро- вании результирующего табличного документа. Методы Вывести () и Присоединить () содержат четыре параметра, смысл которых одинаков для обоих методов. Параметр Таблица является обязательным и содержит тот самый табличный документ, который должен быть добавлен в результирующий табличный документ. Параметр Уровень используется для автоматической группировки строк/ колонок результирующего табличного документа. Соседние строки/колонки с одинаковым уровнем будут отнесены к одной группе. При использовании метода Вывести () указывается уровень для группировки строк, а при исполь- зовании метода Присоединить () - уровень для группировки колонок. Для автоматической группировки строк/колонок результирующего таблич- ного документа используются методы НачатьАвтогруппировкуСтрок(), ЗакончитьАвтогруппировкуСтрок(), НачатьАвтогруппировкуКо- лонок() и ЗакончитьАвтогруппировкуКолонок(). Обычно возможность автогруппировки строк/колонок результирующего табличного документа используется при выводе иерархических результатов запроса. Тогда в качестве номера уровня задается уровень записи выборки результата запроса, данные которой выводятся в область макета. Пусть, например, существует макет, показанный на рис. 7.54. Рис. 7.54. Макет
Решение специальных прикладных задач в «1С:Предприятии 8» Тогда, указав при формировании результирующего табличного документа уровни группировок и необходимость автоматической группировки строк (листинги 7.63, 7.64), можно получить отчет, содержащий группировки товаров по складам (рис. 7.55). Листинг 7.63. Пример использования автогруппировки строк &НаКлиенте Процедура СформироватьОтчет(Команда) ТабДок = ЗаполнитьОтчет(); ТабДок.Показать(); КонецПроцедуры Отчет формируется в серверной внеконтекстной функции Заполни- тьОтчет(). Затем заполненный данными табличный документ возвращается на клиента и показывается пользователю. Листинг 7.64. Пример использования автогруппировки строк &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПродажиКомпанииОбороты.Контрагент КАК Контрагент, ПродажиКомпанииОбороты. Номенклатура, СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНачала. &ДатаОкончания) | КАК ПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Номенклатура, ПродажиКомпанииОбороты.Контрагент ИТОГИ СУММА(СуммаОборот) ПО Контрагент, Номенклатура"; Запрос.УстановитьПараметр("ДатаНачала" , '2011.09.14 00:00:00'); Запрос.УстановитьПараметр("ДатаОкончания", '2011.09.15 23:59:59’); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("МакетОтчета"); ОбластьКонтрагент = ТабМакет. ПолучитьОбласть("Контрагент"), ОбластьНоменклатура = ТабМакет.ПолучитьОбласть(!,Номенклатура");
Глава 7. Табличный документ 259 ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); Т абДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.УровеньО); КонецЦикла; КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); Возврат ТабДок; КонецФункции ЧГ- Tao. (1 С:Предприятие) । -U Lx Д М - О X 1 2 2 3 4 1 Никитин Юрий 19 4551 J 1 г 1 1 2 Никитин Юрий Windows ХР Home Edition Russian UPG СС 1 7001 I в 3 Никитин Юрий Windows ХР Professional Russian CD 2351 4 Никитин Юрий 1C: Аспект 7.7 1 6001 । J 5 Никитин Юрий 1C: Бухгалтерия 7.7 Базовая версия 7001 i ! 1 i i 6 Никитин Юрий Консультации по настройке 1С 2001 j i 7 Никитин Юрий Консультации по настройке ОС Windiws 15 0001 8 Никитин Юрий Доставка 201 [ 1. 1 +! 9 Завод РТИ 11 9501 f 17 I IJ 1 I I 18 иг . ... ir — . i- Рис. 7.55. Сформированный отчет ПРИМЕЧАНИЕ Обратите внимание, что на рис. 7.55 в строках, которые входят в группировку второго уровня, имя контрагента выведено с отступом от левого края ячейки. Так происходит потому, что для этой ячейки в макете табличного документа установлено свойство АвтоОтступ, которое задает количество символов отступа от левого края области в зависимости от уровня группировки. В данном случае значение свойства равно 3. Это означает, что для строк первого уровня группировки будет использован отступ в 3 символа, для строк второго уровня - 6 символов и т. д. Параметр ИмяГруппы метода Вывести () табличного документа задает название группы, к которой относятся выводимые строки. Это название будет отображено во всплывающей подсказке при наведении курсора на маркер группы. Использование таких подсказок может быть полезным в многоуров- невых отчетах для улучшения их читаемости.
260 Решение специальных прикладных задач в «Ю.Предприятии 8» Например, если взять за основу пример, приведенный в листинге 7.64, и несколько видоизменить его (листинг 7.65), то при сворачивании/разворачи- вании группировок будет выдаваться соответствующая подсказка (рис. 7.56). Листинг 7.65. Пример использования имен групп &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос; Пока Выборка.СледующийО Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень(), "Продажи номенклатуры контрагенту" + Выборка.Контрагент); КонецЦикла; КонецЦикла; Возврат ТабДок; КонецФункции г— i Таблиц... (1 (^Предприятие] . -Ti -Ji. I 4 M- t , _ □, X J .2 Г 1 < 2 3 4 . r СП СЛ ш ю -* _ I I II Никитин Юрий 19 4551 Никитин Юрий Windows ХР Home Edition Russian UPG CD 1 700 [ Никитин Юрий Windows ХР Professional Russian CD 2351 Никитин Юрий 1 С:Аспект 7.7 1 6001 Никитин Юрий 1 С: Бухгалтерия 7.7 Базовая версия 7001 Никитин Юрий Консультации по настройке 1С 2001 Никитин Юрий Консультации по настройке ОС Wndiws 15 0001 8 9 10 Никитин Юрий Доставка Завод РТИ Завод РТИ Wndows ХР Home Edition Russian UPG 201 11 9501 CC 1 9001 Пре иажи L‘IZ 13 14 р5 16 юменклагуры контрагенту Завод РТИ ,ws хр Protessiorial Russian CD 3501 аепвид Tin 1 с,.мипект 7.7 2 000[ Завод РТИ 1 С: Бухгалтерия 7.7 Базовая версия 5001 3 а в од РТ И Консультации по настройке 1С 8001 3 а в од РТ И Консу льтации по настройке ОС Wndiws 6 0001 Завод РТИ Доставка 4001 1 17 18 I ▼ 1 Рис. 7.56. Использование имен групп Параметр Открыта метода Вывести () табличного документа определяет вид, в котором будет выводиться создаваемая группа. Если параметр имеет значение Истина, группа будет выводиться в развернутом виде (по умол-
Глава 7. Табличный документ 261 чанию). Если параметр имеет значение Ложь, группа будет выводиться в свернутом виде. Например, если в примере, приведенном в листинге 7.64, использовать этот параметр при выводе группировки Номенклатура (листинг 7.66), то результи- рующий документ будет содержать свернутые группировки (рис. 7.57). Листинг 7.66. Пример управления видом создаваемых группировок &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); ТабДок.Вывести(ОбластьКонтрагент, Выборка,Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса,ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень(),, Ложь); КонецЦикла; КонецЦикла:* Возврат ТабДок; КонецФункции Рис. 7.57. Результирующий документ Аналогичного результата можно достигнуть с помощью методов табличного документа ПоказатьУровеньГруппировокСтрок() и ПоказатьУро- веньГруппировокКолонок(). Эти методы имеют один обязательный параметр Уровень, задающий номер уровня, до которого необходимо раскрыть группировки. Например, в примере, приведенном в листинге 7.65, можно было бы исполь- зовать следующую конструкцию (листинг 7.67).
262 Решение специальных прикладных задач в «^Предприятии 8» Листинг 7.67. Пример управления видом создаваемых группировок ТабДокЛоказатьУровеньГруппировокСтрок(О); Табличный документ содержит методы, которые позволяют опре/делить коли- чество уровней группировки, использованных в документе. Это методы КоличествоУровнейГруппировокСтрок() и КоличествоУров- нейГруппировокКолонок(). Использование этих методов может пона- добиться, например, если требуется организовать собственную командную панель для управления группировками табличного документа. Тогда резуль- таты, возвращаемые этими методами, позволят организовать цикл обхода всех уровней группировок. Наряду с автоматической группировкой строк/колонок результирующего документа можно группировать строки/колонки и «вручную». Для этого используются методы табличного документа НачатьГруппуСтрокО, ЗакончитьГру гшу Строк (), НачатьГруппуКолонок() и Закон- читьГруппуКолонок(). Эти методы имеют два необязательных параметра: ИмяГруппы и ОткрытаЛиГруппа. Если, например, говорить про группировку строк, то в случае использования методов НачатьГруппуСтрокО и ЗакончитьГруппуСтрот () в одну группу будут объединены строки, выведенные в результирующий табличный документ между вызовами этих методов. Также можно создавать и вложенные группировки. Например, в результате выполнения примера, приведенного в листингах 7.68, 7.69, будет получен следующий табличный документ (рис. 7.58). Листинг 7.68. Пример использования группировки строк табличного документа &НаКлиенте Процедура МакетДокумента(Команда) ТабДок = ВывестиПараметры(); ТабДок.Показать(); КонецПроцедуры Листинг 7.69. Пример использования группировки строк табличного документа &НаСервереБезКонтекста ! Функция ВывестиПараметры() ТабДок = Новый ТабличныйДокумент(); ТабМакет=ПолучитьОбщийМакет("Макет’'); ! ОбластьСтрока = ТабМакет ЛолучитьОбласть(мСтрока");
Глава 7. Табличный документ 263 II Вывести одну строку верхнего уровня. ОбластьСтрока.Параметры.Название = "Строка верхнего уровня"; ТабДок.Вывести(ОбластьСтрока); ТабДок.НачатьГ руппуСтрок(); II Вывести три строки группы первого уровня. ОбластьСтрока.Параметры.Название = "Группировка первого уровня"; ТабДок.Вывести(ОбластьСтрока); ТабДок.Вывести(ОбластьСтрока); ТабДок.Вывести(ОбластьСтрока); ТабДок.НачатьГруппуСтрок(); // Вывести две строки группы второго уровня. ОбластьСтрока.Параметры.Название = "Группировка второго уровня"; ТабДок.Вывести(ОбластьСтрока); Т абДок. Вывести(Обл астьСтрока); ТабДок.ЗакончитьГруппуСтрок(); II закончить группировку строк второго уровня ТабДок.ЗакончитьГруппуСтрок(): II закончить группировку строк первого уровня Возврат ТабДок; КонецФункции Рис. 7.58. Результирующий табличный документ Табличный документ позволяет управлять расположением маркеров секций, сворачивающих горизонтальные и вертикальные группировки табличного документа. Для этого используются свойства ИтогиСнизу и ИтогиСправа. Эти свой- ства принимают значения типа Булево и по умолчанию для нового документа установлены в значение Ложь, г. е. для горизонтальных секций маркеры будут располагаться сверху, а для вертикальных - слева. Свойство табличного документа ОтображатьГруппировки позволяет управлять отображением существующих группировок. По умолчанию это свойство для нового документа установлено в значение Истина. Это озна- чает, что группировки будут отображены.
264 Решение специальных прикладных задач в «1С:Предприятии 8» Получение строк макета на разных языках При получении различных областей макета можно указать язык, на котором должны быть получены строки, содержащиеся в макете. Если в конфигурации определено несколько языков (Общие ► Языки), то система предоставляет возможность задать значение любой строки, содержа- щейся в конфигурации, на каждом из языков, определенных в конфигурации. Таким образом, если макет содержит текстовые строки, то в общем случае их значения могут быть указаны отдельно, для каждого языка. Предположим, что существует макет (рис. 7.59), в котором определена область Строка, содержащая строку на разных языках. Рис. 7.59. Макет Если в палитре свойств ячейки R2C2, в свойстве Текст, нажать кнопку открытия (со значком лупы), можно открыть диалог для ввода строк на разных языках. Для языка Русский (код ru) указано значение Сотрудник, а для языка Английский (код еп) - значение Employee (рис. 7.60). Рис. 7.60. Строка на разных языках При формировании результирующего табличного документа на основе такого макета указанная строка может быть получена как на русском языке, так и на английском. Для этого используется свойство табличного документа КодЯзыкаМакета (листинг 7.70). После того как область макета полу- чена в виде табличного документа, ей следует установить нужный код языка (в нашем случае еп или ru). Тогда при выводе этой области в результирующий табличный документ для строк на разных языках, содержащихся в выводимом документе, будет получено их значение на языке, код которого совпадает с кодом, указанным в свойстве КодЯзыкаМакета.
Глава 7. Табличный документ 265 Листинг 7.70. Получение области на указанном языке &НаСервереБезКонтекста Функция ВывестиПараметры() ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("Макет"); ОбластьСтрока = ТабМакет.ПолучитьОбласть(йСтрока"); II Вывести строки, содержащиеся в области, на русском языке. ОбластьСтрока.КодЯзыкаМакета = "ш"; ТабДок.Вывести(ОбластьСтрока); II Вывести строки, содержащиеся в области, на английском языке. ОбластьСтрока.КодЯзыкаМакета = "еп"; ТабДок.Вывести(ОбластьСтрока); Возврат ТабДок; КонецФункции Результирующий табличный документ будет выглядеть так, как показано на рис. 7.61. Рис. 7.61. Результирующий табличный документ В том случае, если свойству КодЯзыкаМакета указан код языка, отсут- ствующий в конфигурации, будет выведена пустая строка. По умолчанию свойство КодЯзыкаМакета имеет значение Неопределено. В этом случае при выводе областей макета в табличный документ будет использован код языка макета, соответствующий языку, назначенному для текущего пользова- теля. Если текущему пользователю язык не назначен, будет использован код я?ыка, установленного для свойства конфигурации Основной язык. Использование расшифровки в табличном документе Табличный документ предоставляет возможность использовать расшифровку для получения детальной информации при нажатии на определенные ячейки результирующего табличного документа. ПРИМЕЧАНИЕ Следует заметить, что расшифровка может быть использована как непосредственно в табличном документе, так и в табличном документе, размещенном в форме (поле вида ПолеТабличногоДокумента). Однако возможности использования расшифровки непосредственно в табличном
266 Решение специальных прикладных задач в «^Предприятии 8» документе ограничены, по сравнению с полем табличного документа. Об использовании расшифровки в поле табличного документа рассказывается в разделе «Расшифровка в поле табличного документа» на с. 285. Для того чтобы существовала возможность использования расшифровки, должны быть выполнены три условия: ячейкам/рисункам табличного документа, для которых должна выпол- няться расшифровка, должны быть заданы имена параметров расшифровки (свойство ПараметрРасшифровки области ячеек табличного документа или рисунка табличного документа); в процессе вывода областей макета в результирующий табличный доку- мент параметрам расшифровки должны быть присвоены значения, отличные от Неопределено; результирующий табличный документ должен обеспечивать запрет редак- тирования тех ячеек/рисунков, для которых предполагается использовать расшифровку. Для этого используется обычно либо свойство Толь- коПросмотр, либо свойство Защита табличного документа. Если все перечисленные условия выполнены, то при наведении курсора на область/рисунок табличного документа, допускающий расшифровку, курсор принимает вид креста с расположенной на нем лупой. Это говорит о том, что данная ячейка допускает расшифровку. При двойном щелчке мышью на такой ячейке будет выполнено стандартное действие со значением, находящимся в параметре расшифровки данной ячейки: для значений примитивных типов будет отображено их значение в отдельном окне; для ссылочных значений будет открыта основная форма объекта, исполь- зуемая для редактирования данных объекта. Таким образом, непосредственно в табличном документе расшифровка используется, как правило, для того, чтобы предоставить возможность просмотра и редактирования данных ссылочных объектов, представления которых содержатся в результирующем табличном документе. Выполнение расшифровки возможно не только по двойному, но и по одинар- ному щелчку мышью на ячейке. Для этого используется свойство области/ рисунка табличного документа Гиперссылка. Если это свойство установ- лено в значение Истина, то при наведении курсора на такую ячейку он будет принимать форму ладони и описанные выше действия будут выполняться по одинарному щелчку мыши. Также область ячеек табличного документа обладает свойством Использо- ваниеРасшифровки, которое принимает значения системного перечисления ИспользованиеРасшифровкиТабличногоДокумента (табл. 7.4).
Глава 7. Табличный документ Таблица 7.4. Значения системного перечисления «ИспользованиеРасшифровкиТабличногоДокумента» ЙММЙМ Шмшв МП Mb If БезОбработки Курсор не меняет свой внешний вид, и расшифровка не выполняется Ячейка Расшифровка вызывается только для ячейки, содержащей значение параметра расшифровки Строка Расшифровка выполняется для всех ячеек строки, следующих за ячейкой, содержащей значение параметра расшифровки В качестве примера использования расшифровки рассмотрим формирование отчета по продажам номенклатуры контрагентам, в котором при нажатии на контрагента или номенклатуру будет открываться форма соответствующего элемента справочника Контрагенты или Номенклатура. Используем макет, показанный на рис. 7.62. В этом макете для ячеек, в которые выводится представление контрагента, указано имя параметра расшифровки РасшифровкаКонтрагента, а для ячеек, в которые выводится представление номенклатуры, указано имя параметра расшифровки РасшифровкаНоменкла- туры. «г МакетОтчета А !< Конфиг 3 2 Заполнение (Параметр -------- .----------м । Контрагент; 2 :Номенклату 3 ’К В» i Параметр ! НоменклатураПредставление Hhk РасшиФровкаНоменклатуры И спользованиеРасшиФровки | Я чейка ► Значения: ► Положение: ► Оформление: Рис. 7.62. Макет табличного документа <КонтрагентПредставление>/_______________________________ «КснтрагентПредставление* / , «НоменклатураПредставление* «СуммаОборот* 21 ,~Т Ячейки ▼ Основные: Размещение? екста Имя ’Авт£|/ Защита Г иперссылка РежимИзмененияРазмераКоло«{Л|[ Обычный ft ----------------------------------- Макет: Z* Параметр Ячейки Основные: Размещение? екст^ м t Имя t Защита * Г иперссылка ! РежимИзмененияРазмераКолонки! Обычный Макет: / Заполнение I f Параметр ! :Авто взсз И спо льзованиеРасшиФровки; Ячейка ► Значения: В Положение: > Оформление Для формирования отчета используем код, представленный в листингах 7.71, 7.72.
268 Решение специальных прикладных задач в «^Предприятии 8» Листинг 7.71. Пример использования расшифровки &НаКлиенте Процедура СформироватьОтчет(Команда) ТабДок = ЗаполнитьОтчет(); II Установить режим просмотра документа. ТабДок.ТолькоПросмотр = Истина; ТабДок.Показать(); КонецПроцедуры Листинг 7.72. Пример использования расшифровки &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, ПродажиКомпанииОбороты.Контрагент.Представление КАК КонтрагентПредставление, ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура. ПродажиКомпанииОбороты.Номенклатура.Представление КАК НоменклатураПредставление. СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания) КАК ПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Номенкпатура, ПродажиКомпанииОбороты.Контрагент ИТОГИ СУММА(СуммаОборот) ПО Контрагент, Номенклатура"; Запрос.УстановитьПараметр("ДатаНачала" , '2011.09.14 00:00:00'); Запрос.УстановитьПараметр("ДатаОкончания“, '2011.09.15 23:59:59'); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет(пМакет"); ОбластьКонтрагент = ТабМакет.ПолучитьОбласть(''Контрагент''); ОбластьНоменкпатура = ТабМакет.ПолучитьОбласть("Номенклатура’’); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); II Установить расшифровку поля "Контрагент" группировки "Контрагент". ОбластьКонтрагент.Параметры.РасшифровкаКонтрагента = Выборка.Контрагент; ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень());
Глава 7. Табличный документ ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.Г1оГруппировкам); ПокаВыборкаНоменклатура.Следующий() Цикл ОбластьНоменкпатура.Параметры.Заполнить(ВыборкаНоменклатура); II Установить расшифровку полей ’’Контрагент" и ’Номенклатура" II группировки "Номенклатура". ОбластьНоменклатура.Параметры.РасшифровкаКонтрагента = ВыборкаНоменклатура.Контрагент; ОбластьНоменклатура.Параметры.РасшифровкаНоменклатуры = ВыборкаНоменклатура.Номенклатура; ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; . ТабДок.ЗакончитьАвтогруппировкуСтрок(); Возврат ТабДок;* КонецФункции Отчет формируется в серверной внеконтекстной функции Запол- нитьОтчет(). В этой функции перед выводом областей макета в результирующий табличный документ параметрам расшифровки, содер- жащимся в этих областях, присваиваются значения, имеющие тип ссылки на контрагента или на номенклатуру. Затем заполненный данными табличный документ возвращается на клиента и показывается пользователю. Перед показом результирующего табличного документа на клиенте ему устанавливается свойство ТолькоПросмотр. В результате будет сформирован табличный документ, в котором при двойном щелчке, например, по ячейке, содержащей представление контрагента, будет открываться форма для просмотра и редактирования данных этого контра- гента (рис. 7.63). Рис. 7.63. Сформированный отчет
Решение специальных прикладных задач в «^Предприятии 8» Печать табличного документа Табличный документ может быть распечатан на принтере, причем система предоставляет возможность настройки различных параметров печати не только интерактивными средствами (в диалоге настройки печати), но и сред- ствами встроенного языка. Для того чтобы распечатать табличный документ, используется метод табличного документа Напечатать (). Этот метод содержит один параметр ДиалогПечати, который определяет необходимость показа диалога печати перед печатью. Параметр принимает значения системного перечисления РежимИспользованияДиалогаПечати: Использовать или НеИс- пользовать. Значение по умолчанию НеИспользовать. Для того чтобы предоставить пользователю возможность вручную настраивать параметры печати, в параметр метода Напечатать () должно быть передано значение Использовать (листинг 7.73). Листинг 7.73. Печать табличного документа с использованием диалога печати ТабДок = ПолучитьМакетДокумента(иМакет”); ? . ТабДок,Напечатать(РШ<имИспользованияДиалогаПечати.Использовать); ВНИМАНИЕ! Следует учитывать, что если свойства табличного документа ВысотаТаблицы и ШиринаТаблицы равны нулю (подробнее смотрите на с. 210), то при попытке печати такого документа будет выдано сообщение: Нет информации для вывода на печать, и печать будет отменена. По умолчанию печать будет осуществляться на принтер, который установлен в операционной системе как принтер по умолчанию. Для того чтобы указать определенный принтер, на который должна осуществляться печать, использу- ется свойство табличного документа ИмяПринтера (листинг 7.74). Листинг 7.74. Печать на указанный принтер Если принтер с указанным именем не установлен в операционной системе или если имя принтера не указано, печать будет осуществляться на принтер по умолчанию. Перед печатью табличного документа ему может быть установлен ряд пара- метров, аналогичных тем параметрам, которые задаются в диалоге настройки печати. Для этого используются следующие свойства табличного документа.
Глава 7. Табличный документ 271 ОриентацияСтраницы - задает ориентацию страницы. Принимает значения системного перечисления ОриентацияСтраницы: Ландшафт или Портрет. По умолчанию используется значение Портрет. ПолеСверху, ПолеСлева, ПолеСнизу, ПолеСправа - эти свойства задают ширину полей отступа при печати в миллиметрах. По умолчанию для всех свойств используется значение 10. ОбластьПечати - задает область табличного документа, которая будет выводиться на печать. Содержит значение типа ОбластьЯчеекТаблично- гоДокумента или Неопределено. Значение Неопределено - это значение по умолчанию. В этом случае на печать будет выведена область табличного документа, ограниченная свой- ствами ШиринаТаблицы и ВысотаТаблицы табличного документа. Если это свойство содержит прямоугольную область табличного документа, то будет напечатана указанная область. Если свойство содержит область строк, то будет напечатана часть этой области, ограниченная справа значением свойства табличного документа ШиринаТаблицы. Если свойство содержит область колонок, то будет напечатана часть этой области, ограниченная снизу значением свойства табличного документа ВысотаТаблицы. КоличествоЭкземпляров - задает количество экземпляров табличного документа, которые будут выведены на печать. Принимает значения типа Число и Неопределено. Неопределено - значение по умолчанию. В этом случае количество экземпляров будет определяться настройками принтера, на который осуществляется печать. Экземпляров на странице - задает количество страниц, на которые будет разбит текст табличного документа, напечатанный на одном листе бумаги. Может принимать числовые значения 0, 1 и 2 и значение Неопре- делено. Значение 1 означает, что на одном листе будет напечатана одна страница. Значение 2 означает, что табличный документ, печатаемый на одном листе бумаги, будет разбит на две страницы по вертикали. Значение 0 задает автоматическое определение количества страниц на листе. Значение Неопределено означает, что количество экземпляров на странице будет определяться настройками принтера, на который осуществляется печать. Разбор по копиям - позволяет управлять последовательностью печати страниц многострочного табличного документа при выводе на печать нескольких экземпляров документа.
Решение специальных прикладных задач в «ЮПредприятии 8» 272 Если свойство установлено в значение Истина, то печать будет выполняться в следующей последовательности: Экземпляр! Страница! Экземпляр! Страница2 Экземпляр! Страницам Экземпляр2 Страница! Экземпляр2 Страница2 Экземпляр2 Страницам ЭкземплярМ Страница! ЭкземплярМ Страница2 ЭкземплярМ Страницам. Если свойство установлено в значение Ложь, то печать будет выполняться в следующей последовательности: Экземпляр! Страница! Экземпляр2 Страница! ЭкземплярМ Страница! Экземпляр! Страница2 Экземпляр2 Страница2 ЭкземплярМ Страница2 « • • Экземпляр! Страницам Экземпляр2 Страницам ЭкземплярМ Страницам Значение Неопределено означает, что последовательность вывода страниц на печать будет определяться настройками принтера, на который осуществля- ется печать.
Глава 7. Табличный документ 273 Свойства МасштабПечати и АвтоМасштаб позволяют управлять масштабом печатаемого документа. Свойство АвтоМасштаб принимает значения типа Булево. Если значение свойства АвтоМасштаб установлено в Истина и по ширине табличный документ занимает более одной страницы, его масштаб будет уменьшен таким образом, чтобы документ помещался на одну страницу по ширине. Значение Ложь означает, что масштаб печати будет определяться свойством МасштабПечати. Свойство МасштабПечати принимает числовые значения и значение Неопределено. Это свойство задает масштаб печатаемого табличного доку- мента в процентах. Значение Неопределено - значение по умолчанию. Оно означает, что масштаб будет определяться настройками принтера, на который осуществляется печать. Свойство ЧерноБелаяПечать позволяет печатать документ в черно-белом режиме. По умолчанию это свойство имеет значение Неопределено. Это означает, что режим печати будет определяться настройками того принтера, на который осуществляется печать. Значение Ложь означает, что будет выпол- няться печать в цветном режиме, значение Истина означает, что печать будет выполняться в черно-белом режиме. При печати табличного документа можно определить строки/колонки, которые будут печататься на каждом новом листе. Для этого использу- ются свойства табличного документа ПовторятьПриПечатиСтроки и ПовторятьПриПечатиКолонки. Эти свойства содержат значения типа ОбластьЯчеекТабличногоДокумента. Наиболее распространенным случаем использования этих свойств является повторение на каждом новом листе шапки таблицы, когда таблица располагается на нескольких страницах. Табличный документ позволяет использовать при печати колонтитулы. Колон- титулы представляют собой специальные области, вставляемые в верхнюю и нижнюю часть каждой страницы документа. В колонтитулы обычно помеща- ется информация о номере страницы, названии документа, названии глав или разделов документа и т.д. В табличном документе верхний и нижний колонтитулы описываются объек- тами КолонтитулТабличногоДокумента. Для доступа к верхнему колонтитулу используется свойство табличного документа ВерхнийКо- лонтитул, для доступа к нижнему - НижнийКолонтитул. Колонтитул состоит из трех логических частей: левой, центральной и правой. Каждая из этих частей может содержать значение типа Строка, которое и будет напечатано на каждом листе документа. Для доступа к этим частям колонтитула используются свойства ТекстСлева, ТекстВЦентре и Те кот Справа колонтитула табл ичного документа. Эти свойства принимают значения типа Строка и могут содержать ряд управля- ющих конструкций (табл. 7.5).
274 Решение специальных прикладных задач в «^Предприятии 8» Таблица 7.5. Управляющие конструкции колонтитула табличного документа Конструкция Описание [&НомерСтраницы] При печати вместо данной управляющей конструкции будет выведен номер страницы [&Стран и цВсего] При печати вместо данной управляющей конструкции будет выве- дено количество страниц в документе [&Дата] При печати вместо данной управляющей конструкции будет выве- дена текущая дата [&Время] При печати вместо данной управляющей конструкции будет выве- дено текущее время Помимо собственно текста колонтитула, могут быть заданы различные свой- ства, определяющие внешний вид колонтитулов. Свойство ВертикальноеПоложение определяет способ выравнивания текста колонтитула по вертикали в пределах отведенной для него области (Верх, Низ, Центр). Значение по умолчанию - Низ. Размеры верхнего и нижнего колонтитулов задаются свойствами табличного документа РазмерКолонтитулаСверху и РазмерКолонтитулаСнизу. Размеры задаются в миллиметрах и по умолчанию имеют значение 10. Свойство НачальнаяСтраница принимает значения типа Число и опре- деляет номер страницы, начиная с которого будет выводиться колонтитул. По умолчанию имеет значение 0. Свойство Шрифт позволяет установить шрифт для вывода колонтитула. Принимает значения типа Шрифт. Свойство Выводить определяет необходимость вывода колонтитула. По умолчанию это свойство имеет значение Ложь. Это означает, что колонти- тулы не выводятся. Пример задания колонтитулов документа показан в листинге 7.75. Листинг 7.75. Пример использования колонтитулов ТабДок * Новый ТабличныйДокумент; Область = ТабДок.Область(2,2); Область.Текст = "Тест печати"; ТабДок.ОбластьПечати = Область; ВерхнийКолонтитул =? ТабДок.ВерхнийКолонтитул; ВерхнийКолонтитул.Выводить = Истина; ВерхнийКолонтитул,ТекстСлева = "Отчетсоставлен [ВДата] в [&Время]"; НижнийКолонтитул = ТабДок.НижнийКолонтитул; НижнийКолонтитул.Выводить3 Истина; ....... НижнийКолонтитул.ТекстВЦентре = "Страница [&НомерСтраницы] из [&СтраницВсего]"; ТабДок.Напечатать();
Глава 7. Табличный документ 275 В процессе формирования результирующего табличного документа на основе макета могут использоваться методы ВывестиВертикальныйРаздели- тельСтраницО и ВывестиГоризонтальныйРазделительСтраниц(). Эти методы выводят в результирующий документ соответственно верти- кальный и горизонтальный разделители страниц. Например, эти методы могут быть использованы при печати документов, формы которых изначально подразумевают размещение информации на двух страницах. Метод табличного документа КоличествоСтраницО возвращает количе- ство страниц в документе с учетом текущих настроек печати. Использование этого метода может быть полезным перед печатью результирующего таблич- ного документа для информирования пользователя о количестве страниц, которые будут напечатаны. При формировании результирующего табличного документа может возник- нуть задача - создать определенное оформление каждого печатаемого листа документа. Например, каждый лист документа, выводимый на печать, должен содержать однотипную шапку и однотипный подвал, в котором может быть указана итоговая информация по данным, выведенным на этом листе. В этом случае после вывода шапки нужно вывести в табличный документ столько строк, чтобы на текущем печатаемом листе поместилась еще и область подвала. Для решения подобных задач предназначены методы табличного документа ПроверитьВывод () и ПроверитьПрисоединение (). Метод ПроверитьВывод (), примененный к результирующему табличному документу, позволяет определить, поместится ли на одном листе (по высоте) результирующий табличный документ (при текущих настройках печати), если в него вывести документы, переданные в параметре этого метода. Аналогичным образом метод ПроверитьПрисоединение (), примененный к результирующему табличному документу, позволяет определить, поме- стится ли на одном листе (по ширине) результирующий табличный документ (при текущих настройках печати), если к нему присоединить документы, переданные в параметре этого метода. Параметр этих методов может принимать значения типа ТабличныйДоку- мент или Массив. Если необходимо проверить добавление/присоединение одного табличного документа, то этот документ и передается в параметре указанных методов. Если необходимо проверить добавление/присоединение нескольких табличных документов, то в этом случае в параметр метода пере- дается массив, состоящий из добавляемых/присоединяемых документов. Указанные методы возвращают значение типа Булево. Значение Истина говорит о том, что результирующий табличный документ помещается на одну страницу. Значение Ложь говорит о том, что документ не поместится на одну страницу.
276 Решение специальных прикладных задач в «1С:Предприятии 8» Для примера рассмотрим формирование результирующего табличного доку- мента на основе макета, в котором определены три области: Шапка, Строка и Подвал (рис. 7.64). Рис. 7.64. Макет табличного документа Требуется, чтобы каждая страница результирующего табличного документа начиналась с области Шапка, содержала некоторое число областей Строка и заканчивалась областью Подвал, причем каждая страница должна быть макси- мально заполнена данными и не содержать пустых областей внизу страницы. Пример формирования документа по указанным правилам показан в листингах 7.76, 7.77. Листинг 7.76. Пример использования метода «ПроверитьВыводО» &НаКлиенте Процедура ПечатьМакета(Кбманда) ТабДок = ПроверитьВыводДокумента(); ТабДок.Напечатать(); s КонецПроцедуры Листинг 7.77. Пример использования метода «ПроверитьВыводО» ТабМакет = ПолучитьОбщийМакет("Макети); ОбластьШапка = ТабМакет.ПолучитьОбластьСШапка"); ОбластьСтрока = ТабМакет.ПолучитьОбласть(нСтрока*'); ОбластьПодвал=ТабМакет.ПолучитьОбластьСПодвал"); II Сформировать массивобластей для проверки. СтрокаСПодвалом = Новый Массив; СтрокаСПодвалом.Добавить(ОбластьСтрока); СтрокаСПодвалом.Добавить(ОбластьПодвал); ТабДок=Новый ТабличныйДокумент();
Глава 7. Табличный документ 277 II Заполнение параметров области "Шапка”. ОбластьШапка.ТекущаяОбласть.Текст = "ШапкаОтчета"; ОбластьШапка.ТекущаяОбласть.Шрифт = Новый Шрифт(,, Истина); Т абДок. Вывести(ОбластьШапка); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПродажиКомпанииОбороты.Контрагент КАК Контрагент, ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, | СУММА(ПродажиКомпании06ороты.СуммаОборот) КАК Суммарборот . ИЗ РегистрНакопленйя.Продажи.Обороты() КАКПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Номенклатура, ПродажиКомпанииОбороты.Контрагент"; । Выборка = Запрос.Выполнить().Выбрать(); II Цикл обхода данных, выводимых в результирующий документ. Пока Выборка.Следующий() Цикл Если ТабДок.ПроверитьВывод(СтрокаСПодвалом) Тогда II Заполнение значений параметров области "Строка". ОбластьСтрока.ТекущаяОбласть.Текст = Строка(Выборка.Контрагент)+" " +Строка( Выборка. Номенклатура^" '' +Стррка(Выборка.СуммаОборот); ТабДок.Вывести(ОбластьСтрока); Иначе II Заполнение значений параметров области "Подвал". ОбластьПодвал.ТекущаяОбласть.Текст = "ПодвалОтчета"; ОбластьПодвал.ТекущаяОбласть.Шрифт = Новый Шрифт(,, Истина); ТабДок.Вывести(ОбластьПодвал); ТабДок.ВывестиГоризонтальныйРазделительСтраниц(): // Заполнение параметров области "Шапка". ОбластьШапка.ТекущаяОбласть.Текст = "ШапкаОтчета"; ОбластьШапка.ТекущаяОбласть.Шрифт = Новый Шрифт(,, Истина); ТабДок.Вывести(ОбластьШапка); // Заполнение параметров области "Строка". ОбластьСтрока.ТекущаяОбласть.Текст = Строка(Выборка.Контрагент)+"" Н>рока(Выборка. Номенклатура^" " +Строка(Выборка.СуммаОборот); ТабДок.Вывести(ОбластьСтрока); КонецЕсли; КонецЦикла; И Заполнение параметров области "Подвал". ОбластьПодвал.ТекущаяОбласть.Текст = "ПодвалОтчета": ОбластьПодвал.ТекущаяОбласть.Шрифт = Новый Шрифт(,, Истина); Т абДок. Вывести(ОбластьПодвал); Возврат ТабДок; КонецФункции
278 Решение специальных прикладных задач в «^Предприятии 8» Сначала вызывается серверная внеконтекстная функция ПроверитьВы- водДокумента(). В этой функции формируется массив, состоящий из двух областей макета: Строка и Подвал. В цикле вывода области Строка в резуль- тирующий табличный документ выполняется проверка, поместится ли результирующий табличный документ на одну страницу, если к нему доба- вить области Строка и Подвал. В том случае, если документ помещается, выводится область Строка и осуществляется переход к следующему шагу цикла. Если документ не помещается, выводится область Подвал, и формиру- ется следующая страница документа: выводится горизонтальный разделитель страниц, область Шапка и область Строка. Затем результирующий табличный документ возвращается на клиента и печатается. Свойства областей и рисунков табличного документа, управляющие печатью Свойства и методы табличного документа, перечисленные в предыдущем разделе, необходимо применять непосредственно к тому документу, который будет напечатан, т. е. если результирующий табличный документ формируется на основе макета, то оформлять нужно именно результирующий табличный документ, а не макет или области макета. Свойства же областей и рисунков табличного документа, управляющие печатью, могут быть применены как к областям/рисункам результирую- щего табличного документа, так и к областям/рисункам макета или областей макета. При выводе областей макета в результирующий табличный документ значения этих свойств будут сохранены. Рисунки табличного документа имеют свойство ВыводитьНаПечать, которое позволяет управлять выводом рисунка табличного документа на печать. Оно принимает значения типа Булево. Если свойство имеет значение Истина (значение по умолчанию для новых рисунков), рисунок будет напе- чатан. Для рисунков, которые являются примечаниями, управление выводом на печать также осуществляется с помощью этого свойства, однако оно будет использоваться только в том случае, если у табличного документа инте- рактивно включен режим отображения примечаний (Таблица ► Отображать примечания). В противном случае независимо от значения свойства Выво- дитьНаПечать примечания не будут напечатаны. Область ячеек табличного документа обладает свойством Вместе Со Сле- дующим, которое позволяет объединять строки или колонки области таким образом, чтобы при разделении на страницы они всегда оказывались на одной странице. Следует учитывать, что это свойство применимо только к областям строк или областям колонок. По умолчанию свойство имеет значение Ложь. Для того чтобы объединение было выполнено, его необходимо установить в значение Истина. Также область ячеек табличного документа имеет свойства КонецСтра- ницы и НачалоСтраницы. Эти свойства принимают значения типа Булево
Глава 7. Табличный документ и применимы только для областей строк/колонок. Значение свойства КонецСтраницы, равное Истина, говорит о том, что данная область является последней на странице. Значение свойства НачалоСтраницы, равное Истина, говорит о том, что данную область необходимо выводить с новой страницы. Использование табличного документа в форме Для отображения табличного документа в форме необходимо создать реквизит типа ТабличныйДокумент и связать его с полем формы вида Поле таблич- ного документа. При этом к функциональности табличного документа, которая была описана выше, добавляются возможности, связанные с наличием контекста формы и модуля формы: обработка событий, возникающих при манипулировании табличным доку- ментом, в частности: □ обработка расшифровки, □ обработка нажатий в табличном документе. Реквизит типа ТабличныйДокумент содержит в себе табличный документ, которым он управляет, а связанное с ним поле формы вида Поле табличного документа отображает содержимое табличного документа. Например, необходимо сформировать и отразить в форме обработки данные о продажах номенклатуры контрагентам с возможностью расшифровки данных по номенклатуре и контрагенту. Этот пример можно посмотреть в демонстрационной конфигурации «Геогра- фические схемы и диаграммы», прилагающейся к книге на компакт-диске, в обработке Работа с табличным документом, на закладке Табличный документ в форме. Для этого создадим реквизит формы Результат типа ТабличныйДокумент. Перетащим реквизит в дерево элементов формы и получим поле формы вида Поле табличного документа, связанное с этим реквизитом. Это поле будет отображать табличный документ в форме обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатию которой табличный документ будет заполняться данными о продажах. В обработчике команды напишем следующий код (листинг 7.78). Листинг 7.78. Обработчик команды «Сформировать»
280 Решение специальных прикладных задач в «^Предприятии 8» По команде Сформировать вызывается внеконтекстная серверная функция ЗаполнитьОтчет(), которая подробно рассматривалась в разделе «Исполь- зование расшифровки в табличном документе» на стр. 265. Здесь она приводится еще раз (листинг 7.79). Листинг 7.79. Функция «ЗаполнитьОтчет()» &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос; Запрос. Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, ! | ПродажиКомпанииОбороты.Контрагёнт.Представление КАК | КонтрагентПредставление, ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, ПродажиКомпанииОбороты.Номенклатура.Представление КАК НоменклатураПредставление, СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания) КАК ПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Номенклатура, ПродажиКомпанииОбороты.Контрагент ИТОГИ СУММА(СуммаОборот) ПО Контрагент, Номенклатура"; Запрос.УстановитьПараметр("ДатаНачала", '2011.09.14 00:00:00'); Запрос.УстановитьПараметр("ДатаОкончания", '2011.09.15 23:59:59'); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); • . ' ’ ': ?. • •. • .. ; О’; . . . : • о .. .. . ...; . * / . * ; •, . ’ ’. *. : • *’ “ ..... •• '• • • • * > '!' ' ... . \ ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("Макет"); ОбластьКонтрагент = ТабМакет.ПолучитьОбласть("Контрагент"); ОбластьНоменкпатура = ТабМакет.ПолучитьОбласть("Номенклатура"); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.СледующиЭД) Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); // Установить расшифровку поля "Контрагент" группировки "Контрагент". ОбластьКонтрагент.Параметры.РасшифровкаКонтрагентаВыборка.Контрагенг ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Глава 7. Табличный документ 281 Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); II Установить расшифровку полей "Контрагент” и "Номенклатура” //группировки "Номенклатура".. ОбластьНоменклатура.Параметры.РасшифровкаКонтрагента = ВыборкаНоменклатура.Контрагент; ОбластьНоменклатура .Параметры.РасшифровкаНоменклату ры = ВыборкаНоменклатура.Номенклатура; ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); Возврат ТабДок; Г КонецФункции Табличный документ, сформированный в этой функции, возвращается на клиента и присваивается реквизиту Результат. После этого табличный доку- мент автоматически отображается в форме обработки в поле табличного документа (рис. 7.65). Работа с табличным документом - Ко. (1 С Предприятие) —А Р< )6ога с табличным документом Все действия Свойства табличного документа Т абличный документ в форме Сформировать 1 С: Бухгалтерия 7.7 Базовая версия Доставка Консультации по настройке ОС Windiws Windows ХР Professional Russian CD Консультации по настройке 1С Windows ХР Home Edition Russian UPG CD 1 С: Аспект 7 7 1 С: Бухгалтерия 7.7 Базовая версия Доставка Консультации по настройке ОС Wndiws Windows ХР Professional Russian CD Консультации по настройке 1С Windows ХР Home Edition Russian UPG CD 1 С: Аспект 7.7 Рис. 7.65. Формирование табличного документа в форме Никитин Юрий Никитин Юрий Никитин Юрий Никитин Юрий Никитин Юрий Никитин Юрий Никитин Юрий Никитин Юрий Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ 19 455 700 20 15 000 235 200 1 700 1 600 11 950 500 400 6 000 350 800 1 900 2 000 -г 5 •! Vi I № б
282 Решение специальных прикладных задач в «^Предприятии 8» Для того чтобы открыть табличный документ, содержащийся в форме, в отдельном окне, нужно вывести его в новый табличный документ, а затем показать этот документ (листинги 7.80, 7.81). Листинг 7.80. Показ табличного документа, содержащегося в форме, в отдельном окне &НаКлйенте Процедура Показать(Команда) ТабДок=ОткрытьВНовомОкне(); ТабДок.Показать(); КонецПроцедуры Листинг 7.81. Показ табличного документа, содержащегося в форме, в отдельном окне &НаСервере Функция ОткрытьВНовомОкне() ТабДок = Новый ТабличныйДокумент(); ТабДа<уВывести(Результат); Возврат ТабДок; КонецФункции Использование события «ПриАктивизацииОбласти» Поле табличного документа обладает рядом событий, которые могут быть обработаны в обработчиках, расположенных в модуле формы. Прежде всего, это событие ПриАктивизацииОбласти. Оно возникает при смене текущей области табличного документа. Смена текущей области проис- ходит, например, при нажатии клавиш управления курсором, при нажатии мыши, при нажатии клавиши табуляции и т. д. В обработчик события передается элемент управления, вызвавший это событие, в данном случае - поле табличного документа. Свойство Теку- щаяОбласть поля табличного документа будет содержать ту область, которая стала текущей в результате смены текущей области. Таким образом, в обработчике события ПриАктивизацииОбласти можно проанализировать текущую область поля табличного документа и выполнить необходимые действия. При этом следует помнить, что текущей областью может быть как область ячеек табличного документа, так и рисунок таблич- ного документа (листинг 7.82).
Глава 7. Табличный документ 283 Листинг 7.82. Пример использования обработчика события «ПриАктивизацииОбласти» поля табличного документа Процедура РезультатПриАктивизацииОбласти(Элемент) ТекОбласть = Элемент.ТекущаяОбласть; Если ТипЗнч(ТекОбласть) = Тип(”ОбластьЯчеекТабличногоДокумента") Тогда //...алгоритм обработки ИначеЕсли ТипЗнч(ТекОбласть) = Тип(''РисунокТабличногоДокумента") Т°ГДЭ //...алгоритм обработки КонецЕсли; КонецПроцедуры Событие возникает на клиенте. В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере. Использование события «Выбор» Событие Выбор поля табличного документа возникает при выборе какой- либо области или рисунка табличного документа. Если для области или рисунка табличного документа разрешен только просмотр и установлено свойство Гиперссылка, то выбор осуществляется по одинарному щелчку мыши или нажатию клавиши Enter. В остальных случаях выбор осуществля- ется по двойному щелчку мыши или при нажатии клавиши Enter. В процедуру обработки события Выбор передаются три параметра: Элемент - поле табличного документа, которое вызвало это событие; Область - область/рисунок табличного документа, для которого был выполнен выбор; Стандартная обработка - признак выполнения стандартных действий при выборе. По умолчанию имеет значение Истина. Это означает, что будет начато редактирование выбранной области/рисунка табличного документа (в том случае, если редактирование разрешено). В обработ- чике события Выбор этот параметр может быть установлен в значение Ложь - тогда редактирование выбранной области/картинки осущест- вляться не будет. В качестве примера использования события Выбор можно рассмотреть сохранение рисунка, выведенного в табличный документ, при клике на нем мышью. Для этого свойство Гиперссылка рисунка должно быть установ- лено в значение Истина, а результирующий табличный документ не должен иметь возможности редактирования (листинг 7.83).
284 Решение специальных прикладных задач в «ЮПредприятии 8» Листинг 7.83. Пример использования обработчика события «Выбор» поля табличного документа Процедура ПолеТабличногоДокументаВыбор(Элемент, Область, СтандартнаяОбработка) Если ТипЗнч(Область) * Тип("РисунокТабличногоДокумента") Тогда ЁслИО^ластьТйпРисунка^ТипРисункаТабличногоДокумедта.КартинкаТогда II Организовать диалог выбора файла для сохранения картинки. Диалог = НовыйДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); Диалог.Заголовок="Сохраненение рисунка"; II Получить строковое представление формата картинки. ФорматРисунка = НРег(Строка(Область.Картинка.Формат())); Если ФорматРисунка = ФорматКартинки.НеизвестныйФормат Тогда Предупреждение("Формат картинки неизвестен, | задайте расширение сохраняемого файла самостоятельно**); Иначе Диалог.Фильтр = "Рисунок (*.** + ФорматРисунка + *')]*.** + ФорматРисунка; КонецЕсли; II Сохранить картинку в файл. Если Диалог.Выбрать() Тогда Область.Картинка.Записать(Диалог.ПолноеИмяФайла +Диалог.Расширение); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры Следует иметь в виду, что если событие Выбор возникает в результате нажатия мыши в поле табличного документа, то сначала будет вызвано событие ПриАктивизацииОбласти поля табличного документа. Причем если активизируемая область допускает редактирование, то двойной клик мышью в этой области вызовет два события ПриАктивизацииОбласти и одно событие Выбор (рис. 7.66). Рис. 7.66. Последовательность вызова событий
Глава 7. Табличный документ 285 Расшифровка в поле табличного документа Событие Обработка Расшифровки вызывается в результате выпол- нения расшифровки области/рисунка табличного документа (подробнее про расшифровку можно прочитать в разделе «Использование расшифровки в табличном документе», с. 265). В событие передаются три параметра: Элемент, Расшифровка и Стан- дартнаяОбработка. Параметр Элемент содержит поле табличного документа, которое вызвало это событие. Параметр Расшифровка содержит значение параметра расшифровки области/рисунка табличного документа. Параметр СтандартнаяОбработка содержит по умолчанию значение Истина и определяет необходимость выполнения стандартной обработки расшифровки (для значений примитивных типов стандартной обработкой является отображение этих значений в отдельном окне; для ссылочных значений будет открыта основная форма объекта, используемая для редакти- рования данных объекта). Как правило, целью алгоритма, выполняемого в обработке расшифровки, является получение некоторых дополнительных, уточняющих данных для определенной ячейки или области отчета. Поэтому значением параметра расшифровки в этом случае является, как правило, структура, содержащая необходимую информацию. Например, для отчета о продажах номенклатуры по контрагентам значе- нием параметра расшифровки ячейки, содержащей сумму оборота товаров, проданных контрагенту (листинг 7.84), может быть структура следующего вида (табл. 7.6). Таблица 7.6. Структура, передаваемая в параметр расшифровки Ключ Значение Контрагент Никитин Юрий Номенклатура Консультации по настройке 1С СуммаОборот 200 Листинг 7.84. Пример заполнения расшифровки при выводе в поле табличного документа &НаСервереБезКонтекста Процедура ОтчетСРасшифровкой(ТабДок) Запрос = Новый Запрос; Запрос-Текст = "ВЫБРАТЬ ПродажиКомпанииОбороты.Контрагент КАК Контрагент, ПродажиКомпанииОбороты.Контрагент.ПредставлениеКАККонтрагентПредставление, ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура,
286 Решение специальных прикладных задач в «ЮПредприятии 8» ПродажиКомпанииОбороты.Номенклатура.ПредставлениеКАК НоменклатураПредставление, СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Номенклатура, ПродажиКомпанииОбороты.Контрагент ИТОГИ СУММА(СуммаОборот) ПО Контрагент, Номенклатура"; Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); ТабМакет = ПолучитьОбщийМакет("Макет"); ОбластьКонтрагент = ТабМакет.ПолучитьОбласть("Контрагент"); ОбластьНоменклатура = ТабМакет.ПолучитьОбластьС'Номенклатура"); ТабДок. Очистить(); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); // Установить расшифровку поля "Контрагент" группировки "Контрагент". СтрукгураРасшифровки = Новый Структура; СтрукгураРасшифровки.Вставить("Контрагент", Выборка.Контрагент); СтруктураРасшифровки.Вставить("Номенклатура", Неопределено); СтруктураРасшифровки.Вставить("СуммаОборот", Неопределено); ОбластьКонтрагент.Параметры.РасшифровкаКонтрагента = СтрукгураРасшифровки; II Установить расшифровку поля СуммаОборот группировки "Контрагент". СтрукгураРасшифровки = Новый Структура; СтруктураРасшифровки.Вставить("Контрагент,,1 Выборка.Контрагент); СтруктураРасшифровки.Вставить^Номенклатура", Неопределено); СтруктураРасшифровки.Вставить("СуммаОборот", Выборка.СуммаОборот); ОбластьКонтрагент.Параметры.РасшифровкаСуммы = СтрукгураРасшифровки; ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка. Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Вь!боркаНбМенклатура.Спёдую^ ОбластьНоменклатура.Параметрь1.3аполнить(ВыборкаНоменкла // Установить расшифровку поля "Контрагент* группировки "Номенклатура". СтрукгураРасшифровки=Новый Структура; , Струкгу^расявйфр6вки.Вставить(пк6н^рагент"?ВыбрркаНомен1шатураХонтрагент)* СтруктураРасшифровкИ/ВставиТьСНоменклатура^^еопредёлено);
Глава 7. Табличный документ 287 СтруктураРасшифровки.Вставить("СуммаОборот", Неопределено); ОбластьНоменклатураЛараметры.РасшифровкаКонтрагента = СтруктураРасшифровки; //Установить расшифровку поля "Номенклатура" группировки "Номенклатура". СтруктураРасшифровки = Новый Структура; СтруктураРасшифровки.Вставить("Контрагент"1ВыборкаНоменклатура.Контрагент); СтруктураРасшифровки.Вставиь^ ВыборкаНоменклатура.Номенклатура); СтруктураРасшифровки.ВставитьрСуммаОборот’', Неопределено); ОбластьНоменклатураЛараметрь1.РасшифровкаНомен^^ * СтруктураРасшифровки; // Установить расшифровку поля СуммаОборот группировки "Номенклатура". СтруктураРасшифровки = Новый Структура; СтруктураРасшифровки.Вставить("Контрагент",ВыборкаНоменклатура.Контрагент); СтруктураРасшифровки.Вставить("Номенклатура", ВыборкаНоменклатура.Номенклатура); СтруктураРасшифровки.Вставить("СуммаОборот", ВыборкаНоменклатура.СуммаОборот); ОбластьНоменклатура.Параметры.РасшифровкаСуммы = СтруктураРасшифровки; ТабДок.Вывести(ОбластьНоменкпатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСгрок(); КонецПроцедуры Отчет формируется во внеконтекстной процедуре ОтчетСРасшифровкойО, которая вызывается по команде Расшифровка. В процедуру передается реквизит Результат, содержащий табличный документ. Табличный документ заполняется данными отчета, а также формируется структура расшифровки для полей табличного документа. Затем его содержимое автоматически отображается в форме обработки в поле табличного документа Теперь требуется обеспечить нестандартное поведение системы по обработке расшифровки значений, содержащихся в полях табличного документа. Для этого нужно создать обработчик события ОбработкаРасшифровки у поля формы табличного документа (листинг 7.85).
Решение специальных прикладных задач в «^Предприятии 8» Листинг 7.85. Пример процедуры обработки события «ОбработкаРасшифровки» Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) Если Не ТипЗнч(Расшифровка) = Тип("Структура") Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; Контрагент = Расшифровка.Контрагент; Номенклатура = Расшифровка.Номенклатура; Сумма = Расшифровка.СуммаОборот; ТабДок = ПоказатьПродажиТоваров(Контрагент, Номенклатура, Сумма); ТабДок.ТолькоПросмотр = Истина; ТабДок.Показать(); КонецПроцедуры В этом обработчике нестандартная обработка расшифровки (Стандарт- наяОбработка = Ложь) обеспечивается только в случае, если в параметре Расшифровка содержится структура. В этом случае обработка расшифровки, например, может вызывать выпол- нение процедуры, формирующей отчет о продажах номенклатуры выбранному контрагенту с детализацией по регистратору (листинг 7.86). Листинг 7.86. Процедура «ПоказатьПродажиТоваров()» &НаСервереБезКонтекста Функция ПоказатьПродажиТоваров(Контрагент, Номенклатура, Сумма) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Регистратор КАК Регистратор, | ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, СУММА(ПродажиКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот, СУЖА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты(,, Регистратор) КАК ПродажиКомпанииОбороты ГДЕ ПродажиКомпанйиОбороты.Контрагент ~ ^Контрагент СГРУППИРОВАТЬ ПО ПродажиКомпанииОбороты.Регистратор, ПродажиКомпанииОбороты.Номенклатура ИТОГИ; СУММА(СуммаОборот), СУММА(КоличествоОборот) Регистратор, Номенклатура";
Глава 7. Табличный документ 289 Запрос.УстановитьПараметр("Контрагент", Контрагент); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("МакетРасшифровка"); Область = ТабМакет. ПолучитьОбласть("Заголовок"); ОбластьДокумент = ТабМакет.ПолучитьОбласть(''Документ"); ОбластьНоменклатура = ТабМакет.ПолучитьОбласть("Номенклатурап); Область.Параметры.Контрагент = Контрагент; ТабДок.Вывести(Область); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий^) Цикл ОбластьДокумент.Параметры.Заполнить(Выборка); // Установить расшифровку поля "Регистратор" группировки "Документ". ОбластьДокумент.Параметры . РасшифровкаДокумента = Выборка .Регистратор; ТабДок.Вывести(ОбластьДокумент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); II Установить расшифровку полей "Регистратор" и "Номенклатура" //группировки "Номенклатура". ОбластьНоменклатура.Параметры.РасшифровкаДокумента = ВыборкаНоменклатура.Регистратор; ОбластьНоменклатура.Параметры.РасшифровкаНоменклатуры = ВыборкаНоменклатура.Номенклатура; ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); Возврат ТабДок; КонецФункции
Решение специальных прикладных задач в «^Предприятии 8» В результате будет получен табличный документ с данными о продажах номенклатуры контрагенту с детализацией по регистратору, в котором при двойном щелчке по ячейкам, содержащим представление документа или номенклатуры, будет открываться форма для просмотра и редактирования данных соответствующего элемента справочника, т. е. будет выполняться стандартная обработка расшифровки (рис. 7.67). L. ! 1J Продажи контрагенту "Автохозяйство №34' Расходная накладная 00023 от 13.09.2011 0:00:00 Расходная накладная 00023 от 1 Клавиатура LK-601 КВ-2000 PS/2 Расходная накладная 00023 от 1 Монитор 17' Philips 107S20 Расходная накладная 00023 от 1 Монитор 19' Hitachi СМ715ЕТ Расходная накладная 00023 от 1 Мышь GENIUS “EASY" (3 кнопки), Расходная накладная 00023 от 1 Мышь Ice Mouse MUS-2 Расходная накладная 00023 от 1 Ноутбук Rover Computers Explorer Расходная накладная 00023 от 1 Лазерный принтер 5250197-203 Minolta-QMS Расходная накладная 00023 от 1 Лазерный принтер HP LaserJet 2200 Расходная накладная 00023 от 1 Сист. блок IBM NetVista А22р Расходная накладная 00023 от 1 Сист. блок IBM NetVista М41 , . _ Расходная накладная 00028 от 13.09.2011 0:00:00 '. 14 . | Расходная: накладная 001Й28 от ^Windows ХР Home Edition Russian CD I 15 1 Расходная накладная 0002\рт IWindows XP Home Edition Russian UPG CD I J 6 !___Расходная накладная 00028 o1\] Windows XP Professional Russian CD LJ7.T I 18 I pg-1 I 20 I I 21 L 1. £ s' L.6 _7_ .8 9' 10 11 ! 13 19 4 1 3 2 2 1 1 1 2 2 6 2 2 2 ’’^сходная накладная 00028 от... (1С:ПредприяГие) 9 719 20 210 1 050 4 3 1 599 415 830 , /X 2 7001 2 888| 9801 3401 170| 4701 Г 23 | [J4J I 25 J { 26 1 ' 27.J 28 | 29 L?q"! ~3i i „32j 33. ) „34Э ’35' I Расходная накладная 00028 от 13.09.2011 0:00:00 Провести и закрыть Провести Все действия ’ . ? ' Номер: '.00028 Дата: 113.09.2011 О Д Контрагент: 'Автохозяйство N-34 Все действия 36 i I 37 "I га , Номенклатура I Windows ХР Professional Russian CD Windows XP Home Edition Russian CD ' Windows XP Home Edition Russian UPG CD • Количество : Цена ; 2,00 2,00 2,00 235,00 170.00 85,00 > Сумма 470.00 340,00 170,00 г1 1 I 2 2 4 0 Добавить X I ‘Йк ф N 1 2 3 Рис. 7.67. Отчет о продажах номенклатуры контрагенту с детализацией по регистратору При обработке события ОбработкаРасшифровки также нужно иметь в виду, что перед вызовом события ОбработкаРасшифровки будет вызвано событие Выбор, а если событие ОбработкаРасшифровки возникает в результате нажатия мыши в поле табличного документа, то сначала будет вызвано событие ПриАктивизацииОбласти поля табличного документа. Причем если активизируемая область допускает редактирование, то двойной щелчок мышью в этой области вызовет два события ПриАктивиза- цииОбласти, событие Выбор и событие ОбработкаРасшифровки (рис. 7.68).
Глава 7. Табличный документ Рис. 7.68. Последовательность вызова событий Перетаскивание в табличном документе Поле табличного документа поддерживает механизм перетаскивания, который позволяет с помощью мыши переносить значения из/в табличный документ. В качестве примера можно рассмотреть формирование документа Заказ, при котором значения номенклатуры перетаскиваются в табличную часть доку- мента мышью из сформированного отчета о продажах номенклатуры. Предположим, что для формирования отчета о продажах номенклатуры используется некоторая обработка, ее форма содержит поле табличного доку- мента, в которое и выводится отчет об остатках. Документ Расходная Накладная также имеет форму документа, содержащую таблицу с полем Номенклатура, связанную с данными табличной части документа Состав (рис. 7.69). Рис. 7.69. Форма документа и отчет о продажах номенклатуры Как таблица, расположенная в форме документа, так и поле табличного доку- мента, расположенное в форме обработки, имеют два свойства, которые
292 I Решение специальных прикладных задач в «1С:Предприятии 8» управляют возможностью перетаскивания. Это свойства РазрешитьНа- чалоПеретаскивания и РазрешитьПеретаскивание. Свойство РазрешитьНачалоПеретаскивания управляет источником данных, а свойство РазрешитьПеретаскивание - приемником. В нашем случае источником данных будет являться поле табличного документа, поэтому его свойство РазрешитьНачалоПеретаскивания должно быть установлено в значение Истина. Приемником данных будет являться таблица формы документа, поэтому ее свойство РазрешитьПеретаскивание также должно быть установлено в значение Истина (рис. 7.70). РазрешитьПеретаскивание = Истина РазрешитьНачалоПеретаскивания = Истина Рис. 7.70. Установка свойств, управляющих перетаскиванием В процессе перетаскивания система генерирует четыре события: НачалоПе- ретаскивания, ПроверкаПеретаскивания, Перетаскивание и ОкончаниеПеретаскивания. Два из этих событий генерируются в источ- нике, а два - в приемнике (рис. 7.71). РазрешитьПеретаскивание = Истина РазрешитьНачалоПеретаскивания = Истина Рис. 7.71. События, сопровождающие перетаскивание
Глава 7. Табличный документ 293 Эти события содержат различные параметры, но общим для всех событий является параметр ПараметрыПеретаскивания, который позволяет анали- зировать действия, выполняемые при перетаскивании, и управлять процессом перетаскивания. Этот параметр содержит объект ПараметрыПеретаскивания, который имеет три свойства. Значение - в этом свойстве содержится перетаскиваемое значение. В нашем случае таким значением будет табличный документ, состоящий из одной ячейки - той, которую перетаскивают. Действие - это свойство имеет тип системного перечисления Дейст- вияПеретаскивания и определяет текущее действие перетаскивания. Текущее действие перетаскивания зависит от того, каким образом пользова- тель выполняет перетаскивание, и оно может принимать различные значения в каждом из обработчиков событий перетаскивания. Если перетаскивание выполняется правой кнопкой мыши, то свойство Действие будет иметь значение Выбор. Это означает, что в результате перетаскивания будет открыто контекстное меню, из которого пользователь сможет выбрать необходимое действие (например, копирование, переме- щение или отмена), рис. 7.72. Рис. 7.72. Выбор действия из контекстного меню Если перетаскивание выполняется левой клавишей мыши с нажатой клавишей Control, то свойство Действие будет иметь значение Копирование. Если перетаскивание выполняется только левой клавишей мыши, то свойство Действие будет иметь значение Перемещение.
294 Решение специальных прикладных задач в «1С:Предприятии 8» Свойство Действие может принимать еще одно значение - Отмена. Это значение может быть установлено только средствами встроенного я^ыка или системой в результате анализа условий перемещения. Значение Отмена озна- чает, что перетаскивание ие может быть выполнено. Свойство ДопустимыеДействия объекта ПараметрыПеретаскивания определяет те действия, которые в принципе допускается выполнять при перетаскивании. Это свойство принимает значения системного перечисления ДопустимыеДействияПеретаскивания (табл. 7.7). Значение этого свой- ства, установленное системой по умолчанию или заданное разработчиком при обработке события НачалоПеретаскивания, будет одним и тем же во всех обработчиках событий перетаскивания (если, конечно, разработчик не изменит его явным образом в одном из обработчиков). Таблица 7.7. Значения системного перечисления «ДопустимыеДействияПеретаскивания» Значение Пояснение Копирование Допускается только копирование КопированиеИПеремещение Допускается копирование или перемещение Перемещение Допускается только перемещение НеОбрабатывать Не осуществляется никаких действий В каждом обработчике события перетаскивания система анализирует значение свойств Действие и ДопустимыеДействия на непротиворечивость. Допу- скаются следующие сочетания значений (табл. 7.8). Таблица 7.8. Сочетания значений свойств «ДопустимыеДействия» и «Действие» ДопустимыеДействия Действие КопированиеИПеремещение Копирование Перемещение Выбор Отмена Копирование Копирование Выбор Отмена Перемещение Перемещение Выбор Отмена НеОбрабатывать Отмена Если допустимым действием является копирование, а действие пере- мещение, будет выполняться копирование. Если допустимым действием является перемещение, а действие - копирование, будет выполняться пере- мещение.
Глава 7. Табличный документ | 295 Кроме непротиворечивости значений перечисленных свойств, системой принимается во внимание то, какие данные содержатся в источнике и прием- нике. Например, при перетаскивании из поля табличного документа, открытого в режиме Только просмотр, система позволит выполнить лишь копирование (или не выполнять никаких действий). При перетаскивании в таблице формы, содержащей, например, список документов, система не позволит выполнить копирование. В то же время при перетаскивании в таблице формы, источ- ником данных которой является таблица значений, содержащая необъектные данные, копирование будет разрешено. Также если, например, в таблице, источником данных которой является иерархический справочник, выполня- ется перетаскивание группы справочника в элемент справочника, система запретит любые действия, кроме отмены. В результате анализа непротиворечивости действий и данных источника и приемника система определяет, какое же действие перетаскивания будет выполняться. В соответствии с этим система изменяет форму курсора. Если определено, что будет выполняться копирование, курсор отображается с пиктограммой копирования (рис. 7.73). Рис. 7.73. Копирование Если определено, что будет выполняться перемещение или выбор, курсор отображается с пиктограммой перемещения (рис. 7.74). Действие Выбор не имеет отдельной пиктограммы.
296 | Решение специальных прикладных задач в «^Предприятии 8» Рис. 7.74. Перемещение Если определено, что будет выполняться отмена, то курсор отображается пиктограммой, изображающей перечеркнутую окружность (рис. 7.75). Рис. 7.75. Отмена перетаскивания Для формирования отчета будем использовать макет, в котором для ячейки, содержащей параметр Номенклатура, указано, что она содержит значение типа СправочникСсылка.Номенклатура (рис. 7.76).
Глава 7. Табличный документ 297 Рис. 7.76. Макет отчета Именно эти значения разрешено будет перетаскивать в форму документа. Для этого следует воспользоваться событием НачалоПеретаскивания поля табличного документа. В нем нужно проанализировать перетаскива- емую область и разрешить перетаскивание только в том случае, если область содержит значение. Событие НачалоПеретаскивания поля табличного документа поставляет три параметра. Элемент - элемент управления, вызвавший событие; в нашем случае поле табличного документа. ПараметрыПеретаскивания - параметры перетаскивания. СтандартнаяОбработка - признак выполнения стандартной обработки. Стандартная обработка заключается собственно в начале перетаскивания данных. По умолчанию имеет значение Истина. Для того чтобы разрешить перетаскивание только ячеек табличного доку- мента, содержащих значения номенклатуры, проанализируем признак СодержитЗначение текущей области табличного документа. Если область не содержит значение, перетаскивание выполнять не будем (листинг 7.87).
298 Решение специальных прикладных задач в «^Предприятии 8» Листинг 7.87. Обработчик события «НачалоПеретаскивания» Процедура РезультатНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) Если ПараметрыПеретаскивания.Значение.ТекущаяОбласть.СодержитЗначение = Ложь Тогда СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры После того как обработано событие НачалоПеретаскивания, у прием- ника (в нашем случае - таблица формы документа) будет вызвано событие ПроверкаПеретаскивания. Это событие вызывается всякий раз, когда курсор попадает на новый объект в элементе управления (например, в новую ячейку таблицы), а также при нажатии и отпускании клавиши Control. Событие ПроверкаПеретаскивания табличного поля поставляет пять параметров. Элемент - элемент управления, вызвавший событие; в нашем случае таблица формы документа. ПараметрыПеретаскивания - параметры перетаскивания. СтандартнаяОбработка - признак выполнения стандартной обра- ботки. Стандартная обработка заключается в проверке возможности вставки значения, т.е. проверяется тип вставляемого значения, и если он совпадает с типом отображаемых данных, то производятся стандартные действия. Строка - строка, над которой находится курсор. Содержит порядковый номер строки или Неопределено. Поле - поле управляемой формы, с которым связана данная колонка таблицы, над которой находится курсор, или Неопределено. Так как в нашем случае источником данных таблицы является объект ДокументТабличнаяЧасть .РасходнаяНакладная.Состав, а пере- таскиваемое значение имеет тип Табличный документ, то стандартную обработку необходимо отключить и установить действие перетаскивания вручную. Например, можно разрешить перетаскивание только в том случае, если курсор находится над областью таблицы, не содержащей строк (листинг 7.88). Листинг 7.88. Обработчик события «ПроверкаПеретаскивания» Процедура СоставПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) СтандартнаяОбработка = Ложь; Если Строка <> Неопределено И Объекг.Состав.Количество() <> 0 Тогда
Глава 7. Табличный документ 299 ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена; Иначе ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование; КонецЕсли; КонецПроцедуры При отпускании клавиши мыши у приемника (в нашем случае - таблица формы документа) будет вызвано событие Перетаскивание. Обработчик этого события может быть использован для того, чтобы заполнить приемник данными, если способ заполнения отличается от стандартного. Обработчик этого события имеет такие же параметры, что и обработчик события ПроверкаПеретаскивания. В нашем случае необходимо отказаться от выполнения стандартной обработки (т. к. тип данных табличного поля не совпадает с типом перетаскиваемого значения) и заполнить приемник данными самостоятельно (листинг 7.89). Листинг 7.89. Обработчик события «Перетаскивание» Процедура СоставПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) ПараметрыПеретаскивания.Действие=Дейст8иеПеретаскивания.Копирование; Т абДок = ПараметрыПеретаскивания.Значение; Значение = ТабДок.ТекущаяОбласть.Значение; НоваяСтрока = Объект.Состав.Добавить(); НоваяСтрока.Номенклатура = Значение; НоваяСтрока.Количество = 1; КонецПроцедуры
Д. И. Гончаров, Е. Ю. Хрусталева Решение специальных прикладных задач в «1С:Предприятии 8.2» Подписано в печать 27.12.2011. Формат 60x84 1/16. Печ. л. 18,75. Тираж 5 000 экз. Заказ И-18. Налоговая льгота — общероссийский классификатор продукции ОК 005-93, том 2; 95 3005 - литература учебная. Издательство ООО «1С-Паблишинг» 127473, Москва, ул. Достоевского, 1/21, строение 1 По вопросам розничного приобретения книг, выпускаемых издательством фирмы «1С» (ООО «1С-Паблишинг»), обращайтесь в книжные и интернет-магазины, кпартнерам-1С:Франчайзии в отдел продаж фирмы «1С». Фирма «1С» 123056, Москва, а/я 64, Отдел продаж: Селезневская ул., 21 (м. «Достоевская». «Новослободская») Тел.: (495)737-9257, факс: (495) 681-4407 e-mail: 1с(<7'lc.ru. www.lc.ru По вопросам оптовых закупок учебных и методических пособий по программным продуктам фирмы «1С» обращайтесь в ООО «1С-Паблишинг»: 127473, Москва, ул. Достоевского, 1/21, строение 1 Тел.: (495) 681-02-21, факс: (495) 681-44-07 e-mail: publishing^ lc.ru books.lc.ru Отпечатано с оригиналов ООО «Ю-Паблишинг». Казанский производственный комбинат программных средств. 420044, Казань, ул. Ямашева, 36.