Transcription
В этом видео я вам покажу, как в 1С можно достаточно быстро разработать вот такой простой, но наглядный дашборд. Меня зовут Ваня, это канал Iron Skills. Здесь мы рассказываем про разработку в 1С. Погнали.
Итак, нам нужно разработать вот такой дашборд. На нём нужно показывать четыре диаграммы. График заказов по месяцам. Дальше круговая диаграмма, которая показывает продажа по контрагентам. Динамика продаж - это гистограмма, где за каждый месяц показывается сумма продаж в виде столбика. И продажа по менеджерам - это кольцевая диаграмма, которая показывает сумму продаж в разрезе менеджеров.
Приступаем к разработке. Первое, с чего можно начать - это создать внешнюю обработку, в которой мы реализуем всё, что нам потребуется, потому что это удобно тестировать. То есть обработку я потом смогу открыть в режиме предприятия, проверить и вот так постепенно реализовывать весь функционал. А потом её сделаем частью конфигурации, чтобы не надо было постоянно открывать внешнюю обработку.
Итак, поехали. Файл новый. Внешняя обработка. Называем её демо. Нижнее подчёркивание, дашборд. В синониме небольшую корректировку тоже сделаем, чтобы это выглядело красивее. И создаём форму обработки.
Для того, чтобы на форме показать диаграмму, нужно создать реквизит формы с таким типом. Добавляем реквизит. Назовём первый реквизит динамика продаж. Тип у него указываем. Диаграмма. Точно таким же способом создаём ещё три реквизита, потому что нам нужно на форме разместить четыре диаграммы. Второе назовём так: заказы по месяцам. Тип укажем тоже диаграмма. Дальше следующий реквизит продажи по контрагентам. Тип тоже указываем диаграмма. И последний реквизит продажи по менеджерам. Это тип тоже диаграмма.
Теперь, чтобы разместить диаграммы на форме, я просто выделяю четыре реквизита и перетаскиваю их в дерево элементов. И у нас на форме появляется четыре диаграммы. Дальше для них имеет смысл отключить заголовок. Это текст, который показывается над диаграммой, потому что в диаграмме можно показать заголовок внутри. Это более красиво будет. Поэтому положение заголовка для этих элементов выбираем. Нет.
Следующий этап - это взаимное расположение диаграмм. Нам нужно их расположить вот так. Слева заказы по месяцам и динамика продаж, а справа продажи по контрагентам и продажи по менеджерам. Чтобы добиться такого расположения, можно поступить так. Создаём сначала группу первую. Эта группа будет называться колонки. Для этой группы выбираем группировка горизонтальная всегда. И внутри добавляем две вложенные группы, тоже без отображения. Это первая колонка. и вторая колонка. Теперь для первой и второй колонки мы указываем группировку вертикальную. И теперь нам нужно сделать так, чтобы заказы по месяцам и динамика продаж были слева. Поэтому мы выделяем заказы по месяцам и динамику продаж и перетаскиваю в первую колонку, а во вторую колонку перемещаем продажи по контрагентам и продажи по менеджерам. И вот в итоге мы добились нужного расположения.
Следующий этап - это настройка самих диаграмм. То есть нам нужно для каждой диаграммы выбрать её тип. Что это будет? график, круговая диаграмма, гистограмма или кольцевая, плюс настроить заголовок, что он должен располагаться над диаграммой и должен быть вот таким жирным шрифтом выделен. Это выполняется на уровне свойств реквизитов формы.
Начнём с динамики продаж, либо даже давайте начнём с заказов по месяцам. Это левый верхний угол. Итак, заказы по месяцам, свойства, объект, настройка. Первое, что можем сделать - это выбрать тип диаграммы. Заказа по месяцам - это должен быть график. Поэтому выбираем тип диаграммы. График. Дальше, чтобы появился заголовок, нужно переключиться в группу настроек область заголовка диаграммы и прописать текст заголовка заказы по месяцам. По умолчанию он показывается справа. Чтобы показать его над диаграммой и сделать жирным, переключаемся в оформление и указываем, что шрифт будет полужирный, размер 12, расположение вверх. Теперь закрываем эту форму. И вот у нас первая диаграмма настроена.
Дальше динамика продаж. Это должна быть гистограмма и тоже должен быть заголовок. Переключаемся в свойства реквизита формы динамика продаж. Настройка. Тип оставляем такой, как сейчас. Переключаемся в область заголовка и прописываем заголовок. Динамика продаж. Точно таким же оформление расположения делаем вверх и шрифт точно такой же настраиваем 12 полужирный. Закрываем.
Переходим к следующей диаграмме. Это продажа по контрагентам. Здесь нам нужно сделать круговую диаграмму плюс самая большая серия, то есть контрагент, по которому больше всего было продаж, она должна как бы раздвигаться от основного круга. Это тоже можно настроить. Значит, переключаемся в продажи по контрагентам именно в свойство реквизита. Настройка. Тип диаграммы. Выбираем здесь круговая. Настроим сразу заголовок. Область заголовка диаграммы продажи по контрагентам. Оформление расположения выбираем вверх. шрифт полужирный 12. Теперь переключимся обратно в диаграмма группу настроек и поработаем немножко с сериями. Вот здесь в примере видно, что каждая серия ещё дополнительно для неё указывается процент. Чтобы этого добиться, мы должны включить в оформлении диаграммы формат подписей. То есть вид подписи у полномочани выбрано нет. Мы выберем здесь просто процент. Надо только найти нужный вариант. Вот процент. А чтобы выполнялось раздвижение, можно использовать свойства автораздвижения серии. Вот тут можно выбрать максимальная серия. Тогда контрагент с наибольшей суммой продаж будет его серия, вот этот сектор круга раздвигаться. Всё, этого достаточно. Остальное всё мы будем выполнять уже програмно, то есть это заполнение диаграммы.
И последнее - это продажа по менеджерам. Это должна быть кольцевая диаграмма. Переключимся в свойство реквизита продажи по менеджерам. Объект, настройка. Выбираем тип диаграммы кольцевая. Затем переключаемся в настройку заголовка, область заголовка диаграммы. Прописываем его продажи по менеджерам. Оформление расположения делаем вверх и шрифт полужирный двенадцатый размер. Здесь также надо будет показать дополнительно сумму продаж и процент. Это мы настраиваем в группе свойств диаграмма, оформление, вид подписей. Нам нужно тут выбрать вариант значение плюс процент. значение - это будет сумма продаж, а процент - это относительно общей суммы по всем менеджерам. Всё, эти настройки мы выполнили. И вот уже визуально у нас, по крайней мере, вот в конфигураторе это всё выглядит красиво. Но понятное дело, что если я сейчас сохраню эту обработку, ну, допустим, в загрузке и открою её в режиме предприятия, такой красоты мы тут, конечно же, сейчас не увидим. И более того, у меня вообще ошибка по правам доступа, потому что я запускаюсь под пользователем с неполными правами. Значит, мне нужно будет сначала запустить сеанс под пользователем с полными правами. Если мы откроем эту обработку в режиме предприятия, то такой красоты, конечно, здесь мы не увидим. То есть будет просто четыре пустых прямоугольника.
Для того, чтобы диаграммы отображались, нам нужно их заполнить. Но ещё нужно выполнить небольшие настройки. Это на форме нам нужно показать период, что можно было его выбрать, и кнопочку для обновления диаграмм. Сделаем это. Добавлю сначала реквизит формы, назову его период и укажу тип стандартный период. Разместим его на форме вверху и сделаем здесь максимальную ширину. Я думаю, двадцати будет более чем достаточно. Плюс добавим команду, назовём её обновить. Выберем для неё картинку стандартную обновить. Отображение в виде картинки и тоже разместим на форме. Чтобы кнопка была рядышком с полем, добавляем их в группу. Обычно группа без отображения, назовём её группа просто шапка. Период и кнопка обновить будут находиться здесь. А командную панель, для неё автозаполнение мы отключим, чтобы убрать лишний отступ. Сохраним изменения.
И последний маленький штрих в плане оформления - это уберём вот эти линии, обводки наших диаграмм, чтобы это всё-таки выглядело более симпатично. Идём в реквизиты, которые мы добавляли. И вот тут в настройках диаграмм можно на закладке оформления отключить рамку. Выбираем её нет рамки. Тогда рамка пропадает. И вот так по всем реквизитам с типом диаграммы мы проходимся и отключаем рамку, чтобы это не резало глаз. Продажа по контрагентам то же самое. оформление нет рамки и продажа по менеджерам тоже оформление нет рамки сохраним изменения покажу что поменялось вот видите сейчас у нас старая версия тут были рамочки и не было периода сейчас мы открываем нашу обработку у нас есть возможность выбрать период и плюс есть все наши диаграммы
Теперь приступаем к реализации заполнения диаграмм это нужно будет делать по кнопке это нужно будет делать при изменении периода и плюс мы в конце сделаем так чтобы в момент открытия этой формы сразу же диаграммы все заполнялись. Начнём с того, что заполним период по умолчанию. Сделаем это в момент создания формы. Для формы в событиях создадим обработчик при создании на сервере. И здесь выберем для реквизита период вариант. Вариант стандартного периода этот год. Это нужно, чтобы у нас изначально диаграммы все строились за год.
Дальше создадим обработчик действия для команды обновить. И поскольку нам нужно будет получать данные о продажах и о заказах, а это нужно будет делать с помощью запросов, нам нужно выбирать вариант создать процедуру на клиенте с вызовом процедуры на сервере. И назовём эту серверную процедуру чуть по-другому. Обновить диаграммы на сервере. Дальше для того, чтобы наш код легче было читать, разобьём формирование диаграмм на четыре разные процедуры. То есть одна процедура будет под каждую диаграмму. Первую назовём обновить диаграмму заказа по месяцам. Вторую назовём обновить диаграмму продажи по контрагентам. Дальше третью, обновить диаграмму динамика продаж. И четвёртое, обновить диаграмму продажи по менеджерам.
Ну и дальше наша задача - это описать программный код этих процедур по заполнению диаграмм. Для ускорения я буду использовать готовые процедуры, просто объясню основную логику. И первое - это обновить диаграммы, заказы по месяцам. Скопирую процедуру из заготовленного кода, вставлю сюда. Здесь логика такая. Для того, чтобы получить диаграмму с графиком заказов по месяцам, нам нужна, по сути, информация следующая: месяц, количество заказов. И для получения такой информации мы, во-первых, можем составить запрос к таблице документа заказ покупателя. И в этом запросе для каждого документа за выбранный период, то есть мы в запросе делаем условие, что дата документа между началом и концом периода, который выбирается на форме, и документ проведён, а мы получаем для каждого такого документа начало месяца его даты. Тем самым мы получим таблицу месяц и ссылка. Месяц ссылка. Затем мы эту таблицу группируем по месяцу и считаем количество разных ссылок. Получаем на выходе таблицу с двумя колонками, где первая колонка - это будет месяц, то есть дата конкретная, там 1 января двадцать пятого года, второй 1 февраля двадцать пятого года и так далее. А вторая колонка это будет количество заказов. Получив вот такую таблицу, мы дальше данные из неё можем перенести в соответствие. Зачем это нужно? Дело в том, что если мы хотим, чтобы график выглядел красиво, то нам, по-хорошему, надо сделать так, чтобы там не было пропусков, то есть, чтобы были видны все месяцы конкретного года. И если в какой-то месяц не было заказов совсем, всё равно нужно, чтобы эта информация у нас на диаграмме была отражена. Поэтому мы сначала данные по тем месяцам, когда были заказы, заносим соответствие. Это реализуется через создание соответствия. И вот сюда вставку элементов соответствия, где ключом у нас является месяц означением количества заказов. А потом уже мы в цикле по месяцам всем конкретного выбранного периода, этот цикл вот такого вида, пока месяц меньше либо равно, чем период даты окончания, мы будем выполнять заполнение диаграммы. Заполнение диаграммы состоит из буквально трёх шагов. Нам нужно создать серии, создать точки и установить для серии точки значения. В зависимости от вида диаграммы по-разному происходит их заполнение именно с точки зрения там количества серии точек. И здесь просто можно посмотреть наше видео про диаграммы. У нас тоже на YouTube канале есть. Я здесь долго останавливаться не буду. Смысл такой, что в графике у нас серия будет одна, потому что у нас будет одна линия, по сути. Поэтому мы сначала устанавливаем серию, для неё указываем какой-то название, количество заказов. Дальше в цикле мы устанавливаем точки. И в нашем случае точками являются месяцы, то есть дата конкретного месяца. Чтобы месяц отображался не в виде даты, а в виде вот такого красивого представления, название месяца плюс год, мы для точки установленной задаём текст и для формирования текста используем функцию формат, позволяющую отформатировать дату. Затем мы количество заказов получаем из соответствия. А если в соответствии данных нет, это значит, что в этот месяц заказов не было. И тогда мы используем значение ноль для переменное количество заказов. И затем, используя метод установить значение, происходит установка для конкретной точки, конкретной серии значения количества заказов. И мы переходим к следующему месяцу. Сохраним изменения. Так, я вижу, что есть ошибочка. Да, у нас не все процедуры пока описаны. Давайте я пока их вызов закомментирую, чтобы мы увидели, что первая диаграмма формируется. Переоткрываем обработку в режиме предприятия. Нажимаем обновить. И вот мы видим, что обновление работает. Только выберем, например, прошлый год - это демобаза. Вот мы видим, что график отображается.
Следующее. Реализуем формирование диаграммы динамика продаж. Раскомментирую вызов процедуры обновить диаграмму динамика продаж и далее скопирую процедуру из заготовок. Логика здесь будет достаточно несложная. Данная его продажи хранятся в регистре накопления продажи. Этот регистр оборотный. Для получения данных из оборотного регистра используется таблица виртуальная продажа, обороты. И в этой таблице мы можем настроить периодичность и получать данные с разворотом по периоду, в данном случае по месяцам. Для виртуальной таблицы мы указываем, за какой период мы хотим получить обороты. И в данном случае указана периодичность месяц. Выбирается два поля: период, сумма, оборот. То есть на выходе мы получим таблицу месяц и сумма продаж. Но дальше тут есть похожий нюанс, как и с заказами клиентов. Дело в том, что если в какой-то месяц продаж не было, то в этом случае у нас будет по сути в таблице ничего. То есть у нас не будет записи за этот месяц. Но нам нужно всё равно, чтобы у нас столбики были за каждый месяц. Даже если не было продаж, то там будет просто как бы нулевой столбик. Чтобы такого добиться, нам нужно дополнить вот эту таблицу, которую мы получим, нулями за те месяцы, когда не было продаж. И для этого используется следующий подход. В конструкторе запросов мы можем перейти на закладку итоги и настроить итоги по периоду, то есть по месяцам. И для группировки период мы можем установить флажок периодами и вот тут настроить дополнение, что мы хотим дополнить результат всеми месяцами с вот такой даты по вот такую дату. И тогда мы получим в результате как раз-таки возможность работать со всеми месяцами выбранного периода, в том числе с теми, за которые не было никаких продаж. Затем мы получаем выборку, указывая способ обхода, обход по группировкам и по всем периодам. А дальше заполняется диаграмма. У нас серия будет одна, потому что у нас один цвет столбиков - это сумма продаж. И дальше в цикле обхода выборки по периодам мы устанавливаем точку. Это конкретный месяц. Для неё задаём формат, чтобы месяц выводился в виде месяц-год и задаём значение в виде суммы оборот за этот месяц. Сохраним изменения, посмотрим, что в итоге получается. Открываем снова дашборд, нажимаем обновить. И вот мы видим, что диаграмма рисуется. Ну, данных здесь просто за этот год нету. Давайте сделаем так, чтобы у нас в момент создания формы всё-таки был не этот год, а прошлый год, потому что в этой демобазе у нас, видите, данные за текущий год по сути отсутствуют. Их слишком мало, чтобы что-то смотреть. Вот за прошлый год уже видно, что сумма продаж отображается.
Следующая диаграмма - это продажа по контрагентам. Это должна быть у нас круговая диаграмма, где каждый сектор круга - это конкретно контрагент, а размер сектора определяется суммой продаж. Процедура обновить диаграмму продажи по контрагентам. скопирую эту процедуру, перенесу к нам в модуль. И здесь логика такая. Данные о продажах получаем из виртуальной таблицы регистра накопления продажи таблицы оборотов. Данные берём за период с начала по конец периода- это период выбранный на форме. И выбираем из этой таблицы два поля: контрагент и сумма оборот. Да, ещё момент такой, это касается и всех предыдущих запросов. Я на это внимание не акцентировал, хотя это важно. Во всех запросах вы увидите. Кстати, эта обработка тоже будет приложена к этому видео. Вы найдёте в описании. А во всех запросах вы найдёте вот тут слово разрешённые. В конструкторе запроса на закладке Дополнительно стоит флажок разрешённые. Это нужно для корректной работы механизма ограничения доступа на уровне записей. То есть, чтобы пользователь с ограниченными правами не мог получить то, что ему недоступно, и не получал ошибок как раз-таки по этому поводу. Поэтому во всех запросах стоит признак получать только разрешённое. Итак, мы получили таблицу контрагента сумма оборот за выбранный период. И наша задача - это в круговой диаграмме установить одну точку, назвать её сумма продаж, например, и затем в цикле обхода выборки по продажам для каждого контрагента установить серию, то есть серия является контрагент, и затем установить значение для точки серии в виде суммы оборот. Сохраним изменение. Теперь открою диаграмму в режиме предприятия, нажму обновить, и у нас диаграмма по контрагентам тоже отображается.
И последнее - это диаграмма продажи по менеджерам. Там, на самом деле, всё очень похоже, как и с контрагентами. Просто там тип диаграммы кольцевая, и данные из регистра накопления выбираются чуть-чуть другие. Копирую эту процедуру, вставляю её к нам в модуль. Для получения оборотов по продажам в разрезе менеджеров используется всё тот же регистр накопления продажи, виртуальная таблица оборотов. Тоже данные берём за период, но уже выбираем из таблицы другие поля. Это ответственный и сумма оборот. Ну а затем всё то же самое, как и с диаграммой круговой по контрагентам. То есть установили точку, обошли выборку в цикле устанавливаем серии ей конкретного менеджера ответственного и устанавливаем значение в значение суммы продаж, которое сделал этот менеджер. Посмотрим, как это работает. Открываем обработку, обновляем. И вот мы видим, что все диаграммы успешно отрисованы.
Вернусь в модуль. Здесь мы наведём красоту и создадим структуру модуля, то есть опишем необходимые области. Область обработчики событий формы. Это процедура при создании на сервере. Дальше область обработчики команд формы. Это процедура обновить. Далее остальные процедуры у нас служебные. Служебные процедуры и функции. Переносим всё в эту область.
И ещё один момент доработаем. Если сейчас я меняю период на другой, то мне нужно нажать на кнопку, чтобы диаграммы обновились. Сделаем так, чтобы обновление происходило сразу же после изменения периода. Для этого нужно создать для элемента форума период обработчик события при изменении. И в этом обработчике просто вызвать процедуру, которая у нас уже есть. Ну, давайте сначала только я создам отдельную область. Мы её назовём обработчики событий элементов шапки формы. И вот здесь мы вызовем процедуру обновить диаграммы на сервере. Проверяем на синтаксис. Ошибок нет. Всё, структуру модуля мы оформили. Переоткроем обработку. Проверим, что всё работает как надо. Итак, открываем её режиме предприятия. Обновляем. по кнопке всё хорошо. Если я меняю период, то обновление происходит тоже сразу же. Это тоже работает.
Ну и заключительный штрих - это чтобы при открытии формы у нас сразу происходило формирование. Для этого нужно в обработчик события формы при создании на сервере после установки варианта периода добавить вызов той же самой процедуры. Обновить диаграммы на сервере. Сохраняем обработку. Дальше открываем её повторно. И вот мы видим, что диаграмма формируется сразу же в момент открытия формы.
Хорошо, мы внешнюю обработку создали, но понятное дело, не будет же никто открывать её постоянно через файл открыть. Более того, у пользователя прав может не быть. Вот мы даже столкнулись в процессе, что я пытался открыть обработку, а прав не хватало. И было бы неплохо разместить вот эту форму на начальной странице приложения. Как это сделать, не трогая основную конфигурацию? Самый простой вариант - использовать расширение. Что мы делаем? Мы идём в конфигуратор, в меню конфигурация, расширение конфигурации, создаём расширение, называем его, например, Iron Skills. Дальше сдаём какой-то префикс для расширения. Назначение пускай будет дополнение. Нажимаем окей. База файловая, поэтому снимаем флажки безопасный режим защиты от опасных действий. Открываем расширение. Теперь нам нужно встроить вот эту внешнюю обработку в расширение. Делается это очень просто. Правой кнопкой мыши по группе обработки вставить внешнюю обработку отчёт. Выбираем демо дашборд и она становится частью расширения. Но поскольку в расширениях принта ещё префикс использовать, давайте тут правильно её назовём. Всё-таки вначале добавим префикс именно в имя обработки и нижнее подчёркивание демошборд. Теперь мы можем кликнуть правой кнопкой мыши по корню расширения и перейти в редактор области начальной страницы. И вот здесь мы можем, например, в левую колонку добавить обработку демо дашборд. Нажимаем окей. Видимость оставим по умолчанию. Обновляем конфигурацию базы данных. Запускаем сеанс и посмотрим, что в итоге получилось.
Итак, вот мы видим, что наша форма, она отображается внизу. Чтобы она отображалась без других форм, мы можем перейти в режиме предприятия в настройки настройка начальной страницы и просто убрать вот эту обработку пульс бизнеса, если она нам не нужна. Нажимаем окей. И вот в итоге будет открываться наш дашборд. Проверим, как это работает. Ещё раз я перезапущу сеанс. То есть я просто вот запускаю ещё раз с нуля, и мы должны сразу же увидеть наш разработанный дашборд. Итак, вуаля, дашборд готов. Отображается при старте программы. Вот так достаточно несложно. Вы можете разрабатывать дашборды в 1С. Если этот ролик вам понравился, обязательно поставьте лайк, поддержите нас комментарием, поделитесь этим роликом со своими коллегами, друзьями. С вами был Ваня, канал Iron Skills. Здесь мы рассказываем про разработку в 1С. Увидимся в следующих роликах. Пока. M.