Рисуем Робота в диаграмме Ганта с использованием Регистра расчетов и Плана видов расчета

Программирование - Практика программирования

34
О сложных механизмах расчетного учета, который обычно используются в программах начисления зарплаты, в простом примере в виде рисования Робота в диаграмме Ганта.

*************************************************************************************************************************************************

Есть специальное учебник "1С_ Предприятие 8.3. Практическое пособие разработчика. Примеры и типовые приемы" Радченко/Хрусталева http://v8.1c.ru/metod/books/book.jsp?id=441 в котором со стр.553 начинается урок по механизмам создания расчетов и перерасчетов для зарплаты. В данном пособии подробно объясняется регистр расчетов, план видов расчетов, а так же сложные проводки в документах начисления заработной платы.

Есть так же очень хороший видео курс от Павла Чистова, в котором он подробно объясняет работу с зарплатными механизмами, начиная с 25 занятия: https://www.youtube.com/watch?v=vstkWb5H820

В нашей статье - мы не будем углубляться в фундаментальные науки по начислению зарплаты, мы просто попробуем разобраться в основных механизмах расчетного учета играючись, рисуя забавного Робота.

*************************************************************************************************************************************************

****Итак, какие инструменты нам понадобятся чтобы нарисовать Симпатягу-Робота?

1.Холст нам потребуется прежде всего. В виде холста мы будем использовать диаграмму Ганта. В ней мы должны создать матрицу из точек, например, 31 точка в длину и 30 точек в ширину - вполне достаточно, чтобы получилась полная картина.

Откуда мы будем брать данные, чтобы обозначить горизонтальную ось диаграммы Ганта?

Читаем в Синтаксис-помощнике: по горизонтальной оси - у диаграммы идет временная шкала.

Договоримся, что весь итоговый наш холст, отображенный в диаграмме Ганта, мы будем называть Матрицей. Чтобы задать длину Матрицы, т.е. горизонтальную ось диаграммы Ганта, нам необходим некий справочник, в котором мы будем хранить, н-р, в днях - размер длины Матрицы. Конечно, можно создать обычный справочник и заполнить его 31 записью, но справочник нам не гарантирует уникальности.

*************************************************************************************************************************************************

2.Уникальность нам дает только регистр Сведений. Создадим такой регистр Сведений (непериодический,независимый) в Конфигураторе, назовем его "ДлинаМатрицы":

Данные регистра сведений "ДлинаМатрицы":Измерение - дата, тип Дата, ресурс - число, длина=1, точность=0.

Теперь в пользовательском режиме 1с мы можем в ручную забить 31 записью созданный регистр сведений, но если лень это делать в ручную, то можно набросать маленькую обработку, которая за нас автоматически заполнит регистр сведений 31 записью. Код этой обработки будет следующий:

&НаСервере
Процедура ЗаполнениеРегистраСведений_31записьюНаСервере()
		Для Ном=0 По 31 Цикл
		
	    ТекДата= '20180101'+86400*Ном;

		Запись= РегистрыСведений.ДлинаМатрицы.СоздатьМенеджерЗаписи();
		
		Запись.Дата=ТекДата;
		
		Запись.Признак=1;
		
	    Запись.Записать();
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнениеРегистраСведений_31записью(Команда)
	ЗаполнениеРегистраСведений_31записьюНаСервере();
КонецПроцедуры

***код обработки написан по мотивам уроков Павла Чистого

Обратите внимание, что в РегистрСведений - нам нужно забить значения каких-нибудь дат, я выбрала первый месяц этого года. Далее при построении диаграммы Ганта - будем помнить, что наш виртуальный диапазон горизонтальной оси диаграммы Ганта - это период с 01.01.2018г по 31.01.2018г.

По аналогии с расчетным учетом заработной платы - в подобный регистр сведений мы бы вносили графики рабочих дней.

*************************************************************************************************************************************************

3. Вертикальная ось диаграммы Ганта - это точки диаграммы Ганта, объекты. Например, разрабатывая систему расчета зарплаты, в данные точки мы бы выбирали Сотрудников из справочника Сотрудники. То есть это объекты, для которых требуется произвести потом некий расчет. В нашем примере все просто - это будут некие СтрокиМатрицы, в каждой из стоки - мы закрасим или оставим пустой ячейку. А совокупность строк - даст ширину Матрицы!

В ширину наша Матрица будет иметь 30 строк, чтобы вместился весь наш рисунок.

Вопрос - где хранить СтрокиМатрицы? Так как мы создаем механизм, который практически похож на механизм зарплатного учета, то поступим точно так же - СтрокиМатрицы будем хранить в справочнике, так и назовем его "СтрокиМатрицы". Создадим в Конфигураторе обычный справочник "СтрокиМатрицы". В пользовательском режиме 1с Предприятие - заполним его 30-ю записями, н-р, "СтрокаМатрицы1, СтрокаМатрицы2" и т.д.

Мы так же можем заполнить справочник в ручную или написать маленькую обработку по автоматическому созданию записей в справочнике:

&НаСервере
Процедура ЗаполнениеСправочникаСтрок_30записейНаСервере()
	
	Для Ном=0 По 30 Цикл
		Спр = Справочники.СтрокиМатрицы;
        НоваяЗапись = Спр.СоздатьЭлемент();
        НоваяЗапись.Наименование = "СтрокаМатрицы"+(Ном+1);
		
        НоваяЗапись.Записать();
		
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнениеСправочникаСтрок_30записей(Команда)
	ЗаполнениеСправочникаСтрок_30записейНаСервере();
КонецПроцедуры

*** код обработки навеян примером отсюда https://helpf.pro/faq/view/298.html

Мы заполнили в пользовательском режиме 1сПредприятие: регистр сведений "ДлинаМатрицы" и справочник "СтрокиМатрицы":

*************************************************************************************************************************************************

4. Теперь приступим к созданию ВидаЛиний, которые будут отображаться в диаграмме Ганта. В диаграмме у нас может быть в текущем примере всего два вида Линий - сплошная (на рис.под цифрой 1) и закрашенный кусочек линии (на рис. под цифрой 2)

Согласитесь, что имея возможность наносить на Холст закрашенные ячейки-кубики, проще всего нарисовать любой сложности рисунок.

Итак, мы решили, что двух видов линий - для создания рисунка нам достаточно, но где в системе 1с хранить информацию о ВидахЛиний????

Давайте подумаем КАК эти линии получаются на практике - есть одна сплошная линия, она заполняет собой всю выделенную ей строку. Но если мы зададим условие, что вот от от этой координаты СплошнойЛинии до следующей у нас должен быть пробел, что мы сделаем со СплошнойЛинией в этом Случае? Мы вырвем из нее кусок и в этом месте у бывшей СплошнойЛинии будет пустота! Выражение "вырвем" звучит пугающе))...Поэтому разработчики 1с для подобного действия придумали свое название - "Вытеснение".

Значит у нас есть СплошнаяЛиния, а методом Вытеснения - мы можем добиться в этой линии промежутков.

Собственно, рваная линия в нашем творчестве не пригодится)) Мы ведь можем на Холсте изображать вырванные (Вытесненные) кусочки линии! Они-то и будут как цветные кубики, которые нам нужно будет просто расставить в нужном порядке. 

***здесь, чтобы не терять связь с аналогией  расчетного учета в начислении зарплаты, представим, что Вытесненные Кубики - это период Отпусков сотрудников, или их прогулы - на графике времени. Т.к. отпуск и прогул - это тоже Вытесненные Кубики из СплошнойЛинии, определяемой как Оклад.

Мы можем хранить описание наших линий (СплошнаяЛиния и ВытесненныйКубик) в любом из справочников, но как нам в таком справочнике потом логически связать эти два вида - полный и вытесненный???? Это будет не просто!!! Поэтому в системе 1с8 есть уже специальный готовый справочник, в котором мы сразу можем задать связь наших двух видов линий. Называется этот справочник - ПланВидовРасчета.

Создаем в Конфигураторе ПланВидовРасчета "ВидЛинии". Чтобы у нас была возможность создать связь между видами линий в виде Вытеснения - необходимо на вкладке "Расчет" поставить галочку "Использует период действия". 

Теперь идем на вкладку "Прочие" и нажимаем на кнопку "Предопределенные", здесь создаем два вида линий:

1) СплошнаяЛиния

2) ВытесняющийКубик, к-й на вкладке "Вытесняющие" задает связь - что он вытесняет именно СплошнуюЛинию!

п.с. данная вкладка "Вытесняющие" при создании элементов ПВР появилась благодаря тому, что мы поставили галочку "Использует период действия".

*************************************************************************************************************************************************

5. Создадим связующее звено - Регистр Расчета. Назовем его "РегистрМатрицы".

Что такое регистр расчета и чем он отличается от обычного регистра, например, накопительного регистра Оборотов?

В оперативном учете - мы в накопительный регистр Оборотов записываем информацию о продажах товара, благодаря чему всегда можем знать на какую сумму за определенный период продали товара. С регистром Расчета - все тоже самое!!! Регистр расчета - точно такой же накопительный регистр Оборотов, в котором накапливается сумма, заработанная Сотрудником за определенный период. С небольшим отличием - регистр Расчетов просто обожает играть с датами))) Вот только представьте, что вы решили такой регистр использовать для торгового документа, например, фиксировать продажу товаров: у вас человек стоит на кассе, а вы в ручную вбиваете абсолютно ВСЕ даты, которые только сможете найти на этикетке!!!))))))))))))))))) Хотя, возможно, что не стоит смеяться по этому поводу - еще буквально недавно никто и представить не мог, что на кассе будут двумя видами сканеров проводить товар, а вот это уже есть, так что кто знает???)))))).........

Продолжим. Только Регистр Расчета умеет делать Вытеснение по Дате! Да, в специальном справочнике ПланыВидовРасчета - мы задали два вида линий - одна сплошная, другая вытесняющая, но справочник на то и справочник, чтобы просто в виде груды макулатуры лежать на полках)) ,а вот регистр Расчета - это как умный библиотекарь: подберет все разбросанные книжки по полу и расставит их в хитром порядке по полочкам.

Чтобы наш регистр Расчета мог проводить операцию Вытеснения, нам нужно включить у него соответствующую галочку - на вкладке "Основные" - "ПериодДействия" .Кроме этого, так как регистр расчета - это сердце механизма расчетов, то мы к этому сердцу подключаем все, созданные ранее объекты: регистр сведений "ДлинаМатрицы" с указанием необходимых данных этого рег.Сведений (см.рис.), а так же План Видов Расчета "ВидЛинии":

Отметим так же на этой вкладке, что регистр Расчета имеет переодичность в месяц.

На вкладке "Данные" введем:

1) Измерение: СтрокаМатрицы, тип = СправочникСсылка.СтрокиМатрицы

2) Ресурс: ПятаяНога, тип число. В нашей задаче нам не понадобится данный ресурс регистра Расчета, но по аналогии с расчетным учетом - мы бы сюда ввели ресурс Сумма, которую наш Сотрудник заработал, чтобы она накапливалась за период.

На вкладке "Регистраторы" - пока ничего мы ввести не можем, т.к. еще нет документа, который будет производить записи в регистр расчета.

*************************************************************************************************************************************************

6. Создадим документ, который будет регистрировать данные в Регистр расчета. Назовем его "ДокЗаполнениСтрокиМатрицы".

Создадим табличную часть у документа, назовем ее "РисунокСтроки". Введем здесь следующие колонки таб.части документа:

1) СтрокаМатрицы, тип СсылкаСправочник.СтрокиМатрицы;2) ВидЛинии, тип СсылкаПланВидовРасчета.ВидЛинии;3) ПериодДействияНачало, тип Дата;4) ПериодДействияКонец, тип Дата

Перейдем на вкладку "Движения", выберем  ОперативноеПроведение=Запретить, регистры расчета = РегистрМатрицы, нажмем здесь же на кнопку "КонструкторДвижений":

В открывшемся Конструкторе движений - нужно заполнить все как на рис.ниже. Здесь будьте очень внимательны!!! В поле "ПериодДействияКонец" нужно обязательно поставить формулу КонецДня(ТекСтрокаРисунокСтроки.ПериодДействияКонец), так как наш регистр расчета хоть и очень умный при работе с датами, но любит все даты ставить в начало дня, а это может вылится в то, что вы просто не увидите в Отчете ДНЯ конечной даты!!!

Об этой странной особенности регистра расчетов в книге Хрусталевой/Радченко ничего не сказано, просто на стр.578 в примере КонструктораДвижений документа показан вот такой же способ вывода КонцаДня.

Мне очень понравился вариант, который показал Павел Чистов - как регистрРасчетов переводить в КонецДня: правым кликом мышки кликаем на регистрРасчетов, в открывшемся меню - вызываем МодульНабораЗаписей регистра и прописываем там следующую процедуру:

Процедура ПередЗаписью(Отказ, Замещение, ТолькоЗапись, ЗаписьФактическогоПериодаДействия, ЗаписьПерерасчетов)
	Для каждого Запись Из ЭтотОбъект Цикл
	
		Запись.ПериодДействияКонец=КонецДня(Запись.ПериодДействияКонец);
	
	КонецЦикла; 
КонецПроцедуры

Документ создали, откроем регистрРасчета, убедимся - появилась ли там галочка "Регистратор" = документ "ДокЗаполненияСтрокиМатрицы"

*************************************************************************************************************************************************

7.Создаем итоговый отчет "МатрицаГанта". Создали отчет, создали основную форму Отчета, добавим в форме Отчета новый реквизит = ДиаграммаГанта, тип ДиаграммаГанта.:

Добавим на форме кнопку "Сформировать", и под кнопкой внесем следующий программный код:


&НаСервере
Процедура СформироватьРисунокНаСервере(ДГ)
	 Запрос=Новый Запрос;
	 Запрос.Текст=
	 	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	РегистрМатрицыФактическийПериодДействия.СтрокаМатрицы,
		|	РегистрМатрицыФактическийПериодДействия.ВидРасчета,
		|	РегистрМатрицыФактическийПериодДействия.ПериодДействияНачало,
		|	РегистрМатрицыФактическийПериодДействия.ПериодДействияКонец
		|ИЗ
		|	РегистрРасчета.РегистрМатрицы.ФактическийПериодДействия КАК РегистрМатрицыФактическийПериодДействия";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	ДГ.Обновление=Ложь;
	ДГ.Очистить();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Точка= ДГ.УстановитьТочку(ВыборкаДетальныеЗаписи.СтрокаМатрицы);
		Серия= ДГ.УстановитьСерию(ВыборкаДетальныеЗаписи.ВидРасчета);
		Значение= ДГ.ПолучитьЗначение(Точка,Серия);
		Интервал=Значение.Добавить();
		Интервал.Начало=ВыборкаДетальныеЗаписи.ПериодДействияНачало;
		Интервал.Конец=ВыборкаДетальныеЗаписи.ПериодДействияКонец;
	КонецЦикла;
	
	ДГ.Обновление=Истина;
КонецПроцедуры

&НаКлиенте
Процедура СформироватьРисунок(Команда)
	СформироватьРисунокНаСервере(ДиаграммаГанта);
КонецПроцедуры

На этом все инструменты для создания шедевра Робота-Ганта у нас готовы.

*************************************************************************************************************************************************

8. В пользовательском режиме 1с начинаем рисовать Робота.

