Обработка 1С распределения времени сотрудников в таблице значений

Форма обработки 1С8 распределения времени сотрудников

Здравствуйте, уважаемые читатели блога SoftMaker.kz! Не так давно я опубликовал статью, в которой привел ряд примеров программирования с таблицей значений. Хотя в сегодняшней обработке не используется ни один из примеров из той статьи, тем не менее весь расчет времени сотрудников основан на работе с таблицей значений.

Содержание

Внешний вид обработки распределения времени сотрудников следующий:

Форма обработки 1С8 распределения времени сотрудников


Описание работы обработки распределения времени сотрудников

Часто на определенное задание или проект выделяется время и вам нужно быстро распределить его между исполнителями, выделив каждому равное количество. Данная обработка помогает это сделать буквально за один клик. Но для начала необходимо заполнить некоторые поля и таблицу значений.

  1. Заполните строки таблицы значений в колонке «Исполнитель». Для добавления строк можно воспользоваться кнопкой «Добавить (Ins)» в панели задач обработки (зеленая кнопка с белым плюсом).
  2. Введите общее количество времени (минуты), которое будет затрачено на проект, в поле «Общее время».
  3. Нажмите кнопку «Распределить» для распределения, указанного количества времени.
  4. Также можно изменить количество времени в поле «Время каждому», чтобы в первым в списке исполнителям было распределено именно это время, а остаток последнему. Это удобно, если вам нужно перераспределить время именно таким образом.

Поля, которые вы заполнили, будут сохранены для следующего сеанса работы. Когда вы откроете обработку снова, то увидите, что значения полей были сохранены.


Описание программного кода распределения времени на встроенном языке 1С

Когда вы нажимаете кнопку «Распределить» срабатывает процедура «Распределить» и происходит распределение времени из поля «Общее время». На основании значения из этого поля происходит расчет времени для каждого сотрудника. Заполняются колонки таблицы значений «Минуты» и «Примечание».

// функция переводит числовое значение минут 
// в формат вида: 97 -> (1ч 37м)
Функция фПояснение(Мин)
Часы = Цел(Мин/60);
Остаток = Мин Часы*60;
Если Часы > 0 Тогда
СтрЧ = «(« + Строка(Часы) + «ч»;
МинЧ = Строка(Остаток) + «м)»;
Если Остаток = 0 Тогда
Пояснение = СтрЧ + » 00м)»;
Иначе
Пояснение = СтрЧ + » « + МинЧ;
КонецЕсли;
Иначе
Пояснение = «»;
КонецЕсли;
Возврат ?(Пояснение = «», «», » « + Пояснение);;
КонецФункции // Пояснение()

// функция переводит числовое значение интервала
// в формат вида: 60:00 (1ч 00м) по 80:00 (1ч 20м)
Функция ИзЧислаВоВремя(Мин, Интервал)
Пояснение = фПояснение(Мин);
Начало = Строка(Мин) + «:00» + Пояснение + » по»;
МинИнт = Мин + Интервал;
Пояснение = фПояснение(МинИнт);
Конец = Строка(МинИнт) + «:00» + Пояснение;
Возврат Начало + » « + Конец;
КонецФункции // ИзЧислаВоВремя()

Процедура ОчиститьЗначения()
Для каждого Стр Из ТаблицаРаспределения Цикл
Стр.Минуты = 0;
Стр.Примечание = «»;
КонецЦикла;
КонецПроцедуры // ОчиститьЗначения()


// Процедура распределяет время в таблице
Процедура Распределить(ПоКаждому = Истина)
Если Заполнено() Тогда
// Получим количество строк в таблице
Количество = ТаблицаРаспределения.Количество();
Если ПоКаждому Тогда
// Рассчитать по каждому — распределяет,
// указанное число минут каждому исполнителю,
// а остаток времени последнему в списке
Исполнители = Цел(ОбщееВремя/ВремяКаждому);
Если Количество <= Исполнители Тогда
Исполнители = Количество 1;
Иначе
Количество = Исполнители + 1;
КонецЕсли;
Остаток = ОбщееВремя Исполнители*ВремяКаждому;
ОчиститьЗначения();
Иначе
// Получим количество минут на каждого
// сотрудника, а последнему отдадим остаток
Целое = Цел(ОбщееВремя/Количество);
Дробное = ОбщееВремя/Количество Целое;
ВремяКаждому = ?(Дробное = 0, Целое, Целое + 1);
Избыток = Количество*ВремяКаждому ОбщееВремя;
Остаток = ВремяКаждому Избыток;
КонецЕсли;
Мин = 0;
Для каждого Стр Из ТаблицаРаспределения Цикл
// Получим номер строки таблицы значений
Индекс = ТаблицаРаспределения.Индекс(Стр) + 1;
Если Количество = Индекс Тогда
Если Остаток = 0 Тогда
Прервать;
КонецЕсли;
Стр.Минуты = Остаток;
Стр.Примечание = ИзЧислаВоВремя(Мин, Остаток);
Прервать;
Иначе
Стр.Минуты = ВремяКаждому;
Стр.Примечание = ИзЧислаВоВремя(Мин, ВремяКаждому);
Мин = Мин + ВремяКаждому;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры // Распределить()

Если вы нажимаете кнопку «Расчитать», так же срабатывает процедура «Распределить», но в этот раз за основу распределения времени берется значение из поля «Время каждому», то есть это значение присваивается каждому исполнителю, а остаток последнему в списке. Также заполняются колонки таблицы значений «Минуты» и «Примечание».


Сохранение результата обработки в текст или таблицу

Если вам необходимо сохранить результаты распределения времени, то это можно сделать двумя способами:

    • Нажать правой кнопкой мыши на табличном поле и в выпадающем списке выбрать пункт «Вывести список».
    • В поле «Выводить в» выбрать подходящий для вас формат вывода («Табличный документ» или «Текстовый документ») и нажать кнопку «ОК». На экран будет выведен табличный документ.
    • Чтобы сохранить табличный документ на диск нужно выбрать пункт меню «Файл» | «Сохранить».
    • Затем выбрать подходящий формат, например, «.mxl» или «.xls», ввести название файла и нажать кнопку «Сохранить».
    • В обработке нажать кнопку «Вывести». На экран будет выведен табличный документ.
    • Чтобы сохранить табличный документ на диск нужно выбрать пункт меню «Файл» | «Сохранить».
    • Затем выбрать подходящий формат, например, «.mxl» или «.xls», ввести название файла и нажать кнопку «Сохранить».

Во втором способе сохранения результата обработки распределения времени использовался код, который помогает ответить на вопрос, как программно вывести табличное поле в табличный документ:

// Выведем табличное поле в табличный документ
Процедура ОсновныеДействияФормыВывести(Кнопка)
Построитель = Новый ПостроительОтчета;
Построитель.ТекстЗаголовка = «Распределение времени работы»;
Построитель.ИсточникДанных =
Новый ОписаниеИсточникаДанных(ТаблицаРаспределения);
Построитель.МакетОформления =
ПолучитьМакетОформления(СтандартноеОформление.Интерфейс);
Построитель.Выполнить();
Для каждого Колонка Из Построитель.ВыбранныеПоля Цикл
Колонка.Представление =
ТаблицаРаспределения.Колонки[Колонка.Имя].Заголовок;
КонецЦикла;
Построитель.Вывести();
КонецПроцедуры

Как видно из этого кода, для вывода табличного поля в табличный документ используется построитель отчета. Этот способ очень удобен, если нужно сделать красивое оформление вывода данных из табличного поля в табличный документ. Также, вы можете ознакомится с обработкой, которая показывает пример работы с табличным полем.


Загрузка списка сотрудников из файла «.mxl»

Итак, у нас есть сохраненный файл «.mxl», который мы получили, используя первый способ сохранения результата обработки распределения времени. Он нам пригодится, чтобы автоматически загружать список сотрудников, не вбивая их по-новому каждый раз. Не правда ли удобно? Чтобы загрузить список сотрудников из файла нужно:

  • Заполнить поле «Путь загрузки», нажав на кнопку «…» и выбрав ранее сохраненный файл.
  • Затем нужно нажать кнопку «Загрузить». Произойдет заполнение колонки табличного поля «Исполнитель».

Хотелось бы особо отметить, что нужно использовать файл, который был получен при первом способе сохранения результата обработки распределения времени. Если использовать второй способ сохранения, то данные загружены не будут. Код для этой части обработки такой:

Процедура Кнопка2Нажатие(Элемент)
// Укажем путь к файлу загрузки
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = ПутьЗагрузки;
Фильтр = «Табличный документ .mxl (*.mxl)|*.mxl»;
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = «Выберите файл загрузки»;
Если ДиалогОткрытияФайла.Выбрать() Тогда
ПутьЗагрузки = ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры

Процедура ОсновныеДействияФормыЗагрузить(Кнопка)
// Заполненим колонку табличного поля «Исполнитель»
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьЗагрузки);
ТаблицаРаспределения.Очистить();
ВТаб = ТабДок.ВысотаТаблицы;
Для Т = 2 По ВТаб Цикл
ОбластьСтрока = ТабДок.Область(«R» + Т);
Если ТипЗнч(ОбластьСтрока) = Тип(«Неопределено») Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаРаспределения.Добавить();
НоваяСтрока.Сотрудник = ОбластьСтрока.Текст;
КонецЦикла;
КонецПроцедуры

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



  Пожалуйста, Войдите или Зарегистрируйтесь чтобы получить ссылку на скачивание.


Этот блог читают уже более 3000 человек
- читай и ТЫ!

4 ответы
  1. Марат says:

    Распределение времени между сотрудниками по конкретным задачам у нас на предприятии было введено недавно и когда мне стало необходимо сделать соответствующие расчеты в 1С8, конечно же я столкнулся с трудностями. В итоге сам не справился. Но на мое счастье я нашел ваше пособие и теперь запросто могу сделать распределение времени!

    Ответить
  2. Softmaker
    Softmaker says:

    Марат, здорово, что вам пригодилась эта обработка по распределению времени в 1С!

    Ответить
  3. Артём says:

    Я распределение времени еще ни разу не делал между сотрудниками и меня интересует вот что: я могу раскидать время только по одному сотруднику в одной таблице, или скажем можно сделать так что один сотрудник занят сразу на нескольких мероприятиях? если да, как это сделать

    Ответить
  4. Softmaker
    Softmaker says:

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

    Ответить

Ответить

Want to join the discussion?
Feel free to contribute!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *