усцусацуса

Ведение графиков работы водителей, формирование табелей учета рабочего времени

1. Организация ведения графиков работы водителей в системе 1С:ЗУП

Задача организовать:

– Удобное ведение графиков работы водителей. В том числе с фиксацией режимов работы водителей («Д1», «Д2» и т.д., т.е. времени выезда и возвращения) для корректной подстановки в документ «Разнарядка на выпуск ТС».

– Корректный расчет зарплаты водителей с учетом фактической выработки.

На данный момент в базе 1С:ЗУП ведется учет «Индивидуальных графиков работы» (документ) с фиксацией кодов режимов работы («Д1», «Д2» и т.д.). Как правило, первично данные загружаются в документ из Excel заранее на будущий период (в начале месяца на текущий). При необходимости внесения корректировок (по часам, режимам работы), они вносятся начальником колонны непосредственно в документ вручную при наличии технической возможности (документ не заблокирован). На основе этих данных в конечном итоге рассчитывается заработная плата водителей. Условное схематическое изображение:

Ведение графиков работы водителей, формирование табелей учета рабочего времени
Условная схема логики между данными в учете графиков работы водителей и расчете зарплаты в базе 1С:ЗУП

В базе 1С:ERP имеется документ «Графики работы сотрудников», но он неудобен для ведения в ручном виде. Причины:

– Сложно вести учет отдельных документов графиков в разрезе по водителям и периодам.

– Отсутствует возможность привязки или фиксации режима работы, т.е. планового времени выезда.

В документе «Разнарядка на выпуск ТС» в базе 1С:ERP требуется автоматизировать подстановку водителей и времени выезда на заданную дату (для пакетной выписки ПЛ), но так как на данный момент имеется сложность с ведением графиков водителей, требуется или доработка существующего функционала или разработка нового. Несмотря на это, требуемые данные в требуемом формате уже присутствуют в базе 1С:ЗУП и в целом имеется рабочий бизнес-процесс по их внесению и корректировке. Исходя из этого, предлагается следующее решение:

– Скопировать функционал «Индивидуальный график работы» в 1С:ЗУП.

– Перенести его в базу 1С:ERP и в целом организационно перевести учет графиков работы водителей в базу ERP.

– Организовать перед расчетом заработной платы, выгрузку данных из документа «Индивидуальный график работы» базы 1С:ERP в базу 1С:ЗУП.

– С учетом полученных данных по выработке и кадровым данным сотрудников в базе 1С:ЗУП рассчитывается заработная плата водителей. Информация об этом передается в базу 1С:ERP, где соответствующие (рассчитанные) документы «Индивидуальный график работы» блокируются для внесения изменений.

Данный способ позволит:

– Сохранить текущую логику и форму учета данных в функционирующем бизнес-процессе (но в другой базе).

– Минимизировать ведение учета данных в разном виде, в разных местах.

– Сохранить возможность автоматической загрузки данных из Excel-таблиц.

– Минимизировать процессы обмена данных между базами и, соответственно, возможные случаи их расхождения.

Ведение графиков работы водителей, формирование табелей учета рабочего времени
Условная схема учета и обмена данными по фактически отработанному времени сотрудников (и расчета зарплаты) «Как должно быть»
Дополнительная информация

2. Требования на разработку в учетной системе 1С

Графики работы водителей. Требования на разработку:

Требование

Комментарий

1

Реализовать в базе 1С ERP функционал документа «Индивидуальный график работы» полностью аналогичный функционалу в базе 1С ЗУП:

·     С кодами режимов работы (и переносом соответствующего справочника).

·     С возможностью автоматической загрузки данных из Excel-файла.

·     C логикой блокировки доступа к данным документа (по рассчитанным периодам).

Перетащить функционал для ведения учета в базе 1С ERP

2

Реализовать механизм автоматического переноса данных документа «Индивидуальный график работы» из базы 1С ERP в базу 1С ЗУП

Регламентное задание, расписание настроить совместно в процессе разработки

3

Реализовать в базе 1С ERP функционал справочника «Коды режимов работы» аналогичный функционалу в базе 1С ЗУП. Добавить реквизиты:

·     Начало рабочего интервала (Дата, время)

·     Окончание рабочего интервала (Дата, время)

·     Продолжительность обеда (Дата, время)

Перетащить справочник из 1С ЗУП в 1С ERP. На данный момент в базе ЗУП данный справочник служит только для хранения непосредственно кодов без каких-либо привязок ко времени. Добавленные реквизиты служат для расширения функциональности и позволит не плодить лишние сущности.

4

Организовать механизм переноса данных в 1С ERP о завершении расчета зарплаты в базе 1С ЗУП, также реализовать механизм блокировки (редактирования) документов «Индивидуальный график работы» по аналогии с условиями в базе 1С ЗУП

Требуется доступ к функционалу базы 1С ЗУП для анализа списка текущих условий и их повторения.

 

3. Реализация решения на базе учетной программы 1С

Реализация решения: Решение реализуем на  расширение ВедениеГрафиковРаботыВодителей

Создаем объекты:

Константы:

1.ф1_НочныеЧасыРабочееВремя (Справочник ВидыИспользованияРабочегоВремени)

Перечисления:

1.аэ_Направление со значениями: Белорусское, Киевское, Павелецкое, Шереметьево, Домодедово, Внуково, Окружная

2.аэ_СтатусДокумента со значениями: ВРаботе, Проверен

Справочники: 

3.аэ_КодыВремени с реквизитами: ЧасыРаботы (Число (15, 2)), ЧасыНочные (Число (15, 2)), РасшифровкаКода (Строка (300)), Направление (Перечисление аэ_Направление), КраткийСоставДокумента (Строка (500)), НеДобавлятьВРазнарядку (Булево),

Выход (Строка (10))

       Табличные части:

1.СписокПодразделений с реквизитами: Подразделение (Справочник ПодразделенияОрганизаций)

Регистры сведений:

2.аэ_ИзменениеКодовВремени с измерениями: КодВремени (Справочник аэ_КодыВремени), Подразделение (Справочник ПодразделенияОрганизаций), ВечерняяСмена (Булево)

С ресурсами: ЧасыРаботы (Число (15, 2)), ЧасыНочные (Число (15, 2)), ВремяНачала (Дата состав Время),  ВремяОкончания (Дата состав Время)

2.Веде_ВыгрузкаДокумента с измерениями: Документ (Документ ИндивидуальныйГрафик)

С ресурсами: Выгружен (Булево)

3.Веде_СопоставлениеПодразделенияИКолонны с измерениями: Колонна (Справочник уатКолонны)

С ресурсами: Подразделение (Справочник ПодразделенияОрганизаций)

4.Веде_ДанныеДляСводокИндГрафиков с измерениями: Подразделение (Справочник ПодразделенияОрганизаций), Организация (Справочник Организации), КодВремени (Справочник аэ_КодыВремени)

С ресурсами: Количество (Число (3, 0))

Документы:

1.аэ_ИзменениеКодовВремени с реквизитами: ДатаИзменения (Дата состав Дата), Ответственный (Справочник Пользователи), Комментарий (Строка (500))

       Табличные части:

1.СписокКВ с реквизитами: КодВремени (Справочник аэ_КодыВремени), ЧасыРаботы (Число (10, 2)), ЧасыНочные (Число (10, 2)), ПодразделенияСправочно (Строка (500)), ВремяНачала (Дата состав Время),  ВремяОкончания (Дата состав Время), ВечерняяСмена (Булево)

Регламентные задания:

1.Веде_ВыгрузкаИндивидуальныеГрафики

Общие модули:

1.Веде_ВыгрузкаИндивидуальныеГрафики

Процедура ВыгрузитьИндивидуальныеГрафики() Экспорт  

    ИмяФайлаПравилОбмена = “E:\ПОД_ЕРП_ЗУП.xml”;

    ИмяФайлаОбмена       = “E:\ФайлВыгрузки.xml”;  

    АдресВременногоХранилищаИмяФайлаОбменаИзСервера = ВыгрузитьЗдесьНаСервере(ИмяФайлаПравилОбмена, ИмяФайлаОбмена);

    Если АдресВременногоХранилищаИмяФайлаОбменаИзСервера <> Неопределено Тогда

    ЗагрузкаТам(ИмяФайлаОбмена);

        ОчищаемРегистрСведений();      

    Иначе

        Сообщить(“Нет документов в правилах регистрации”);  

   КонецЕсли;

КонецПроцедуры   

Функция ВыгрузитьЗдесьНаСервере(ИмяФайлаПравилОбмена, ИмяФайлаОбмена)

    СписокДокументов = Новый Массив;

    Запрос = Новый Запрос;

    Запрос.Текст =

    “ВЫБРАТЬ

    |   Веде_ВыгрузкаДокумента.Документ КАК Документ,

    |   Веде_ВыгрузкаДокумента.Выгружен КАК Выгружен

    |ИЗ

    |   РегистрСведений.Веде_ВыгрузкаДокумента КАК Веде_ВыгрузкаДокумента”;

    Рез = Запрос.Выполнить();

    Выборка = Рез.Выбрать();

    Пока Выборка.Следующий() Цикл

        СписокДокументов.Добавить(Выборка.Документ);

    КонецЦикла;

    Если СписокДокументов.Количество() > 0 Тогда

        ОбработкаЗдесь = Обработки.УниверсальныйОбменДаннымиXML.Создать();

         ОбработкаЗдесь.РежимОбмена          = “Выгрузка”; 

        ОбработкаЗдесь.ИмяФайлаПравилОбмена = ИмяФайлаПравилОбмена;

        ОбработкаЗдесь.ИмяФайлаОбмена       = ИмяФайлаОбмена;

        ОбработкаЗдесь.ЗагрузитьПравилаОбмена();

            ОбработкаЗдесь.Параметры.Вставить(“Документы”, СписокДокументов);

        ОбработкаЗдесь.ВыполнитьВыгрузку();

        ОбработкаЗдесь = Неопределено;

        Возврат ИмяФайлаОбмена;

    Иначе

        Возврат Неопределено;   

    КонецЕсли;

КонецФункции

Процедура ЗагрузкаТам(ИмяФайлаОбмена) 

    Соединение = ПодключениеКБазе();

    Если Соединение = Неопределено Тогда

        Возврат;

    КонецЕсли;

    ОбработкаТам = Соединение.Обработки.УниверсальныйОбменДаннымиXML.Создать();

    ОбработкаТам.РежимОбмена    = “Загрузка”;

    ОбработкаТам.ИмяФайлаОбмена = ИмяФайлаОбмена;

    ОбработкаТам.ОптимизированнаяЗаписьОбъектов = Истина;

    ОбработкаТам.ЗаписыватьРегистрыНаборамиЗаписей = Истина;

    ОбработкаТам.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;

    ОбработкаТам.ЗагружатьДанныеВРежимеОбмена = Истина;

     ОбработкаТам.ВыполнитьЗагрузку(); 

    Соединение = Неопределено;

    ОбработкаТам = Неопределено;

КонецПроцедуры

Процедура ОчищаемРегистрСведений()

    НаборЗаписей = РегистрыСведений.Веде_ВыгрузкаДокумента.СоздатьНаборЗаписей();

    НаборЗаписей.Записать();

КонецПроцедуры

Функция ПодключениеКБазе()

    ПараметрыПодключения = “Srvr = “”svo-srv-1cdev””; Ref = “”zup_copy02″”; Usr = “”АйзатулловМ””; Pwd = “”””;”;  

    V83 = Новый COMОбъект(“V83.COMConnector”);

    Попытка

        Соединение = V83.Connect(ПараметрыПодключения);

        Сообщить(“Подключение выполнено”);

    Исключение

        Сообщить(“Ошибка подключения!”);

        Соединение = Неопределено;

    КонецПопытки;

    Возврат Соединение; 

КонецФункции 

Процедуры и функции в модуле формы документа аэ_ИзменениеКодовВремени:      

&НаКлиенте

Процедура СписокКВКодВремениНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ПараметрыПодбора = Новый Структура(“ЗакрыватьПриВыборе, МножественныйВыбор,РежимВыбора”, Истина, Ложь, Истина);

    ФормаВыбора = ОткрытьФорму(“Справочник.аэ_КодыВремени.Форма.ФормаВыбораДляДокумента”, ПараметрыПодбора, Элемент);

КонецПроцедуры

&НаКлиенте

Процедура СписокКВКодВремениОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ТекущаяСтрока = Элементы.СписокКВ.ТекущиеДанные;

    ТекущаяСтрока.КодВремени = ВыбранноеЗначение;

    ТекущаяСтрока.ПодразделенияСправочно = ПолучитьПодразделениеНаСервере(ВыбранноеЗначение);

    //

  ТекущаяСтрока.НеДобавлятьВРазнарядку = ПолучитьДобавлениеВРазнарядку(ВыбранноеЗначение);

    //

КонецПроцедуры

&НаСервере

Функция ПолучитьДобавлениеВРазнарядку(ВыбранноеЗначение) 

    Запрос = Новый Запрос;

    Запрос.Текст =

    “ВЫБРАТЬ

    |    аэ_КодыВремени.Ссылка КАК Ссылка,

    |    аэ_КодыВремени.НеДобавлятьВРазнарядку КАК НеДобавлятьВРазнарядку

    |ИЗ

    |    Справочник.аэ_КодыВремени КАК аэ_КодыВремени

    |ГДЕ

    |    аэ_КодыВремени.Ссылка = &Ссылка”;

    Запрос.УстановитьПараметр(“Ссылка”, ВыбранноеЗначение);

    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл

        Возврат Выборка.НеДобавлятьВРазнарядку;   

    КонецЦикла;        

КонецФункции

&НаСервере

Функция ПолучитьПодразделениеНаСервере(КВ)

    ПодразделенияСправочно = КВ.КраткийСоставДокумента;    

    Возврат ПодразделенияСправочно;

КонецФункции

&НаСервере

Процедура ПриОткрытииНаСервере()

   УстановитьЗначениеПодстановкиВРазнарядку();

КонецПроцедуры

&НаКлиенте

Процедура ПриОткрытии(Отказ)

    ПриОткрытииНаСервере();

КонецПроцедуры

&НаСервере

Процедура УстановитьЗначениеПодстановкиВРазнарядку()

    Для Каждого СтрокаТаблицы Из Объект.СписокКВ Цикл

        СтрокаТаблицы.НеДобавлятьВРазнарядку = СтрокаТаблицы.КодВремени.НеДобавлятьВРазнарядку;   

    КонецЦикла;       

КонецПроцедуры

&НаКлиенте

Процедура ТабельВводДанныхОВремениЗаДень(ДанныеОВремени, ДанныеТекущейСтроки, НомерДня)

    Если ДанныеОВремени.Часы <> 0 Тогда

        Часы = ДанныеОВремени.Часы;

    ИначеЕсли ДанныеОВремени.ВидВремени = ОбщегоНазначенияКлиент.ПредопределенныйЭлемент(“Справочник.ВидыИспользованияРабочегоВремени.Явка”) Тогда

        Часы = ДанныеТекущейСтроки[“ЧасовНорма” + НомерДня];

    Иначе

        Часы = 0;

    КонецЕсли;   

    ДанныеТекущейСтроки[“ВидВремени” + НомерДня] = ДанныеОВремени.ВидВремени;

    ДанныеТекущейСтроки[“Часов” + НомерДня]      = Часы;            

    ДанныеТекущейСтроки[“Время” + НомерДня + “Представление”] = УчетРабочегоВремениРасширенныйКлиентСервер.ТабельПредставлениеВремениПоВиду(ДанныеОВремени.БуквенноеОбозначение, Часы);   

КонецПроцедуры

 В модуле объекта документа:         

Процедура ОбработкаПроведения(Отказ, Режим)        

Движения.аэ_ИзменениеКодовВремени.Записывать = Истина;  

Запрос = Новый Запрос;    Запрос.Текст =    “ВЫБРАТЬ   

|    аэ_ИзменениеКодовВремениСписокКВ.КодВремени КАК КодВремени,   

|    аэ_ИзменениеКодовВремениСписокКВ.ЧасыРаботы КАК ЧасыРаботы,

|    аэ_ИзменениеКодовВремениСписокКВ.ЧасыНочные КАК ЧасыНочные,

|    аэ_ИзменениеКодовВремениСписокКВ.Ссылка.ДатаИзменения КАК Период,

|    аэ_ИзменениеКодовВремениСписокКВ.ВремяНачала КАК ВремяНачала,

|    аэ_ИзменениеКодовВремениСписокКВ.ВремяОкончания КАК ВремяОкончания,

|    аэ_ИзменениеКодовВремениСписокКВ.ВечерняяСмена КАК ВечерняяСмена,

|    аэ_КодыВремениСписокПодразделений.Подразделение КАК Подразделение

|ИЗ

|    Документ.аэ_ИзменениеКодовВремени.СписокКВ КАК

аэ_ИзменениеКодовВремениСписокКВ

|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.аэ_КодыВремени.СписокПодразделений КАК

аэ_КодыВремениСписокПодразделений

|        ПО аэ_ИзменениеКодовВремениСписокКВ.КодВремени =

аэ_КодыВремениСписокПодразделений.Ссылка

|ГДЕ

|    аэ_ИзменениеКодовВремениСписокКВ.Ссылка = &Ссылка”;

Запрос.УстановитьПараметр(“Ссылка, Ссылка);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий()Цикл

Движение = Движения.аэ_ИзменениеКодовВремени.Добавить();

ЗаполнитьЗначенияСвойств(Движение, Выборка);

КонецЦикла;

КонецПроцедуры

Айзатуллов Марс,

Специалист компании ООО “Кодерлайн”