Имя: Пароль:
1C
1С v8
ЗУП - программно заполнение док-та "Доход в натуральной форме: не считает НДФЛ
,
0 Масянька
 
04.08.23
09:17
Доброе утро!
Универсальным отчетом сравнила ТЧ документов, где считает и созданный программно. Отличий не нашла. А ндфл нет.
Что не досмотрела?
Спасибо.
1 asady
 
04.08.23
09:27
(0)  в этом документе есть ТЧ "НДФЛ" - она почему-то на форму не выведена
программно заполнить ее нужно
2 Масянька
 
04.08.23
09:30
(1) Повторяю: "Универсальным отчетом сравнила ТЧ документов, где считает и созданный программно. Отличий не нашла."
3 SleepyHead
 
гуру
04.08.23
09:38
(2) Сравни теперь реквизиты документов. А еще хитрая ЗУПа любит хранить данные в регистрах, которые связаны с документом, ну к примеру - документы, учтенные в расчете НДФЛ

Сравнивай вообще все, что связано с другим документом, в котором видно.
4 asady
 
04.08.23
09:38
(2) ты их не видишь, а они есть.
отладчиком пройдись - может найдешь
5 Масянька
 
04.08.23
09:40
(3) В реквизитах (различия) - руководитель, ГБ, ответственный.
6 Масянька
 
04.08.23
09:41
+(5) Если нажать "Пересчитать сотрудника" - считает.
7 Масянька
 
04.08.23
09:42
(4) Да, заполнила я таблицы: физ. лица, начисления, НДФЛ.
Другие версии есть?
8 Масянька
 
04.08.23
09:43
(3) Открыла движения док-та (рассчитан НДФЛ, не проведен) - пусто.
9 Масянька
 
04.08.23
09:45
(3) В этом регистре нет док-та (в котором рассчитан НДФЛ).
10 SleepyHead
 
гуру
04.08.23
10:00
(9) Отладчик в ПриСозданииНаСервере, ПриОткрытии, итп
11 SleepyHead
 
гуру
04.08.23
10:02
табличные части "Распределение результатов начислений", "распределение результатов удержаний" не заполнены.
12 Масянька
 
04.08.23
10:04
(11) Да (не заполнены).
13 SleepyHead
 
гуру
04.08.23
10:05
(12) А в документе, который вручную создан, заполнены?
14 Масянька
 
04.08.23
10:08
(13) Нет.
15 Масянька
 
04.08.23
10:09
Как включить отладку?
База SQL
16 SleepyHead
 
гуру
04.08.23
10:10
17 asady
 
04.08.23
10:13
(0) Модуль формы ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) https://infostart.ru/1c/articles/1098803/?ysclid=lkw8vzmdpn593039213

В этом обработчике можно дозаполнять реквизиты объекта (через параметр ТекущийОбъект)  или провести дополнительные проверки. Есть доступ к данным формы.

Важно понимать, что в предыдущем обработчике (в процессе проверки заполнения) произошло «разделение» формы на форму и прикладной объект (пока только в памяти сервера), данные которого будут записаны в базу данных.

В обработчике модуля формы ПередЗаписьюНаСервере появляется возможность доступа как к данным основного реквизита формы Объект, а также и к самому объекту, который будет записан через параметр обработчика ТекущийОбъект.

Параметр ТекущийОбъект  имеет тип класса «объект» в зависимости от типа записываемого объекта (в случае записи документа ДокументОбъект). Т.е. экземпляр класса объект создан, и можно обратиться к его свойствам и методам, но в базу данных ещё не записан.

И тут внимание!!! ТекущийОбъект - объект, который реально будет записан в информационную базу и дозаполнять реквизиты нужно именно через параметр ТекущийОбъект.

Внесение изменений через реквизит формы объекта  Объект не даст никакого результата, его можно только анализировать. В информационную базу эти данные записаны не будут. После завершения транзакции записи, данные из ТекущегоОбъекта запишутся в Объект.  Таким образом, все изменения, внесенные в Объект, пропадут.

Также нужно понимать, что при программной записи объекта это событие вызываться не будет (!!!!!!).

Поэтому если какие-либо алгоритмы должны выполняться при любом способе записи данных объекта, а не только при записи из формы, их следует размещать в обработчике события объекта (ПередЗаписью), а не в обработчике события формы.

В текущем документе имеем:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    РеквизитыВДанные(ТекущийОбъект);
    Если ЗаполнениеВыполнено <> Неопределено Тогда
        ТекущийОбъект.ДополнительныеСвойства.Вставить("УдалитьПерерасчетыЗарплаты", Истина);
        ТекущийОбъект.ДополнительныеСвойства.Вставить("СотрудникиПерерасчетаЗаработка",
            ОбщегоНазначения.ВыгрузитьКолонку(ЗаполнениеВыполнено, "Ключ"));
    КонецЕсли;
...
18 Масянька
 
04.08.23
10:17
(16) Это на сервере?
19 Гена
 
гуру
04.08.23
10:18
А может не включена опция в Настройка - Расчет зарплаты - <Выполнять автоматический пересчет документов при их редактировании> ?
Или она не влияет на программно создаваемый док?
20 Масянька
 
04.08.23
10:22
(16) На сервере все включено.
21 Гена
 
гуру
04.08.23
10:27
Я так понимаю, что идёт список десятков сотрудников по путёвкам детей в лагеря. А нельзя не мучится с "два в одном флаконе" и сначала создать программно доки дохода, а потом их следующей приблудой программно же и рассчитать/провести?
22 Масянька
 
04.08.23
10:31
(21) А "программно рассчитать" это как?
Я просто уже не знаю, и не понимаю...
23 Гена
 
гуру
04.08.23
10:38
(22) Это к программистам. Просто по логике проще сначала создать кучу однотипных доков, а затем уже их перебирать, рассчитывать, проводить. Нет?
24 SleepyHead
 
гуру
04.08.23
10:46
(23) "Ой, ежики, идите нахрен, я не тактик, я стратег" (с)

(14) Не верю. Мне приходилось такие табличные части заполнять, без них документ просто отказывался проводиться.
25 Гена
 
гуру
04.08.23
10:47
(24) матершинник )
26 SleepyHead
 
гуру
04.08.23
11:00
(25) Вчера была опечатка, если вы про нее ))
27 Масянька
 
04.08.23
11:17
28 SleepyHead
 
гуру
04.08.23
11:40
(27) Это документ, созданные вручную? Который проводится?
29 Масянька
 
04.08.23
11:45
(28) Это все документы - пусто.
30 SleepyHead
 
гуру
04.08.23
11:45
Посмотрел в одной из своих реальных баз, да, не заполняются эти две таблицы, но только в том случае, если нет распределения по статьям финансирования или по территориям/условиям труда. Заполнены только таб части НДФЛ и Начисления.
31 Масянька
 
04.08.23
11:49
(30) Чего делать-то?
32 SleepyHead
 
гуру
04.08.23
11:52
(31) Дальше разбираться. Ты вот смотришь какими-то разрозненными кусками, а нужно взять документ, который создан вручную и проводится, и вывести все его реквизиты в таблицу. Рядом вывести реквизиты документа, который не проводится, и посмотреть, чем отличаются. То же по каждой табличной части.

Вся логика проведения зашита в менеджере этого документа, так что советы по воспроизведению расчетов идут мимо, это тупиковый путь. Документ проводится по данным, записанным в объкте.
33 asady
 
04.08.23
12:03
(32) - не совсем прав
читай (17) до просветления
34 SleepyHead
 
гуру
04.08.23
12:05
(33) Не понял, что особенного дает 17 ? Заполняешь объект сразу как нужно и записываешь с проведением.
35 Масянька
 
04.08.23
12:05
(33) До какого просветления?
Я создаю новый док-т, заполняю, записываю.
Теперь записывать нужно 2 раза?
36 SleepyHead
 
гуру
04.08.23
12:06
(35) Там либо очень сильное колдунство, которое я не понимаю, либо он ошибается. Предложенный метод поможет, если ты работаешь с формой.  А ты, насколько я понимаю, записывешь без формы, а создаешь документы программно.

Причем тут вообще методика из 17, непонятно.
37 asady
 
04.08.23
12:09
(36) разработчики 1С сделали некую фичу - я привел фрагмент из формы документа "ДоходВНатуральнойФорме" - из-за которой проведение из формы и без формы будет всегда иметь разные результаты
38 SleepyHead
 
гуру
04.08.23
12:12
(37) Там вообще отрабатывается запись в фоне, насколько я понял. Все равно не врубаюсь, в чем тут логика - не должны результаты проведения отличаться.
39 Gucci76
 
04.08.23
12:13
(35) А как заполняли? Руками или экспортной процедурой из формы документа?
40 SleepyHead
 
гуру
04.08.23
12:13
ну да, есть там своя логика, например вот это вызывается
Но опять же, в итоге проведение все равно идет из модуля объекта по данным объекта.
В форме всего лишь обеспечивается правильное заполнение данных объекта.

Процедура РеквизитыВДанные(ТекущийОбъект)
    
    ТекущийОбъект.Показатели.Очистить();
    
    ОписанияТаблиц = Новый Массив;
    ОписанияТаблиц.Добавить(ОписаниеТаблицыНачислений());
    ОписанияТаблиц.Добавить(ОписаниеТаблицыПерерасчетов());
    ОписанияТаблиц.Добавить(ОписаниеТаблицыЗависимыеНачисления());
    
    ЗарплатаКадрыРасширенный.ВводНачисленийРеквизитВДанные(ЭтотОбъект, ТекущийОбъект, ОписанияТаблиц, 2);
    ЗарплатаКадрыРасширенный.ВводРаспределенияРезультатовРасчетаРеквизитВДанные(ЭтотОбъект, ТекущийОбъект, ОписанияТаблицДляРаспределенияРезультата());
    РасчетЗарплатыРасширенныйФормы.РаспределениеПоТерриториямУсловиямТрудаРеквизитВДанные(ЭтотОбъект, ТекущийОбъект, ОписанияТаблицСРаспределениемПоТерриториямУсловиямТруда());
    
КонецПроцедуры
41 Масянька
 
04.08.23
12:18
(39) Кусок:
&НаСервере
Процедура СоздатьСамДокумент(ДатаДохода, СписокДанных)
    
    ДокументНачисления = Документы.ДоходВНатуральнойФорме.СоздатьДокумент();

    ДокументНачисления.Организация            = Справочники.Организации.ОрганизацияПоУмолчанию();
    ДокументНачисления.Дата                    = ДатаДохода;
    ДокументНачисления.МесяцНачисления        = ДатаДохода;
    ДокументНачисления.Начисление            = Объект.ВидРасчета;
    ДокументНачисления.ДатаПолученияДохода    = ДатаДохода;

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

        НоваяСтрокаНачисления = ДокументНачисления.Начисления.Добавить();
        
        НоваяСтрокаНачисления.Сотрудник         = мСотрудник;
        НоваяСтрокаНачисления.Подразделение     = мПодразделение;
        НоваяСтрокаНачисления.ПериодДействия = мМесяцНалоговогоПериода;
42 asady
 
04.08.23
12:18
(40) скорее всего причина в том что данные объекта при программном заполнении заполняются программистом не так как в типовой процедура РеквизитыВДанные()
43 Gucci76
 
04.08.23
12:24
На форме документа есть экспортная процедура
Процедура ПерезаполнитьДанныеФормыНаСервере(Знач Сотрудники, СохранятьИсправления = Истина) Экспорт

попробуйте ее использовать
44 Масянька
 
04.08.23
12:28
(43) А как её использовать в обработке?
45 Gucci76
 
04.08.23
12:32
&НаКлиенте
Процедура ЗаполнитьДокумент()

                ЗаполнитьДокументНаСервере(); // заполняете ТЧ и реквизиты шапки документа
        


                МассивСотрудников = Новый Массив;
        // заполнить как надо массивСотрудников
        
        ПараметрыФормы = Новый Структура("Ключ",Объект.ДокументСсылка);
        
        УпрФорма = ПолучитьФорму("Документ.ДоходВНатуральнойФорме.ФормаОбъекта",ПараметрыФормы,ЭтаФорма);
        //УпрФорма.СотрудникиКРасчету = МассивСотрудников;
        УпрФорма.ПерезаполнитьДанныеФормыНаСервере(МассивСотрудников);
        УпрФорма.Модифицированность = Истина;
        УпрФорма.Открыть();

КонецПроцедуры
46 Gucci76
 
04.08.23
12:32
Приблизительно так
47 Hungry Programmer
 
04.08.23
12:35
Ужас, шел 2023-й год. Создать и рассчитать документ на сервере в ЗУПе по прежнему большой геморрой без обращения к форме (
48 Saval1986
 
04.08.23
13:31
(0) может конечно глупай вопрос, но все же задам т.к.  сам попадал )) после программного заполнения формы как записываете документ? Режим записи - проведение?
49 SleepyHead
 
гуру
04.08.23
14:59
Вот такой код прекрасно работает

Ссылка на обработку на яндекс-диске, пока живая, потом удалю

https://disk.yandex.ru/d/RGwivp_YyDBBNw

&НаСервере
Процедура СоздатьДоходВНатуральнойФормеНаСервере()

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

&НаКлиенте
Процедура СоздатьДоходВНатуральнойФорме(Команда)
    Если НЕ ПроверитьЗаполнение() Тогда
        Возврат
    КонецЕсли;
    СоздатьДоходВНатуральнойФормеНаСервере();
КонецПроцедуры
50 SleepyHead
 
гуру
04.08.23
15:01
Форма документа открывается, табличная часть заполнена, движения выполнены
Написано минут за 5-10 наверное со всеми проверками, без регистрации, смсм и прочих извращений с вызовом формы документа

По хорошему бы еще заполнить показатели начисления, но если в табличных частях начислений и НДФЛ поставить Фискрасчет, то работает и без лишних телодвижений.
51 Масянька
 
04.08.23
15:26
(48) Запись. Бухи должны проверить.
52 Масянька
 
04.08.23
15:27
(49) Налог рассчитать (ручками) и я могу.
При добавлении строки (в созданном программно документе), при перерасчете сотрудника - НДФЛ автоматом садится.
Идеал - именно автомат-расчет.
53 Гена
 
гуру
04.08.23
17:19
(52) Может всё-таки разными процедурами? Сначала сделать доки, а потом заходить и спокойно рассчитывать?
54 SleepyHead
 
гуру
04.08.23
18:21
(52) ну так кури процедуру формы РассчитатьСотрудниковНаСервере
55 SleepyHead
 
гуру
04.08.23
18:24
Хотя там и завязано все на форму.. А вообще сдается мне, кто-то просто работать не хочет, я про бухгалтерию.

Если сотрудников в документе много, то намного проще к форме прикрутить процедуру загрузки суммы натурального дохода. А потом уже после загрузки буху не составит труда выделить сотрудников и надать кнопку пересчета.
56 ДиВаH2
 
05.08.23
15:26
В ЗУП 3 многое завязано на методы в форме, еще часто добавляют программно реквизиты в тч на форме, чтобы использовать в алгоритмах. Приходится программно заполнять, потом открывать форму, вызывать методы пересчета и закрывать.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой