Итак, звонит пользователь и описывает ошибку, приведенную выше. Стандартная отмазка "Ждем новый релиз УПП" не прошла - есть сроки ответа, если не ответим вовремя, будет штраф. Пришлось включать мозг.
Смотрим исходный документ. Все поля на месте: расчетный счет, адрес, данные ребенка и т.д. Чешем репу. Благо, в документе, отправленном в ФСС виден текст XML-сообщения и это уже кое-что. Если есть XML и ошибка формата сообщения, значит где-то должна быть схема XSD для его проверки. Полдня поиска в гугле и яндексе мало что дали. Оказалось, что всё лежит под самым носом:
Спецификации СЭДО
Схема XSD
Теперь нужен какой-то инструмент, позволяющий проверить файл XML по схеме XSD. Я для себя выбрал простой скрипт на питоне:
from lxml import etree
# Загрузка xsd схемы
xsd_file_name = 'c:/tmp/xsd/v01/proactive/Confirmation.xsd'
schema_root = etree.parse(xsd_file_name)
schema = etree.XMLSchema(schema_root)
# Загрузка xml
xml_filename = 'c:/tmp/ans.xml'
xml = etree.parse(xml_filename)
# Проверка
if not schema.validate(xml):
print(schema.error_log)
Здесь c:/tmp/xsd/v01/proactive/Confirmation.xsd - путь к корневому файлу схемы XSD,
c:/tmp/ans.xml - сохраненный в файл текст XML из документа.
Запускаем скрипт и получаем вот такую ошибку:
c:/tmp/ans.xml:4:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element '{urn:ru:fss:integration:types:proactive:benefit4:v01}benefit4Approve': This element is not expected. Expected is one of ( {urn:ru:fss:integration:types:proactive:v01}changeReason, {urn:ru:fss:integration:types:proactive:benefit1:v01}benefit1Approve, {urn:ru:fss:integration:types:proactive:benefit2:v01}benefit2Approve, {urn:ru:fss:integration:types:proactive:benefit4:v02}benefit4Approve, {urn:ru:fss:integration:types:proactive:benefit5:v01}benefit5Approve, {urn:ru:fss:integration:types:proactive:benefit6:v01}benefit6Approve, {urn:ru:fss:integration:types:proactive:v01}refuse ).
Опаньки! Оказывается для элемента benefit4Approve необходимо использовать версию спецификации пространства имен v02. Но это еще не всё. Понятно, что версия спецификации просто так не меняется, скорее всего изменилось и что-то внутри.
Редактируем в xml-файле имя пространства имен на xmlns:benefit="urn:ru:fss:integration:types:proactive:benefit4:v02"
запускаем скрипт и видим следующие ошибки:
c:/tmp/ans.xml:11:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element '{urn:ru:fss:integration:types:proactive:benefit4:v02}insuredInfo': Missing child element(s). Expected is one of ( {urn:ru:fss:integration:types:proactive:benefit4:v02}workContract, {urn:ru:fss:integration:types:proactive:benefit4:v02}childRelType ).
c:/tmp/ans.xml:55:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element '{urn:ru:fss:integration:types:proactive:benefit4:v02}cert': This element is not expected.
c:/tmp/ans.xml:60:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element '{urn:ru:fss:integration:types:proactive:benefit4:v02}birthDate': This element is not expected. Expected is one of ( {urn:ru:fss:integration:types:proactive:benefit4:v02}cert, {urn:ru:fss:integration:types:proactive:benefit4:v02}otherDoc, {urn:ru:fss:integration:types:proactive:benefit4:v02}birthReference ).
Лезем в спецификацию по поводу тегов workContract, childRelType, cert, birthDate.
Выясняем, что workContract - срочный трудовой контракт - не наш случай. childRelType - отношение к ребенку (перечисление 38 - мать, 39 - отец, 40 - попечитель, 41 - опекун, 42 - иной родственник, фактически осуществляющий уход за ребенком). Этого тэга раньше не было.
cert - свидетельство о рождении. Раньше было, но теперь из тэга zagsAct передвинули выше, в birthInfo.
Добавляем в XML-файл тэг <benefit:childRelType>38</benefit:childRelType> внутрь benefit:insuredInfo, перемещаем cert.
Запускаем скрипт - проходит без ошибок. Ошибка по birthDate оказалась наведенной. Теперь становится понятно, что нужно исправить в УПП, чтобы документ отправился в ФСС.
1. Документ ОтветНаЗапросФССДляРасчетаПособия. Модуль формы документа.
Процедура УсловияИсчисленияКодНачалоВыбораИзСписка
Процедура УсловияИсчисленияКодНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокВыбора = Новый СписокЗначений;
Если ВидПособия = Перечисления.ПособияНазначаемыеФСС.ЕдиновременноеПособиеПриРожденииРебенка Тогда
СписокВыбора.Добавить("38", "38 - мать");
СписокВыбора.Добавить("39", "39 - отец");
СписокВыбора.Добавить("40", "40 - попечитель");
СписокВыбора.Добавить("41", "41 - опекун");
СписокВыбора.Добавить("42", "42 - иной родственник, фактически осуществляющий уход за ребенком");
Иначе
СписокВыбора.Добавить("43", "43 - лицо, относящееся к категории лиц, подвергшихся воздействию радиации");
СписокВыбора.Добавить("44", "44 - лицо, приступившее к работе в районах Крайнего Севера и приравненных к ним местностях до 2007 года и продолжающее работать в этих местностях");
СписокВыбора.Добавить("45", "45 - лицо, имеющее инвалидность");
СписокВыбора.Добавить("46", "46 - трудовой договор менее 6 месяцев (не заполняется в случае заболевания туберкулезом)");
СписокВыбора.Добавить("47", "47 - заболевание (травма) наступили в течение 30 календарных дней со дня прекращения работы (не заполняется в случае заболевания туберкулезом)");
СписокВыбора.Добавить("48", "48 - уважительная причина нарушения режима");
СписокВыбора.Добавить("49", "49 - продолжительность заболевания превышает 4 месяца подряд (для лиц, имеющих инвалидность, за исключением заболевания туберкулезом)");
СписокВыбора.Добавить("50", "50 - продолжительность заболевания превышает 5 месяцев в календарном году (для лиц, имеющих инвалидность, за исключением заболевания туберкулезом)");
СписокВыбора.Добавить("51", "51 - неполное рабочее время");
КонецЕсли;
ЭлементСписка = ВыбратьИзСписка(СписокВыбора,Элемент,СписокВыбора.НайтиПоЗначению(Элемент.Значение));
Если ЭлементСписка <> Неопределено Тогда
Элемент.Значение = ЭлементСписка.Значение;
КонецЕсли;
КонецПроцедуры
2. Документ ОтветНаЗапросФССДляРасчетаПособия. Модуль объекта
Функция ТекстXML(Документ) Экспорт
ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
ОбработкаКомментариев.УдалитьСообщения();
Отказ = Ложь;
ПроверитьПравильностьЗаполненияДокумента(Отказ, Ложь);
Если Отказ Тогда
ОбработкаКомментариев.ПоказатьСообщения();
Возврат "";
КонецЕсли;
СведенияОВидеПособия = СведенияОВидеПособия(Документ);
Если Документ.ОтказВНазначенииПособия Тогда
НомерСхемы = 1;
ИначеЕсли СведенияОВидеПособия.ЭтоОбычныйБольничный Тогда
НомерСхемы = 1;
ИначеЕсли СведенияОВидеПособия.ЭтоБольничныйПоБиР Тогда
НомерСхемы = 2;
ИначеЕсли СведенияОВидеПособия.ЭтоПособиеПриРождении Тогда
НомерСхемы = 4;
ИначеЕсли СведенияОВидеПособия.ЭтоОтпускПоУходу Тогда
НомерСхемы = 5;
Иначе
Возврат "";
КонецЕсли;
МенеджерXML = Обработки.ПостроительXML.Создать();
МенеджерXML.ФорматДат = "ДФ=yyyy-MM-dd";
// В корне 1 элемент: Подтверждение сведений проактивно собранных Фондом.
КореньXML = МенеджерXML.ДобавитьУзел(МенеджерXML.ДеревоXML, "proactive:approveSocialAssist");
МенеджерXML.ДобавитьПространствоИмен(КореньXML, "proactive", "urn:ru:fss:integration:types:proactive:v01");
МенеджерXML.ДобавитьПространствоИмен(КореньXML, "common", "http://www.fss.ru/integration/types/common/v01");
Если НомерСхемы = 4 Тогда
МенеджерXML.ДобавитьПространствоИмен(КореньXML, "benefit", "urn:ru:fss:integration:types:proactive:benefit" + НомерСхемы + ":v02");
Иначе
МенеджерXML.ДобавитьПространствоИмен(КореньXML, "benefit", "urn:ru:fss:integration:types:proactive:benefit" + НомерСхемы + ":v01");
КонецЕсли;
МенеджерXML.ДобавитьПространствоИмен(КореньXML, "person", "http://www.fss.ru/integration/types/person/v02");
МенеджерXML.ДобавитьПространствоИмен(КореньXML, "xsi", "http://www.w3.org/2001/XMLSchema-instance");
// Идентификатор входящего запроса.
МенеджерXML.ДобавитьАтрибут(КореньXML, "responseOn", Документ.ВходящийЗапросИдентификатор);
// Номер процесса социальной поддержки.
МенеджерXML.ДобавитьУзел(КореньXML, "proactive:socialAssistNum", Документ.НомерПроцесса);
// Причина изменения (перерасчета). Заполняется в случае повторного направления ответа.
Если Документ.Исправление Тогда
МенеджерXML.ДобавитьУзел(КореньXML, "proactive:changeReason", Документ.ИсправлениеКодПричины);
КонецЕсли;
// Данные для расчета пособия.
Если Документ.ОтказВНазначенииПособия Тогда
УзелДанных = МенеджерXML.ДобавитьУзел(КореньXML, "proactive:refuse");
МенеджерXML.ДобавитьУзел(УзелДанных, "proactive:reason", Документ.ОтказВНазначенииПособияПричина);
Иначе
УзелДанных = МенеджерXML.ДобавитьУзел(КореньXML, "benefit:benefit" + НомерСхемы + "Approve");
Если СведенияОВидеПособия.ЭтоОбычныйБольничный Тогда
ВыгрузитьСведенияОбЭЛН(Документ, МенеджерXML, УзелДанных);
ВыгрузитьСведенияОСтрахователе(Документ, МенеджерXML, УзелДанных);
ВыгрузитьСведенияОЗастрахованномЛице(Документ, МенеджерXML, УзелДанных, СведенияОВидеПособия);
ВыгрузитьСпособВыплаты(Документ, МенеджерXML, УзелДанных);
ВыгрузитьДанныеДляРасчета(Документ, МенеджерXML, УзелДанных, СведенияОВидеПособия);
ВыгрузитьИзвещение(Документ, МенеджерXML, УзелДанных);
ИначеЕсли СведенияОВидеПособия.ЭтоБольничныйПоБиР Тогда
ВыгрузитьСведенияОбЭЛН(Документ, МенеджерXML, УзелДанных);
ВыгрузитьСведенияОСтрахователе(Документ, МенеджерXML, УзелДанных);
ВыгрузитьСведенияОЗастрахованномЛице(Документ, МенеджерXML, УзелДанных, СведенияОВидеПособия);
ВыгрузитьСпособВыплаты(Документ, МенеджерXML, УзелДанных);
ВыгрузитьДанныеДляРасчета(Документ, МенеджерXML, УзелДанных, СведенияОВидеПособия);
ВыгрузитьСведенияОбОтпуске(Документ, МенеджерXML, УзелДанных);
ВыгрузитьИзвещение(Документ, МенеджерXML, УзелДанных);
ИначеЕсли СведенияОВидеПособия.ЭтоПособиеПриРождении Тогда
ВыгрузитьСведенияОСтрахователе(Документ, МенеджерXML, УзелДанных);
ВыгрузитьСведенияОЗастрахованномЛице(Документ, МенеджерXML, УзелДанных, СведенияОВидеПособия);
ВыгрузитьСпособВыплаты(Документ, МенеджерXML, УзелДанных);
ВыгрузитьДанныеДляРасчета(Документ, МенеджерXML, УзелДанных, СведенияОВидеПособия);
ВыгрузитьИнформациюОбУсыновленииОпеке(Документ, МенеджерXML, УзелДанных);
ВыгрузитьИнформациюОПередачеНаВоспитание(Документ, МенеджерXML, УзелДанных);
ВыгрузитьИнформациюОРожденииРебенка(Документ, МенеджерXML, УзелДанных);
ВыгрузитьИнформациюОДругомРодителе(Документ, МенеджерXML, УзелДанных);
ВыгрузитьИзвещение(Документ, МенеджерXML, УзелДанных);
ИначеЕсли СведенияОВидеПособия.ЭтоОтпускПоУходу Тогда
КонецЕсли;
КонецЕсли;
// Замечания.
Если Документ.Исправление Тогда
МенеджерXML.ДобавитьУзел(КореньXML, "proactive:note", Документ.ИсправлениеОписаниеПричины);
КонецЕсли;
МенеджерXML.НачатьЗаписьВСтрокуXML(Ложь);
СтрокаXML = МенеджерXML.СтрокаXML();
Возврат СтрокаXML;
КонецФункции
Процедура ВыгрузитьИнформациюОРожденииРебенка
Процедура ВыгрузитьИнформациюОРожденииРебенка(Документ, МенеджерXML, УзелДанных)
// Информация о рождении ребенка.
УзелРебенок = МенеджерXML.ДобавитьУзел(УзелДанных, "benefit:birthInfo", Неопределено, Ложь, Истина);
Если ЗначениеЗаполнено(Документ.АктоваяЗаписьОРожденииНомер)
И ЗначениеЗаполнено(Документ.АктоваяЗаписьОРожденииДата) Тогда
// Данные о актовой записи ЗАГС.
УзелЗАГС = МенеджерXML.ДобавитьУзел(УзелРебенок, "benefit:zagsAct");
МенеджерXML.ДобавитьУзел(УзелЗАГС, "benefit:num", Документ.АктоваяЗаписьОРожденииНомер);
МенеджерXML.ДобавитьУзел(УзелЗАГС, "benefit:issueDate", Документ.АктоваяЗаписьОРожденииДата);
Иначе
// Иной документ подтверждающий рождение ребенка.
УзелИное = МенеджерXML.ДобавитьУзел(УзелРебенок, "benefit:otherDoc");
МенеджерXML.ДобавитьУзел(УзелИное, "benefit:num", Документ.ИнойДокументОРожденииСерияНомер, Ложь, Истина);
МенеджерXML.ДобавитьУзел(УзелИное, "benefit:issueDate", Документ.ИнойДокументОРожденииДатаВыдачи, Ложь, Истина);
КонецЕсли;
// Свидетельство о рождении.
Свидетельство = МенеджерXML.ДобавитьУзел(УзелРебенок, "benefit:cert", Неопределено, Истина, Ложь);
МенеджерXML.ДобавитьУзел(Свидетельство, "benefit:num", Документ.СвидетельствоОРожденииСерияНомер, Ложь, Истина);
МенеджерXML.ДобавитьУзел(Свидетельство, "benefit:issueDate", Документ.СвидетельствоОРожденииДатаВыдачи, Ложь, Истина);
// Дата рождения ребенка.
МенеджерXML.ДобавитьУзел(УзелРебенок, "benefit:birthDate", Документ.РебенокДатаРождения, Ложь, Истина);
// ФИО ребенка.
УзелФИО = МенеджерXML.ДобавитьУзел(УзелРебенок, "benefit:fullName", Неопределено, Ложь, Истина);
МенеджерXML.ДобавитьУзел(УзелФИО, "person:firstName", Документ.РебенокИмя);
МенеджерXML.ДобавитьУзел(УзелФИО, "person:lastName", Документ.РебенокФамилия);
МенеджерXML.ДобавитьУзел(УзелФИО, "person:middleName", Документ.РебенокОтчество, Истина);
// СНИЛС ребенка.
МенеджерXML.ДобавитьУзел(УзелРебенок, "benefit:snils", СтрЗаменить(СтрЗаменить(Документ.РебенокСНИЛС, "-", ""), " ", ""));
КонецПроцедуры
Процедура ВыгрузитьСведенияОЗастрахованномЛице
Процедура ВыгрузитьСведенияОЗастрахованномЛице(Документ, МенеджерXML, УзелДанных, СведенияОВидеПособия)
УзелСотрудник = МенеджерXML.ДобавитьУзел(УзелДанных, "benefit:insuredInfo");
// Категория застрахованного лица, СНИЛС, ИНН.
МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:category", ВРег(ОбменСведениямиОПособияхСФСС.УбратьПробелы(Документ.СотрудникКатегория)));
МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:snils", СтрЗаменить(СтрЗаменить(Документ.СотрудникСНИЛС, "-", ""), " ", ""));
МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:inn", Документ.СотрудникИНН);
// ФИО.
УзелФИО = МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:fullName");
МенеджерXML.ДобавитьУзел(УзелФИО, "person:firstName", Документ.СотрудникИмя);
МенеджерXML.ДобавитьУзел(УзелФИО, "person:lastName", Документ.СотрудникФамилия);
МенеджерXML.ДобавитьУзел(УзелФИО, "person:middleName", Документ.СотрудникОтчество, Истина);
// Дата рождения, Пол.
МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:birthDate", Документ.СотрудникДатаРождения);
Пол = ?(Документ.СотрудникПол = Перечисления.ПолФизическихЛиц.Женский, "FEMALE", "MALE");
МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:gender", Пол);
// Код статуса налогоплательщика, код страны гражданства.
Налогоплательщик = МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:taxpayer");
МенеджерXML.ДобавитьУзел(Налогоплательщик, "benefit:taxpayerStatus", Документ.КодСтатусаНалогоплательщика);
МенеджерXML.ДобавитьУзел(Налогоплательщик, "benefit:countryCode", Документ.КодСтраныГражданства);
// Адрес регистрации.
Если ЗначениеЗаполнено(Документ.АдресРегистрацииИндекс)
И ЗначениеЗаполнено(ОбменСведениямиОПособияхСФСС.УбратьПробелы(Документ.АдресРегистрацииКодПоФИАС)) Тогда
ЗаписатьАдрес(МенеджерXML, Налогоплательщик, Документ, "АдресРегистрации", "benefit:postalCode", "benefit:address");
ИначеЕсли ЗначениеЗаполнено(Документ.АдресРегистрацииЗаПределамиРФ) Тогда
МенеджерXML.ДобавитьУзел(Налогоплательщик, "benefit:foreignAddress", Документ.АдресРегистрацииЗаПределамиРФ);
Иначе
МенеджерXML.ДобавитьУзел(Налогоплательщик, "benefit:address");
МенеджерXML.ДобавитьУзел(Налогоплательщик, "benefit:postalCode");
КонецЕсли;
// Удостоверение личности тип "IdType" пространства имен "http://www.fss.ru/integration/types/person/v02".
УзелПаспорт = МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:id");
МенеджерXML.ДобавитьУзел(УзелПаспорт, "person:type", Документ.УдостоверениеЛичностиВид.КодИМНС);
МенеджерXML.ДобавитьУзел(УзелПаспорт, "person:series", ОбменСведениямиОПособияхСФСС.УбратьПробелы(Документ.УдостоверениеЛичностиСерия));
МенеджерXML.ДобавитьУзел(УзелПаспорт, "person:num", ОбменСведениямиОПособияхСФСС.УбратьПробелы(Документ.УдостоверениеЛичностиНомер));
МенеджерXML.ДобавитьУзел(УзелПаспорт, "person:issueDate", Документ.УдостоверениеЛичностиДатаВыдачи);
МенеджерXML.ДобавитьУзел(УзелПаспорт, "person:dept", СокрЛП(Документ.УдостоверениеЛичностиКемВыдан));
МенеджерXML.ДобавитьУзел(УзелПаспорт, "person:endDate", Документ.УдостоверениеЛичностиСрокДействия, Истина);
// Срочный трудовой договор.
Если (СведенияОВидеПособия.ЭтоОбычныйБольничный Или СведенияОВидеПособия.ЭтоОтпускПоУходу)
И ЗначениеЗаполнено(Документ.ТрудовойДоговорДатаНачала)
И ЗначениеЗаполнено(Документ.ТрудовойДоговорДатаОкончания)
И (Не ЗначениеЗаполнено(Документ.ДатаНачалаСобытия)
Или Документ.ДатаНачалаСобытия < Документ.ТрудовойДоговорДатаОкончания) Тогда
УзелДоговор = МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:workContract", Неопределено, Истина, Истина);
МенеджерXML.ДобавитьУзел(УзелДоговор, "common:begin", Документ.ТрудовойДоговорДатаНачала);
МенеджерXML.ДобавитьУзел(УзелДоговор, "common:end", Документ.ТрудовойДоговорДатаОкончания);
КонецЕсли;
// Отношение к ребенку
Если СведенияОВидеПособия.ЭтоПособиеПриРождении Тогда
МенеджерXML.ДобавитьУзел(УзелСотрудник, "benefit:childRelType", Документ.УсловияИсчисленияКод1);
КонецЕсли;
КонецПроцедуры
После внесения исправлений в УПП и дополнительного ввода значения в поле УсловияИсчисленияКод1 (при указании вида пособия "Единовременная выплата при рождении ребенка" ранее не использовался) документ был благополучно отправлен.
PS:
Пока я гуглил информацию, мне попались на разных региональных сайтах ФСС предыдущие версии спецификаций по проактивным выплатам. В версии v01 было 290 страниц, v02 - 515 страниц, в текущей версии v02.11 - 894 страницы. Это прогресс за год! Неудивительно, что 1С за ними не поспевает. Я думаю, что у нас будет еще много веселых минут в связи с этой темой.
Update 31.08.2022
Исправлена процедура ВыгрузитьИнформациюОРожденииРебенка