Имя: Пароль:
1C
1С v8
Документ начисления зарплаты в ЕРП
☑
0 lirt82
 
22.10.26
✎
10:42
В документ НачислениеЗарплаты, добавил команду загрузить из эксель, описал обработчик, таб. часть Начисления заполняется  данными из экселя, но показатели(налоги) пустые и следовательно колонка Результат пустая, не могу найти процедуру обработчик которая вызывает заполнение и расчет показателей. Кто сталкивался подскажите процедуру?
1 paramedic
 
22.10.26
✎
10:45
А посмотреть обработчик поля Начисление ПриИзменении?
2 lirt82
 
22.10.26
✎
14:49
(1) смотрю
кто может сюда скинуть пример кода по заполнению документа "НачислениеЗарплаты" в ЗУП-е, ЕРП из внешнего источника?
3 lirt82
 
22.10.26
✎
14:52
вот мой код, при выполнении таб часть заполняется то показатели пустые как и колонка Результат
&НаСервере
Функция ВыполнитьЗагрузкуИзФайлаExcelНаСервере(Адрес, ТекстОшибки) Экспорт
    
    Данные = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеExcelФайла);
    Данные.Записать(ИмяВременногоФайла);
    
    Объект.Начисления.Очистить();
    
    Документ = Новый ТабличныйДокумент;
    Документ.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    ПЗ = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(Документ.Область(4, 2, Документ.ВысотаТаблицы, 40));
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    ТаблицаЗначений = ПЗ.Результат.Выгрузить();
    
    //+ в первом цикле сформируем массив ссылок сотрудников полученных от физ. лиц
    ТекстОшибки = "";
    ТЗСотрудникиИСуммы = Новый ТаблицаЗначений;
    ТЗСотрудникиИСуммы.Колонки.Добавить("Сотрудник");
    ТЗСотрудникиИСуммы.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(13, 2)));
    
    МассивСотрудников = Новый Массив;
    
    Для Каждого ТС Из ТаблицаЗначений Цикл
        
        ФИО = СокрЛП(ТС.Ф_И_О_);
        ФизическоеЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ФИО);
        Если Не ФизическоеЛицо.Пустая() Тогда
            НашлиСотрудника = КадровыйУчетРасширенный.ОсновнойСотрудникФизЛица(ФизическоеЛицо, Объект.Организация, Объект.Дата);
            Если НашлиСотрудника <> Неопределено Тогда
                Если ЗначениеЗаполнено(ТС.ПерерИтого) Тогда
                    МассивСотрудников.Добавить(НашлиСотрудника);
                    Стр = ТЗСотрудникиИСуммы.Добавить();
                    Стр.Сотрудник = НашлиСотрудника;
                    Стр.Сумма = Окр(ТС.ПерерИтого, 0);
                КонецЕсли;
            Иначе
                ТекстОшибки = ТекстОшибки + НСтр("ru = 'Не найден сотрудник %1.'") + Символы.ПС;
                ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ФИО);
            КонецЕсли;
        Иначе
            ТекстОшибки = ТекстОшибки + НСтр("ru = 'Не удалось найти физическое лицо %1.'") + Символы.ПС;
            ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ФИО);
        КонецЕсли;
        
    КонецЦикла;
    //- в первом цикле сформируем массив ссылок сотрудников полученных от физ. лиц
    
    //+ во втором цикле заполним таб. часть документа            
    Ном = 0;
    
    Если МассивСотрудников.Количество() > 0 Тогда
        КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников(Истина,
        ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСотрудников),
        "Организация, Подразделение, ГрафикРаботы, ДатаУвольнения", Объект.Дата);
        
        ПоказательПремия = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "Премия");
        НачислениеПремия = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Премия за месяц");
        
        Для Каждого ДанныеСотрудника Из КадровыеДанныеСотрудников Цикл    
            
            Если ЗначениеЗаполнено(ДанныеСотрудника.ДатаУвольнения) Тогда
                ТекстОшибки = ТекстОшибки + НСтр("ru = 'Сотрудник %1 уволен.'") + Символы.ПС;
                ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Строка(ДанныеСотрудника.Сотрудник));
                Ном = Ном + 1;
            КонецЕсли;
            Если ДанныеСотрудника.Подразделение = Объект.Подразделение Тогда  
                НС = Объект.Начисления.Добавить();
                НС.Сотрудник = ДанныеСотрудника.Сотрудник;
                НС.Подразделение = ДанныеСотрудника.Подразделение;
                НС.ГрафикРаботы = ДанныеСотрудника.ГрафикРаботы;
                НС.ПериодДействия = Объект.МесяцНачисления;
                НС.ДатаНачала = Объект.МесяцНачисления;
                НС.ДатаОкончания = КонецМесяца(Объект.МесяцНачисления);
                НС.ПериодРегистрацииВремени = Объект.МесяцНачисления;
                НС.Начисление = НачислениеПремия;
                НС.Показатель1 = ПоказательПремия;
                НС.Значение1 = ТЗСотрудникиИСуммы.Найти(ДанныеСотрудника.Сотрудник, "Сотрудник").Сумма;
            КонецЕсли;
            
        КонецЦикла;
    КонецЕсли;
    
    Если Ном > 0 Тогда
        ТекстОшибки = ТекстОшибки + НСтр("ru = 'Загрузка завершена. Найдено %1 уволенных сотрудников (требуют проверки).'");
    Иначе
        ТекстОшибки = ТекстОшибки + НСтр("ru = 'Загрузка завершена.'");
    КонецЕсли;
    ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Ном);
    
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
    КонецПопытки;
    
    ЗарплатаКадрыКлиентСервер.ЗаполнитьМесяцПоДатеВТабличнойЧасти(Объект.Начисления, "ПериодДействия", "ПериодДействияСтрокой");
    //ПересчитатьСотрудниковНаСервере();
    //СотрудникиДокумента = Объект.Начисления.Выгрузить(, "Сотрудник").ВыгрузитьКолонку("Сотрудник");
    //ПерезаполнитьДанныеФормыНаСервере(СотрудникиДокумента, Ложь);
    
    Возврат ТекстОшибки;
    
КонецФункции
4 lirt82
 
22.10.26
✎
15:03
вот так получается
5 Gucci76
 
22.10.26
✎
15:53
(0) А почему премия грузится в начисление зарплаты? Может ее в премию грузить?
6 paramedic
 
22.10.26
✎
16:08
1. Вы недозаполняете необходимые ТЧ.
2. В коде даже комментарий есть:
// Заполнение и расчет начислений.
7 Gucci76
 
22.10.26
✎
16:53
(6) Зачем для загрузки премии использовать самый сложный документ расчета? В премии, разовом начислении тоже не одна ТЧ.
На Бухэксперт уже есть обработка загрузки во многие документы (кроме начисления ЗП :-) ).
8 paramedic
 
22.10.26
✎
16:55
(7) Откуда мы знаем, что ТС грузит только премии? Может премии как пример показаны?
9 Gucci76
 
22.10.26
✎
16:59
(8) Вот я и спрашиваю ТС ))))
10 Гена
 
гуру
22.10.26
✎
17:04
(5) +
За загрузку в док Начисления зп данных кроме поля результата - сразу расстрел. Только сначала напоить чайком... всенеп'геменно... это а'гхиважно!
11 Amra
 
22.10.26
✎
17:28
(10) Согласен. Удаляет гланды через .опу.
(0) Выкинуть весь код в топку. Переделать показатель премии как задаваемый через документ данные для начисления зп, и грузить туда. Гоооораздо проше и правильнее
12 Вадя
 
22.10.26
✎
18:18
Данные для расчета зарплаты - это же архискучно !!!
13 Вадя
 
22.10.26
✎
18:21
Нужно сочинить свои документы - Начисления по KPI или на крайний случай какой-нибудь навороченный Сдельный наряд для каждого подразделения со своей спецификой и грузить в них данные из екселек. Это всем понравится !!!
14 Amra
 
22.10.26
✎
19:07
(13) Да-да, а потом угробить базу при обновлении, при таких познаниях ЗУПа)) Это по нашему, модно и современно)
15 El_Duke
 
гуру
22.10.26
✎
22:07
Мне вообще непонятно в чем смысл внедрения блока зарплаты если расчет по прежнему производится на коленке в экселе ...
16 paramedic
 
23.10.26
✎
09:06
(15) Чтобы весь учет был в одном месте. В ЕРП, если хотите, чтобы зарплата могла использоваться в качестве базы распределения, учет ее должен быть в ЕРП.
17 El_Duke
 
гуру
23.10.26
✎
09:18
(16) Ну и на здоровье
Зачем считать сначала в экселе и потом грузить в ЕРП ? Почему сразу в ЕРП не считать ?
18 ДиВаH2
 
24.10.26
✎
17:28
(16) А если учет ведется в зуп корп и зарплата нужна в качестве базы распределения в ерп, как быть? странно, что в ерп обычный блок зуп, вместо зуп корп.
19 paramedic
 
26.10.26
✎
09:29
(17) Например, не умеют перенести свои хитроумные алгоритмы расчета в ЕРП.
(18) Тут засада. Не будет у вас базы Зарплата, если вы занесете только отражение з/пл.
20 Мультук
 
гуру
26.10.26
✎
10:20
(0)

Добавлю еще что:

НашлиСотрудника = КадровыйУчетРасширенный.ОсновнойСотрудникФизЛица(ФизическоеЛицо, Объект.Организация, Объект.Дата);


-- Рано или поздно появятся совместители.

Ясен фиг, это сразу не заметят, а потом будет неприятно.

P.S.
Разбивать код на процедуры/функции нынче не модно ?
21 Amra
 
26.10.26
✎
10:26
(20) Проблемы могут быть уже сейчас... Если есть полные тезки вот тут ФизическоеЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ФИО);
22 ДиВаH2
 
26.10.26
✎
16:33
(19) базу распределения можно куда-то занести в ерп? есть аналог документа упп "установка базы распределения"?
23 paramedic
 
26.10.26
✎
17:19
(22) Нет. Варианты баз распределения определены на уровне конфигурации.
24 Krendel
 
26.10.26
✎
18:04
(22) Можно, только синтетически
или документ ручного распределения и заполнением долей распределения
или документ реклассификации
25 ДиВаH2
 
27.10.26
✎
16:20
(24) спасибо, посмотрю
26 lirt82
 
28.10.26
✎
14:51
решение:

&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    
    Если Результат Тогда
        СписокОшибок = ВыполнитьЗагрузкуИзФайлаExcelНаСервере(Адрес, Неопределено);
        ПродолжитьРасчетСтрокНаКлиенте();
        Если ЗначениеЗаполнено(СписокОшибок) Тогда
            ОбщегоНазначенияКлиент.СообщитьПользователю(СписокОшибок);
        КонецЕсли;
    Иначе
        ТекстСообщения = НСтр("ru = 'Файл не был выбран!'");
        ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьРасчетСтрокНаКлиенте()
    
    ОписаниеТаблицыВидовРасчета = ОписаниеТаблицыНачислений(ЭтаФорма);
    ЗарплатаКадрыРасширенныйКлиент.ВводНачисленийНачислениеПриИзменении(ЭтаФорма, ОписаниеТаблицыВидовРасчета, 2);
    РасчетЗарплатыРасширенныйКлиент.ДополнитьСтрокуРасчета(ЭтаФорма, ОписаниеТаблицыВидовРасчета, Истина, Истина);
    
    Для Каждого ТекущиеДанные Из Объект.Начисления Цикл    
        
        СтрокаНачислений = ТекущиеДанные;
        
        Если СтрокаНачислений = Неопределено Тогда
            Возврат;
        КонецЕсли;
        
        СтрокиНачислений = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтрокаНачислений);
        ЗарплатаКадрыРасширенныйКлиентСервер.ВводНачисленийИнициализироватьСтрокиНачислений(ЭтаФорма, СтрокиНачислений, ОписаниеТаблицыВидовРасчета, 2, ТекущиеДанные.Сотрудник);
        
        РасчетЗарплатыКлиент.СтрокаРасчетаПриОкончанииРедактирования(ЭтаФорма, ОписаниеТаблицыВидовРасчета);
        УстановитьДоступностьКомандыЗаполнитьССохранениемИсправленийПриОкончанииРедактированияСтроки(ТекущиеДанные);
        
        ТекущиеДанные.Значение1 = ТекущиеДанные.Результат;
        //ТекущиеДанные.Результат = 0; //все равно Результат очистится при расчете
        
        РассчитатьСотрудникаНаСервере(ТекущиеДанные.Сотрудник, ОписаниеТаблицыВидовРасчета, Ложь);
    КонецЦикла;
    
    РассчитатьИтогиПоДокументу(ЭтаФорма);
    УстановитьОтображениеСообщенияОНеобходимостиПерерасчета();
    
КонецПроцедуры

&НаСервере
Функция ВыполнитьЗагрузкуИзФайлаExcelНаСервере(Адрес, ТекстОшибки) Экспорт
    
    ТЗ_ИзФайлаExcel = Получить_ТЗ_ИзФайлаExcelНаСервере(Адрес);
    
    //+ в первом цикле сформируем массив ссылок сотрудников полученных от физ. лиц
    ТекстОшибки = "";
    ТЗСотрудникиИСуммы = Новый ТаблицаЗначений;
    ТЗСотрудникиИСуммы.Колонки.Добавить("Сотрудник");
    ТЗСотрудникиИСуммы.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(13, 2)));
    
    МассивСотрудников = Новый Массив;
    
    Для Каждого ТС Из ТЗ_ИзФайлаExcel Цикл
        
        ФИО = СокрЛП(ТС.Ф_И_О_);
        ФизическоеЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ФИО);
        Если Не ФизическоеЛицо.Пустая() Тогда
            НашлиСотрудника = КадровыйУчетРасширенный.ОсновнойСотрудникФизЛица(ФизическоеЛицо, Объект.Организация, Объект.Дата);
            Если НашлиСотрудника <> Неопределено Тогда
                Если ЗначениеЗаполнено(ТС.ПерерИтого) Тогда
                    МассивСотрудников.Добавить(НашлиСотрудника);
                    Стр = ТЗСотрудникиИСуммы.Добавить();
                    Стр.Сотрудник = НашлиСотрудника;
                    Стр.Сумма = Окр(ТС.ПерерИтого, 0);
                КонецЕсли;
            Иначе
                ТекстОшибки = ТекстОшибки + НСтр("ru = 'Не найден сотрудник %1.'") + Символы.ПС;
                ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ФИО);
            КонецЕсли;
        Иначе
            ТекстОшибки = ТекстОшибки + НСтр("ru = 'Не удалось найти физическое лицо %1.'") + Символы.ПС;
            ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ФИО);
        КонецЕсли;
        
    КонецЦикла;
    //- в первом цикле сформируем массив ссылок сотрудников полученных от физ. лиц
    
    //+ во втором цикле заполним таб. часть документа            
    Ном = 0;
    
    Если МассивСотрудников.Количество() > 0 Тогда
        КадровыеДанныеСотрудников = КадровыйУчет.КадровыеДанныеСотрудников(Истина,
        ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСотрудников),
        "Организация, Подразделение, ГрафикРаботы, ДатаУвольнения", Объект.Дата);
        
        НачислениеПремия = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Премия за месяц");
            
        Для Каждого ДанныеСотрудника Из КадровыеДанныеСотрудников Цикл    
            
            Если ЗначениеЗаполнено(ДанныеСотрудника.ДатаУвольнения) Тогда
                ТекстОшибки = ТекстОшибки + НСтр("ru = 'Сотрудник %1 уволен.'") + Символы.ПС;
                ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Строка(ДанныеСотрудника.Сотрудник));
                Ном = Ном + 1;
            КонецЕсли;
            Если ДанныеСотрудника.Подразделение = Объект.Подразделение Тогда  
                НС = Объект.Начисления.Добавить();
                НС.Сотрудник = ДанныеСотрудника.Сотрудник;
                НС.Подразделение = ДанныеСотрудника.Подразделение;
                НС.Начисление = НачислениеПремия;
                НС.ГрафикРаботы = ДанныеСотрудника.ГрафикРаботы;
                НС.ГрафикРаботыНорма = ДанныеСотрудника.ГрафикРаботы;
                НС.ОбщийГрафик = ДанныеСотрудника.ГрафикРаботы;
                НС.ПериодДействия = Объект.МесяцНачисления;
                НС.ПериодРегистрацииВремени = Объект.МесяцНачисления;
                // передадим значение показателя для последующего расчета
                НС.Результат = ТЗСотрудникиИСуммы.Найти(ДанныеСотрудника.Сотрудник, "Сотрудник").Сумма;
            КонецЕсли;
            
        КонецЦикла;
                    
    КонецЕсли;
    
    Если Ном > 0 Тогда
        ТекстОшибки = ТекстОшибки + НСтр("ru = 'Загрузка завершена. Найдено %1 уволенных сотрудников (требуют проверки).'");
    Иначе
        ТекстОшибки = ТекстОшибки + НСтр("ru = 'Загрузка завершена.'");
    КонецЕсли;
    ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Ном);
    
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
    КонецПопытки;
    
    ЗарплатаКадрыКлиентСервер.ЗаполнитьМесяцПоДатеВТабличнойЧасти(Объект.Начисления, "ПериодДействия", "ПериодДействияСтрокой");
       
    Возврат ТекстОшибки;
    
КонецФункции

&НаСервере
Функция Получить_ТЗ_ИзФайлаExcelНаСервере(Адрес)
    
    Данные = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеExcelФайла);
    Данные.Записать(ИмяВременногоФайла);
    
    Документ = Новый ТабличныйДокумент;
    Документ.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    ПЗ = Новый ПостроительЗапроса;
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(Документ.Область(4, 2, Документ.ВысотаТаблицы, 40));
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();
    
    Возврат ПЗ.Результат.Выгрузить();
    
КонецФункции
27 paramedic
 
28.10.26
✎
15:28
(24) Реклассификация - просто перенос расходов между статьями. На базу распределения не влияет никак.
Ручное распределение хорошо, но когда у вас 100-150 партий выпуска и под 100 статей, то задавать все коэффициенты вручную ежемесячно - врагу не пожелаешь. А не дай бог зарплата поменяется - все коэффициенты заново считать.