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

В базе 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;
КонецЕсли;
ДанныеТекущейСтроки[“ВидВремени” + НомерДня] = ДанныеОВремени.ВидВремени;
ДанныеТекущейСтроки[“Часов” + НомерДня] = Часы;
ДанныеТекущейСтроки[“Время” + НомерДня + “Представление”] = УчетРабочегоВремениРасширенныйКлиентСервер.ТабельПредставлениеВремениПоВиду(ДанныеОВремени.БуквенноеОбозначение, Часы);
КонецПроцедуры
В модуле объекта документа:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.аэ_ИзменениеКодовВремени.Записывать = Истина;
Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ
| аэ_ИзменениеКодовВремениСписокКВ.КодВремени КАК КодВремени,
| аэ_ИзменениеКодовВремениСписокКВ.ЧасыРаботы КАК ЧасыРаботы,
| аэ_ИзменениеКодовВремениСписокКВ.ЧасыНочные КАК ЧасыНочные,
| аэ_ИзменениеКодовВремениСписокКВ.Ссылка.ДатаИзменения КАК Период,
| аэ_ИзменениеКодовВремениСписокКВ.ВремяНачала КАК ВремяНачала,
| аэ_ИзменениеКодовВремениСписокКВ.ВремяОкончания КАК ВремяОкончания,
| аэ_ИзменениеКодовВремениСписокКВ.ВечерняяСмена КАК ВечерняяСмена,
| аэ_КодыВремениСписокПодразделений.Подразделение КАК Подразделение
|ИЗ
| Документ.аэ_ИзменениеКодовВремени.СписокКВ КАК
аэ_ИзменениеКодовВремениСписокКВ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.аэ_КодыВремени.СписокПодразделений КАК
аэ_КодыВремениСписокПодразделений
| ПО аэ_ИзменениеКодовВремениСписокКВ.КодВремени =
аэ_КодыВремениСписокПодразделений.Ссылка
|ГДЕ
| аэ_ИзменениеКодовВремениСписокКВ.Ссылка = &Ссылка”;
Запрос.УстановитьПараметр(“Ссылка“, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий()Цикл
Движение = Движения.аэ_ИзменениеКодовВремени.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
КонецЦикла;
КонецПроцедуры
Айзатуллов Марс,
Специалист компании ООО “Кодерлайн”