// Запись данных в регистры 1С // Серверный модуль для записи движений через документ ПереносДанных &НаСервереБезКонтекста Функция РазрешитьОрганизацию(Наименование) Экспорт Если Не ЗначениеЗаполнено(Наименование) Тогда Возврат Неопределено; КонецЕсли; Возврат Справочники.Организации.НайтиПоНаименованию(СокрЛП(Наименование), Истина); КонецФункции &НаСервереБезКонтекста Функция РазрешитьСтатьюФинансирования(Наименование) Экспорт Если Не ЗначениеЗаполнено(Наименование) Тогда Возврат Неопределено; КонецЕсли; Возврат Справочники.СтатьиФинансированияЗарплата.НайтиПоНаименованию(СокрЛП(Наименование), Истина); КонецФункции &НаСервереБезКонтекста Функция РазрешитьСтатьюРасходов(Код) Экспорт Если Не ЗначениеЗаполнено(Код) Тогда Возврат Неопределено; КонецЕсли; Возврат Справочники.СтатьиРасходовЗарплата.НайтиПоКоду(СокрЛП(Код)); КонецФункции &НаСервереБезКонтекста Процедура ПостроитьКэшСотрудников(ТЧСотрудники, КэшСотрудников) Экспорт КэшСотрудников = Новый Соответствие; Для Каждого Эл Из ТЧСотрудники Цикл СотрСсылка = Неопределено; Если ЗначениеЗаполнено(Эл.ИНН) Тогда СотрСсылка = Справочники.Сотрудники.НайтиПоРеквизиту("ИНН", СокрЛП(Эл.ИНН)); КонецЕсли; Если Не ЗначениеЗаполнено(СотрСсылка) И ЗначениеЗаполнено(Эл.СНИЛС) Тогда ФЛ = Справочники.ФизическиеЛица.НайтиПоРеквизиту("СтраховойНомерПФР", СокрЛП(Эл.СНИЛС)); Если ЗначениеЗаполнено(ФЛ) Тогда СотрСсылка = Справочники.Сотрудники.НайтиПоРеквизиту("ФизическоеЛицо", ФЛ, Истина); КонецЕсли; КонецЕсли; Если Не ЗначениеЗаполнено(СотрСсылка) И ЗначениеЗаполнено(Эл.ФИО) Тогда СотрСсылка = Справочники.Сотрудники.НайтиПоНаименованию(СокрЛП(Эл.ФИО), Истина); КонецЕсли; Если ЗначениеЗаполнено(СотрСсылка) Тогда КэшСотрудников.Вставить(Эл.Идентификатор, Новый Структура("Сотрудник, ФизическоеЛицо", СотрСсылка, СотрСсылка.ФизическоеЛицо)); КонецЕсли; КонецЦикла; КонецПроцедуры &НаСервереБезКонтекста Процедура ЗаполнитьТЧ(МассивДанных, МассивВзносов, МассивНДФЛ, МассивСотрудников, ТЧЗП, ТЧВзносы, ТЧНДФЛ, ТЧСотрудники) Экспорт ТЧЗП.Очистить(); ТЧВзносы.Очистить(); ТЧНДФЛ.Очистить(); ТЧСотрудники.Очистить(); Для Каждого Строка Из МассивДанных Цикл НоваяСтрока = ТЧЗП.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); КонецЦикла; Для Каждого Строка Из МассивВзносов Цикл НоваяСтрока = ТЧВзносы.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); КонецЦикла; Для Каждого Строка Из МассивНДФЛ Цикл НоваяСтрока = ТЧНДФЛ.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); КонецЦикла; Для Каждого Строка Из МассивСотрудников Цикл НоваяСтрока = ТЧСотрудники.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); КонецЦикла; КонецПроцедуры &НаСервере Процедура ЗаписатьДанные(ГодЗагрузкиПараметр, ОрганизацияНаименование, СтатьяФинансированияНаименование, СтатьяРасходовКод) Экспорт ГодЧисло = Число(ГодЗагрузкиПараметр); МесяцЧисло = Цел(Объект.МесяцЗагрузки); Если ГодЧисло = 0 Тогда ГодЧисло = Год(ТекущаяДата()); КонецЕсли; Если МесяцЧисло < 1 Или МесяцЧисло > 12 Тогда Сообщить("Ошибка: месяц = " + МесяцЧисло + ", год = " + ГодЧисло); Возврат; КонецЕсли; Период = Дата(ГодЧисло, МесяцЧисло, 1); Организация = РазрешитьОрганизацию(ОрганизацияНаименование); Если Не ЗначениеЗаполнено(Организация) Тогда Сообщить("Не найдена организация: """ + ОрганизацияНаименование + """"); Возврат; КонецЕсли; СтатьяФинансирования = РазрешитьСтатьюФинансирования(СтатьяФинансированияНаименование); СтатьяРасходов = РазрешитьСтатьюРасходов(СтатьяРасходовКод); КэшСотрудников = Новый Соответствие; ПостроитьКэшСотрудников(Объект.Сотрудники, КэшСотрудников); ДокПеренос = Документы.ПереносДанных.СоздатьДокумент(); ДокПеренос.Дата = Период; ВидРасчётаОклад = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Оклад", Истина); // Регистр 1: НачисленияУдержанияПоСотрудникам Для Каждого Строка Из Объект.ДанныеРасчетаЗП Цикл ДанныеСотр = КэшСотрудников.Получить(Строка.ИдентификаторСотрудника); Если ДанныеСотр = Неопределено Тогда Продолжить; КонецЕсли; ФизЛицо = ДанныеСотр.ФизическоеЛицо; СотрудникСсылка = ДанныеСотр.Сотрудник; // Начисления ЗаписатьНачисление(ДокПеренос, Строка, "Оклад", Строка.Оклад, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ДоплатаСовместительство", Строка.ДоплатаСовместительство, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ДоплатаНочные", Строка.ДоплатаНочные, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ДоплатаПраздничные", Строка.ДоплатаПраздничные, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "НадбавкаЗаКатегорию", Строка.НадбавкаЗаКатегорию, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "НадбавкаЗаВредность", Строка.НадбавкаЗаВредность, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ПовышающийКоэффициент", Строка.ПовышающийКоэффициент, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "СтимулирующаяВыплата", Строка.СтимулирующиеВыплаты, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "РайонныйКоэффициент", Строка.РайонныйКоэффициент, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ПремияРазовая", Строка.ПремияРазовая, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "Отпуск", Строка.Отпуск, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "КомпенсацияЗаНеиспользованныйОтпуск", Строка.КомпенсацияЗаОтпуск, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ВыходноеПособие", Строка.ВыходноеПособие, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "Родовые", Строка.Родовые, Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); // Удержания ЗаписатьНачисление(ДокПеренос, Строка, "НДФЛ", Строка.НДФЛ, Перечисления.ГруппыНачисленияУдержанияВыплаты.Удержано, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ПрофВзнос", Строка.ПрофВзнос, Перечисления.ГруппыНачисленияУдержанияВыплаты.Удержано, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ИсполнительныйДокумент", Строка.ИсполнительныеДокументы, Перечисления.ГруппыНачисленияУдержанияВыплаты.Удержано, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); // Выплаты ЗаписатьНачисление(ДокПеренос, Строка, "Оклад", Строка.Аванс, Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "Оклад", Строка.ЗарплатаЗаПервуюПоловину, Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "Касса1", Строка.Касса1, Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "БезналичноеПеречисление", Строка.БезналичныеПеречисления, Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ПремияАванс", Строка.ПремияАванс, Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); ЗаписатьНачисление(ДокПеренос, Строка, "ВыплатыВМежрасчетный", Строка.ВыплатыВМежрасчетный, Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка); КонецЦикла; // Регистр 2: ОтработанноеВремяПоСотрудникам Для Каждого Строка Из Объект.ДанныеРасчетаЗП Цикл ДанныеСотр = КэшСотрудников.Получить(Строка.ИдентификаторСотрудника); Если ДанныеСотр = Неопределено Тогда Продолжить; КонецЕсли; Если Строка.ОтработаноДней > 0 Или Строка.РабочиеЧасыПоТабелю > 0 Тогда Движение = ДокПеренос.Движения.ОтработанноеВремяПоСотрудникам.Добавить(); Движение.Период = Период; Движение.Организация = Организация; Движение.ФизическоеЛицо = ДанныеСотр.ФизическоеЛицо; Движение.Сотрудник = ДанныеСотр.Сотрудник; Движение.Начисление = ВидРасчётаОклад; Движение.ОтработаноДней = Строка.ОтработаноДней; Движение.ОтработаноЧасов = Строка.РабочиеЧасыПоТабелю; Движение.ОплаченоДней = Строка.ОтработаноДней; Движение.ОплаченоЧасов = Строка.РабочиеЧасыПоТабелю; КонецЕсли; КонецЦикла; // Регистр 3: СведенияОДоходахНДФЛ Для Каждого Строка Из Объект.ДанныеНДФЛ Цикл ДанныеСотр = КэшСотрудников.Получить(Строка.ИдентификаторСотрудника); Если ДанныеСотр = Неопределено Тогда Продолжить; КонецЕсли; Движение = ДокПеренос.Движения.СведенияОДоходахНДФЛ.Добавить(); Движение.Период = Период; Движение.ГоловнаяОрганизация = Организация; Движение.Организация = Организация; Движение.ФизическоеЛицо = ДанныеСотр.ФизическоеЛицо; Движение.МесяцНалоговогоПериода = Период; Движение.СуммаДохода = Строка.СуммаВаловогоДохода; Движение.СуммаВычета = Строка.СкидкаДляНДФЛЗаМесяц + Строка.ВычетНаРаботникаЗаМесяц + Строка.ВычетНаИждивенцевЗаМесяц; КонецЦикла; // Регистр 4: СтраховыеВзносыПоФизическимЛицам Для Каждого Строка Из Объект.ДанныеСтраховыхВзносов Цикл ДанныеСотр = КэшСотрудников.Получить(Строка.ИдентификаторСотрудника); Если ДанныеСотр = Неопределено Тогда Продолжить; КонецЕсли; Движение = ДокПеренос.Движения.СтраховыеВзносыПоФизическимЛицам.Добавить(); Движение.Период = Период; Движение.Организация = Организация; Движение.ФизическоеЛицо = ДанныеСотр.ФизическоеЛицо; Движение.Сотрудник = ДанныеСотр.Сотрудник; Движение.ПФРДоПредельнойВеличины = Строка.ДТ6Процент; Движение.ПФРСтраховая = Строка.ПФСтраховая; Движение.ФФОМС = Строка.ФССФОМС; Движение.ФССНесчастныеСлучаи = Строка.НСПЗ; КонецЦикла; // Регистр 6: ВзаиморасчетыССотрудниками ДвиженияВзаиморасчеты = ДокПеренос.Движения.ВзаиморасчетыССотрудниками; Для Каждого Строка Из Объект.ДанныеРасчетаЗП Цикл ДанныеСотр = КэшСотрудников.Получить(Строка.ИдентификаторСотрудника); Если ДанныеСотр = Неопределено Тогда Продолжить; КонецЕсли; Если Строка.ВсегоНаРуки <> 0 Тогда Движение = ДвиженияВзаиморасчеты.Добавить(); Движение.Период = Период; Движение.Организация = Организация; Движение.ФизическоеЛицо = ДанныеСотр.ФизическоеЛицо; Движение.Сотрудник = ДанныеСотр.Сотрудник; Движение.СтатьяФинансирования = СтатьяФинансирования; Движение.СтатьяРасходов = СтатьяРасходов; Движение.СуммаВзаиморасчетов = Строка.ВсегоНаРуки; КонецЕсли; КонецЦикла; // Регистр 7: БухгалтерскиеВзаиморасчетыССотрудниками ДвиженияБухВзаиморасчеты = ДокПеренос.Движения.БухгалтерскиеВзаиморасчетыССотрудниками; Для Каждого Строка Из Объект.ДанныеРасчетаЗП Цикл ДанныеСотр = КэшСотрудников.Получить(Строка.ИдентификаторСотрудника); Если ДанныеСотр = Неопределено Тогда Продолжить; КонецЕсли; Если Строка.ВсегоНаРуки <> 0 Тогда Движение = ДвиженияБухВзаиморасчеты.Добавить(); Движение.Период = Период; Движение.Организация = Организация; Движение.ФизическоеЛицо = ДанныеСотр.ФизическоеЛицо; Движение.Сотрудник = ДанныеСотр.Сотрудник; Движение.СтатьяФинансирования = СтатьяФинансирования; Движение.СтатьяРасходов = СтатьяРасходов; Движение.СуммаВзаиморасчетов = Строка.ВсегоНаРуки; КонецЕсли; КонецЦикла; // Регистр 8: ДанныеОВремениДляРасчетаСреднегоОбщий ДвиженияСреднего = ДокПеренос.Движения.ДанныеОВремениДляРасчетаСреднегоОбщий; Для Каждого Строка Из Объект.ДанныеРасчетаЗП Цикл ДанныеСотр = КэшСотрудников.Получить(Строка.ИдентификаторСотрудника); Если ДанныеСотр = Неопределено Тогда Продолжить; КонецЕсли; Если Строка.ОтработаноДней <> 0 Тогда Движение = ДвиженияСреднего.Добавить(); Движение.Период = Период; Движение.Сотрудник = ДанныеСотр.Сотрудник; Движение.ОтработаноДней = Строка.ОтработаноДней; Движение.ОтработаноЧасов = Строка.РабочиеЧасыПоТабелю; Движение.ОтработаноДнейКалендарных = Строка.ОтработаноДнейКалендарных; КонецЕсли; КонецЦикла; ДокПеренос.Записать(); Сообщить("Данные записаны. Документ: " + ДокПеренос.Ссылка); КонецПроцедуры &НаСервере Процедура ЗаписатьНачисление(ДокПеренос, Строка, ВидРасчета, Сумма, Группа, Период, Организация, СтатьяФинансирования, СтатьяРасходов, ФизЛицо, СотрудникСсылка) Экспорт Если Сумма = 0 Тогда Возврат; КонецЕсли; ГруппаНаименование = ""; Если Группа = Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено Тогда ГруппаНаименование = ""; ИначеЕсли Группа = Перечисления.ГруппыНачисленияУдержанияВыплаты.Удержано Тогда ГруппаНаименование = "Удержание"; ИначеЕсли Группа = Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено Тогда ГруппаНаименование = "Выплата"; КонецЕсли; Суффикс = ""; Если ЗначениеЗаполнено(СтатьяФинансирования) Тогда НаименованиеСтатьи = СокрЛП(СтатьяФинансирования.Наименование); Если СтрНайти(НаименованиеСтатьи, "ОМС") > 0 Тогда Суффикс = " (ОМС)"; ИначеЕсли СтрНайти(НаименованиеСтатьи, "ПД") > 0 Тогда Суффикс = " (ПД)"; КонецЕсли; КонецЕсли; ВидРасчёта = Неопределено; Если ЗначениеЗаполнено(Суффикс) Тогда ВидРасчёта = ПланыВидовРасчета.Начисления.НайтиПоНаименованию(ВидРасчета + Суффикс, Истина); КонецЕсли; Если ВидРасчёта = Неопределено Тогда ВидРасчёта = ПланыВидовРасчета.Начисления.НайтиПоНаименованию(ВидРасчета, Истина); КонецЕсли; Если ВидРасчёта = Неопределено Тогда Сообщить("Не найден ПВР: " + ВидРасчета + Суффикс); Возврат; КонецЕсли; Движение = ДокПеренос.Движения.НачисленияУдержанияПоСотрудникам.Добавить(); Движение.Период = Период; Движение.Организация = Организация; Движение.ФизическоеЛицо = ФизЛицо; Движение.Сотрудник = СотрудникСсылка; Движение.НачислениеУдержание = ВидРасчёта; Движение.Сумма = Сумма; Движение.ГруппаНачисленияУдержанияВыплаты = Группа; Движение.СтатьяФинансирования = СтатьяФинансирования; Движение.СтатьяРасходов = СтатьяРасходов; Движение.Сторно = Ложь; КонецПроцедуры