*************************************************************************************************************************************************
Есть специальное учебник "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.
Доставьте себе пользу - изучив регистры расчета - и удовольствие от круглых глаз бухгалтеров-расчетников, когда Вы им покажете рисунок Робота на диаграмме Ганта!!!))