Форма П-4 "Сведения о численности, заработной плате и движении работников" / Форма П-4 / Модуль формы

файл
&НаСервере
Перем мОбъектОтчета;


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;

	// Обход ошибки платформы Параметр сеанса отсутствует или удален
	ПолеТабличногоДокументаФормаОтчета.Очистить();
	
	СформироватьСтруктуруРеквизитовФормы();
	
	СтруктураРеквизитовФормы.СписокПечатаемыхЛистов = Новый СписокЗначений;

	// ОПИСАНИЕ ПАРМЕТРОВ ФОРМЫ
	//
	// Версия формы
	СтруктураРеквизитовФормы.мВерсияФормы = "20/12/2010";
	// Код отчета, равен коду по ОКУД
	СтруктураРеквизитовФормы.мКодОтчета   = "0606010";
		
	СтруктураРеквизитовФормы.мПечатныеФормы = Новый СписокЗначений;
	
	ПолеТабличногоДокументаФормаОтчета.Вывести(ОбъектОтчета(ЭтаФорма.ИмяФормы).ПолучитьМакет("ФормаОтчета2011Кв1_ФормаОтчета"));
	
	СтруктураРеквизитовФормы.мВыбраннаяФорма          = Параметры.мВыбраннаяФорма;
	СтруктураРеквизитовФормы.мДатаКонцаПериодаОтчета  = Параметры.мДатаКонцаПериодаОтчета;
	СтруктураРеквизитовФормы.мДатаНачалаПериодаОтчета = Параметры.мДатаНачалаПериодаОтчета;
	СтруктураРеквизитовФормы.мПериодичность           = Параметры.мПериодичность;
	СтруктураРеквизитовФормы.мСкопированаФорма        = Параметры.мСкопированаФорма;
	СтруктураРеквизитовФормы.мСохраненныйДок          = Параметры.мСохраненныйДок;
	СтруктураРеквизитовФормы.Организация      		  = Параметры.Организация;
	
	ДатаПодписи	= ТекущаяДатаСеанса();
	
	СтруктураРеквизитовФормы.СправочникиВидыКонтактнойИнформацииПочтовыйАдресОрганизации = Справочники.ВидыКонтактнойИнформации.ПочтовыйАдресОрганизации;
	
	Инициализация(Параметры.БезОткрытияФормы);
		
КонецПроцедуры

&НаСервере
Процедура СформироватьСтруктуруРеквизитовФормы()
	
	СтруктураРеквизитовФормы = РегламентированнаяОтчетность.СформироватьСтруктуруОбязательныхРеквизитовСтатистическогоОтчета();
	
КонецПроцедуры

&НаСервере
Процедура Инициализация(БезОткрытияФормы = Ложь) Экспорт
	
	СтруктураРеквизитовФормы.мБезОткрытияФормы = БезОткрытияФормы;
	
	СтруктураРеквизитовФормы.мВПрограммеИзмененаОрганизация = Ложь;

	ТекТабличноеПоле = ПолеТабличногоДокументаФормаОтчета;

	СтруктураРеквизитовФормы.ВидДокумента = 0;
	НомерКорректировки = 1;
	ФормироватьСтруктуруСвойствСтраниц();
	СтруктураРеквизитовФормы.мАдресвФорматеДляВыгрузки = "";

	Если СтруктураРеквизитовФормы.мСохраненныйДок = Неопределено Тогда

		Если СтруктураРеквизитовФормы.мСкопированаФорма <> Неопределено Тогда
			// документ скопирован
			ВосстановитьСохраненныеДанные();
		КонецЕсли;
		
		Модифицированность = Истина;

	Иначе

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

	КонецЕсли;

	Если СтруктураРеквизитовФормы.мСохраненныйДок = Неопределено Тогда
		НомерКорректировки = 0;
	Иначе
		НомерКорректировки = СтруктураРеквизитовФормы.мСохраненныйДок.Вид;
	КонецЕсли;
	
	ПолеТабличногоДокументаФормаОтчета.Области.НомерКорректировки.Значение = НомерКорректировки;
	ПолеТабличногоДокументаФормаОтчета.Области.ДатаСоставленияОтчета.Значение = ДатаПодписи;

	ПоказатьПериод();

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

// Формирует дерево значений - структуру страниц отчета,
// содержащей настройки показа страниц, вывода на печать и выгрузки в ИФНС.
//
&НаСервере
Процедура ФормироватьСтруктуруСвойствСтраниц() Экспорт

	// 0 - нет
	// 1 - есть одна многострочная часть
	// 2 - и более, точное кол-во число многострочных частей на листе
	// Позволяет записывать многострочность в многостраничных документ либо как ТаблицуЗначений, либо как Структуру
	// В случае, если как Структура, то необходима еще одна процедура СформироватьСтруктуруДанныхДопСтрокСтраницы
	// Только для Многостраничных документов !
	// 3. Будет ли очищаться раздел по кнопки "Очистить"
	// 4. Если раздел многостраничный, параметр МногостраничностьВРазделе = Истина, тогда имя поля, по которому
	// будет осуществляться Представление доп. страницы
	// 5. Есть ли в разделе значения, отображаемые в квадратном представлении
	// 6. Обязательный раздел для выгрузки или нет
	// 7. Обязательный раздел для выгрузки или нет

	мСвойстваРазделовДекларации.ПолучитьЭлементы().Очистить();

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

КонецПроцедуры // ФормироватьСтруктуруСтраницОтчета()

// Восстанавливает сохраненные данные отчета.
//
&НаСервере
Процедура ВосстановитьСохраненныеДанные()
	
	Перем ДанныеМногострочныхРазделов;
	Перем ДанныеВариановАвтоЗаполнения;
	Перем ПоказателиОтчета;
	Перем ВерсияФормы;

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

	ДатаПодписи            		   = СтруктураРеквизитовФормы.мСохраненныйДок.ДатаПодписи;
	СтруктураРеквизитовФормы.ЕдиницаИзмерения         = СтруктураРеквизитовФормы.мСохраненныйДок.ЕдиницаИзмерения;
	СтруктураРеквизитовФормы.ТочностьЕдиницыИзмерения = СтруктураРеквизитовФормы.мСохраненныйДок.ТочностьЕдиницыИзмерения;
	Комментарий                    = СтруктураРеквизитовФормы.мСохраненныйДок.Комментарий;

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

	// восстанавливаем версию формы
	СписокСохранения.Свойство("ВерсияФормы", ВерсияФормы);

	// восстановим сохраненные данные редактируемых ячеек
	СписокСохранения.Свойство( "ПоказателиОтчета", ПоказателиОтчета );

	Для Каждого ПоказателиСтраницы Из ПоказателиОтчета Цикл
		ИмяТекТабличноеПоле = ПоказателиСтраницы.Ключ;
		ТекТабличноеПоле    = ЭтаФорма[ИмяТекТабличноеПоле];
		ПоказателиТаблПоле  = ПоказателиСтраницы.Значение;

		Для Каждого Показатель Из ПоказателиТаблПоле Цикл
			ИмяПоказателя       = Показатель.Ключ;
			ЗначениеПоказателя  = Показатель.Значение;

			// установим значение в таблице
			Попытка
				ТекТабличноеПоле.Области[ИмяПоказателя].Значение = ЗначениеПоказателя;
			Исключение
			КонецПопытки;
		КонецЦикла;
	КонецЦикла;

	СтруктураРеквизитовФормы.мАдресвФорматеДляВыгрузки = ПолеТабличногоДокументаФормаОтчета.Области.ОргАдрес.Значение;
	ПолеТабличногоДокументаФормаОтчета.Области.ОргАдрес.Значение = РегламентированнаяОтчетностьКлиентСервер.ПредставлениеАдресаВФормате9Запятых(СтруктураРеквизитовФормы.мАдресвФорматеДляВыгрузки);

	РегламентированнаяОтчетность.ОперацииПриВосстановленииРегламентированногоОтчета(ЭтаФорма);

	Модифицированность   = Ложь;

КонецПроцедуры // ВосстановитьСохраненныеДанные()

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

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

// Процедура управляет показом в форме периода построения отчета,
//
&НаСервере
Процедура ПоказатьПериод()

	// Период для показа в шапке отчета   	
	СтруктураРеквизитовФормы.СтрПериодОтчета = ПредставлениеПериода(НачалоДня(СтруктураРеквизитовФормы.мДатаНачалаПериодаОтчета), КонецДня(СтруктураРеквизитовФормы.мДатаКонцаПериодаОтчета), "ФП = Истина");
	
	// Период в заголовке отчета
	ПериодОтчета = " за " + СтруктураРеквизитовФормы.СтрПериодОтчета;
	ПолеТабличногоДокументаФормаОтчета.Области.ПериодОтчета.Значение = ПериодОтчета;
    	
КонецПроцедуры // ПоказатьПериод()

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если СтрНайти(Заголовок, СтруктураРеквизитовФормы.СтрПериодОтчета) = 0 Тогда
		Заголовок = Заголовок + " за " + СтруктураРеквизитовФормы.СтрПериодОтчета;
	КонецЕсли;
	
	ОргСтр = " (" + СтруктураРеквизитовФормы.НаимОрганизации + ")";
	Если СтрНайти(Заголовок, ОргСтр) = 0 Тогда
		Заголовок = Заголовок + ОргСтр;
	КонецЕсли;
	

	Заголовок = Заголовок + ?(СтрНайти(ЭтаФорма.ИмяФормы, "Внешний") > 0, " - внешний отчет", "");

	ПодключитьОбработчикОжидания("ВыполнитьПроверкуПередОткрытием", 0.1, Истина);

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

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

&НаКлиенте
Процедура ПриОткрытииЗавершение(Отказ, ДополнительныеПараметры) Экспорт
	
	Если Отказ Тогда
		Модифицированность = Ложь;
		Закрыть();
		Возврат;
	КонецЕсли;

КонецПроцедуры
 
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	РегламентированнаяОтчетностьКлиент.ПередЗакрытиемРегламентированногоОтчета(ЭтаФорма, Отказ, СтандартнаяОбработка, ЗавершениеРаботы, ТекстПредупреждения);
			
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если ЗавершениеРаботы Тогда
				
		Возврат;
		
	КонецЕсли;
	
	ПриЗакрытииНаСервере();
		
КонецПроцедуры

&НаСервере
Процедура ПриЗакрытииНаСервере()
    
	РегламентированнаяОтчетность.ПриЗакрытииРегламентированногоОтчета(ЭтаФорма);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ЗаполнитьДатуВЯчейкахНаСервере() Экспорт
    	
	ЗаполнитьДатуВЯчейках(ЭтаФорма);
		
КонецПроцедуры // ЗаполнитьДатуВЯчейкахНаСервере()

&НаКлиенте
Процедура ЗаполнитьДатуВЯчейкахНаКлиенте() Экспорт
    	
	ЗаполнитьДатуВЯчейках(ЭтаФорма);
	
КонецПроцедуры // ЗаполнитьДатуВЯчейкахНаКлиенте()

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьДатуВЯчейках(Форма)
	
	// Процедура "заглушка", для роОчистить.
	Возврат;
              		
КонецПроцедуры // ЗаполнитьДатуВЯчейках()

&НаКлиенте
Процедура Обновить(Команда)
	
	СтруктураРеквизитовФормы.мВПрограммеИзмененаОрганизация = Истина;
	ЗаполнитьСведенияОбОрганизацииНаКлиенте();
	СтруктураРеквизитовФормы.мВПрограммеИзмененаОрганизация = Ложь;
	Модифицированность = Истина;
	
КонецПроцедуры // Обновить()

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

&НаКлиенте
Процедура ОчиститьОтчетЗавершение(Ответ, ДополнительныеПараметры) Экспорт
    
    Если Ответ = КодВозвратаДиалога.Нет Тогда        
        Возврат;       
    Иначе       
        Очистить();     
    КонецЕсли;

КонецПроцедуры // ОчиститьОтчет()

// Процедура очищает содержимое редактируемых и вычисляемых
// ячеек табличного документа.
//
&НаКлиенте
Процедура Очистить() Экспорт
		
	ОчиститьТабличноеПолеНаСервере();

	// устанавливаем флаг модифицированности формы
	Модифицированность = Истина;

КонецПроцедуры // Очистить()

&НаСервере
Процедура ОчиститьТабличноеПолеНаСервере()
	
	ОчиститьТабличноеПоле(ЭтаФорма);
	РасчетНаСервере();
	
КонецПроцедуры // ОчиститьТабличноеПолеНаСервере()

// Процедура очищает содержимое редактируемыхи и вычисляемых ячеек
// поля табличного документа, переданного параметром ВыбТабличноеПоле.
//
// Параметры:
//  ВыбТабличноеПоле - поле табличного документа.
//
&НаКлиентеНаСервереБезКонтекста
Процедура ОчиститьТабличноеПоле(Форма)
	
	// Список ячеек, очищать которые не нужно
	Перем СписокПоказателейНеПодлежащихОчистке;
	
	ВыбТабличноеПоле = Форма.ПолеТабличногоДокументаФормаОтчета;
	
	СписокПоказателейНеПодлежащихОчистке = Новый СписокЗначений;
	СписокПоказателейНеПодлежащихОчистке.Добавить("ОргКодОКПО");
	СписокПоказателейНеПодлежащихОчистке.Добавить("ОргНазв");
	СписокПоказателейНеПодлежащихОчистке.Добавить("ОргАдрес");

	СписокПоказателейНеПодлежащихОчистке.Добавить("КодЗнач1");
	СписокПоказателейНеПодлежащихОчистке.Добавить("КодЗнач2");
	СписокПоказателейНеПодлежащихОчистке.Добавить("КодЗнач3");
	СписокПоказателейНеПодлежащихОчистке.Добавить("КодЗнач4");

	СписокПоказателейНеПодлежащихОчистке.Добавить("ОргИсполнитель");
	СписокПоказателейНеПодлежащихОчистке.Добавить("ОргДолжностьИсп");
	СписокПоказателейНеПодлежащихОчистке.Добавить("ОргТелефонИсп");	
	СписокПоказателейНеПодлежащихОчистке.Добавить("ДатаСоставленияОтчета");
	СписокПоказателейНеПодлежащихОчистке.Добавить("НомерКорректировки");

	Для Инд = 0 По ВыбТабличноеПоле.Области.Количество() - 1 Цикл
		ТекущаяОбласть = ВыбТабличноеПоле.Области[Инд];
		
		// Ячейки не подлежащие очистки
		Если СписокПоказателейНеПодлежащихОчистке.НайтиПоЗначению(ТекущаяОбласть.Имя) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Если Не ТекущаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник Тогда
			Продолжить;
		КонецЕсли;

		Если Не ТекущаяОбласть.СодержитЗначение Тогда
			Продолжить;
		КонецЕсли;

		Если ТекущаяОбласть.Защита Тогда
			Продолжить;
		КонецЕсли;

		ТекущаяОбласть.Очистить();
	КонецЦикла;

КонецПроцедуры // ОчиститьТабличноеПоле()

// РасчетНаКлиенте()
//
&НаКлиенте
Процедура РасчетНаКлиенте(ИмяСтраницыПанели = "") Экспорт

	Расчет(ЭтаФорма, ИмяСтраницыПанели);

КонецПроцедуры // РасчетНаКлиенте()

// РасчетНаСервере()
//
&НаСервере
Процедура РасчетНаСервере(ИмяСтраницыПанели = "") Экспорт

	Расчет(ЭтаФорма, ИмяСтраницыПанели);

КонецПроцедуры // РасчетНаСервере()

// Выполняет расчет вычисляемых показателей отчета
// (ячеек, выделенных зеленым цветом).
//
&НаКлиентеНаСервереБезКонтекста
Процедура Расчет(Форма, ИмяСтраницыПанели = "") Экспорт
	
	мФормаОтчета = Форма.ПолеТабличногоДокументаФормаОтчета;
	
	мФормаОтчета.Области.П010000102.Значение = мФормаОтчета.Области.П010000202.Значение + мФормаОтчета.Области.П010000302.Значение + мФормаОтчета.Области.П010000402.Значение + мФормаОтчета.Области.П010000502.Значение + мФормаОтчета.Области.П010000602.Значение
	                                         + мФормаОтчета.Области.П010000702.Значение + мФормаОтчета.Области.П010000802.Значение + мФормаОтчета.Области.П010000902.Значение + мФормаОтчета.Области.П010001002.Значение + мФормаОтчета.Области.П010001102.Значение;
	мФормаОтчета.Области.П010000103.Значение = мФормаОтчета.Области.П010000203.Значение + мФормаОтчета.Области.П010000303.Значение + мФормаОтчета.Области.П010000403.Значение + мФормаОтчета.Области.П010000503.Значение + мФормаОтчета.Области.П010000603.Значение
	                                         + мФормаОтчета.Области.П010000703.Значение + мФормаОтчета.Области.П010000803.Значение + мФормаОтчета.Области.П010000903.Значение + мФормаОтчета.Области.П010001003.Значение + мФормаОтчета.Области.П010001103.Значение;
	мФормаОтчета.Области.П010000104.Значение = мФормаОтчета.Области.П010000204.Значение + мФормаОтчета.Области.П010000304.Значение + мФормаОтчета.Области.П010000404.Значение + мФормаОтчета.Области.П010000504.Значение + мФормаОтчета.Области.П010000604.Значение
	                                         + мФормаОтчета.Области.П010000704.Значение + мФормаОтчета.Области.П010000804.Значение + мФормаОтчета.Области.П010000904.Значение + мФормаОтчета.Области.П010001004.Значение + мФормаОтчета.Области.П010001104.Значение;

	мФормаОтчета.Области.П010000101.Значение = мФормаОтчета.Области.П010000102.Значение + мФормаОтчета.Области.П010000103.Значение + мФормаОтчета.Области.П010000104.Значение;
	мФормаОтчета.Области.П010000201.Значение = мФормаОтчета.Области.П010000202.Значение + мФормаОтчета.Области.П010000203.Значение + мФормаОтчета.Области.П010000204.Значение;
	мФормаОтчета.Области.П010000301.Значение = мФормаОтчета.Области.П010000302.Значение + мФормаОтчета.Области.П010000303.Значение + мФормаОтчета.Области.П010000304.Значение;
	мФормаОтчета.Области.П010000401.Значение = мФормаОтчета.Области.П010000402.Значение + мФормаОтчета.Области.П010000403.Значение + мФормаОтчета.Области.П010000404.Значение;
	мФормаОтчета.Области.П010000501.Значение = мФормаОтчета.Области.П010000502.Значение + мФормаОтчета.Области.П010000503.Значение + мФормаОтчета.Области.П010000504.Значение;
	мФормаОтчета.Области.П010000601.Значение = мФормаОтчета.Области.П010000602.Значение + мФормаОтчета.Области.П010000603.Значение + мФормаОтчета.Области.П010000604.Значение;
	мФормаОтчета.Области.П010000701.Значение = мФормаОтчета.Области.П010000702.Значение + мФормаОтчета.Области.П010000703.Значение + мФормаОтчета.Области.П010000704.Значение;
	мФормаОтчета.Области.П010000801.Значение = мФормаОтчета.Области.П010000802.Значение + мФормаОтчета.Области.П010000803.Значение + мФормаОтчета.Области.П010000804.Значение;
	мФормаОтчета.Области.П010000901.Значение = мФормаОтчета.Области.П010000902.Значение + мФормаОтчета.Области.П010000903.Значение + мФормаОтчета.Области.П010000904.Значение;
	мФормаОтчета.Области.П010001001.Значение = мФормаОтчета.Области.П010001002.Значение + мФормаОтчета.Области.П010001003.Значение + мФормаОтчета.Области.П010001004.Значение;
	мФормаОтчета.Области.П010001101.Значение = мФормаОтчета.Области.П010001102.Значение + мФормаОтчета.Области.П010001103.Значение + мФормаОтчета.Области.П010001104.Значение;

	// Раздел 1 продолжение, расчет графы 5 и 6.
	мФормаОтчета.Области.П010000105.Значение = мФормаОтчета.Области.П010000205.Значение
	                                         + мФормаОтчета.Области.П010000305.Значение
	                                         + мФормаОтчета.Области.П010000405.Значение
	                                         + мФормаОтчета.Области.П010000505.Значение
	                                         + мФормаОтчета.Области.П010000605.Значение
	                                         + мФормаОтчета.Области.П010000705.Значение
	                                         + мФормаОтчета.Области.П010000805.Значение
	                                         + мФормаОтчета.Области.П010000905.Значение
	                                         + мФормаОтчета.Области.П010001005.Значение
	                                         + мФормаОтчета.Области.П010001105.Значение;

	мФормаОтчета.Области.П010000106.Значение = мФормаОтчета.Области.П010000206.Значение
	                                         + мФормаОтчета.Области.П010000306.Значение
	                                         + мФормаОтчета.Области.П010000406.Значение
	                                         + мФормаОтчета.Области.П010000506.Значение
	                                         + мФормаОтчета.Области.П010000606.Значение
	                                         + мФормаОтчета.Области.П010000706.Значение
	                                         + мФормаОтчета.Области.П010000806.Значение
	                                         + мФормаОтчета.Области.П010000906.Значение
	                                         + мФормаОтчета.Области.П010001006.Значение
	                                         + мФормаОтчета.Области.П010001106.Значение;

	мФормаОтчета.Области.П010000107.Значение = мФормаОтчета.Области.П010000207.Значение
	                                         + мФормаОтчета.Области.П010000307.Значение
	                                         + мФормаОтчета.Области.П010000407.Значение
	                                         + мФормаОтчета.Области.П010000507.Значение
	                                         + мФормаОтчета.Области.П010000607.Значение
	                                         + мФормаОтчета.Области.П010000707.Значение
	                                         + мФормаОтчета.Области.П010000807.Значение
	                                         + мФормаОтчета.Области.П010000907.Значение
	                                         + мФормаОтчета.Области.П010001007.Значение
	                                         + мФормаОтчета.Области.П010001107.Значение;

	мФормаОтчета.Области.П010000108.Значение = мФормаОтчета.Области.П010000208.Значение
	                                         + мФормаОтчета.Области.П010000308.Значение
	                                         + мФормаОтчета.Области.П010000408.Значение
	                                         + мФормаОтчета.Области.П010000508.Значение
	                                         + мФормаОтчета.Области.П010000608.Значение
	                                         + мФормаОтчета.Области.П010000708.Значение
	                                         + мФормаОтчета.Области.П010000808.Значение
	                                         + мФормаОтчета.Области.П010000908.Значение
	                                         + мФормаОтчета.Области.П010001008.Значение
	                                         + мФормаОтчета.Области.П010001108.Значение;

	мФормаОтчета.Области.П010000109.Значение = мФормаОтчета.Области.П010000209.Значение
	                                         + мФормаОтчета.Области.П010000309.Значение
	                                         + мФормаОтчета.Области.П010000409.Значение
	                                         + мФормаОтчета.Области.П010000509.Значение
	                                         + мФормаОтчета.Области.П010000609.Значение
	                                         + мФормаОтчета.Области.П010000709.Значение
	                                         + мФормаОтчета.Области.П010000809.Значение
	                                         + мФормаОтчета.Области.П010000909.Значение
	                                         + мФормаОтчета.Области.П010001009.Значение
	                                         + мФормаОтчета.Области.П010001109.Значение;

	мФормаОтчета.Области.П010000110.Значение = мФормаОтчета.Области.П010000210.Значение
	                                         + мФормаОтчета.Области.П010000310.Значение
	                                         + мФормаОтчета.Области.П010000410.Значение
	                                         + мФормаОтчета.Области.П010000510.Значение
	                                         + мФормаОтчета.Области.П010000610.Значение
	                                         + мФормаОтчета.Области.П010000710.Значение
	                                         + мФормаОтчета.Области.П010000810.Значение
	                                         + мФормаОтчета.Области.П010000910.Значение
	                                         + мФормаОтчета.Области.П010001010.Значение
	                                         + мФормаОтчета.Области.П010001110.Значение;

	мФормаОтчета.Области.П010000111.Значение = мФормаОтчета.Области.П010000211.Значение
	                                         + мФормаОтчета.Области.П010000311.Значение
	                                         + мФормаОтчета.Области.П010000411.Значение
	                                         + мФормаОтчета.Области.П010000511.Значение
	                                         + мФормаОтчета.Области.П010000611.Значение
	                                         + мФормаОтчета.Области.П010000711.Значение
	                                         + мФормаОтчета.Области.П010000811.Значение
	                                         + мФормаОтчета.Области.П010000911.Значение
	                                         + мФормаОтчета.Области.П010001011.Значение
	                                         + мФормаОтчета.Области.П010001111.Значение;

	мФормаОтчета.Области.П010000107.Значение = мФормаОтчета.Области.П010000108.Значение + мФормаОтчета.Области.П010000109.Значение + мФормаОтчета.Области.П010000110.Значение;
	мФормаОтчета.Области.П010000207.Значение = мФормаОтчета.Области.П010000208.Значение + мФормаОтчета.Области.П010000209.Значение + мФормаОтчета.Области.П010000210.Значение;
	мФормаОтчета.Области.П010000307.Значение = мФормаОтчета.Области.П010000308.Значение + мФормаОтчета.Области.П010000309.Значение + мФормаОтчета.Области.П010000310.Значение;
	мФормаОтчета.Области.П010000407.Значение = мФормаОтчета.Области.П010000408.Значение + мФормаОтчета.Области.П010000409.Значение + мФормаОтчета.Области.П010000410.Значение;
	мФормаОтчета.Области.П010000507.Значение = мФормаОтчета.Области.П010000508.Значение + мФормаОтчета.Области.П010000509.Значение + мФормаОтчета.Области.П010000510.Значение;
	мФормаОтчета.Области.П010000607.Значение = мФормаОтчета.Области.П010000608.Значение + мФормаОтчета.Области.П010000609.Значение + мФормаОтчета.Области.П010000610.Значение;
	мФормаОтчета.Области.П010000707.Значение = мФормаОтчета.Области.П010000708.Значение + мФормаОтчета.Области.П010000709.Значение + мФормаОтчета.Области.П010000710.Значение;
	мФормаОтчета.Области.П010000807.Значение = мФормаОтчета.Области.П010000808.Значение + мФормаОтчета.Области.П010000809.Значение + мФормаОтчета.Области.П010000810.Значение;
	мФормаОтчета.Области.П010000907.Значение = мФормаОтчета.Области.П010000908.Значение + мФормаОтчета.Области.П010000909.Значение + мФормаОтчета.Области.П010000910.Значение;
	мФормаОтчета.Области.П010001007.Значение = мФормаОтчета.Области.П010001008.Значение + мФормаОтчета.Области.П010001009.Значение + мФормаОтчета.Области.П010001010.Значение;
	мФормаОтчета.Области.П010001107.Значение = мФормаОтчета.Области.П010001108.Значение + мФормаОтчета.Области.П010001109.Значение + мФормаОтчета.Области.П010001110.Значение;
											 
КонецПроцедуры // Расчет()

&НаКлиенте
Процедура СохранитьОтчет(Команда)
	
	СохранитьНаКлиенте();
	
КонецПроцедуры // СохранитьОтчет()

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

&НаКлиенте
Процедура СохранитьНаКлиентеСВопросом(Автосохранение, Вариант, ВыполняемоеОповещение, ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки, ПодобныйОтчетСуществует, ПоказателиОтчета)
	
	Если ПодобныйОтчетСуществует Тогда
		
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(КодВозвратаДиалога.Да, "Сохранить");
		Кнопки.Добавить(КодВозвратаДиалога.Нет, "Отмена");
		
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Отчет с видом %1 уже существует.
		|Сохранить отчет с таким же видом?'"), ?(Вариант = 0, """Первичный""", """Корректирующий/" + Вариант + """"));
		ДополнительныеПараметры = Новый Структура("Автосохранение, Вариант, ВыполняемоеОповещение, ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки, ПоказателиОтчета", Автосохранение, Вариант, ВыполняемоеОповещение, ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки, ПоказателиОтчета);
		ОписаниеОповещения = Новый ОписаниеОповещения("ВопросСохранитьОтчетСТакимЖеВидомЗавершение", ЭтотОбъект, ДополнительныеПараметры);
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , Кнопки.Получить(1).Значение);
		
	Иначе
		
		СохранитьНаКлиентеСВопросомПродолжение(Автосохранение, Вариант, ВыполняемоеОповещение, ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки, ПоказателиОтчета);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВопросСохранитьОтчетСТакимЖеВидомЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Автосохранение = ДополнительныеПараметры.Автосохранение;
	Вариант = ДополнительныеПараметры.Вариант;
	ВыполняемоеОповещение = ДополнительныеПараметры.ВыполняемоеОповещение;
	ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки = ДополнительныеПараметры.ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки;
	ПоказателиОтчета = ДополнительныеПараметры.ПоказателиОтчета;
	
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		
		Возврат;
		
	КонецЕсли;
	
	СохранитьНаКлиентеСВопросомПродолжение(Автосохранение, Вариант, ВыполняемоеОповещение, ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки, ПоказателиОтчета);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПослеСохраненияНаКлиенте(ВыполняемоеОповещение, РезультатСохранения)
	
	КлючУникальности = СтруктураРеквизитовФормы.мСохраненныйДок;
	
	Если РезультатСохранения Тогда
		
		РегламентированнаяОтчетностьКлиент.ПослеЗаписиРегламентированногоОтчета(ЭтаФорма);
		
		Если ВыполняемоеОповещение <> Неопределено Тогда
			ВыполнитьОбработкуОповещения(ВыполняемоеОповещение);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры
// СохранитьНаКлиенте

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

	КонецЕсли;
	
	Если ПодобныйОтчетСуществует
	 ИЛИ ОткрытьФормуВопросаПриИзмененииВидаДокументаНомераКорректировки Тогда
	 
	 	Возврат Ложь;
		
 	КонецЕсли;
		
	Возврат Сохранить(Автосохранение, КодИФНС, Вариант, , ПоказателиОтчета);
		
КонецФункции // ПередСохранением()

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

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

	// формируем список сохранения
	СписокСохранения = Новый Структура();
	
	// вставляем данные редактируемых ячеек таблицы	
	СписокСохранения.Вставить("ПоказателиОтчета", ПоказателиОтчета);

	// вставляем данные многострочных разделов
	СписокСохранения.Вставить("ДанныеМногострочныхРазделов", Неопределено);

	// вставляем данные вариантов автозаполнения ячеек
	СписокСохранения.Вставить("ДанныеВариантовАвтоЗаполнения", Неопределено);

	// вствляем версию формы
	СписокСохранения.Вставить("ВерсияФормы", СтруктураРеквизитовФормы.мВерсияФормы);

	ХранилищеДанных = Новый ХранилищеЗначения(СписокСохранения);
	СтруктураРеквизитовФормы.мСохраненныйДок.ДанныеОтчета = ХранилищеДанных;

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

			Сообщение.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1'"), РегламентированнаяОтчетностьКлиентСервер.СформироватьТекстСообщения(ОписаниеОшибки()));

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

    КонецЕсли;
	
	Если ДанныеДляРазблокирования <> Неопределено Тогда
		РазблокироватьДанныеДляРедактирования(ДанныеДляРазблокирования.Ключ, ДанныеДляРазблокирования.ИдФормы);
	КонецЕсли;
	
	Возврат Истина;

КонецФункции // Сохранить()

&НаСервере
Процедура ЗаполнитьПоказателиОтчетаНаСервере(ПоказателиОтчета)
	
	РегламентированнаяОтчетностьКлиентСервер.ЗаполнитьПоказателиОтчета(ЭтаФорма, ПоказателиОтчета);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПоказателиОтчетаНаКлиенте(ПоказателиОтчета)
	
	РегламентированнаяОтчетностьКлиентСервер.ЗаполнитьПоказателиОтчета(ЭтаФорма, ПоказателиОтчета);
	
КонецПроцедуры

&НаКлиенте
Функция СобратьДанныеТекущегоТаблПоляНаКлиенте(ИмяТабличногоПоля) Экспорт
	
	Возврат РегламентированнаяОтчетностьКлиентСервер.СобратьДанныеТекущегоТаблПоля(ЭтаФорма, ИмяТабличногоПоля);
	
КонецФункции // СобратьДанныеТекущегоТаблПоляНаКлиенте()

&НаСервере
Функция СобратьДанныеТекущегоТаблПоляНаСервере(ИмяТабличногоПоля) Экспорт
	
	Возврат РегламентированнаяОтчетностьКлиентСервер.СобратьДанныеТекущегоТаблПоля(ЭтаФорма, ИмяТабличногоПоля);

КонецФункции // СобратьДанныеТекущегоТаблПоляНаСервере()

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

&НаКлиенте
Процедура ПоказатьБланкЗавершение(Отказ, ДополнительныеПараметры) Экспорт
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;

	Команда = ДополнительныеПараметры.Команда;
		
	Если Команда <> Неопределено Тогда
		Печать(Команда.Имя);
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервере
Функция ПечатьНаСервере(ВидПечати)
	
	Если НЕ РегламентированнаяОтчетность.ПринтерДоступен() Тогда
		
		Сообщение = Новый СообщениеПользователю;

		Сообщение.Текст = НСтр("ru='Перед формированием печатных форм необходимо определить в системе принтер и задать его в качестве используемого по умолчанию!'");

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

&НаКлиенте
Процедура  ЗаписатьИЗакрыть(Команда)
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Форма", ЭтаФорма);
	Оповещение = Новый ОписаниеОповещения("ПослеСохраненияФормыЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	СохранитьНаКлиенте(, Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеСохраненияФормыЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ДополнительныеПараметры.Форма.Закрыть();
КонецПроцедуры

&НаСервере
Процедура РазрешитьРедактированиеРеквизитовОбъекта() Экспорт
	
	РегламентированнаяОтчетность.РазрешитьРедактированиеРеквизитовОтчета(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда)
	
	РегламентированнаяОтчетностьКлиент.РазрешитьРедактированиеРеквизитовОтчета(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОткрытьПрисоединенныеФайлы(Команда)
	
	РегламентированнаяОтчетностьКлиент.СохранитьОтчетИОткрытьФормуПрисоединенныеФайлы(ЭтаФорма);
	
КонецПроцедуры

&НаКлиенте
Процедура КомментарийПриИзменении(Элемент)
	Модифицированность = Истина;
КонецПроцедуры

&НаСервере
Функция ОбъектОтчета(ЭтаФормаИмя) Экспорт
	Если мОбъектОтчета = Неопределено Тогда
		мОбъектОтчета = РегламентированнаяОтчетностьВызовСервера.ОбъектОтчета(ЭтаФормаИмя);
	КонецЕсли;
	Возврат мОбъектОтчета;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИмяОтчета(ЭтаФормаИмя)
	Форма_Имя = СтрЗаменить(ЭтаФормаИмя, "Внешний", "");
	Возврат Сред(Лев(Форма_Имя, СтрНайти(Форма_Имя, ".Форма.") - 1), 7);
КонецФункции

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

#Область ОбработчикиСобытийПроцессыОбработкиДокументов

&НаКлиенте
Процедура Подключаемый_ВыполнитьЗадачуПоОбработкеДокументаОповещение(Контекст, ДополнительныеПараметры) Экспорт
	
	ВыполнитьЗадачуПоОбработкеДокументаНаСервере(Контекст);
		
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры, Контекст);
	
КонецПроцедуры

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

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

#Область ПроцессыОбработкиДокументов

&НаКлиенте
Процедура Подключаемый_КомментарийНаправившегоОткрытие(Элемент, СтандартнаяОбработка)
	
	РегламентированнаяОтчетностьКлиент.КомментарийНаправившегоОткрытие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_КомментарийСледующемуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	РегламентированнаяОтчетностьКлиент.КомментарийСледующемуНачалоВыбора(
		ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

#Область ПроцессыОбработкиДокументов

&НаКлиенте
Процедура Записать(ПараметрыЗаписи) Экспорт
	
	СохранитьНаКлиенте();
	
КонецПроцедуры

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

&НаСервере
Процедура УправлениеДоступностьюРеквизитов(БлокируемыеЭлементы, ТолькоПросмотр) Экспорт
	
	РегламентированнаяОтчетность.УправлениеДоступностьюРеквизитов(ЭтотОбъект, БлокируемыеЭлементы, ТолькоПросмотр);
	
КонецПроцедуры

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

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

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