Использует файл сохраненный настроек отчета за прошлый период (например - "_1_ИСХОДНАЯ_12010.pf")
Сделан для себя (НЕ ДЛЯ УПРОЩЕНКИ).
Старался минимизировать свои изменения, они помечены "// новое начало" и "// новое конец"
Для исправления предыдущего отчета или создания нового, но с учетом доплаты или переплаты в прошлом отчете, поставить флажок "в прошлом периоде"
Для создания нового без исправлений, с расчетом не коэффициентом, и с условием, что прошлый период был рассчитан не коэфф. и не требуется доплата/удержание за него, оба флажка: "в этом периоде" и "в прошлом периоде" НЕ ставить.
По сути изменения:
Добавил процедурку:
// Новое начало СосчитатьВыплатыЧерезНачисленияСоЗдвигомНаМесяц()
//******************************************************************************
// СосчитатьВыплатыЧерезНачисленияСоЗдвигомНаМесяц()
//Описание:
//процедура заполняет суммы уплаченных взносов пересчитав начисленные
//по сотрудникам за тот-же период со сдвигом на месяц назад
//
Процедура СосчитатьВыплатыЧерезНачисленияСоЗдвигомНаМесяц()
ТабПоУплатамПредПериод = СоздатьОбъект("ТаблицаЗначений");
ТабПоУплатамПредПериод.НоваяКолонка("Объект");
ТабПоУплатамПредПериод.НоваяКолонка("Период");
ТабПоУплатамПредПериод.НоваяКолонка("УплачСтрах");
ТабПоУплатамПредПериод.НоваяКолонка("УплачНакоп");
ТабПоУплатамТекПериод = СоздатьОбъект("ТаблицаЗначений");
ТабПоУплатамПредПериод.Выгрузить(ТабПоУплатамТекПериод);
// вычислим период, за который начисленные СтрахВзносы входили в уплату по текущему периоду
ТекущийОтченыйПериод= ПолучитьДатуНачала();
НачОтсчТекПериодаРасчета= НачМесяца(ТекущийОтченыйПериод - 1);
КонОтсчТекПериодаРасчета= КонМесяца((Мин(глПолучитьДатуОкончанияОтчетногоПериодаСЗВ(ТекущийОтченыйПериод),ДатаОтчета))-32);
// вычислим период, за который начисленные СтрахВзносы входили в уплату по предыдущему периоду
// что-бы узнать остатки с прошлого периода. Если Сотр был уволен в середине предыдущего периода
ДатаСоЗдвигом= ПолучитьОтчетныйПериодПоДате(НачОтсчТекПериодаРасчета);
ВременОтчетныйПериод= ОтчетныйПериод;
ОтчетныйПериод= ДатаСоЗдвигом;
ПредыдущийОтченыйПериод= ПолучитьДатуНачала();
ОтчетныйПериод = ВременОтчетныйПериод;
ТекущийОтченыйПериод= ПолучитьДатуНачала(); // возможно лишнее обращение и можно удалить
НачОтсчПредПериодаРасчета= НачМесяца(ПредыдущийОтченыйПериод - 1);
КонОтсчПредПериодаРасчета= КонМесяца((Мин(глПолучитьДатуОкончанияОтчетногоПериодаСЗВ(ПредыдущийОтченыйПериод),ДатаОтчета))-32);
// Сообщить("ТекущийОтченыйПериод");
// Сообщить(ТекущийОтченыйПериод);
// Сообщить("НачОтсчТекПериодаРасчета");
// Сообщить(НачОтсчТекПериодаРасчета);
// Сообщить("КонОтсчТекПериодаРасчета");
// Сообщить(КонОтсчТекПериодаРасчета);
// Сообщить("ПредыдущийОтченыйПериод");
// Сообщить(ПредыдущийОтченыйПериод);
// Сообщить("НачОтсчПредПериодаРасчета");
// Сообщить(НачОтсчПредПериодаРасчета);
// Сообщить("КонОтсчПредПериодаРасчета");
// Сообщить(КонОтсчПредПериодаРасчета);
ТабПоУплатам = СоздатьОбъект("ТаблицаЗначений");
ЗапросПоВзносам=СоздатьОбъект("Запрос");
ТекстЗапроса="//{{ЗАПРОС(ЗапросПоВзносам)
|С НачОтсчПредПериодаРасчета по КонОтсчТекПериодаРасчета;
|Объект = ЖурналРасчетов.СтраховыеВзносы.Объект;
|ВР = ЖурналРасчетов.СтраховыеВзносы.ВидРасч;
|Результат = ЖурналРасчетов.СтраховыеВзносы.Результат;
|Регистрация = ЖурналРасчетов.СтраховыеВзносы.ДатаОкончания;
|Группировка Объект Без Групп Без Упорядочивания;
|Группировка ВР Без Групп Без Упорядочивания;
|Группировка Результат Без Групп;
|Без Итогов;
|Группировка Регистрация;
|Условие((Результат <> 0) И ((ВР = ВидРасчета.ПФРСтраховаяЧастьс2010) ИЛИ (ВР = ВидРасчета.ПФРНакопительнаяЧастьс2010)));
|"//}}ЗАПРОС
;
Если ЗапросПоВзносам.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Не удалось обработать журнал взносов");
КонецЕсли;
ЗапросПоВзносам.Выгрузить(ТабПоУплатам);
ТабПоУплатам.Сортировать("Объект,Регистрация");
ТабПоУплатам.НоваяКолонка("ПериодОплаты");
ТабПоУплатам.ВыбратьСтроки();
Пока ТабПоУплатам.ПолучитьСтроку()=1 Цикл
Если ТабПоУплатам.Регистрация>=НачОтсчТекПериодаРасчета Тогда
ТабПоУплатамТекПериод.НоваяСтрока();
ТабПоУплатамТекПериод.Период = ТекущийОтченыйПериод;
ТабПоУплатамТекПериод.Объект = ТабПоУплатам.Объект; // удалить
ТабПоУплатам.ПериодОплаты = ТекущийОтченыйПериод;
Если ТабПоУплатам.ВР = ВидРасчета.ПФРСтраховаяЧастьс2010 Тогда
ТабПоУплатамТекПериод.УплачСтрах = ТабПоУплатам.Результат;
ТабПоУплатамТекПериод.УплачНакоп = 0;
ТабПоУплатам.ПериодОплаты = ТекущийОтченыйПериод; // удалить
Иначе
ТабПоУплатамТекПериод.УплачНакоп = ТабПоУплатам.Результат;
ТабПоУплатамТекПериод.УплачСтрах = 0;
КонецЕсли;
Иначе
ТабПоУплатамПредПериод.НоваяСтрока();
ТабПоУплатамПредПериод.Период = ПредыдущийОтченыйПериод;
ТабПоУплатамПредПериод.Объект = ТабПоУплатам.Объект;
ТабПоУплатам.ПериодОплаты = ПредыдущийОтченыйПериод; // удалить
Если ТабПоУплатам.ВР = ВидРасчета.ПФРСтраховаяЧастьс2010 Тогда
ТабПоУплатамПредПериод.УплачСтрах = ТабПоУплатам.Результат;
ТабПоУплатамПредПериод.УплачНакоп = 0;
Иначе
ТабПоУплатамПредПериод.УплачНакоп = ТабПоУплатам.Результат;
ТабПоУплатамПредПериод.УплачСтрах = 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТабПоУплатамТекПериод.Свернуть("Объект,Период","УплачСтрах,УплачНакоп");
ТабПоУплатамТекПериод.Сортировать("Объект,Период");
//ТабПоУплатамТекПериод.ВыбратьСтроку(,"ТабПоУплатамТекПериод_3_ВнутриПроцедуры");
ТабПоУплатамПредПериод.Свернуть("Объект,Период","УплачСтрах,УплачНакоп");
ТабПоУплатамПредПериод.Сортировать("Объект,Период");
//ТабПоУплатамПредПериод.ВыбратьСтроку(,"ТабПоУплатамПредПериод_3_ВнутриПроцедуры");
// ------------------------------------------------------------------------------------------
// получим из файла настроек
ОтчетныйПериодВременный= ОтчетныйПериод ;
ОтчетныйПериод = ПредыдущийОтченыйПериод;
ДатаПериода = ОтчетныйПериод;
ИмяФайла = ПолучитьИмяФайлаНастроек();
УплатыПредПериод= СоздатьОбъект("ТаблицаЗначений");
Если ФС.СуществуетФайл(ИмяФайла) =1 Тогда
ФайлНастр = СоздатьОбъект("Текст");
ФайлНастр.Открыть(ИмяФайла);
Иначе Возврат;
КонецЕсли;
// список документов в 3-й строке
СтрокаСписокДокументов = СтрЗаменить(ФайлНастр.ПолучитьСтроку(3), констКод1, констКод10);
УплатыПредПериод= ЗначениеИзСтрокиВнутр(СтрокаСписокДокументов);
//УплатыПредПериод.ВыбратьСтроку(,"СписокДокументов УплатыПредПериод");
// очистим и восстановим переменные
ОтчетныйПериод = ОтчетныйПериодВременный;
ДатаПериода = ОтчетныйПериод;
ИмяФайлаНастроек = ПолучитьИмяФайлаНастроек();
ТаблицаПачки= "";
СтрокаСписокДокументов = "";
ТабПоУплатам = "";
КонецПроцедуры // СосчитатьВыплатыЧерезНачисленияСоЗдвигомНаМесяц()
// новое конец // СосчитатьВыплатыЧерезНачисленияСоЗдвигомНаМесяц()
ну и в процедуре ЗаполнитьСуммыВзносов() добавил:
ТабИсчисленоВзносов.ВыбратьСтроки();
Пока ТабИсчисленоВзносов.ПолучитьСтроку()=1 Цикл
КоэффициентСтраховая = 0;
КоэффициентНакопительная = 0;
ДатаПериода = ТабИсчисленоВзносов.ОтчетныйПериод;
НомСтроки = "";
Если ТабУплатыВзносов.НайтиЗначение(ДатаПериода,НомСтроки,"ОтчетныйПериод")=1 Тогда
КоэффициентСтраховая = ТабУплатыВзносов.ПолучитьЗначение(НомСтроки,"КоэффициентСтраховая");
КоэффициентНакопительная = ТабУплатыВзносов.ПолучитьЗначение(НомСтроки,"КоэффициентНакопительная");
КонецЕсли;
ТабИсчисленоВзносов.Ключ = ПолучитьКлючСотрудника(ТабИсчисленоВзносов.Сотрудник,ТабИсчисленоВзносов.КатегорияЗЛ);
// новое начало
НомСтрок1 = 0;
НомСтрок2 = 0;
НомСтрок3 = 0;
НовУплачСтрах = 0;
НовУплачНакоп = 0;
Если (КоэфДА=0) И (ДатаПериода=ТекущийОтченыйПериод) Тогда // это начислен/удерж тек периода и по новому
ТабПоУплатамТекПериод.НайтиЗначение(ТабИсчисленоВзносов.Сотрудник,НомСтрок1,"Объект");
Если (НомСтрок1=0) Тогда// не найдена, значт не было начислений и они будут состоять только из остатков с пр периода
ТабИсчисленоВзносов.УплаченоСтраховая = 0;
ТабИсчисленоВзносов.УплаченоНакопительная = 0;
Иначе // нашли, плюсуем
ТабПоУплатамТекПериод.ПолучитьСтрокуПоНомеру(НомСтрок1);
ТабИсчисленоВзносов.УплаченоСтраховая = ТабПоУплатамТекПериод.УплачСтрах;
ТабИсчисленоВзносов.УплаченоНакопительная = ТабПоУплатамТекПериод.УплачНакоп;
КонецЕсли;
ИначеЕсли (КоэфДА=0) И (ДатаПериода<>ТекущийОтченыйПериод) Тогда //это начислен\удерж прошл периода и по новому
Если (КоэфДА1=0) Тогда// прошлый период был посчитан по новому
ТабИсчисленоВзносов.УплаченоСтраховая = 0;
ТабИсчисленоВзносов.УплаченоНакопительная = 0;
ИначеЕсли (КоэфДА1=1) Тогда // прошлый период был посчитан по старому
ТабПоУплатамПредПериод.НайтиЗначение(ТабИсчисленоВзносов.Сотрудник,НомСтрок2,"Объект");
УплатыПредПериод.НайтиЗначение(ТабИсчисленоВзносов.Сотрудник,НомСтрок3,"Сотрудник");
Если (НомСтрок2=0) и (НомСтрок3<>0) Тогда// значт были начисления, но не должны были быть ????????????
// нашли, считываем начисления прошлого периода старым способом, полученные из файла
УплатыПредПериод.ПолучитьСтрокуПоНомеру(НомСтрок3);
ТабИсчисленоВзносов.УплаченоСтраховая = УплатыПредПериод.УплаченоСтраховая;
ТабИсчисленоВзносов.УплаченоНакопительная = УплатыПредПериод.УплаченоНакопительная;
Сообщить(Строка(ТабИсчисленоВзносов.Сотрудник) + " были начисления, но не должны были быть ????? НЕДОУПЛАТА");
// реальная недоуплата должна быть разницей (Правильно - ЧерезКоэф)
ТабИсчисленоВзносов.УплаченоСтраховая = 0 - ТабИсчисленоВзносов.УплаченоСтраховая;
ТабИсчисленоВзносов.УплаченоНакопительная = 0 - ТабИсчисленоВзносов.УплаченоНакопительная;
ИначеЕсли (НомСтрок2<>0) и (НомСтрок3=0) Тогда// значт не было начислений, но должны были быть ????????????
// сколько должны были начислить, еслиб считали не коэффициентом
ТабПоУплатамПредПериод.ПолучитьСтрокуПоНомеру(НомСтрок2);
ТабИсчисленоВзносов.УплаченоСтраховая = ТабПоУплатамПредПериод.УплачСтрах;
ТабИсчисленоВзносов.УплаченоНакопительная = ТабПоУплатамПредПериод.УплачНакоп;
Сообщить(Строка(ТабИсчисленоВзносов.Сотрудник) + " не было начислений, но должны были быть ПЕРЕПЛАТА ???????");
ИначеЕсли (НомСтрок2=0) и (НомСтрок3=0) Тогда// значт не было начислений, и не должно было быть
ТабИсчисленоВзносов.УплаченоСтраховая = 0;
ТабИсчисленоВзносов.УплаченоНакопительная = 0;
Иначе
// нашли, считываем начисления прошлого периода старым способом, полученные из файла
УплатыПредПериод.ПолучитьСтрокуПоНомеру(НомСтрок3);
ТабИсчисленоВзносов.УплаченоСтраховая = УплатыПредПериод.УплаченоСтраховая;
ТабИсчисленоВзносов.УплаченоНакопительная = УплатыПредПериод.УплаченоНакопительная;
// сколько должны были начислить, еслиб считали не коэффициентом
ТабПоУплатамПредПериод.ПолучитьСтрокуПоНомеру(НомСтрок2);
НовУплачСтрах = ТабПоУплатамПредПериод.УплачСтрах;
НовУплачНакоп = ТабПоУплатамПредПериод.УплачНакоп; // 2222222222222222222222222
// реальная недоуплата должна быть разницей (Правильно - ЧерезКоэф)
ТабИсчисленоВзносов.УплаченоСтраховая = НовУплачСтрах - ТабИсчисленоВзносов.УплаченоСтраховая;
ТабИсчисленоВзносов.УплаченоНакопительная = НовУплачНакоп - ТабИсчисленоВзносов.УплаченоНакопительная;
КонецЕсли;
КонецЕсли;
ИначеЕсли (КоэфДА=1) и (КоэфДА1=1) Тогда // всё считаем по старому
// новое конец
ТабИсчисленоВзносов.УплаченоСтраховая = ОКР(ТабИсчисленоВзносов.ИсчисленоСтраховая * КоэффициентСтраховая,2);
ТабИсчисленоВзносов.УплаченоНакопительная = ОКР(ТабИсчисленоВзносов.ИсчисленоНакопительная * КоэффициентНакопительная,2);
// новое начало
КонецЕсли;
// новое конец
Если ДатаПериода<>ТекущийОтченыйПериод Тогда
ТабИсчисленоВзносов.ИсчисленоСтраховая = 0;
ТабИсчисленоВзносов.ИсчисленоНакопительная = 0;
КонецЕсли;
КонецЦикла;
Это из крупных изменений =) остальное так... по мелочи =)
Исходник: //infostart.ru/public/84659/
Удачи в борьбе с 1С.
ИСПРАВЛЕНИЯ:
Поправил немного, были пара-тройка уволенных невовремя) сотров потеряны правил в спешке, но теперь НОВЫЙ отчет без ошибок!