Как самому написать обмен между Бухгалтерией 2.0 и ЗУП 3.1. (Часть 1)





Речь пойдет о том, как можно осуществить переход на ЗУП 3.1 и при этом сохранить работоспособность системы обмена, написав свой обмен между конфигурациями разных поколений в Конвертации данных. В этой части речь пойдет только об документе Отражения зарплаты (перенос начислений).

Многие опытные разработчики и иже с ними, считающие себя таковыми, сейчас делают "рукалицо". Но я не призываю повторять свой опыт, а только делюсь решением поставленной в свое время задачи, данный метод может быть полезен для тех, кто думает, но не может решиться на нечто подобное, может быть даже не в этих конфигурациях. Итак, задача "подружить" новую ЗУП 3.1 и старую Бухгалтерию 2.0 с помощью написания собственных правил обмена в Конвертации.

По большому счету обмен сводится к обмену данных о начислениях документ "Отражение зарплаты в бух учете" и выплат ведомости в банк/кассу, в моем случае начисления переносятся с детализацией по физлицам.

Итак в Конвертации данных 2.1, загрузил конфигурации баз источника(ЗУП 3.1) и приемника(Бухгалтерии 2.0) предварительно выгрузив их с помощью обработки с диска, создал новую конвертацию,  перешел к правилам.

Сделал новые ПКО (правила конвертации объектов) ОтражениеЗарплатыВРеглУчете(источник) — ОтражениеЗарплатыВБухучете(приемник), отказался от формирования ПКС (правила конвертации свойств), их создание будет описано ниже. Правила выгрузки данных можно согласиться создать стандартные, или создать их позже.

Переходим к ПКС: Добавляем свойства которые не вызовут затруднений: Номер, Дата, ПериодРегистрации, Организация, Комментарий.

Переходим к основной самой главной части Отражение в учете, создаем новое ПКС, Приемником ставим ОражениеВУчете (табличная часть документа отражения в Бухгалтерии), Источник оставляем пустым, как на картинке(1), в событии ПередВыгрузкой (событие просходит при выгрузке поэтому нам доступны объекты из конфигурации Источника) пишем алгоритм выгрузки который состоит в запросе и возврате результата в качестве множественной части, то есть мы заменяем таблицу из ЗУП, которая отличается по структуре таблицы в Приемнике,  результатом запроса, который мы пишем в соответствии с нужными свойствами в Приемнике (в примере достаточно большой к которому я пришел не с первой итерации, возьмем здесь попроще, в продолжении выложу файл обмена,  в нем можно увидеть полный запрос)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтражениеЗарплатыВБухучетеНачисления.Ссылка КАК Ссылка,
| ОтражениеЗарплатыВБухучетеНачисления.ФизическоеЛицо КАК ФизическоеЛицо,
| ОтражениеЗарплатыВБухучетеНачисления.Подразделение КАК Подразделение,
| ОтражениеЗарплатыВБухучетеНачисления.ВидОперации КАК ВидОперации,
| ОтражениеЗарплатыВБухучетеНачисления.ВидНачисленияОплатыТрудаДляНУ КАК ВидНачисленияОплатыТрудаДляНУ,
| ""Зарплата"" КАК ВидНачисления,
| ОтражениеЗарплатыВБухучетеНачисления.Сумма КАК Сумма
|ИЗ
| Документ.ОтражениеЗарплатыВБухучете КАК ОтражениеЗарплатыВБухучете
|  ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтражениеЗарплатыВБухучете.НачисленнаяЗарплатаИВзносы КАК ОтражениеЗарплатыВБухучетеНачисления
|  ПО (ОтражениеЗарплатыВБухучетеНачисления.Ссылка = ОтражениеЗарплатыВБухучете.Ссылка)
|ГДЕ
| ОтражениеЗарплатыВБухучете.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ОтражениеЗарплатыВБухучетеНачисленныйНДФЛ.Ссылка,
| ОтражениеЗарплатыВБухучетеНачисленныйНДФЛ.ФизическоеЛицо,
| КадроваяИсторияСотрудников.Подразделение,
| ОтражениеЗарплатыВБухучетеНачисленныйНДФЛ.ВидОперации,
| NULL,
| ""Налог"",
| ОтражениеЗарплатыВБухучетеНачисленныйНДФЛ.Сумма
|ИЗ
| Документ.ОтражениеЗарплатыВБухучете КАК ОтражениеЗарплатыВБухучете
|  ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтражениеЗарплатыВБухучете.НачисленныйНДФЛ КАК ОтражениеЗарплатыВБухучетеНачисленныйНДФЛ
|  ПО (ОтражениеЗарплатыВБухучетеНачисленныйНДФЛ.Ссылка = ОтражениеЗарплатыВБухучете.Ссылка)
|  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&ДатаДок,) КАК КадроваяИсторияСотрудников
|  ПО (КадроваяИсторияСотрудников.ФизическоеЛицо = ОтражениеЗарплатыВБухучетеНачисленныйНДФЛ.ФизическоеЛицо)
|ГДЕ
| ОтражениеЗарплатыВБухучете.Ссылка = &Ссылка
|   И (КадроваяИсторияСотрудников.ВидСобытия <>&ВидСобытия ИЛИ КадроваяИсторияСотрудников.ВидСобытия =&ВидСобытия И КадроваяИсторияСотрудников.Период>=&ДатаНач)
|";

Запрос.УстановитьПараметр("Ссылка",  Источник);
Запрос.УстановитьПараметр("ДатаДок",  Источник.Дата);
Запрос.УстановитьПараметр("ВидСобытия", Перечисления.ВидыКадровыхСобытий.Увольнение);
Запрос.УстановитьПараметр("ДатаНач",  НачалоМесяца(Источник.Дата));

КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

 Добавлена еще одна колонка ВидНачисления, для чего будет понятно ниже.

Итак мы имеем табличные данные по зарплате из Источника, но структура Приемника отличается от имеющихся данных, Добавляем свойства табличной части, Сумма, Физлицо, ВидНачисленияНУ (перечисление) как на картинке, предварительно создав (вручную!)  стандартные обмены для этих свойств (минимально только необходимые Код, Наименование), интерес вызывает ВидОперации, добавляем ПКС для свойства ВидРасчета (эта колонка будет использоваться для "транзита" ВидаОперации по которому будет строиться позже проводка) . Я немного усложнил используя Алгоритмы, но сделал это чтобы было легче читать и находить нужный код, и так ПКС для Вида Расчета

ИмяПКО = "";
мВид =ОбъектКоллекции.ВидОперации;
мВидНачисления = ОбъектКоллекции.ВидНачисления;

Выполнить(Алгоритмы.ПолучитьВидОперации);

Если ИмяПКО = "" Тогда
Отказ = Истина
КонецЕсли;

и код Алгоритма:

Значение = "ОКЛ";
//Если ТипЗнч(мВид) = Тип("ПеречислениеСсылка.ВидыОперацийПоЗарплате") Тогда
ИмяПКО = "НачисленияЗарплата";

Если мВидНачисления = "Зарплата" Тогда
Если мВид = Перечисления.ВидыОперацийПоЗарплате.НачисленоДоход Тогда
Значение = "ОКЛ";
ИначеЕсли мВид = Перечисления.ВидыОперацийПоЗарплате.ЕжегодныйОтпуск Тогда
Значение = "ОТ";
ИначеЕсли мВид = Перечисления.ВидыОперацийПоЗарплате.КомпенсацияЕжегодногоОтпуска Тогда
Значение = "КОТ";

ИначеЕсли мВид = Перечисления.ВидыОперацийПоЗарплате.ЕжегодныйОтпускОценочныеОбязательства Тогда
Значение = "ОТФ";
ИначеЕсли мВид = Перечисления.ВидыОперацийПоЗарплате.КомпенсацияЕжегодногоОтпускаОценочныеОбязательства Тогда
Значение = "КОТФ";
ИначеЕсли мВид = Перечисления.ВидыОперацийПоЗарплате.РасходыПоСтрахованиюФСС Тогда
Значение = "БЛН";
КонецЕсли;
ИначеЕсли мВидНачисления = "Налог" Тогда
//такого вида операции нет, добавил сам
//код - УПН, Уплата подоходного налога
Если мВид = Перечисления.ВидыОперацийПоЗарплате.НДФЛ Тогда
Значение = "УПН";
КонецЕсли;
КонецЕсли;

предварительно в Видах расчета в Бухгалтерии в Начислениях организации создал начисления с перечисленными кодами. И необходимо создать ПКО Начисления зарплата, которое нужно только для поиска начисления по нужному коду как на картинке(3) (со следующим кодом внутри Значение = Источник;).

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

Хоз = ПланыСчетов.Хозрасчетный;
Сч44 = Хоз.НайтиПоКоду("44.01");
Сч70 = Хоз.НайтиПоКоду("70");

Нач = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций;

Для каждого Стр Из Объект.ОтражениеВУчете Цикл

Если Стр.ВидРасчета = Нач.НайтиПоКоду("ОКЛ")
Тогда
Стр.СчетДт      = Сч44;
Стр.СубконтоДт1 = Справочники.СтатьиЗатрат.НайтиПоКоду("000000008");  //зп

Стр.СчетКт      = Сч70;
Стр.СубконтоКт1 = Стр.ФизЛицо;
Стр.СубконтоКт2 = Стр.ВидНачисленияПоСт255НК;


ИначеЕсли Стр.ВидРасчета = Нач.НайтиПоКоду("УПН") Тогда
// НДФЛ
Стр.СчетДт      = Сч70;
Стр.СубконтоДт1 = Стр.ФизЛицо;

Стр.СчетКт      = Хоз.НайтиПоКоду("68.01");
Стр.СубконтоКт1 = Перечисления.ВидыПлатежейВГосБюджет.Налог;
Стр.СубконтоКт2 = Стр.ПодразделениеДт;

Стр.ВидРасчета  = Нач.ПустаяСсылка();
КонецЕсли;

КонецЦикла;

Попытка
Объект.Записать();
Сообщить(Объект.Номер);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
ОписаниеОшибкиОпределенияПользователя = "";
Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
Попытка
Объект.Записать()
Исключение
Сообщить(Объект);
Сообщить(ОписаниеОшибки());
Сообщить("Документ не перенесен!");
Отказ = Истина;
КонецПопытки;

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

После этого проверяем, сохраняем, выгружаем и пробуем сделать обмен через УниверсальныйОбменXML, в ЗУП 3.1 доступен через меню "Все функции".

Про выплаты не забыл просто многовато получилось итак. Продолжение следует.

 

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *