Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 14:48

Загрузка данных в табель

Автор Zeus_God, 18 фев 2014, 13:19

0 Пользователей и 1 гость просматривают эту тему.

Zeus_God

Подскажите, пожалуйста, коллеги.
Делаю обработку в ЗУПе 2.5 для загрузки табелей из xls в 1С. Сейчас работа "зависла" с такой проблемой, что сверхурочные часы надо загружать вместе с явками (т.е. в одной ячейке должна быть и явка и сверхурочные. Например, "Я8 С2"). Ставил в документе точки остановки, но не могу вычислить, где именно происходит загрузка сверхурочных. Может кто сталкивался, подскажите, пожалуйста, или дайте направление в котором думать. Обработка рабочая, все остальные функции в порядке.

MuI_I_Ika

А обработка типовая или вы свою какую-то пишете?

Вообще, если в экселе записано именно в таком формате: Я8 С2

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


Zeus_God

Обработку пишу сам. Наверно, лучше скину скрин эксель файла и фрагмент кода =)
Процедура кЗагрузкаНажатие(Элемент)

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Организации.Ссылка,
| Организации.Наименование
|ИЗ
| Справочник.Организации КАК Организации";
ОрганизацияЗапрос = Запрос.Выполнить().Выбрать();

мВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();


// ------------------------------------ Заполнение строк ТЧ ОтработанноеВремя -------------------------------------------------

ДокТабель = Документы.ТабельУчетаРабочегоВремениОрганизации.СоздатьДокумент();
ДокТабель.Дата = ТекущаяДата();
ДокТабель.ДатаНачалаПериода = НачалоМесяца(ТекущаяДата());
ДокТабель.ДатаОкончанияПериода = КонецМесяца(ТекущаяДата());

Пока ОрганизацияЗапрос.Следующий() Цикл
ДокТабель.Организация = ОрганизацияЗапрос.Ссылка;
КонецЦикла;

ПодразделениеОрганизации = ДокТабель.ПодразделениеОрганизации;
ДокТабель.СпособВводаДанных = Перечисления.СпособыВводаДанныхОВремени.ПоДням;
ЗаполнениеДокументовПереопределяемый.ЗаполнитьШапкуДокумента(ДокТабель, глЗначениеПеременной("глТекущийПользователь"));

МассивПриставок = Новый Массив(4);
МассивПриставок[0] = "Первый";
МассивПриставок[1] = "Второй";
МассивПриставок[2] = "Третий";
МассивПриставок[3] = "Четвертый";

ДниСверхурочные = Новый Массив();
ТекСтр = 1;
НомерСтрокиПрверка = -100;

Для Сч = 1 По Мас.Количество()-1 Цикл

Если ТипЗнч(Мас[Сч][0]) <> Тип("СправочникСсылка.СотрудникиОрганизаций") ИЛИ Мас[Сч][0] = Справочники.СотрудникиОрганизаций.ПустаяСсылка() Тогда
Продолжить;
КонецЕсли;

СотрудникТД = Мас[Сч][0];
Если Сч <> НомерСтрокиПрверка Тогда
СтрокаРасшифровкиПоДням = ДокТабель.ОтработанноеВремя.Добавить();
КонецЕсли;
Сотрудник = ОпределениеЗанятости (ВидЗанятости[ТекСтр][0], СотрудникТД);
СотрудникНайден = Ложь;

// Поиск текущего сотрудника в файле (с текущим видом занятости)
Для СтрокаПроверка = Сч + 1 по Мас.Количество()-1 Цикл

СотрудникПроверка = Мас[СтрокаПроверка][0];
СотрудникСравн = Сотрудник;
Если СотрудникПроверка = Неопределено ИЛИ ВидЗанятости[СтрокаПроверка][0] = Неопределено Тогда
Прервать;
КонецЕсли;

Если (СотрудникСравн.Код = Сотрудник.Код) И (СотрудникСравн.ВидЗанятости = Сотрудник.ВидЗанятости) И (СтрокаПроверка-1 <> Сч) Тогда
НомерСтрокиПрверка = СтрокаПроверка-1;
СотрудникНайден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

ТекСтр = ТекСтр + 1;

СтрокаРасшифровкиПоДням.Сотрудник = Сотрудник;
Проверка = Ложь;
Проверка2 = Ложь;
ВсегоСверхурочных = 0;
Праздничных = 0;

Если Сч = НомерСтрокиПрверка Тогда
Продолжить; // Предотвращение повторной загрузки данных из строки, где есть данные сотрудника
Иначе
Для Сч1 = 1 по 31 Цикл