Откроем Документы "ДокЗаполненияСтрокиМатрицы"  и начнем с самого первого элемента справочника СтрокиМатрицы - создавать с помощью ВетесняющегоКубика создавать заполненность первой СтрокиМатрицы, которая у нас отразится в диаграммеГанта. Здесь будьте внимательны! Мы регистр сведений "ДлинаЛинии" - заполнили днями из января этого года, а это значит, что в документе - мы должны периодах Действия - указывать только ЯНВАРЬ этого года!!!

Создаем таких документов в пользовательском режиме - столько, сколько у нас должно быть Строк в Матрице, т.е.30-31 шт.

Я предварительно на клеточном листике нарисовала Робота, расчертила шкалу времени и Строк, и вводила эти данные в документы.

Вот что у нас получилось в итоге:

*************************************************************************************************************************************************

Попробуйте сами нарисовать Робота в диаграмме Ганта и регистры расчета покажутся Вам весьма простой наукой, даже если разбудят ночью - Вы быстро ответите какая связь Видов расчета задается в Плане Видов Расчетов, что такое Вытеснение, по которым считают больничные, штрафы, отпуска профессиональные кадровики.)) Ответите и как настроить регистр расчетов. Что такое База ( в нашем примере - неявной базой выступала СплошнаяЛиния, на основании нее мы проводили Вытеснение), как рассчитать Базу для Отпускных, как настроить Базу для премий. Сможете с закрытыми глазами помочь учетнику добавить ВидРасчета = Управленческий, а это в данный момент очень актуально.

*************************************************************************************************************************************************

В загрузке учебная база данных, созданная на платформе 1с 8.3.

Доставьте себе пользу - изучив регистры расчета - и удовольствие от круглых глаз бухгалтеров-расчетников, когда Вы им покажете рисунок Робота на диаграмме Ганта!!!))  

34

Скачать файлы

Наименование Файл Версия Размер
Рисуем Робота в диаграмме Ганта с использованием РегистраРасчетов и ПланаВидовРасчета:
.dt 58,90Kb
17.02.18
2
.dt 58,90Kb 2 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. jan-pechka 135 18.02.18 19:03 Сейчас в теме
Есть очень подробная схема структуры регистра расчета
п.с. взяла с этого сайта http://www.1c1c1c.ru/
Прикрепленные файлы:
2. Yashazz 2316 18.02.18 20:19 Сейчас в теме
Плюсану уже хотя бы за забавную идею)
TreeDogNight; jan-pechka; pm74; +3 Ответить
3. pm74 130 18.02.18 20:26 Сейчас в теме
4. user774630 19.02.18 17:13 Сейчас в теме
**код обработки написан по мотивам уроков Павла Чистого

Кто такой Павел Чистый? :) Чистов, видимо.
dreamcreal; jaroslav.h; jan-pechka; TreeDogNight; +4 Ответить
6. jan-pechka 135 19.02.18 18:05 Сейчас в теме
(4)да, все верно - Павел Чистов.

прошу прощения за опечатку
5. vano-ekt 1129 19.02.18 18:01 Сейчас в теме
Дмитрий74Чел; CratosX; корум; dj_serega; Romakon92; xanta; ivazzz82; gigabyte_artur; alalsl; BackinSoda; ddd_77; sasha777666; CSiER; jif; zqzq; Sardukar; bsturtle; rusmil; unichkin; user774630; jan-pechka; +21 Ответить
7. bsturtle 166 19.02.18 20:15 Сейчас в теме
8. sashapere 144 21.02.18 09:11 Сейчас в теме
9. BackinSoda 21.02.18 15:00 Сейчас в теме
Печка Щука растёт на глазах прям ))
jan-pechka; +1 Ответить
10. user716143 07.12.18 15:06 Сейчас в теме
Почему нельзя мыслить шириной и высотой? Зачем длину сюда приплетать? Разрыв мозга.
Оставьте свое сообщение