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

Как добавить значение из DBF файла в поле формы документа. ЗУП (последняя версия)

Автор Алексей Рожков, 07 авг 2020, 14:18

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

Алексей Рожков

Привет всем.
Конфигурация - Зарплата и управление персоналом для Казахстана, редакция 3.1. Локализация для Казахстана: "1С-Рейтинг" (3.1.1.61)

Имеется документ "Данные для расчета зарплаты"
В этом документе (через расширение) создал поле с именем (НомерЗаказа). Все заполняется, все сохраняется.
Имеется также DBF файл. Там есть колонка "ZAKAZ".

В чем проблема?
Нужно из ДБФ файла, из колонки ZAKAZ положить информацию в созданное мною поле на форме НомерЗаказа.

Исходный код:


&НаСервере
Процедура Команда1НаСервере()
//мДБФ="C:\Обмен\Файлы ДБФ\kopil_1c.dbf";
мДБФ="D:\ЗУПфайлыПоследние\kopil_1c.dbf";

ИНН="931240000042";
Дежурный=Справочники.Сотрудники.НайтиПоКоду("03243");
ВыбраннаяОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН",ИНН);
СоздСоотвМес=Новый Соответствие();
СоздСоотвМес.Вставить("01","январь ");
СоздСоотвМес.Вставить("02","февраль ");
СоздСоотвМес.Вставить("03","март ");
СоздСоотвМес.Вставить("04","апрель ");
СоздСоотвМес.Вставить("05","май ");
СоздСоотвМес.Вставить("06","июнь ");
СоздСоотвМес.Вставить("07","июль ");
СоздСоотвМес.Вставить("08","август ");                 
СоздСоотвМес.Вставить("09","сентябрь ");
СоздСоотвМес.Вставить("10","октябрь ");
СоздСоотвМес.Вставить("11","ноябрь ");
СоздСоотвМес.Вставить("12","декабрь ");
ГруппаСтатьиЗатрат=Справочники.ВидыРаботСотрудников.НайтиПоНаименованию("Статьи Затрат");
ГруппаЗаказы=Справочники.ВидыРаботСотрудников.НайтиПоНаименованию("Заказы");
СдельнаяРабота= Справочники.ВидыРаботСотрудников.НайтиПоНаименованию("Сдельная работа");
СоздСоотвРаботы=Новый Соответствие();
Видыработ=Справочники.ВидыРаботСотрудников.Выбрать();
Пока  Видыработ.Следующий() Цикл
Если ВидыРабот.Родитель=ГруппаСтатьиЗатрат Тогда
СоздСоотвРаботы.Вставить(Лев(Видыработ.Наименование,3),Видыработ.Ссылка);
ИначеЕсли ВидыРабот.Родитель=ГруппаЗаказы Тогда
СоздСоотвРаботы.Вставить(Лев(Видыработ.Наименование,5),Видыработ.Ссылка);
иначе
Продолжить;
КонецЕсли;
КонецЦикла;
  Спр=Справочники.ПроизводственныеКалендари.НайтиПоКоду("РК");
дпк=Справочники.ПроизводственныеКалендари.РезультатЗаполненияПроизводственногоКалендаряПоУмолчанию(спр.Код, 2018);
ВидыДнейСоответствие = Новый Соответствие;
Для Каждого СтрокаТаблицы Из ДПК Цикл
ВидыДнейСоответствие.Вставить(СтрокаТаблицы.Дата, СтрокаТаблицы.ВидДня);

КонецЦикла;

// Создание описателя типов для таблицы значений
КЧ = Новый КвалификаторыЧисла(15,2);
КЧД = Новый КвалификаторыЧисла(15,5);
КС = Новый КвалификаторыСтроки(5);
КД = Новый КвалификаторыДаты(ЧастиДаты.Дата);

Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС); 
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧД = Новый ОписаниеТипов(Массив, , ,КЧД);
Массив.Очистить();
Массив.Добавить(Тип("Дата"));
ОписаниеТиповД = Новый ОписаниеТипов(Массив, , ,КД);
ТаблицаДанных = Новый ТаблицаЗначений();
    ФайлDBF = Новый XBase;
    ФайлDBF.ОткрытьФайл(мДБФ,, Истина);
//PERIOD CEX TN VID DNI CHAS SUMMA ZAKAZ BSD BSK SOC_NAL SOC_OT SUMMAR SOC_NALR MESOT GODOT KAT PENS POD_NAL MED_OT MED_OTR RNN

     ФайлDBF.Кодировка = КодировкаXBase.OEM;
Для Каждого ПолеDBF Из ФайлDBF.Поля Цикл
если  ПолеDBF.Имя = "DNI" Или  ПолеDBF.Имя = "CHAS" Или  ПолеDBF.Имя = "SUMMA"   Тогда
ТаблицаДанных.Колонки.Добавить(ПолеDBF.Имя,ОписаниеТиповЧ, ПолеDBF.Имя);
иначеесли  ПолеDBF.Имя = "PERIOD" Тогда
       ТаблицаДанных.Колонки.Добавить(ПолеDBF.Имя,ОписаниеТиповД, ПолеDBF.Имя);
   иначеесли  ПолеDBF.Имя = "CEX" Или  ПолеDBF.Имя = "TN" Или  ПолеDBF.Имя = "VID" Или  ПолеDBF.Имя = "ZAKAZ"  Или
    ПолеDBF.Имя = "BSD" Или ПолеDBF.Имя = "MESOT" Или ПолеDBF.Имя = "GODOT"  Тогда
       ТаблицаДанных.Колонки.Добавить(ПолеDBF.Имя,ОписаниеТиповС, ПолеDBF.Имя);
   Иначе
   продолжить;
  КонецЕсли;
  КонецЦикла;
      месОтч =Сред(Реквизит1,4,2);
  ГодОтч =Сред(Реквизит1,7,4);
ФайлDBF.Первая();
Пока Не ФайлDBF.ВКонце() Цикл // И Лев(ФайлDBF.TN,5)="21014" И Лев(ФайлDBF.TN,5)="21596" и   ФайлDBF.TN="21537"
Если Лев(ФайлDBF.MESOT,2)= месОтч и Лев(ФайлDBF.GODOT,4)= ГодОтч   и ФайлDBF.SUMMA >0 Тогда
Если Лев(ФайлDBF.VID,3)="N02"  ИЛИ  Лев(ФайлDBF.VID,3)="R02" ТОгда
ЗаполнитьЗначенияСвойств(ТаблицаДанных.Добавить(), ФайлDBF);
ФайлDBF.Следующая();
Иначе
ФайлDBF.Следующая();
КонецЕСли;
   Иначе
ФайлDBF.Следующая();
КонецЕсли;

КонецЦикла;
     
     ФайлDBF.ЗакрытьФайл();
//Конец работы с файлом "kopil_1c.dbf"

//Определяем рабочие дни у сотрудников Работающих Сдельно  По файлу Рабель
мДБФ="C:\Обмен\Файлы ДБФ\rabel.dbf";
//мДБФ="D:\ЗУПфайлыПоследние\rabel.dbf";

КЧ5 = Новый КвалификаторыЧисла(5,0);
КС5 = Новый КвалификаторыСтроки(5);
//
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС5 = Новый ОписаниеТипов(Массив, , КС5); 
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ5 = Новый ОписаниеТипов(Массив, , ,КЧ5);
СписоКотс = новый СписокЗначений;
СписоКотс.Добавить("Л/О");  //Личный отпуск Не оплачивается
СписоКотс.Добавить("Р/З");  //Разрешено законом не оплачивается
СписоКотс.Добавить("8С");  //Разрешено законом оплачивается по среднему
СписоКотс.Добавить("П");    //Прогул не оплачивается
СписоКотс.Добавить("Б/Л"); //Больничный лист  оплачивается по среднему для Б\л
СписоКотс.Добавить("Б");   //Больничный лист  оплачивается по среднему для Б\л
СписоКотс.Добавить("К");   //Командировка  оплачивается по среднему
СписоКотс.Добавить("К8");   //Командировка  оплачивается по среднему
СписоКотс.Добавить("К9");   //Командировка  оплачивается по среднему
СписоКотс.Добавить("К10");   //Командировка  оплачивается по среднему
СписоКотс.Добавить("О");    //Отпуск  оплачивается по среднему для  отпусков
СписоКотс.Добавить("Д/О");  //Отпуск по беременности и родам оплачивается по среднему для  отпусков
СписоКотс.Добавить("У/О");  //Учебный Отпуск не оплачивается
СписоКотс.Добавить("Г/О");  //Гос обязаности  оплачивается по среднему
СписоКотс.Добавить("Р/А");  //Разрешено администрацией  Не оплачивается
СписоКотс.Добавить("Д");    //Донор  оплачивается по среднему
СписоКотс.Добавить("Х");    //Отсутстие Не оплачивается
СписоКотс.Добавить("УВ");    //Уволен Отсутстие Не оплачивается

//******************************************  КОШКИН АРТЁМ АНАТОЛЬЕВИЧ 21596 И Лев(ФайлDBF.TN,5)="21596"
     месОтч =Сред(Реквизит1,4,2);
  ГодОтч =Сред(Реквизит1,7,4);

ТаблицаДанныхР = Новый ТаблицаЗначений();
    ФайлDBF = Новый XBase;
    ФайлDBF.ОткрытьФайл(мДБФ,, Истина);
     ФайлDBF.Кодировка = КодировкаXBase.ANSI;
   Столб=1;
Для Каждого ПолеDBF Из ФайлDBF.Поля Цикл
Если ПолеDBF.Тип ="N" ТОгда
ТаблицаДанныхР.Колонки.Добавить(ПолеDBF.Имя,ОписаниеТиповЧ5, ПолеDBF.Имя);
Иначе
ТаблицаДанныхР.Колонки.Добавить(ПолеDBF.Имя,ОписаниеТиповС5, ПолеDBF.Имя);
КонецЕсли;
КонецЦикла;
ФайлDBF.Первая();
Пока Не ФайлDBF.ВКонце() Цикл     // И Лев(ФайлDBF.UOPL,1) ="1"  И  Лев(ФайлDBF.TN,5)="21537"

Если  ФайлDBF.MESOT=месОтч И ФайлDBF.GODOT=ГодОтч     Тогда

     ЗаполнитьЗначенияСвойств(ТаблицаДанныхР.Добавить(), ФайлDBF);
КонецЕсли;
ФайлDBF.Следующая();
КонецЦикла;
  ФайлDBF.ЗакрытьФайл();
Тцех="";                       
СоотвСотр=новый Соответствие();
  ТаблицаДанныхР.Сортировать("CEX возр,TN возр");
  Таблицавывода=ТаблицаДанныхР.Скопировать();
  Таблицавывода.Свернуть("CEX,TN");
  Таблицавывода.Колонки.Добавить("Прич",ОписаниеТиповС,"Прич");
  Таблицавывода.Колонки.Добавить("Ден",ОписаниеТиповЧ,"Ден");
Таблицавывода.Колонки.Добавить("ВидДен",,"ВидДен");

Для каждого СтрокаТаб из ТаблицаДанныхР  Цикл
Прич="";
//РабДен=ВидыДнейСоответствие.Получить(ДатаДня);
//СтрокаТаб.ВидДен<>Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий
Для Столб=6 по 36 Цикл //Обычные Дни и часы
индСто=Столб-1;
Ден= Столб-5;
Если Ден<= День(Реквизит1) Тогда
ДатаДня= Дата(Год(Реквизит1),Месяц(Реквизит1),Ден);
Иначе
ДатаДня = Реквизит1;

КонецЕсли;
РабДен=ВидыДнейСоответствие.Получить(ДатаДня);

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

ТаблицаДанных.Сортировать("CEX возр, TN возр,ZAKAZ возр");  // ,ZAKAZ
ТаблицаДанных.Свернуть("CEX,TN,BSD,ZAKAZ","SUMMA");
Для каждого стр из ТаблицаДанных Цикл
Если стр.SUMMA =0   Тогда продолжить; КонецЕсли;
ДДРЗ=Документы.ДанныеДляРасчетаЗарплаты.СоздатьДокумент();
ДДРЗ.Организация=ВыбраннаяОрганизация;
ПослДень= СоотвСотр.Получить(Лев(стр.TN,5));
Если ПослДень =неопределено Тогда
ДатаРаботы=Реквизит1;
иначе
ДатаРаботы=Дата(ГодОтч,месОтч,ПослДень);

КонецЕсли;

ДДРЗ.Дата=ДатаРаботы;
ДДРЗ.Период=ДатаРаботы;
ДДРЗ.ПериодОкончания=ДатаРаботы;

ДДРЗ.ВидДокумента=Справочники.ВидыДокументовВводДанныхДляРасчетаЗарплаты.НайтиПоНаименованию("Сдельный заработок Зенит");
ТчПоказ=ДДРЗ.ЗначенияПоказателей.Добавить();
ТчВыпРаботы=ДДРЗ.ВыполненныеРаботы.Добавить();
Если  Лев(стр.BSD,4)="8410" Тогда
Кл= Лев(стр.ZAKAZ,3);
Иначе
Кл= Лев(стр.ZAKAZ,5);
КонецЕсли;
Работа=СоздСоотвРаботы.Получить(Кл);
Если Работа=Неопределено Тогда
ТчВыпРаботы.ВидРабот=СдельнаяРабота;

Иначе
ТчВыпРаботы.ВидРабот=Работа;
КонецЕсли;
Работник=Справочники.Сотрудники.НайтиПоКоду(Лев(стр.TN,5));
Если Работник= Справочники.Сотрудники.ПустаяСсылка() Тогда
ТчВыпРаботы.Сотрудник=Дежурный;
ДДРЗ.Сотрудник =Дежурный;
ТчПоказ.Объект =Дежурный;
Сообщить("Нет ТН:"+Лев(стр.TN,5));
иначе
ТчВыпРаботы.Сотрудник=Работник;
ДДРЗ.Сотрудник =Работник;
ТчПоказ.Объект =Работник;
КонецЕсли;
ТчВыпРаботы.Период=ДатаРаботы;
ТчВыпРаботы.ОбъемВыполненныхРабот=стр.SUMMA;
ТчВыпРаботы.Сумма=стр.SUMMA;
ТчПоказ.Период=ДатаРаботы;
ТчПоказ.Показатель=Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Сдельный заработок Зенит");
ТчПоказ.Значение=стр.SUMMA;
попытка
ДДРЗ.Записать(РежимЗаписиДокумента.Проведение);
исключение
ДДРЗ.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;

КонецЦикла;

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

&НаКлиенте
Процедура Команда1(Команда)
Команда1НаСервере();
КонецПроцедуры

&НаКлиенте
Процедура Поле1ПриИзменении(Элемент)
Если ПустаяСтрока(Реквизит1) Тогда
Сообщить("Нет  Даты");
КонецЕсли;
КонецПроцедуры

PS - как сложно разбираться в чужом коде :)



АлександрВладимирович


Алексей Рожков


Теги:

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

Рейтинг@Mail.ru

Поиск