Простой пример — вычеты в 2010 году, первый с начала года по пустую дату, второй с середины года по конец года.
По стандартным правилам результат — отсутствие вычетов в первой половине года!
А вот перенос измененными правилами, как видно, все переносится!
На сегодня, 06.03.11, я изменил текущие стандартные правила от 27.02.11.
Видеоурок по использованию измененных правил уже почти готов, на следующей неделе выкладываю (за праздники поднажму).
Далее, для искушенных в коде, представляю алгоритм изменения выгрузки вычетов по НДФЛ на детей. Для начала маленькая проверка самих вычетов:
//******************************************************Изменил Самойлов 17.11.10
// В ЗиК отсутствует проверка правильности периода, дату начала можно установить большей, чем дата окончания
КоличествоСтрокТЗ = ТаблицаВычетовНаДетей.КоличествоСтрок();
НомСтроки = 1;
Для Сч=1 По КоличествоСтрокТЗ Цикл
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(НомСтроки);
Если (ТаблицаВычетовНаДетей.Период > ТаблицаВычетовНаДетей.ПериодЗавершения)И(ПустоеЗначение(ТаблицаВычетовНаДетей.ПериодЗавершения)=0) Тогда
Сообщить("Некорректный период для вычета на детей у "+Источник);
Сообщить("ДатаНачалаВычета (начала работы в организации)- "+ТаблицаВычетовНаДетей.Период+", дата окончания вычета - "+ТаблицаВычетовНаДетей.ПериодЗавершения);
ТаблицаВычетовНаДетей.УдалитьСтроку(НомСтроки);
Иначе
НомСтроки = НомСтроки + 1;
КонецЕсли;
КонецЦикла;
//*******************************************************************************
А вот и сами изменения алгоритма выгрузки, а точнее инвентаризации всевозможных случаев:
ТаблицаВычетовНаДетей.Свернуть("Физлицо, Период, ПериодЗавершения, КодВычета", "КоличествоДетей, КоличествоДетейЗавершения");
ТаблицаВычетовНаДетей.Сортировать("+Период,+ПериодЗавершения");
Пока ТаблицаВычетовНаДетей.КоличествоСтрок() > 0 Цикл
Если ТаблицаВычетовНаДетей.КоличествоСтрок() > 1 Тогда
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(1);
Для Номер = 2 По ТаблицаВычетовНаДетей.КоличествоСтрок() Цикл
КодВычета = ТаблицаВычетовНаДетей.ПолучитьЗначение(Номер, "КодВычета");
Если КодВычета <> ТаблицаВычетовНаДетей.КодВычета Тогда
Продолжить;
КонецЕсли;
// Правила обработки двух пересекающихся периодов
// Всегда у первого периода дата начала меньше чем у второго
// С одинаковой датой начала, первым пойдет пустой период
// 1. даты окончания заполнены и совпадают
// в первом периоде: дата окончания становится на день меньше даты начала второго периода
// во втором периоде: количество детей - сумма первого и второго периодов
// 2. у первого периода не заполнена дата окончания, у второго - заполнена
// в первом периоде: дата начала становится на день позже даты окончания второго периода
// во втором периоде: количество детей - сумма первого и второго периодов
// 3. у первого и второго периодов совпадают даты начала
// в первом периоде: количество детей - сумма первого и второго периодов
// во втором периоде: дата начала становится на день больше даты окончания первого периода
// 4. даты окончания заполнены, не совпадают
// в первом периоде: дата окончания становится на день меньше даты начала второго периода
// во втором периоде: дата начала становится на день больше даты окончания первого периода
// добавляется еще один период:
// с даты окончания первого до даты начала второго периода,
// количество детей - сумма первого и второго периодов
БудущийПериод = ТаблицаВычетовНаДетей.ПолучитьЗначение(Номер, "Период");
БудущийПериодЗавершения = ТаблицаВычетовНаДетей.ПолучитьЗначение(Номер, "ПериодЗавершения");
БудущееКоличествоДетей = ТаблицаВычетовНаДетей.ПолучитьЗначение(Номер, "КоличествоДетей");
//******************************************************Изменил Самойлов 17.11.10
//Наложение, ограниченное равенством справа
//А1___________________________________________________А2
// Б1_____________________________Б2
//
//А2=Б1-1 Передвигаем конец первого периода до пересечения, количество суммируем во втором периоде
//*******************************************************************************
Если БудущийПериодЗавершения = ТаблицаВычетовНаДетей.ПериодЗавершения Тогда
// Запомним количество детей текущей записи
КоличествоДетей = ТаблицаВычетовНаДетей.КоличествоДетей;
// У текущей записи уменьшим дату окончания
ТаблицаВычетовНаДетей.ПериодЗавершения = БудущийПериод-1;
// Исправим количество детей следующей записи
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(Номер);
ТаблицаВычетовНаДетей.КоличествоДетей = ТаблицаВычетовНаДетей.КоличествоДетей + КоличествоДетей;
Прервать;
КонецЕсли;
//******************************************************Изменил Самойлов 17.11.10
//Если (ПустоеЗначение(ТаблицаВычетовНаДетей.ПериодЗавершения) = 1) Тогда
//// Запомним период завершения текущей записи
//ПериодЗавершения = ТаблицаВычетовНаДетей.ПериодЗавершения;
//
//// Запомним количество детей текущей записи
//КоличествоДетей = ТаблицаВычетовНаДетей.КоличествоДетей;
//
//// У текущей записи уменьшим дату начала
//ТаблицаВычетовНаДетей.Период = БудущийПериодЗавершения+1;
//// Исправим количество детей следующей записи
//ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(Номер);
//ТаблицаВычетовНаДетей.КоличествоДетей = ТаблицаВычетовНаДетей.КоличествоДетей + КоличествоДетей;
// Выше закомментировал, т.к. меняют начало первого периода, что считаю неправильным,
// потому, что все зиждется на сортировке по началу периода
//Наложение, ограниченное равенством слева
//конец первого периода может быть только пустое значение,
//если будет конкретная дата, то сортировкой периоды поменяются местами и попадут в след. условие
//А1___________________________________________________А2
//Б1_____________________________Б2
//
//А2=Б2 Передвигаем конец первого периода до конца пересечения, количество суммируем в первом периоде
//Б1=Б2+1 Б2=А2 Превращаем второй период в кусок первого после пересечения
Если (ПустоеЗначение(ТаблицаВычетовНаДетей.ПериодЗавершения) = 1)//к стандарту добавлю еще условие:
и (БудущийПериод = ТаблицаВычетовНаДетей.Период) Тогда
// Запомним период завершения текущей записи
А2 = ТаблицаВычетовНаДетей.ПериодЗавершения;
// Запомним количество детей текущей записи
КоличествоДетейА = ТаблицаВычетовНаДетей.КоличествоДетей;
// Передвигаем конец первого периода до конца пересечения
ТаблицаВычетовНаДетей.ПериодЗавершения = БудущийПериодЗавершения; //А2=Б2
// Превращаем второй период в кусок первого после пересечения
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(Номер);
КоличествоДетейБ = ТаблицаВычетовНаДетей.КоличествоДетей;
ТаблицаВычетовНаДетей.КоличествоДетей = КоличествоДетейА;
ТаблицаВычетовНаДетей.Период = ТаблицаВычетовНаДетей.ПериодЗавершения + 1; //Б1=Б2+1
ТаблицаВычетовНаДетей.ПериодЗавершения = А2; //Б2=А2
//количество суммируем в первом периоде
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(1);
ТаблицаВычетовНаДетей.КоличествоДетей = КоличествоДетейА + КоличествоДетейБ;
//*******************************************************************************
Прервать;
КонецЕсли;
Если (БудущийПериод = ТаблицаВычетовНаДетей.Период) Тогда
// Запомним период завершения текущей записи
ПериодЗавершения = ТаблицаВычетовНаДетей.ПериодЗавершения;
// У текущей записи исправим количество детей
ТаблицаВычетовНаДетей.КоличествоДетей = ТаблицаВычетовНаДетей.КоличествоДетей + КоличествоДетей;
// Исправим дату начала следующей записи
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(Номер);
ТаблицаВычетовНаДетей.Период = ПериодЗавершения + 1;
Прервать;
КонецЕсли;
//******************************************************Изменил Самойлов 17.11.10
//Если (БудущийПериод < ТаблицаВычетовНаДетей.ПериодЗавершения) Тогда
//Выше - Наложение, ограниченное равенством слева
//конец первого периода меньше
//А1__________________А2
//Б1_____________________________Б2
//
//Б1=А2+1 Передвигаем начало второго периода после пересечения, количество суммируем в первом периоде
//Дальше
//Второй период находится внутри первого
//А1____________________________________________________________________А2
// Б1_____________________________Б2
//
//А2=Б1-1 Первый период становится куском первого периода до пересечения
//Б1=Б2+1 Б2=А2 Второй период становится куском первого периода после пересечения
//В1=Б1 В2=Б2 Создаем третий период - пересечение
Если ((БудущийПериод < ТаблицаВычетовНаДетей.ПериодЗавершения) // условие для Б1, равно быть не может
ИЛИ((БудущийПериод > ТаблицаВычетовНаДетей.ПериодЗавершения) //Если Б1>А2, то только если А2 пустое
И(ПустоеЗначение(ТаблицаВычетовНаДетей.ПериодЗавершения) = 1))) И //теперь условие для Б2
(((БудущийПериодЗавершения < ТаблицаВычетовНаДетей.ПериодЗавершения)И(ПустоеЗначение(БудущийПериодЗавершения) = 0))
ИЛИ ((БудущийПериодЗавершения > ТаблицаВычетовНаДетей.ПериодЗавершения)
И(ПустоеЗначение(ТаблицаВычетовНаДетей.ПериодЗавершения) = 1))) Тогда
// Запомним реквизиты текущей записи
ПериодЗавершения = ТаблицаВычетовНаДетей.ПериодЗавершения;
КоличествоДетей = ТаблицаВычетовНаДетей.КоличествоДетей;
// У текущей записи уменьшим дату окончания
ТаблицаВычетовНаДетей.ПериодЗавершения = БудущийПериод-1; //А2=Б1-1
// Исправим дату начала следующей записи
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(Номер);
ТаблицаВычетовНаДетей.Период = ТаблицаВычетовНаДетей.ПериодЗавершения + 1; //Б1=Б2+1
ТаблицаВычетовНаДетей.ПериодЗавершения = ПериодЗавершения; //Б2=А2
// Добавим новую запись между первым и вторым периодом
ТаблицаВычетовНаДетей.НоваяСтрока();
ТаблицаВычетовНаДетей.Физлицо = Источник;
ТаблицаВычетовНаДетей.Период = БудущийПериод; //В1=Б1
ТаблицаВычетовНаДетей.ПериодЗавершения = БудущийПериодЗавершения; //В2=Б2
ТаблицаВычетовНаДетей.КодВычета = КодВычета;
ТаблицаВычетовНаДетей.КоличествоДетей = КоличествоДетей + БудущееКоличествоДетей;
ТаблицаВычетовНаДетей.КоличествоДетейЗавершения = КоличествоДетей;
Прервать;
КонецЕсли;
//Периоды пересекаются краями
//А1______________________________А2
// Б1_____________________________Б2
//
//А2=Б1-1 Первый период становится куском первого периода до пересечения
//Б1=А2+1 Второй период становится куском второго периода после пересечения
//В1=Б1 В2=А2 Создаем третий период - пересечение
Если ((БудущийПериод < ТаблицаВычетовНаДетей.ПериодЗавершения) // условие для Б1, равно быть не может
ИЛИ((БудущийПериод > ТаблицаВычетовНаДетей.ПериодЗавершения) //Если Б1>А2, то только если А2 пустое
И(ПустоеЗначение(ТаблицаВычетовНаДетей.ПериодЗавершения) = 1))) И //теперь условие для Б2
((БудущийПериодЗавершения > ТаблицаВычетовНаДетей.ПериодЗавершения )
ИЛИ((БудущийПериодЗавершения < ТаблицаВычетовНаДетей.ПериодЗавершения )
И(ПустоеЗначение(БудущийПериодЗавершения) = 1))) Тогда
//*******************************************************************************
// Запомним реквизиты текущей записи
ПериодЗавершения = ТаблицаВычетовНаДетей.ПериодЗавершения;
КоличествоДетей = ТаблицаВычетовНаДетей.КоличествоДетей;
// У текущей записи уменьшим дату окончания
ТаблицаВычетовНаДетей.ПериодЗавершения = БудущийПериод-1;
// Исправим дату начала следующей записи
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(Номер);
ТаблицаВычетовНаДетей.Период = ПериодЗавершения + 1;
// Добавим новую запись между первым и вторым периодом
ТаблицаВычетовНаДетей.НоваяСтрока();
ТаблицаВычетовНаДетей.Физлицо = Источник;
ТаблицаВычетовНаДетей.Период = БудущийПериод;
ТаблицаВычетовНаДетей.ПериодЗавершения = ПериодЗавершения;
ТаблицаВычетовНаДетей.КодВычета = КодВычета;
ТаблицаВычетовНаДетей.КоличествоДетей = КоличествоДетей + БудущееКоличествоДетей;
ТаблицаВычетовНаДетей.КоличествоДетейЗавершения = КоличествоДетей;
Прервать;
КонецЕсли;
КонецЦикла;
ТаблицаВычетовНаДетей.Свернуть("Физлицо, Период, ПериодЗавершения, КодВычета", "КоличествоДетей, КоличествоДетейЗавершения");
ТаблицаВычетовНаДетей.Сортировать("+Период,+ПериодЗавершения");
КонецЕсли;
ТаблицаВычетовНаДетей.ПолучитьСтрокуПоНомеру(1);
ВыгрузитьПоПравилу(ТаблицаВычетовНаДетей, , , , "НДФЛСтандартныеВычетыНаДетей");
ТаблицаВычетовНаДетей.УдалитьСтроку(1);
КонецЦикла;
Благодарю alexk-is за //infostart.ru/public/19856/
Публикация //infostart.ru/public/19622/ не активна, но все равно, благодарю Владислава Томашевича.
Изменения новых правил, дополнения отслеживаем на моем блоге: Изменить 1С
Изменения стандартных правил выгрузки перехода с ЗиК на ЗУП
Столкнулась тем что неправильно переносится ФСС_НС в те месяца когда есть превышение за 415000
Точнее ФСС_НС в данном случае не переносится вообще — страховых нет, а ФСС_НС есть, но про него просто забыли.
Мне задан был вопрос
Вот такую ситуацию я исследовал:
Правило конвертации объектов «НачисленияИУдержания». Обработчик «ПослеЗагрузки».
Если смотреть в отладчике в наборе записей РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций все загружаемые записи присутствуют, при вызоае алгоритма в 41 строке обработчика:
Выполнить(Алгоритмы.РассчитатьДниЧасыПоПятидневке);
часть записей в наборе пропадает.
В этом алгоритме происходит запись документа «ПереносДанных», который является регистратором для данного набора записей, при этом часть записей не попадает в виртуальную таблицу РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия,
с которой в дальнейшем теле алгоритма в запросе происходит ВНУТРЕННЕЕ СОЕДИНЕНИЕ с таблицей РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций. Полученный результат запроса не содержит всех исходных записей набора регистра, который загружается в табличную часть документа «ПереносДанных».
В результате теряются при загрузке данные о начислениях по следующим
признакам:
1. Вид расчета источника —
ВидРасчета.ОплатаБЛЗаСчетРаботодателяЕНВДс2010 (другие виды расчета больничных не теряются, хотя в приемнике фигурирует для всех один и тотже вид расчета — ОплатаПоСреднемуБЛ)
2. Период действия расчета — предыдущий месяц
3. Если загружать данные в чистую информационную базу начиная с месяца, в котором есть «пропадающие» начисления, то начисления не пропадают. Если включить в выгрузку предыдущий «пропадающим» начислениям месяц, то начисления пропадают.
Я, к сожалению, не могу знать как заполняется виртуальная таблица РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ФактическийПериодДействия
при проведении документа «ПереносДанных» и почему при так складывающихся условиях (период действия предыдущего месяца и вид расчета ИСТОЧНИКА означенный выше) она не заполняется нужными записями, хотя в основной таблице регистра весь набор записей сохраняется. При загрузке ведь все виды расчета больничного конвертируются в один!
Не понятно.
Обновил статью. 06.03.11
Добавил в «современные» правила свои изменения по вычетам и выложил. Почему-то думал, что вот-вот ребята из 1С все поправят. Видимо затерялось мое письмишко у них…
Изначально мне ответили, что «Ошибка зарегистрирована с номером 10066919.
Сроки исправления: в одном из следующих релизов.» Это было 15.12.11
А где посмотреть «современные» правила?
(7) Так на сайте 1С поддержки пользователей… Или в новом релизе ЗУП (как их достать из релиза см. мой видеоурок). А что, еще кто-то переходит?
Да, мы переходим.