СтрокаТД = Сч + 2;
СтолбецТД = Сч1 + 2;
СтрокаСверхТД = НомерСтрокиПрверка + 2;
ВидВремени = "ПервыйВидВремени" + Строка(Сч1);
КоличествоЧасов = "ПервыйЧасов" + Строка(Сч1);

Если СотрудникНайден = Истина И Лев(СокрЛП(ЭлементыФормы.ТабельСравн.Область("R" + СтрокаСверхТД + "C" + СтолбецТД).Текст), 1) = "С" Тогда

СтрокаРасшифровкиПоДням[ВидВремени] = Строка(ЗаполнениеВремени(ВидВремени, СокрЛП(ЭлементыФормы.ТабельСравн.Область("R" + СтрокаТД + "C" + СтолбецТД).Текст)));
СтрокаРасшифровкиПоДням[КоличествоЧасов] = ЗаполнениеЧасов(КоличествоЧасов, ЭлементыФормы.ТабельСравн.Область("R" + СтрокаТД + "C" + СтолбецТД).Текст);

// Надо здесь настроить загрузку сверхурочных

Иначе

СтрокаРасшифровкиПоДням[ВидВремени] = ЗаполнениеВремени(ВидВремени, СокрЛП(ЭлементыФормы.ТабельСравн.Область("R" + СтрокаТД + "C" + СтолбецТД).Текст));
СтрокаРасшифровкиПоДням[КоличествоЧасов] = ЗаполнениеЧасов(КоличествоЧасов, ЭлементыФормы.ТабельСравн.Область("R" + СтрокаТД + "C" + СтолбецТД).Текст);

КонецЕсли;

КонецЦикла;
КонецЕсли;

СтрокаРасшифровкиПоДням.Физлицо = СтрокаРасшифровкиПоДням.Сотрудник.Физлицо;

КонецЦикла;


Попытка

ДокТабель.Записать(РежимЗаписиДокумента.Проведение);

Исключение

Сообщить("Не удалось провести документ!");
ДокТабель.Записать(РежимЗаписиДокумента.Запись);

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

ЭлементыФормы.ИмяЗФайла.Значение = ДокТабель.Ссылка;

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

И, собственно, скрин эксель файла:


(http://hostingkartinok.com/show-image.php?id=936914f8a63056a2db15802719230126)
Добавлено: 19 фев 2014, 08:05


Функции "ЗаполнениеВремени" и "ЗаполнениеЧасов" взял из конфигурации
Функция ЗаполнениеВремени (НазваниеЯчейкиВБазе, ВидВремени)

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КлассификаторИспользованияРабочегоВремени.Ссылка,
| КлассификаторИспользованияРабочегоВремени.Наименование,
| КлассификаторИспользованияРабочегоВремени.БуквенныйКод КАК БукваВидаВремени,
| КлассификаторИспользованияРабочегоВремени.ПолноеНаименование,
| КлассификаторИспользованияРабочегоВремени.РабочееВремя
|ИЗ
| Справочник.КлассификаторИспользованияРабочегоВремени КАК КлассификаторИспользованияРабочегоВремени";

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

Пока Выборка.Следующий() Цикл
Если Выборка.БукваВидаВремени = СокрЛП(Лев(ВидВремени, 2)) Тогда
СтрокаРасшифровкиПоДням[НазваниеЯчейкиВБазе] = Выборка.Ссылка;
Прервать;
КонецЕсли;
КонецЦикла;

Возврат СтрокаРасшифровкиПоДням[НазваниеЯчейкиВБазе];

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


Функция ЗаполнениеЧасов (НазваниеЯчейкиВБазе, ВидВремени)

Если Лев(Прав(ВидВремени, 2), 1) = "," ИЛИ Лев(Прав(ВидВремени, 2), 1) = "." Тогда
СтрокаРасшифровкиПоДням[НазваниеЯчейкиВБазе] = СокрЛП(Прав(ВидВремени, 4));
Иначе
СтрокаРасшифровкиПоДням[НазваниеЯчейкиВБазе] = СокрЛП(Прав(ВидВремени, 2));
КонецЕсли;

Возврат СтрокаРасшифровкиПоДням[НазваниеЯчейкиВБазе];

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

Добавлено: 19 фев 2014, 15:06


Вопрос решен! Тему можно закрывать. MuI_I_Ika, спасибо, что не прошли мимо

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск