Расчет начисления прочих доходов на сервере в ЗУП 3.1

29.12.22

Задачи пользователя - Адаптация типовых решений

Ещё один вариант доработки ЗУП 3.1 с целью ввода документа Регистрация прочих доходов на сервере.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расчет начисления прочих доходов на сервере в ЗУП3.1:
.cfe 11,65Kb
3
3 Скачать (1 SM) Купить за 1 850 руб.

Понадобилось вводить документ Начисление прочих доходов (или, чтобы никто не догадался, РегистрацияПрочихДоходов) программно. При этом основные данные известны, необходимо произвести расчет НДФЛ и тому подобного. Затруднение в том, что вопреки всяким законам логики и здравого смысла расчетные механизмы ЗУП3.1 завязаны на формы.

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

В первой итерации расчет у меня производился обработкой, поэтому дело обошлось просто экспортной обёрткой поверх РассчитатьНДФЛИВзносыВсем() в расширении - пользуйтесь, если вам этого достаточно.

Во второй итерации, понятно, клиента 1С, пользовательского интерфейса и всего такого не стало.

Расчет выполняется в несколько вызовов, первый можно выполнить целиком на сервере:

РасчетНДФЛНарастающимИтогомСНачалаГода = УчетНДФЛФормыРасширенный.РасчетНДФЛНарастающимИтогомСНачалаГода(ДокументОбъект.ВидПрочегоДохода);
	
ПараметрыРасчета = УчетПрочихДоходов.ПараметрыРасчетаДокумента();
ПараметрыРасчета.СписокФизическихЛиц = СписокФизическихЛиц;
ПараметрыРасчета.РасчетНДФЛНарастающимИтогомСНачалаГода = РасчетНДФЛНарастающимИтогомСНачалаГода;
ДанныеРасчета = УчетПрочихДоходов.РассчитатьДокумент(ДокументОбъект, ПараметрыРасчета);

Следующий вызов, к сожалению, принимает в качестве аргумента Форму

УчетПрочихДоходов.РезультатРасчетаВДанныеФормы(Форма, ДанныеРасчета);

Проявив некоторую смекалку, я попытался решить проблему подменой формы:

Форма = Новый Структура;
Форма.Вставить("Объект", ДокументОбъект);
Форма.Вставить("ИтогВзносы", 0);
	
УчетПрочихДоходов.РезультатРасчетаВДанныеФормы(Форма, ДанныеРасчета);

Это помогло бы, если бы мы были на обычной форме. К сожалению, на управляемой это не совсем помогло, потому что на форме добавлены реквизиты и в сам объект. Эту проблему я решил, сконвертировав ДокументОбъект в структуру целиком, для чего написал функцию (наверное, полезная для чего-то ещё, нужно подумать):

Функция ОбъектВСтруктуру(Знач ДокументОбъект) Экспорт

	Объект = Новый Структура;
	
	Для Каждого Реквизит Из ДокументОбъект.Метаданные().СтандартныеРеквизиты Цикл
		Объект.Вставить(Реквизит.Имя, ДокументОбъект[Реквизит.Имя]);
	КонецЦикла;
	
	Для Каждого Реквизит Из ДокументОбъект.Метаданные().Реквизиты Цикл
		Объект.Вставить(Реквизит.Имя, ДокументОбъект[Реквизит.Имя]);
	КонецЦикла;
	
	Для Каждого МетаТЧ Из ДокументОбъект.Метаданные().ТабличныеЧасти Цикл
		Объект.Вставить(МетаТЧ.Имя, Новый Массив);
		
		// добавим строку-образец для добавления новых строк:
		ПустаяСтрока = Новый Структура;
		Для Каждого Реквизит Из МетаТЧ.СтандартныеРеквизиты Цикл
			ПустаяСтрока.Вставить(Реквизит.Имя, Неопределено);
		КонецЦикла;
		Для Каждого Реквизит Из МетаТЧ.Реквизиты Цикл
			ПустаяСтрока.Вставить(Реквизит.Имя, Неопределено);
		КонецЦикла;
		Объект.Вставить(МетаТЧ.Имя + "_ПустаяСтрока", ПустаяСтрока);
		
		// заполним те строки, что есть:
		ОбъектТЧ = Объект[МетаТЧ.Имя];
		ДокументОбъектТЧ = ДокументОбъект[МетаТЧ.Имя];
		Для Каждого СтрДокументОбъектТЧ Из ДокументОбъектТЧ Цикл
			СтрОбъектТЧ = Новый Структура;
			Для Каждого Реквизит Из МетаТЧ.СтандартныеРеквизиты Цикл
				СтрОбъектТЧ.Вставить(Реквизит.Имя, СтрДокументОбъектТЧ[Реквизит.Имя]);
			КонецЦикла;
			Для Каждого Реквизит Из МетаТЧ.Реквизиты Цикл
				СтрОбъектТЧ.Вставить(Реквизит.Имя, СтрДокументОбъектТЧ[Реквизит.Имя]);
			КонецЦикла;
			ОбъектТЧ.Добавить(СтрОбъектТЧ);
		КонецЦикла;
	КонецЦикла;
	
	Возврат Объект;
	
КонецФункции

Обратите внимание на "_ПустаяСтрока" - оно появилось позже.

Теперь можно спокойно вставлять получившийся "Объект" в "Форму" и вызывать функцию (в процессе всплыло ещё два добавленных реквизита):

Процедура РассчитатьНачислениеПрочихДоходовНаСервере(Знач ДокументОбъект) Экспорт
	
	СписокФизическихЛиц = Новый Массив;
	
	Для Каждого Стр Из ДокументОбъект.НачисленияУдержанияВзносы Цикл
		Если СписокФизическихЛиц.Найти(Стр.ФизическоеЛицо) = Неопределено Тогда
			СписокФизическихЛиц.Добавить(Стр.ФизическоеЛицо);
		КонецЕсли;
	КонецЦикла;
	// BSLLS:LineLength-off разбиение строки уменьшает читабельность
	РасчетНДФЛНарастающимИтогомСНачалаГода = УчетНДФЛФормыРасширенный.РасчетНДФЛНарастающимИтогомСНачалаГода(ДокументОбъект.ВидПрочегоДохода);
	// BSLLS:LineLength-on
	ПараметрыРасчета = УчетПрочихДоходов.ПараметрыРасчетаДокумента();
	ПараметрыРасчета.СписокФизическихЛиц = СписокФизическихЛиц;
	ПараметрыРасчета.РасчетНДФЛНарастающимИтогомСНачалаГода = РасчетНДФЛНарастающимИтогомСНачалаГода;
	ДанныеРасчета = УчетПрочихДоходов.РассчитатьДокумент(ДокументОбъект, ПараметрыРасчета);
	
	// копируем документ в структуру:
	Объект = ОбъектВСтруктуру(ДокументОбъект);
	
	// это реквизиты, добавленные в оригинале на форму:
	Для Каждого СтрОбъект Из Объект.НачисленияУдержанияВзносы Цикл
		СтрОбъект.Вставить("ЗачтеноАвансовыхПлатежей", 0);
		СтрОбъект.Вставить("ИтогВзносыСтрока", 0);
	КонецЦикла;
	
	Форма = Новый Структура;
	Форма.Вставить("Объект", Объект);
	Форма.Вставить("ИтогВзносы", 0);
	
	УчетПрочихДоходов.РезультатРасчетаВДанныеФормы(Форма, ДанныеРасчета);
	
	// теперь нужно все данные вернуть обратно в ДокументОбъект:
	СтруктуруВОбъект(ДокументОбъект, Форма.Объект);
	
КонецПроцедуры

(ДокументОбъект заполняется физлицами, видом прочих доходов и суммами перед вызовом, проводится вызывающей стороной.)

К сожалению, приведённый код сам по себе не работает, потому что в УчетПрочихДоходов.РезультатРасчетаВДанныеФормы() добавляются и удаляются строки в табличных частях, а у меня вместо табличных частей массивы. Пришлось в итоге взять эту процедуру в расширение (ИзменениеИКонтроль) и добавить проверку на тип Формы, чего как раз хотелось избежать:

&ИзменениеИКонтроль("РезультатРасчетаВДанныеФормы")
Процедура РезультатРасчетаВДанныеФормы(Форма, ДанныеРасчета)

	Объект = Форма.Объект;
	#Вставка
	ЭтоОбъектСтруктура = ТипЗнч(Объект) = Тип("Структура");
	#КонецВставки

    ...

    // Очищаем НДФЛ
	Идентификаторы = Новый Соответствие;
	КоличествоСтрок = Объект.НДФЛ.Количество();
	Для Сч = 1 По КоличествоСтрок Цикл
		СтрокаДокумента = Объект.НДФЛ[КоличествоСтрок - Сч];
		Если СтрокиНачисленийФизЛиц[СтрокаДокумента.ФизическоеЛицо] <> Неопределено Тогда
			Идентификаторы.Вставить(СтрокаДокумента.ИдентификаторСтрокиНДФЛ, Истина);
			#Удаление
			Объект.НДФЛ.Удалить(СтрокаДокумента);
			#КонецУдаления
			#Вставка
			Если ЭтоОбъектСтруктура Тогда
				Объект.НДФЛ.Удалить(КоличествоСтрок - Сч);
			Иначе
				Объект.НДФЛ.Удалить(СтрокаДокумента);
			КонецЕсли;
			#КонецВставки

    ...

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

Итоговое решение мне кажется не очень изящным, не совсем устойчивым к обновлениям, но другого я не нашел.

Если видите ошибки, или знаете, как полностью рассчитать документ штатными средствами - пишите комментарии!

Расширение с тестовой обработкой приложено.

* Тестировалось на Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.23.63),  1С:Предприятие 8.3 (8.3.19.1399)

** Заглавная картинка сгенерирована нейросетью midjourney по запросу "cat-like stupid server holds client window"

ЗУП расчет зарплаты расчетные механизмы начисление прочих доходов

См. также

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    4175    15    1    

33

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    6008    14    5    

24

Печатные формы Адаптация типовых решений Бухгалтер Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с установленными именами. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

3000 руб.

07.02.2023    6719    73    10    

30

Адаптация типовых решений Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    5273    dimanich70    15    

22

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    6908    dimanich70    9    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1465168 09.01.23 09:35 Сейчас в теме
В свое время, когда понадобилось программно создавать этот документ я переносил процедуры и функции расчета НДФЛ на сервер и немного переписывал их.
2. asae 19.07.23 15:07 Сейчас в теме
в 1с 8.2 было очень хорошо. Можно было создать форму, а у формы был реквизит Объект который потом можно было сохранить. А сейчас боль и ужас.
Оставьте свое сообщение