Реестр прямых выплат ФСС / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
	КонецЕсли;
	
КонецПроцедуры

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

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

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ПередЗаписью

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

#КонецОбласти

#Область ОбработкаПроверкиЗаполнения

Процедура ПроверитьПовторноВыбранныеИНепроведенныеЗаявления(Отказ)
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Запрос.УстановитьПараметр("Заявления", СведенияНеобходимыеДляНазначенияПособий.Выгрузить(,"НомерСтроки, Заявление, ПервичныйДокумент, ИзвещениеИзФССИспользование"));
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Заявления.НомерСтроки КАК НомерСтроки,
	|	Заявления.Заявление КАК Заявление,
	|	Заявления.ПервичныйДокумент КАК ПервичныйДокумент,
	|	Заявления.ИзвещениеИзФССИспользование КАК ИзвещениеИзФССИспользование
	|ПОМЕСТИТЬ ВТЗаявления
	|ИЗ
	|	&Заявления КАК Заявления
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	МИНИМУМ(ВТЗаявления.НомерСтроки) КАК НомерСтроки,
	|	ЗаявленияПовторы.НомерСтроки КАК НомерСтрокиПовтора,
	|	ВТЗаявления.Заявление КАК Заявление
	|ИЗ
	|	ВТЗаявления КАК ВТЗаявления
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЗаявления КАК ЗаявленияПовторы
	|		ПО ВТЗаявления.Заявление = ЗаявленияПовторы.Заявление
	|			И ВТЗаявления.ПервичныйДокумент = ЗаявленияПовторы.ПервичныйДокумент
	|			И ВТЗаявления.НомерСтроки < ЗаявленияПовторы.НомерСтроки
	|
	|СГРУППИРОВАТЬ ПО
	|	ВТЗаявления.Заявление,
	|	ВТЗаявления.ПервичныйДокумент,
	|	ЗаявленияПовторы.НомерСтроки
	|ИТОГИ ПО
	|	Заявление
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТЗаявления.НомерСтроки КАК НомерСтроки,
	|	ВТЗаявления.Заявление КАК Заявление
	|ИЗ
	|	ВТЗаявления КАК ВТЗаявления
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаявлениеСотрудникаНаВыплатуПособия КАК ЗаявлениеСотрудникаНаВыплатуПособия
	|		ПО ВТЗаявления.Заявление = ЗаявлениеСотрудникаНаВыплатуПособия.Ссылка
	|ГДЕ
	|	НЕ ЗаявлениеСотрудникаНаВыплатуПособия.Проведен
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТЗаявления.Заявление КАК Заявление,
	|	ВТЗаявления.НомерСтроки КАК НомерСтроки,
	|	ДругиеРеестрыСЭтимиЗаявлениями.Ссылка КАК Ссылка
	|ИЗ
	|	ВТЗаявления КАК ВТЗаявления
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеестрСведенийНеобходимыхДляНазначенияИВыплатыПособий.СведенияНеобходимыеДляНазначенияПособий КАК ДругиеРеестрыСЭтимиЗаявлениями
	|		ПО ВТЗаявления.Заявление = ДругиеРеестрыСЭтимиЗаявлениями.Заявление
	|			И ВТЗаявления.ПервичныйДокумент = ДругиеРеестрыСЭтимиЗаявлениями.ПервичныйДокумент
	|ГДЕ
	|	ДругиеРеестрыСЭтимиЗаявлениями.Ссылка <> &Ссылка
	|	И НЕ ДругиеРеестрыСЭтимиЗаявлениями.Ссылка.ПометкаУдаления
	|	И НЕ ВТЗаявления.ИзвещениеИзФССИспользование";
	
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	УстановитьПривилегированныйРежим(Истина);
	МассивРезультатов = Запрос.ВыполнитьПакет();
	УстановитьПривилегированныйРежим(Ложь);
	
	ПовторяющиесяЗаявления = МассивРезультатов[1];
	НепроведенныеЗаявления = МассивРезультатов[2];
	УжеИспользованныеЗаявления = МассивРезультатов[3];
	
	ИмяТаблицы = "СведенияНеобходимыеДляНазначенияПособий";
	
	Если Не ПовторяющиесяЗаявления.Пустой() Тогда
		Выборка = ПовторяющиесяЗаявления.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
		Пока Выборка.Следующий() Цикл
			ВыборкаПоЗаявлению = Выборка.Выбрать();
			Если ВыборкаПоЗаявлению.Следующий() Тогда
				ТекстПовторныеСтроки = "" + ВыборкаПоЗаявлению.НомерСтроки + ", " + ВыборкаПоЗаявлению.НомерСтрокиПовтора;
				Пока ВыборкаПоЗаявлению.Следующий() Цикл
					ТекстПовторныеСтроки = ТекстПовторныеСтроки + ", " + ВыборкаПоЗаявлению.НомерСтрокиПовтора;
				КонецЦикла;
				Текст = СтрШаблон(НСтр("ru = '%1 использовано в нескольких строках: %2.'"), Выборка.Заявление, ТекстПовторныеСтроки);
				СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Выборка, "Заявление", Текст);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Если Не НепроведенныеЗаявления.Пустой() Тогда
		Выборка = НепроведенныеЗаявления.Выбрать();
		Пока Выборка.Следующий() Цикл
			Текст = СтрШаблон(НСтр("ru = 'Документ ""%1"" не проведен.'"), Выборка.Заявление);
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Выборка, "Заявление", Текст);
		КонецЦикла;
	КонецЕсли;
	
	Если Не УжеИспользованныеЗаявления.Пустой() Тогда
		Выборка = УжеИспользованныеЗаявления.Выбрать();
		Пока Выборка.Следующий() Цикл
			Текст = СтрШаблон(НСтр("ru = '%1 уже использовано в документе %2.'"), Выборка.Заявление, Выборка.Ссылка);
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Выборка, "Заявление", Текст);
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьТребованияФормата(Отказ)
	
	ПроверкиБЗК.ПроверитьЗаполнениеРеквизитаОбъекта(Отказ, ЭтотОбъект, "РеестрСоставил");
	ПроверкиБЗК.ПроверитьЗаполнениеРеквизитаОбъекта(Отказ, ЭтотОбъект, "ТелефонСоставителя");
	ПроверкиБЗК.ПроверитьЗаполнениеЭлектроннойПочтыОбъекта(Отказ, ЭтотОбъект, "АдресЭлектроннойПочтыСоставителя");
	
	ЭтоЮридическоеЛицо = ЗарплатаКадры.ЭтоЮридическоеЛицо(Организация);
	Если ЗначениеЗаполнено(КПП) Тогда
		ПроверитьКППВШапке(Отказ, "КПП");
	КонецЕсли;
	ПроверитьИННВШапке(Отказ, "ИНН", ЭтоЮридическоеЛицо);
	Если ЗначениеЗаполнено(ОГРН) Тогда
		ПроверитьОГРНВШапке(Отказ, "ОГРН", ЭтоЮридическоеЛицо);
	КонецЕсли;
	ПроверитьРегистрационныйНомерФСС(Отказ, "РегистрационныйНомерФСС", Истина);
	ПроверитьРегистрационныйНомерФСС(Отказ, "ДополнительныйКодФСС", Ложь);
	
	ИмяТаблицы = "СведенияНеобходимыеДляНазначенияПособий";
	
	ЭтоЛН = (ВидРеестра = Перечисления.ВидыРеестровСведенийНеобходимыхДляНазначенияИВыплатыПособий.ПособияПоНетрудоспособности);
	Менеджер = Документы.РеестрСведенийНеобходимыхДляНазначенияИВыплатыПособий;
	
	Для Каждого Строка Из СведенияНеобходимыеДляНазначенияПособий Цикл
		Если ЗначениеЗаполнено(Строка.Заявление) Тогда
			СведенияОбъект = Строка.Заявление.ПолучитьОбъект();
			ПроверитьЗаполнениеСведений(Отказ, СведенияОбъект);
		Иначе
			СведенияОбъект = Неопределено;
		КонецЕсли;
		
		Если ЭтоЛН Тогда
			ПроверитьНомерЛН(Отказ, ИмяТаблицы, Строка, "НомерЛисткаНетрудоспособности");
			Если Менеджер.ТребуетсяЗаполнитьСведенияОЛисткеНетрудоспособности(Строка) Тогда
				Если ЗначениеЗаполнено(Строка.НомерПервичногоЛисткаНетрудоспособности) Тогда
					ПроверитьНомерЛН(Отказ, ИмяТаблицы, Строка, "НомерПервичногоЛисткаНетрудоспособности");
				КонецЕсли;
				Если СведенияОбъект <> Неопределено
					И СведенияОбъект.ТипЗанятостиРаботника <> Перечисления.ВидыЗанятости.ОсновноеМестоРаботы Тогда
					Если ЗначениеЗаполнено(Строка.НомерЛисткаПоОсновномуМестуРаботы) Тогда
						ПроверитьНомерЛН(Отказ, ИмяТаблицы, Строка, "НомерЛисткаПоОсновномуМестуРаботы");
					Иначе
						Текст = НСтр("ru = 'Для совместителя должен быть указан номер листка нетрудоспособности, предъявляемого на основном месте работы.'");
						СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "НомерЛисткаПоОсновномуМестуРаботы", Текст);
					КонецЕсли;
				КонецЕсли;
				ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаВыдачиЛисткаНетрудоспособности");
				ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "КодПричиныНетрудоспособности");
			КонецЕсли;
		КонецЕсли;
		
		// Извещение о представлении недостающих сведений в ФСС;
		// Решение об отказе в назначении пособия:
		Если Строка.ИзвещениеИзФССИспользование Тогда
			ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "ИзвещениеИзФССДата");
			Если Не ЗначениеЗаполнено(Строка.ИзвещениеИзФССНомер) Тогда
				ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "ИзвещениеИзФССНомер");
			ИначеЕсли СтрДлина(Строка.ИзвещениеИзФССНомер) > 12 Тогда
				Текст = НСтр("ru = 'В номере извещения ФСС %1 символов, а должно быть не более 12.'");
				Текст = СтрШаблон(Текст, СтрДлина(Строка.ИзвещениеИзФССНомер));
				СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ИзвещениеИзФССНомер", Текст);
			Иначе
				ЛишниеСимволы = СтроковыеФункцииБЗККлиентСервер.УдалитьЦифрыИзСтроки(Строка.ИзвещениеИзФССНомер);
				Если Не ПустаяСтрока(ЛишниеСимволы) Тогда
					Если СтрДлина(ЛишниеСимволы) = 1 Тогда
						Текст = НСтр("ru = 'В номере извещения ФСС должны быть только цифры (%1 - не цифра).'");
					Иначе
						Текст = НСтр("ru = 'В номере извещения ФСС должны быть только цифры (%1 - не цифры).'");
					КонецЕсли;
					Текст = СтрШаблон(Текст, ЛишниеСимволы);
					СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ИзвещениеИзФССНомер", Текст);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Строка.ПервичныйДокумент)
			И ТипЗнч(Строка.ПервичныйДокумент) = Тип("ДокументСсылка.УведомлениеОПрекращенииОтпускаПоУходуЗаРебенком")
			И СведенияОбъект <> Неопределено
			И Не СведенияОбъект.Перерасчет Тогда
			Текст = НСтр("ru = 'В сведениях для реестра необходимо включить флажок ""Перерасчет"".'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "Заявление", Текст);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ПроверитьНомерЛН(Отказ, ИмяТаблицы, Строка, ИмяРеквизита)
	НомерЛН = Строка[ИмяРеквизита];
	Если Документы.РеестрСведенийНеобходимыхДляНазначенияИВыплатыПособий.ФорматНомераЛНСоответствуетКоду2(НомерЛН) Тогда
		ТекстОшибки = "";
	Иначе
		ТекстОшибки = УчетПособийСоциальногоСтрахования.ПроверитьНомерЛН(НомерЛН);
	КонецЕсли;
	Если ТекстОшибки <> "" Тогда
		ПредставлениеРеквизита = Метаданные().ТабличныеЧасти[ИмяТаблицы].Реквизиты[ИмяРеквизита].Представление();
		Если Не ЗначениеЗаполнено(НомерЛН) Тогда
			Текст = СтрШаблон(НСтр("ru = 'Не заполнено поле ""%1"".'"), ПредставлениеРеквизита);
		Иначе
			Текст = СтрШаблон(НСтр("ru = 'Неверно заполнено поле ""%1"": %2'"), ПредставлениеРеквизита, ТекстОшибки);
		КонецЕсли;
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, ИмяРеквизита, Текст);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьКППВШапке(Отказ, ИмяРеквизита)
	Текст = "";
	Успех = РегламентированныеДанныеКлиентСервер.КППСоответствуетТребованиям(ЭтотОбъект[ИмяРеквизита], Текст);
	Если Не Успех Тогда
		СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, Текст, ИмяРеквизита);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьИННВШапке(Отказ, ИмяРеквизита, ЭтоЮридическоеЛицо)
	Текст = "";
	ИНН = ЭтотОбъект[ИмяРеквизита];
	Успех = РегламентированныеДанныеКлиентСервер.ИННСоответствуетТребованиям(ИНН, ЭтоЮридическоеЛицо, Текст);
	Если Не Успех Тогда
		СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, Текст, ИмяРеквизита);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьОГРНВШапке(Отказ, ИмяРеквизита, ЭтоЮридическоеЛицо)
	РезультатПроверки = ПроверкиБЗК.РезультатПроверкиОГРН(ЭтотОбъект[ИмяРеквизита]);
	Если Не РезультатПроверки.Успех Тогда
		ТекстОшибки = СтрШаблон(
			НСтр("ru = '%1: ОГРН ""%2"" содержит ошибку: %3'"),
			Метаданные().Реквизиты[ИмяРеквизита].Представление(),
			ЭтотОбъект[ИмяРеквизита],
			РезультатПроверки.Пояснение);
		СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, ТекстОшибки, ИмяРеквизита);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьРегистрационныйНомерФСС(Отказ, ИмяРеквизита, ТребоватьЗаполнить)
	РегистрационныйНомер = СокрЛП(ЭтотОбъект[ИмяРеквизита]);
	Если Не ЗначениеЗаполнено(РегистрационныйНомер) Тогда
		Если ТребоватьЗаполнить Тогда
			ПроверкиБЗК.ПроверитьЗаполнениеРеквизитаОбъекта(Отказ, ЭтотОбъект, ИмяРеквизита);
		КонецЕсли;
	ИначеЕсли СтрДлина(РегистрационныйНомер) <> 10 Тогда
		Текст = НСтр("ru = 'В регистрационном номере ФСС %1 символов, а должно быть 10.'");
		Текст = СтрШаблон(Текст, СтрДлина(РегистрационныйНомер));
		СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, Текст, ИмяРеквизита);
	Иначе
		ЛишниеСимволы = СтроковыеФункцииБЗККлиентСервер.УдалитьЦифрыИзСтроки(РегистрационныйНомер);
		Если ЛишниеСимволы <> "" Тогда
			Если СтрДлина(ЛишниеСимволы) = 1 Тогда
				Текст = НСтр("ru = 'В регистрационном номере ФСС должны быть только цифры (""%1"" - не цифра).'");
			Иначе
				Текст = НСтр("ru = 'В регистрационном номере ФСС должны быть только цифры (""%1"" - не цифры).'");
			КонецЕсли;
			Текст = СтрШаблон(Текст, ЛишниеСимволы);
			СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, ЭтотОбъект, Текст, ИмяРеквизита);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьЗаполнениеСведений(Отказ, СведенияОбъект)
	СообщенияДоНачалаПроверки = ПолучитьСообщенияПользователю(Истина);
	ПроверкаЗаполненияПройдена = СведенияОбъект.ПроверитьЗаполнение();
	СообщенияЗаявления = ПолучитьСообщенияПользователю(Истина);
	Для Каждого Сообщение Из СообщенияДоНачалаПроверки Цикл
		Сообщение.Сообщить();
	КонецЦикла;
	Если Не ПроверкаЗаполненияПройдена Тогда
		Отказ = Истина;
		Если СообщенияЗаявления.Количество() = 0 Тогда
			Текст = СтрШаблон(
				НСтр("ru = 'При проверке сведений %1 от %2 обнаружены ошибки.'"),
				СведенияОбъект.Сотрудник,
				Формат(СведенияОбъект.Дата, "ДФ='d MMMM'"));
			СообщенияБЗК.СообщитьОПроблеме(Текст, СведенияОбъект.Ссылка);
		КонецЕсли;
	КонецЕсли;
	Если СообщенияЗаявления.Количество() > 0 Тогда
		ПрефиксДокумента = СтрШаблон(
			НСтр("ru = 'Сведения %1 от %2: '"),
			СведенияОбъект.Сотрудник,
			Формат(СведенияОбъект.Дата, "ДФ='d MMMM'"));
		Для Каждого Сообщение Из СообщенияЗаявления Цикл
			Сообщение.Текст = ПрефиксДокумента + Сообщение.Текст;
			Сообщение.КлючДанных = СведенияОбъект.Ссылка;
			Сообщение.Сообщить();
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ПроверкиЗаполненияПоРегламентуФСС

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

Процедура ПроверитьЗаполнениеСтрокСведенийПоВременнойНетрудоспособности(Отказ)
	ИмяТаблицы = "СведенияНеобходимыеДляНазначенияПособий";
	
	РеквизитыЗаявлений = РеквизитыЗаявлений();
	ЭтоБольничный = (ВидРеестра = Перечисления.ВидыРеестровСведенийНеобходимыхДляНазначенияИВыплатыПособий.ПособияПоНетрудоспособности);
	Менеджер = Документы.РеестрСведенийНеобходимыхДляНазначенияИВыплатыПособий;
	
	Для Каждого Строка Из СведенияНеобходимыеДляНазначенияПособий Цикл
		Если Не ЗначениеЗаполнено(Строка.Заявление) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Строка.ЭтоЭЛН И Менеджер.ФорматНомераЛНСоответствуетКоду2(Строка.НомерЛисткаНетрудоспособности) Тогда
			Текст = НСтр("ru = 'Для введенного номера ЛН следует отключить флажок ЭЛН.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ЭтоЭЛН", Текст);
		КонецЕсли;
		
		РеквизитыЗаявления = РеквизитыЗаявлений.Получить(Строка.Заявление);
		ЭтоПособиеПоБеременностиИРодам = ЭтоБольничный И (
			РеквизитыЗаявления.ВидПособия = Перечисления.ПособияНазначаемыеФСС.ПособиеПоБеременностиИРодам
			Или РеквизитыЗаявления.ВидПособия = Перечисления.ПособияНазначаемыеФСС.ПособиеПоБеременностиИРодамВставшимНаУчетВРанниеСроки);
		
		Если ЭтоБольничный И Менеджер.ТребуетсяЗаполнитьСведенияОЛисткеНетрудоспособности(Строка) Тогда
			
			ПроверитьСведенияОЛисткеНетрудоспособности(Отказ, ИмяТаблицы, Строка, ЭтоПособиеПоБеременностиИРодам);
			
		КонецЕсли;
		
		Если ЭтоПособиеПоБеременностиИРодам Тогда
			
			Если Строка.КодПричиныНетрудоспособности <> "05" Тогда
				Текст = НСтр("ru = 'Для пособия по беременности и родам должен быть указан код причины нетрудоспособности 05.'");
				СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "КодПричиныНетрудоспособности", Текст);
			КонецЕсли;
			
			Если РеквизитыЗаявления.ПорядокРасчетаСреднегоЗаработка <> Перечисления.СпособыРасчетаСреднегоЗаработкаДляОплатыПособия.СреднийЗаработок Тогда
				ДатаПроверки = УчетПособийСоциальногоСтрахованияКлиентСервер.ДатаОтдельногоРасчетаПособийПоМатеринству();
				Если Строка.ОсвобождениеДатаНачала1 >= ДатаПроверки Тогда
					Текст = НСтр("ru = 'Для отпуска по беременности и родам, начинающегося 1 января 2013 года или позже, указан недопустимый порядок расчета среднего заработка: из оклада или МРОТ.'");
					СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ПорядокРасчетаСреднегоЗаработка", Текст);
				КонецЕсли;
			КонецЕсли;
			
			Если Строка.ПоставленаНаУчетВРанниеСрокиБеременности = Перечисления.ПостановкаНаУчетВРанниеСрокиБеременности.Поставлена
				И Не УчетПособийСоциальногоСтрахования.ДоступноПособиеВставшимНаУчетВРанниеСроки(Строка.ОсвобождениеДатаНачала1) Тогда
				Текст = НСтр("ru = 'Единовременное пособие вставшим на учет в ранние сроки беременности отменено с 1 июля 2021 года.'");
				СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ПоставленаНаУчетВРанниеСрокиБеременности", Текст);
			КонецЕсли;
			
		КонецЕсли;
		
		Если (Строка.УсловияИсчисленияКод1 = "46" Или Строка.УсловияИсчисленияКод2 = "46" Или Строка.УсловияИсчисленияКод3 = "46")
			И (Не ЗначениеЗаполнено(РеквизитыЗаявления.ДатаНачалаТрудовогоДоговораПолучателя)
				Или Не ЗначениеЗаполнено(РеквизитыЗаявления.ДатаОкончанияТрудовогоДоговораПолучателя)) Тогда
			Текст = НСтр("ru = 'Для принятого по срочному трудовому договору сроком менее 6 месяцев должен быть указан период этого договора.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаНачалаТрудовогоДоговораПолучателя", Текст);
		КонецЕсли;
		
		Если РеквизитыЗаявления.ВидПособия <> Перечисления.ПособияНазначаемыеФСС.ПособиеВСвязиСНесчастнымСлучаемНаПроизводстве
			И Не ЗначениеЗаполнено(Строка.СтажЛет)
			И Не ЗначениеЗаполнено(Строка.СтажМесяцев) Тогда
			Текст = НСтр("ru = 'Не заполнен стаж.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "СтажЛет", Текст);
		КонецЕсли;
		
		Если (Строка.УсловияИсчисленияКод1 = "43" Или Строка.УсловияИсчисленияКод2 = "43" Или Строка.УсловияИсчисленияКод3 = "43")
			И Не ЗначениеЗаполнено(Строка.ФинансированиеФедеральнымБюджетом) Тогда
			Текст = НСтр("ru = 'Для лица, подвергшегося воздействию радиации, не указана причина этого воздействия'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ФинансированиеФедеральнымБюджетом", Текст);
		КонецЕсли;
		
		Если ЕстьОплатаЗаСчетФСС(Строка) Тогда
			ПериодОплатыЗаполнен = ПроверкиБЗК.ПроверитьПериодВСтрокеТаблицы(
				Отказ,
				ЭтотОбъект,
				ИмяТаблицы,
				Строка,
				"ДатаНачалаОплаты",
				"ДатаОкончанияОплаты",
				НСтр("ru = 'выплаты пособия за счет ФСС'"));
			Если ПериодОплатыЗаполнен Тогда
				Если Строка.ДатаНачалаОплаты < Строка.ОсвобождениеДатаНачала1 Тогда
					Текст = НСтр("ru = 'Период оплаты за счет ФСС начинается до начала периода освобождения от работы.'");
					СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаОкончанияОплаты", Текст);
				КонецЕсли;
				Если Строка.ДатаОкончанияОплаты > Макс(Строка.ОсвобождениеДатаОкончания1, Строка.ОсвобождениеДатаОкончания2, Строка.ОсвобождениеДатаОкончания3) Тогда
					Текст = НСтр("ru = 'Период оплаты за счет ФСС заканчивается после окончания периода освобождения от работы.'");
					СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаОкончанияОплаты", Текст);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ПроверитьСведенияОЛисткеНетрудоспособности(Отказ, ИмяТаблицы, Строка, ЭтоПособиеПоБеременностиИРодам)
	ЭтоСанаторнаяПутевка = ЭтоСанаторнаяПутевка(Строка);
	
	ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "НаименованиеМедицинскойОрганизации");
	ПроверитьОГРНВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ОГРНМедицинскойОрганизации");
	
	Если ЭтоПособиеПоБеременностиИРодам
		И Не ЗначениеЗаполнено(Строка.ДатаИзмененияКодаПричиныНетрудоспособности)
		И Строка.ЯвляетсяПервичнымЛисткомНетрудоспособности
		И Не ЗначениеЗаполнено(Строка.ДополнительныйКодПричиныНетрудоспособности) Тогда
		Текст = НСтр("ru = 'Для пособия по беременности и родам в поле ""Дата 1"" должна быть указана предполагаемая дата родов.'");
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаИзмененияКодаПричиныНетрудоспособности", Текст);
	ИначеЕсли ЗначениеЗаполнено(Строка.ВторойКодПричиныНетрудоспособности)
		И Не ЗначениеЗаполнено(Строка.ДатаИзмененияКодаПричиныНетрудоспособности) Тогда
		Текст = НСтр("ru = 'В поле ""Дата 1"" не указана дата изменения кода причины нетрудоспособности.'");
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаИзмененияКодаПричиныНетрудоспособности", Текст);
	ИначеЕсли ЭтоСанаторнаяПутевка
		И Не ЗначениеЗаполнено(Строка.ДатаИзмененияКодаПричиныНетрудоспособности) Тогда
		Текст = НСтр("ru = 'В поле ""Дата 1"" не указана дата начала санаторной путевки.'");
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаИзмененияКодаПричиныНетрудоспособности", Текст);
	КонецЕсли;
	
	Если ЭтоСанаторнаяПутевка Тогда
		Если Не ЗначениеЗаполнено(Строка.ДатаОкончанияПутевки) Тогда
			Текст = НСтр("ru = 'В поле ""Дата 2"" не указана дата окончания санаторной путевки.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаОкончанияПутевки", Текст);
		КонецЕсли;
		ПроверитьОГРНВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ОГРН_Санатория");
	КонецЕсли;
	
	Если ЭтоУходЗаРодственниками(Строка) Тогда
		Если Не ЗначениеЗаполнено(Строка.ПоУходуФИО1) Тогда
			Текст = НСтр("ru = 'Не заполнено ФИО первого родственника, за которым осуществлялся уход.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ПоУходуФИО1", Текст);
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Строка.ПоУходуВозрастЛет1 + Строка.ПоУходуВозрастМесяцев1) Тогда
			Текст = НСтр("ru = 'Не заполнен возраст первого родственника, за которым осуществлялся уход.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ПоУходуВозрастЛет1", Текст);
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Строка.ПоУходуРодственнаяСвязь1) Тогда
			Текст = НСтр("ru = 'Не заполнена родственная связь первого родственника, за которым осуществлялся уход.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ПоУходуРодственнаяСвязь1", Текст);
		КонецЕсли;
		Если ЗначениеЗаполнено(Строка.ПоУходуФИО2) Тогда
			Если Не ЗначениеЗаполнено(Строка.ПоУходуВозрастЛет2 + Строка.ПоУходуВозрастМесяцев2) Тогда
				Текст = НСтр("ru = 'Не заполнен возраст второго родственника, за которым осуществлялся уход.'");
				СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ПоУходуВозрастЛет2", Текст);
			КонецЕсли;
			Если Не ЗначениеЗаполнено(Строка.ПоУходуРодственнаяСвязь2) Тогда
				Текст = НСтр("ru = 'Не заполнена родственная связь второго родственника, за которым осуществлялся уход.'");
				СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ПоУходуРодственнаяСвязь2", Текст);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ЭтоНарушениеРежима(Строка) Тогда
		ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаНарушенияРежима");
		ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "КодНарушенияРежима");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Строка.ГруппаИнвалидности)
		И ДопустимыеГруппыИнвалидности().Найти(Строка.ГруппаИнвалидности) = Неопределено Тогда
		Текст = НСтр("ru = 'Группа инвалидности %1 не поддерживается форматом обмена с ФСС.'");
		Текст = СтрШаблон(Текст, Строка.ГруппаИнвалидности);
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ГруппаИнвалидности", Текст);
	КонецЕсли;
	
	ПериодыНетрудоспособностиЗаполнены = ПроверитьПериодНетрудоспособности(
		Отказ,
		Строка,
		1,
		ИмяТаблицы,
		НСтр("ru = 'первого периода освобождения от работы'"));
	
	Если ЗначениеЗаполнено(Строка.ОсвобождениеДатаНачала2) Тогда
		ПериодЗаполнен = ПроверитьПериодНетрудоспособности(
			Отказ,
			Строка,
			2,
			ИмяТаблицы,
			НСтр("ru = 'второго периода освобождения от работы'"));
		Если ПериодЗаполнен И Строка.ОсвобождениеДатаОкончания1 + 86400 <> Строка.ОсвобождениеДатаНачала2 Тогда
			Текст = НСтр("ru = 'Начало второго периода освобождения от работы должно непосредственно следовать за окончанием первого периода.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ОсвобождениеДатаНачала2", Текст);
		КонецЕсли;
		ПериодыНетрудоспособностиЗаполнены = ПериодыНетрудоспособностиЗаполнены И ПериодЗаполнен;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Строка.ОсвобождениеДатаНачала3) Тогда
		ПериодЗаполнен = ПроверитьПериодНетрудоспособности(
			Отказ,
			Строка,
			3,
			ИмяТаблицы,
			НСтр("ru = 'третьего периода освобождения от работы'"));
		Если ПериодЗаполнен И Строка.ОсвобождениеДатаОкончания2 + 86400 <> Строка.ОсвобождениеДатаНачала3 Тогда
			Текст = НСтр("ru = 'Начало третьего периода освобождения от работы должно непосредственно следовать за окончанием второго периода.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ОсвобождениеДатаНачала3", Текст);
		КонецЕсли;
		ПериодыНетрудоспособностиЗаполнены = ПериодыНетрудоспособностиЗаполнены И ПериодЗаполнен;
	КонецЕсли;
	
	Если Строка.ДатаВыдачиЛисткаНетрудоспособности > Строка.ОсвобождениеДатаНачала1
		И Не ЭтоНахождениеВСтационареСРебенком(Строка)
		И Не ЭтоПродолжение(Строка)
		И ЗначениеЗаполнено(Строка.НомерЛисткаПродолжения) Тогда
		Текст = НСтр("ru = 'Листок нетрудоспособности выдан после начала освобождения от работы.'");
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаВыдачиЛисткаНетрудоспособности", Текст);
	КонецЕсли;

	Если ЭтоНахождениеВСтационареСРебенком(Строка) Тогда
		ПроверкиБЗК.ПроверитьПериодВСтрокеТаблицы(
			Отказ,
			ЭтотОбъект,
			ИмяТаблицы,
			Строка,
			"ПериодНахожденияВСтационареСРебенкомС",
			"ПериодНахожденияВСтационареСРебенкомПо",
			НСтр("ru = 'нахождения в стационаре'"));
	КонецЕсли;
	
	Если ЕстьИзменениеСостоянияНетрудоспособного(Строка) Тогда
		Если Не ЗначениеЗаполнено(Строка.НовыйСтатусНетрудоспособного) Тогда
			Текст = НСтр("ru = 'В поле ""Иное"" не заполнен код изменения состояния нетрудоспособного.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "НовыйСтатусНетрудоспособного", Текст);
		ИначеЕсли Не ЗначениеЗаполнено(Строка.ДатаНовыйСтатусНетрудоспособного)
			И (Строка.НовыйСтатусНетрудоспособного = "32"
				Или Строка.НовыйСтатусНетрудоспособного = "33"
				Или Строка.НовыйСтатусНетрудоспособного = "34"
				Или Строка.НовыйСтатусНетрудоспособного = "36") Тогда
			Текст = НСтр("ru = 'В поле ""Иное"" не заполнена дата изменения состояния нетрудоспособного.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаНовыйСтатусНетрудоспособного", Текст);
		КонецЕсли;
	ИначеЕсли Не ЭЛНКарантинПоКоронавирусу(Строка.ПервичныйДокумент) Тогда
		ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, "ПриступитьКРаботеС");
	КонецЕсли;
	
	Если ЭтоПродолжение(Строка) Тогда
		ПроверитьНомерЛН(Отказ, ИмяТаблицы, Строка, "НомерЛисткаПродолжения");
	КонецЕсли;
	
КонецПроцедуры

Процедура ПроверитьОГРНВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, ИмяРеквизита)
	ОГРНСтроки = Строка[ИмяРеквизита];
	Если ЗначениеЗаполнено(ОГРНСтроки) Тогда
		РезультатПроверки = ПроверкиБЗК.РезультатПроверкиОГРН(ОГРНСтроки);
		Если Не РезультатПроверки.Успех Тогда
			ТекстОшибки = СтрШаблон(
				НСтр("ru = '%1: ОГРН ""%2"" содержит ошибку: %3'"),
				Метаданные().ТабличныеЧасти[ИмяТаблицы].Реквизиты[ИмяРеквизита].Представление(),
				ОГРНСтроки,
				РезультатПроверки.Пояснение);
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, ИмяРеквизита, ТекстОшибки);
		КонецЕсли;
	Иначе
		ПроверкиБЗК.ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(
			Отказ,
			ЭтотОбъект,
			ИмяТаблицы,
			Строка,
			ИмяРеквизита);
	КонецЕсли;
КонецПроцедуры

Процедура ПроверитьЗаполнениеСтрокСведенийПоУходуЗаРебенком(Отказ)
	ИмяТаблицы = "СведенияНеобходимыеДляНазначенияПособий";
	
	РеквизитыЗаявлений = РеквизитыЗаявлений();
	
	Для Каждого Строка Из СведенияНеобходимыеДляНазначенияПособий Цикл
		
		Если Не ЗначениеЗаполнено(Строка.ФамилияРебенка) Тогда
			Текст = НСтр("ru = 'Не заполнена фамилия ребенка.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ФамилияРебенка", Текст);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.ИмяРебенка) Тогда
			Текст = НСтр("ru = 'Не заполнено имя ребенка.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ИмяРебенка", Текст);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.ДатаРожденияРебенка) Тогда
			Текст = НСтр("ru = 'Не заполнена дата рождения ребенка.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаРожденияРебенка", Текст);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.ОчередностьРожденияРебенка) Тогда
			Текст = НСтр("ru = 'Не заполнена очередность рождения ребенка.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ОчередностьРожденияРебенка", Текст);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.ВидПодтверждающегоДокумента) Тогда
			Текст = НСтр("ru = 'Не заполнен вид подтверждающего документа.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ВидПодтверждающегоДокумента", Текст);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.НаименованиеПодтверждающегоДокумента) Тогда
			Текст = НСтр("ru = 'Не заполнено наименование подтверждающего документа.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "НаименованиеПодтверждающегоДокумента", Текст);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.ДатаДокумента) Тогда
			Текст = НСтр("ru = 'Не заполнена дата подтверждающего документа.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаДокумента", Текст);
		КонецЕсли;
		
		Если Строка.ВидПодтверждающегоДокумента = Перечисления.ВидыПодтверждающихДокументовОтпускаПоУходу.СвидетельствоОРождении
			И Не ЗначениеЗаполнено(Строка.СерияДокумента) Тогда
			Текст = НСтр("ru = 'Не заполнена серия подтверждающего документа.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "СерияДокумента", Текст);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Строка.НомерДокумента) Тогда
			Текст = НСтр("ru = 'Не заполнен номер подтверждающего документа.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "НомерДокумента", Текст);
		КонецЕсли;
		
		РеквизитыЗаявления = РеквизитыЗаявлений.Получить(Строка.Заявление);
		Если РеквизитыЗаявления <> Неопределено Тогда
			Если Строка.ОчередностьРожденияРебенка > 1
				И Не РеквизитыЗаявления.НаличиеОдногоИзДокументовНаПредыдущихДетей
				И Не РеквизитыЗаявления.НаличиеСвидетельстваОСмертиПредыдущихДетей Тогда
				Текст = НСтр("ru = 'Для второго и последующих детей должен быть включен один из флажков: ""Наличие документов на предыдущих детей"", ""Наличие свидетельства о его (их) смерти"".'");
				СообщенияБЗК.СообщитьОбОшибкеВОбъекте(Отказ, РеквизитыЗаявления.Ссылка, Текст, "НаличиеОдногоИзДокументовНаПредыдущихДетей");
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ПроверитьДатуПредставленияПакетаДокументов(Отказ)
	ИмяТаблицы = "СведенияНеобходимыеДляНазначенияПособий";
	
	МинимальнаяДатаПолучения = НачалоДня(Мин(Дата, ТекущаяДатаСеанса()) - 5*86400);
	
	РеквизитыЗаявлений = РеквизитыЗаявлений();
	
	Для Каждого Строка Из СведенияНеобходимыеДляНазначенияПособий Цикл
		
		Если ЗначениеЗаполнено(Строка.ДатаПредставленияПакетаДокументов) Тогда
			ДатаПолучения = Строка.ДатаПредставленияПакетаДокументов;
		Иначе
			РеквизитыЗаявления = РеквизитыЗаявлений.Получить(Строка.Заявление);
			Если ЗначениеЗаполнено(РеквизитыЗаявления.ДатаПредставленияПакетаДокументов) Тогда
				ДатаПолучения = РеквизитыЗаявления.ДатаПредставленияПакетаДокументов;
			Иначе
				ДатаПолучения = РеквизитыЗаявления.Дата;
			КонецЕсли;
		КонецЕсли;
		
		Если НачалоДня(ДатаПолучения) < МинимальнаяДатаПолучения Тогда
			Текст = НСтр("ru = 'Прошло более 5 календарных дней с даты представления застрахованным лицом заявления и документов.'");
			СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ДатаПредставленияПакетаДокументов", Текст);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Функция ПроверитьПериодНетрудоспособности(Отказ, Строка, НомерПериода, ИмяТаблицы, Представление)
	ПериодЗаполнен = ПроверкиБЗК.ПроверитьПериодВСтрокеТаблицы(
		Отказ,
		ЭтотОбъект,
		ИмяТаблицы,
		Строка,
		"ОсвобождениеДатаНачала" + НомерПериода,
		"ОсвобождениеДатаОкончания" + НомерПериода,
		Представление);
	Если Не ЗначениеЗаполнено(Строка["ОсвобождениеФИОВрача" + НомерПериода]) Тогда
		Текст = НСтр("ru = 'Не заполнено ФИО врача %1.'");
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, Представление);
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ОсвобождениеФИОВрача" + НомерПериода, Текст);
		ПериодЗаполнен = Ложь;
	КонецЕсли;
	Если Не ЗначениеЗаполнено(Строка["ОсвобождениеДолжностьВрача" + НомерПериода]) Тогда
		Текст = НСтр("ru = 'Не заполнена должность врача %1.'");
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, Представление);
		СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, "ОсвобождениеДолжностьВрача" + НомерПериода, Текст);
		ПериодЗаполнен = Ложь;
	КонецЕсли;
	
	Возврат ПериодЗаполнен;
КонецФункции

Функция ЭтоСанаторнаяПутевка(Строка)
	Возврат Строка.КодПричиныНетрудоспособности = "08"
		Или Строка.ВторойКодПричиныНетрудоспособности = "08"
		Или Строка.ДополнительныйКодПричиныНетрудоспособности = "017"
		Или Строка.ДополнительныйКодПричиныНетрудоспособности = "018"
		Или Строка.ДополнительныйКодПричиныНетрудоспособности = "019"
		Или ЗначениеЗаполнено(Строка.ДатаОкончанияПутевки);
КонецФункции

Функция ЭтоУходЗаРодственниками(Строка)
	Возврат Строка.КодПричиныНетрудоспособности = "09"
		Или Строка.КодПричиныНетрудоспособности = "12"
		Или Строка.КодПричиныНетрудоспособности = "13"
		Или Строка.КодПричиныНетрудоспособности = "14"
		Или Строка.КодПричиныНетрудоспособности = "15"
		Или Строка.ВторойКодПричиныНетрудоспособности = "09"
		Или Строка.ВторойКодПричиныНетрудоспособности = "12"
		Или Строка.ВторойКодПричиныНетрудоспособности = "13"
		Или Строка.ВторойКодПричиныНетрудоспособности = "14"
		Или Строка.ВторойКодПричиныНетрудоспособности = "15";
КонецФункции

Функция ЭтоНарушениеРежима(Строка)
	Возврат ЗначениеЗаполнено(Строка.ДатаНарушенияРежима)
		Или ЗначениеЗаполнено(Строка.КодНарушенияРежима);
КонецФункции

Функция ЭтоНахождениеВСтационареСРебенком(Строка)
	Возврат ЗначениеЗаполнено(Строка.ПериодНахожденияВСтационареСРебенкомС)
		Или ЗначениеЗаполнено(Строка.ПериодНахожденияВСтационареСРебенкомПо);
КонецФункции

Функция ЭтоПродолжение(Строка)
	Возврат Строка.НовыйСтатусНетрудоспособного = "31";
КонецФункции

Функция ЕстьОплатаЗаСчетФСС(Строка)
	Возврат ЗначениеЗаполнено(Строка.ДатаНачалаОплаты)
		Или ЗначениеЗаполнено(Строка.ДатаОкончанияОплаты);
КонецФункции

Функция ЕстьИзменениеСостоянияНетрудоспособного(Строка)
	Возврат ЗначениеЗаполнено(Строка.НовыйСтатусНетрудоспособного)
		Или ЗначениеЗаполнено(Строка.ДатаНовыйСтатусНетрудоспособного);
КонецФункции

Функция РеквизитыЗаявлений()
	РеквизитыЗаявлений = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "РеквизитыЗаявлений");
	Если РеквизитыЗаявлений <> Неопределено Тогда
		Возврат РеквизитыЗаявлений;
	КонецЕсли;
	МассивЗаявлений = СведенияНеобходимыеДляНазначенияПособий.ВыгрузитьКолонку("Заявление");
	ИменаРеквизитов = Новый Массив;
	ИменаРеквизитов.Добавить("Ссылка");
	ИменаРеквизитов.Добавить("ВидПособия");
	ИменаРеквизитов.Добавить("СпособВыплатыПособия");
	ИменаРеквизитов.Добавить("АдресПолучателяФактический");
	ИменаРеквизитов.Добавить("АдресПолучателяФактическийИдентификаторФИАС");
	ИменаРеквизитов.Добавить("АдресПолучателяФактическийКодКЛАДР");
	ИменаРеквизитов.Добавить("АдресПолучателяРегистрации");
	ИменаРеквизитов.Добавить("АдресПолучателяРегистрацииИдентификаторФИАС");
	ИменаРеквизитов.Добавить("АдресПолучателяРегистрацииКодКЛАДР");
	ИменаРеквизитов.Добавить("СтатусНалогоплательщикаПолучателя");
	ИменаРеквизитов.Добавить("ТипЗанятостиРаботника");
	ИменаРеквизитов.Добавить("ДатаНачалаТрудовогоДоговораПолучателя");
	ИменаРеквизитов.Добавить("ДатаОкончанияТрудовогоДоговораПолучателя");
	ИменаРеквизитов.Добавить("ПорядокРасчетаСреднегоЗаработка");
	ИменаРеквизитов.Добавить("Дата");
	ИменаРеквизитов.Добавить("ДатаПредставленияПакетаДокументов");
	ИменаРеквизитов.Добавить("НаличиеОдногоИзДокументовНаПредыдущихДетей");
	ИменаРеквизитов.Добавить("НаличиеСвидетельстваОСмертиПредыдущихДетей");
	УстановитьПривилегированныйРежим(Истина);
	РеквизитыЗаявлений = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивЗаявлений, ИменаРеквизитов);
	УстановитьПривилегированныйРежим(Ложь);
	ДополнительныеСвойства.Вставить("РеквизитыЗаявлений", РеквизитыЗаявлений);
	Возврат РеквизитыЗаявлений;
КонецФункции

Функция ЭЛНКарантинПоКоронавирусу(ПервичныйДокумент)
	РеквизитыБольничных = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "РеквизитыБольничных");
	Если РеквизитыБольничных = Неопределено Тогда
		МассивБольничных = СведенияНеобходимыеДляНазначенияПособий.ВыгрузитьКолонку("ПервичныйДокумент");
		ОбратныйИндекс = МассивБольничных.Количество();
		Пока ОбратныйИндекс > 0 Цикл
			ОбратныйИндекс = ОбратныйИндекс - 1;
			ПервичныйДокумент = МассивБольничных[ОбратныйИндекс];
			Если ТипЗнч(ПервичныйДокумент) <> Тип("ДокументСсылка.БольничныйЛист") Или ПервичныйДокумент.Пустая() Тогда
				МассивБольничных.Удалить(ОбратныйИндекс);
			КонецЕсли;
		КонецЦикла;
		Если МассивБольничных.Количество() > 0 Тогда
			УстановитьПривилегированныйРежим(Истина);
			РеквизитыБольничных = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивБольничных, "ЭЛНКарантинПоКоронавирусу");
			УстановитьПривилегированныйРежим(Ложь);
		Иначе
			РеквизитыБольничных = Новый Соответствие;
		КонецЕсли;
		ДополнительныеСвойства.Вставить("РеквизитыБольничных", РеквизитыБольничных);
	КонецЕсли;
	
	РеквизитыБольничного = РеквизитыБольничных[ПервичныйДокумент];
	Если РеквизитыБольничного = Неопределено Тогда
		Возврат Ложь;
	Иначе
		Возврат РеквизитыБольничного.ЭЛНКарантинПоКоронавирусу;
	КонецЕсли;
КонецФункции

Функция ДопустимыеГруппыИнвалидности()
	ДопустимыеГруппыИнвалидности = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ДопустимыеГруппыИнвалидности");
	Если ДопустимыеГруппыИнвалидности = Неопределено Тогда
		ROWSET = ПрямыеВыплатыПособийСоциальногоСтрахования.КорневойЭлементРеестраПилотногоПроектаФСС();
		ROW    = ПрямыеВыплатыПособийСоциальногоСтрахования.ЭлементРеестраПилотногоПроектаФСС(ROWSET);
		ДопустимыеГруппыИнвалидности = ПрямыеВыплатыПособийСоциальногоСтрахования.ДопустимыеЗначенияСтрокиРеестра(
			ROW,
			"MSE_INVALID_GROUP");
		ДополнительныеСвойства.Вставить("ДопустимыеГруппыИнвалидности", ДопустимыеГруппыИнвалидности);
	КонецЕсли;
	Возврат ДопустимыеГруппыИнвалидности;
КонецФункции

#КонецОбласти

#Область ВыводОшибок

Процедура ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(Отказ, ИмяТаблицы, Строка, ИмяРеквизита)
	ПроверкиБЗК.ПроверитьЗаполнениеРеквизитаСтрокиТаблицы(
		Отказ,
		ЭтотОбъект,
		ИмяТаблицы,
		Строка,
		ИмяРеквизита);
КонецПроцедуры

Процедура СообщитьОбОшибкеВСтрокеТаблицы(Отказ, ИмяТаблицы, Строка, ИмяРеквизита, Текст)
	СообщенияБЗК.СообщитьОбОшибкеВСтрокеТаблицы(
		Отказ,
		ЭтотОбъект,
		ИмяТаблицы,
		Строка,
		ИмяРеквизита,
		Текст);
КонецПроцедуры

#КонецОбласти

#Область МеханизмФиксацииИзменений

Функция ОбъектЗафиксирован() Экспорт
	Возврат Не ПрямыеВыплатыПособийСоциальногоСтрахования.СтатусПозволяетРедактироватьДокумент(СтатусДокумента);
КонецФункции

Функция ОбновитьВторичныеДанныеДокумента() Экспорт
	Модифицирован = Ложь;
	
	Если ОбъектЗафиксирован() Тогда
		Возврат Модифицирован;
	КонецЕсли;
	
	ПараметрыФиксации = Документы.РеестрСведенийНеобходимыхДляНазначенияИВыплатыПособий.ПараметрыФиксацииВторичныхДанных();
	
	Если ОбновитьДанныеОрганизации(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Если ОбновитьСведенияОПодписантах(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Если ЗаполнитьИдентификаторФСС(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Если ОбновитьСведенияОПособиях(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Если ОбновитьАвтозаполнениеПриостановленийТД(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Если ОбновитьПриостановленияТД(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Если ОбновитьКодНаличияПриостановленийТД(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Если ОбновитьСведенияОМедицинскихОрганизациях(ПараметрыФиксации) Тогда
		Модифицирован = Истина;
	КонецЕсли;
	
	Возврат Модифицирован;
КонецФункции

Функция ОбновитьДанныеОрганизации(ПараметрыФиксации)
	Если Не ЗначениеЗаполнено(Организация) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ИменаРеквизитов =
	"РегистрационныйНомерФСС,
	|КодПодчиненностиФСС,
	|ДополнительныйКодФСС,
	|ОГРН,
	|ТелефонСоставителя,
	|АдресЭлектроннойПочтыСоставителя,
	|ИНН,
	|КПП";
	Реквизиты = Новый Структура(ИменаРеквизитов);
	Если ФиксацияВторичныхДанныхВДокументах.РеквизитыШапкиЗафиксированы(ЭтотОбъект, Реквизиты) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ИменаПолей =
	"РегистрационныйНомерФСС,
	|КодПодчиненностиФСС,
	|ДополнительныйКодФСС,
	|ОГРН,
	|ТелОрганизации,
	|АдресЭлектроннойПочтыОрганизации,
	|ИННЮЛ,
	|КППЮЛ";
	СведенияОбОрганизации = СЭДОФСС.СведенияОСтрахователе(Организация, ИменаПолей, Дата);
	ЗаполнитьЗначенияСвойств(Реквизиты, СведенияОбОрганизации);
	Реквизиты.ТелефонСоставителя               = СведенияОбОрганизации.ТелОрганизации;
	Реквизиты.АдресЭлектроннойПочтыСоставителя = СведенияОбОрганизации.АдресЭлектроннойПочтыОрганизации;
	Реквизиты.ИНН                              = СведенияОбОрганизации.ИННЮЛ;
	Реквизиты.КПП                              = СведенияОбОрганизации.КППЮЛ;
	
	Возврат ФиксацияВторичныхДанныхВДокументах.ОбновитьДанныеШапки(Реквизиты, ЭтотОбъект, ПараметрыФиксации);
КонецФункции

Функция ОбновитьСведенияОПодписантах(ПараметрыФиксации)
	Если Не ЗначениеЗаполнено(Организация) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Реквизиты = Новый Структура("Руководитель, ДолжностьРуководителя, ОснованиеПодписиРуководителя,
		|ГлавныйБухгалтер, ДолжностьГлавногоБухгалтера, ОснованиеПодписиГлавногоБухгалтера");
	Если ФиксацияВторичныхДанныхВДокументах.РеквизитыШапкиЗафиксированы(ЭтотОбъект, Реквизиты) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	СведенияОПодписях = ПодписиДокументов.СведенияОПодписяхПоУмолчаниюДляОбъектаМетаданных(Метаданные(), Организация);
	ЗаполнитьЗначенияСвойств(Реквизиты, СведенияОПодписях);
	
	Возврат ФиксацияВторичныхДанныхВДокументах.ОбновитьДанныеШапки(Реквизиты, ЭтотОбъект, ПараметрыФиксации);
КонецФункции

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

Функция ОбновитьСведенияОПособиях(ПараметрыФиксации)
	Если СведенияНеобходимыеДляНазначенияПособий.Количество() = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	ТаблицаОснований = СведенияНеобходимыеДляНазначенияПособий.Выгрузить(, "Заявление, ПервичныйДокумент");
	Запрос = ПрямыеВыплатыПособийСоциальногоСтрахования.ЗапросРеестраПрямыхВыплатПоПервичнымДокументам(ЭтотОбъект, ТаблицаОснований, "ВТВторичныеДанные");
	Если Запрос = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	Запрос.Выполнить();
	Возврат ФиксацияВторичныхДанныхВДокументах.ОбновитьВторичныеДанные(Запрос.МенеджерВременныхТаблиц, ЭтотОбъект, "СведенияНеобходимыеДляНазначенияПособий", "ВТВторичныеДанные", ПараметрыФиксации);
КонецФункции

Функция ОбновитьАвтозаполнениеПриостановленийТД(ПараметрыФиксации)
	Если СведенияНеобходимыеДляНазначенияПособий.Количество() = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	ЕстьИзменения = Ложь;
	Найденные = СведенияНеобходимыеДляНазначенияПособий.НайтиСтроки(Новый Структура("АвтозаполнениеПриостановленийТД", Ложь));
	Для Каждого СтрокаТаблицы Из Найденные Цикл
		АвтозаполнениеПриостановленийТД = ТипЗнч(СтрокаТаблицы.ПервичныйДокумент) = Тип("ДокументСсылка.БольничныйЛист")
			И ЗначениеЗаполнено(СтрокаТаблицы.ПервичныйДокумент);
		Если ФиксацияВторичныхДанныхВДокументах.ОбновитьДанныеСтроки(
				Новый Структура("АвтозаполнениеПриостановленийТД", АвтозаполнениеПриостановленийТД),
				ЭтотОбъект,
				"СведенияНеобходимыеДляНазначенияПособий",
				СтрокаТаблицы,
				ПараметрыФиксации) Тогда
			ЕстьИзменения = Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат ЕстьИзменения;
КонецФункции

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

Функция ОбновитьКодНаличияПриостановленийТД(ПараметрыФиксации)
	Если СведенияНеобходимыеДляНазначенияПособий.Количество() = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	ЕстьИзменения = Ложь;
	Для Каждого СтрокаТаблицы Из СведенияНеобходимыеДляНазначенияПособий Цикл
		Если ПриостановленияТрудовыхДоговоров.Найти(СтрокаТаблицы.Заявление, "Заявление") <> Неопределено Тогда
			КодНаличияПриостановленийТД = "1";
		Иначе
			КодНаличияПриостановленийТД = "0";
		КонецЕсли;
		Если ФиксацияВторичныхДанныхВДокументах.ОбновитьДанныеСтроки(
				Новый Структура("КодНаличияПриостановленийТД", КодНаличияПриостановленийТД),
				ЭтотОбъект,
				"СведенияНеобходимыеДляНазначенияПособий",
				СтрокаТаблицы,
				ПараметрыФиксации) Тогда
			ЕстьИзменения = Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат ЕстьИзменения;
КонецФункции

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

#КонецОбласти

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

Связанные материалы