Состояния оригиналов первичных документов / Изменение состояний оригиналов первичных документов / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

	УстановитьСсылкуНаОригинал();

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

	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КомплектПечатныхФорм.Состояние"); 
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	ЭлементОтбора.Использование = Истина;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	ЭлементОформления.Использование = Истина;

	ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("КомплектПечатныхФормПредставление");
	ПолеОформления.Использование = Истина;

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

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура СсылкаНаДокументНажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ПоказатьЗначение(,Запись.Владелец);

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормы

&НаКлиенте
Процедура КомплектПечатныхФормВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	Если Поле.Имя = "ОригиналПолученКартинка" Тогда
		УстановитьСостояниеОригинала("УстановкаСостоянияОригиналПолучен");
	КонецЕсли;

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

&НаКлиенте
Процедура КомплектПечатныхФормПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

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

&НаКлиенте
Процедура КомплектПечатныхФормСостояниеПриИзменении(Элемент)

	КоличествоСдвинуть = 0;

	Для Каждого ПечатнаяФорма Из КомплектПечатныхФорм Цикл
		Если ЗначениеЗаполнено(ПечатнаяФорма.Состояние) Тогда
			КоличествоСдвинуть = КоличествоСдвинуть+1;
		КонецЕсли;
	КонецЦикла;

	ТекущаяСтрока = Элементы.КомплектПечатныхФорм.ТекущиеДанные;
	НовыйИндекс = КомплектПечатныхФорм.Индекс(ТекущаяСтрока);

	Если Не НовыйИндекс <= КоличествоСдвинуть Тогда
		КоличествоСдвинуть = НовыйИндекс - КоличествоСдвинуть +1;
		КомплектПечатныхФорм.Сдвинуть(НовыйИндекс,-КоличествоСдвинуть);
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Элементы.КомплектПечатныхФорм.ТекущиеДанные.Состояние) Тогда
		Элементы.КомплектПечатныхФорм.ТекущиеДанные.ОригиналПолученКартинка = 0;
	КонецЕсли;

	Элементы.КомплектПечатныхФорм.ТекущиеДанные.АвторИзменения = ПользователиКлиент.ТекущийПользователь();
	Элементы.КомплектПечатныхФорм.ТекущиеДанные.ДатаПоследнегоИзменения = НСтр("ru = '<только что>'");
	
КонецПроцедуры

&НаКлиенте
Процедура КомплектПечатныхФормСостояниеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	Если ВыбранноеЗначение = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен") Тогда
		Элементы.КомплектПечатныхФорм.ТекущиеДанные.ОригиналПолученКартинка = 1;
	Иначе
		Элементы.КомплектПечатныхФорм.ТекущиеДанные.ОригиналПолученКартинка = 0;
	КонецЕсли;

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

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОК(Команда)
	
	ОчиститьНеОтслеживаемые();

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

// Параметры:
//  Команда - КомандаФормы
//
&НаКлиенте
Процедура Подключаемый_УстановитьСостояниеОригинала(Команда)

	Если Команда.Имя = "НастройкаСостояний" Тогда
		УчетОригиналовПервичныхДокументовКлиент.ОткрытьФормуНастройкиСостояний();
	Иначе
		УстановитьСостояниеОригинала(Команда.Имя);
	КонецЕсли;

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

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

	УчетОригиналовПервичныхДокументов.ОбновитьКомандыСостоянияОригинала(ЭтотОбъект,Элементы.КомплектПечатныхФорм);

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

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

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

	Элементы.КомплектПечатныхФорм.Обновить();

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

&НаКлиенте
Процедура ПоказатьВсе(Команда)

	ПоказатьВсеНаСервере() 

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

&НаКлиенте
Процедура ПоказатьОтслеживаемые(Команда)
	
	ПоказатьОтслеживаемыеНаСервере()
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВручную(Команда)

	Если Не ЗначениеЗаполнено(ПечатнаяФормаВручную) Тогда
		Возврат;
	КонецЕсли;

	ПервичныйДокумент = СтрЗаменить(ПечатнаяФормаВручную," ","");
	
	НайденныеСтроки = КомплектПечатныхФорм.НайтиСтроки(Новый Структура("ИмяМакета",ПервичныйДокумент));

	Если НайденныеСтроки.Количество() > 0 Тогда
		ОчиститьСообщения();
		ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'В списке уже есть такая форма.'"));
		Возврат;
	КонецЕсли;

	Элементы.ДобавитьСвою.Скрыть();
	КоличествоСдвинуть = 0;

	Для Каждого ПечатнаяФорма Из КомплектПечатныхФорм Цикл
		Если ЗначениеЗаполнено(ПечатнаяФорма.Состояние) Тогда
			КоличествоСдвинуть = КоличествоСдвинуть+1;
		КонецЕсли;
	КонецЦикла;

	Если КоличествоСдвинуть = 0 Тогда
		КоличествоСдвинуть = КомплектПечатныхФорм.Количество();
	Иначе
		КоличествоСдвинуть = КомплектПечатныхФорм.Количество() - КоличествоСдвинуть;
	КонецЕсли;

	НоваяСтрока = КомплектПечатныхФорм.Добавить();
	НоваяСтрока.ИмяМакета = ПервичныйДокумент;
	НоваяСтрока.Представление = ПечатнаяФормаВручную;
	НоваяСтрока.Состояние = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана");
	НоваяСтрока.Извне = Истина;
	НоваяСтрока.Картинка = 2;
	НоваяСтрока.ОригиналПолученКартинка = 0;

	ПоследняяСтрока = КомплектПечатныхФорм.Количество()-1;

	КомплектПечатныхФорм.Сдвинуть(ПоследняяСтрока,-КоличествоСдвинуть);

	Элементы.КомплектПечатныхФорм.Обновить();
	Элементы.КомплектПечатныхФорм.ВыделенныеСтроки.Очистить();
	Элементы.КомплектПечатныхФорм.ВыделенныеСтроки.Добавить(НоваяСтрока.ПолучитьИдентификатор());

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

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

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

#Область ЗаполнениеТаблицыКомплектПечатныхФорм

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

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

	МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
	ОбъектМетаданных = Запись.Владелец.Метаданные();
	
	СписокОбъектов = Новый Массив;
	СписокОбъектов.Добавить(ОбъектМетаданных);

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

		Если ТаблицаКоманд.Количество() > 0 Тогда
			Для Каждого ТекСтрока Из ТаблицаКоманд Цикл

				Если КомплектПечатныхФорм.НайтиСтроки(Новый Структура("ИмяМакета", ТекСтрока.Идентификатор)) = 0 Тогда
					НоваяСтрока = КомплектПечатныхФорм.Добавить();
					НоваяСтрока.ИмяМакета = ТекСтрока.Идентификатор;
					НоваяСтрока.Представление = ТекСтрока.Представление;
					НоваяСтрока.Картинка = 1;
					НоваяСтрока.ОригиналПолученКартинка = 0;
				КонецЕсли;

			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

	НенужныеСтроки = КомплектПечатныхФорм.НайтиСтроки(
		Новый Структура("Представление", НСтр("ru='Комплект документов на принтер'")));
	Для Каждого НеНужнаяСтрока Из НенужныеСтроки Цикл
		КомплектПечатныхФорм.Удалить(НеНужнаяСтрока);
	КонецЦикла;

	НенужныеСтроки = КомплектПечатныхФорм.НайтиСтроки(
		Новый Структура("Представление", НСтр("ru='Комплект документов с настройкой...'")));
	Для Каждого НеНужнаяСтрока Из НенужныеСтроки Цикл
		КомплектПечатныхФорм.Удалить(НеНужнаяСтрока);
	КонецЦикла;

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

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

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

	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл
		НоваяСтрока = КомплектПечатныхФорм.Добавить();
		НоваяСтрока.ИмяМакета = Выборка.ПервичныйДокумент;
		НоваяСтрока.Представление = Выборка.Представление;
		НоваяСтрока.Состояние = Выборка.Состояние;
		НоваяСтрока.Извне = Выборка.Извне;
		НоваяСтрока.ДатаПоследнегоИзменения =  Выборка.ДатаПоследнегоИзменения;
		НоваяСтрока.АвторИзменения = Выборка.АвторИзменения;
		НоваяСтрока.Сотрудник = Выборка.Сотрудник; 
		
		Если Выборка.Извне = Истина Тогда
			НоваяСтрока.Картинка = 2;
		Иначе
			НоваяСтрока.Картинка = 1;
		КонецЕсли;

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

	КонецЦикла;
	
	КомплектПечатныхФорм.Сортировать("Представление");

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

&НаСервере
Процедура ЗаполнитьВсеПечатныеФормы()

	ЗаполнитьСписокПечатныхФормПоСсылке();
	ЗаполнитьПервоначальныйСписокПечатныхФорм();

	УдалитьДубликатыФорм();

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

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

	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл
		НоваяСтрока = КомплектПечатныхФорм.Добавить();
		НоваяСтрока.ИмяМакета = Выборка.ПервичныйДокумент;
		НоваяСтрока.Представление = Выборка.Представление;
		НоваяСтрока.Извне = Истина;
		НоваяСтрока.Картинка = 2;
		НоваяСтрока.ОригиналПолученКартинка = 0;
		НоваяСтрока.ДатаПоследнегоИзменения =  Выборка.ДатаПоследнегоИзменения;
		НоваяСтрока.АвторИзменения = Выборка.АвторИзменения;
		НоваяСтрока.Сотрудник = Выборка.Сотрудник;	
	КонецЦикла;
	
	УдалитьДубликатыФорм();
	
КонецПроцедуры

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

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

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

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

&НаСервере
Процедура ПоказатьВсеНаСервере() 

	Элементы.ПоказатьВсе.Пометка = Истина;
	Элементы.ПоказатьОтслеживаемые.Пометка = Ложь;
	ФильтрПечатныхФорм = "Все";
	
	ОчиститьНеОтслеживаемые();
	ЗаполнитьВсеПечатныеФормы();

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

&НаСервере
Процедура ПоказатьОтслеживаемыеНаСервере() 

	Элементы.ПоказатьВсе.Пометка = Ложь;
	Элементы.ПоказатьОтслеживаемые.Пометка = Истина;
	ФильтрПечатныхФорм = "Отслеживаемые";
	
	ОчиститьНеОтслеживаемые();
	ЗаполнитьСписокПечатныхФормПоСсылке();
	УдалитьДубликатыФорм();

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

&НаСервере
Процедура УстановитьФильтрПечатныхФорм() 
	
	Если ФильтрПечатныхФорм = "Отслеживаемые" Тогда
		ПоказатьОтслеживаемыеНаСервере();
	Иначе 
		ПоказатьВсеНаСервере();
	КонецЕсли;

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

&НаСервере
Процедура УстановитьСсылкуНаОригинал() 

	СведенияОДокументе = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Запись.Владелец, "Номер, Дата");
	ТипДокумента = ОбщегоНазначения.ПредставлениеОбъекта(Запись.Владелец.Метаданные());
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда
		НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(СведенияОДокументе.Номер, Истина, Истина);
	Иначе
		СсылкаНаДокумент = Строка(Запись.Владелец);
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(НомерНаПечать) И Не ЗначениеЗаполнено(СведенияОДокументе.Дата) Тогда
		 СсылкаНаДокумент = ТипДокумента; 
		 Возврат;
	КонецЕсли;
	 
	Если ЗначениеЗаполнено(НомерНаПечать) И ЗначениеЗаполнено(СведенияОДокументе.Дата) Тогда
		СсылкаНаДокумент = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 № %2 от %3'"),
			ТипДокумента, НомерНаПечать, Формат(СведенияОДокументе.Дата, НСтр("ru='ДЛФ=DD'")));
	ИначеЕсли ЗначениеЗаполнено(НомерНаПечать) И Не ЗначениеЗаполнено(СведенияОДокументе.Дата) Тогда 
		СсылкаНаДокумент = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 № %2'"), ТипДокумента,
			НомерНаПечать);
	Иначе 
		СсылкаНаДокумент = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 от %2'"),
			ТипДокумента, Формат(СведенияОДокументе.Дата, НСтр("ru='ДЛФ=DD'")));
	КонецЕсли;

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

&НаКлиенте
Процедура УстановитьОбщееСостояние()

	КоличествоЗаписываемых = 0;

	Для Каждого ПечатнаяФорма Из КомплектПечатныхФорм Цикл
		Если ЗначениеЗаполнено(ПечатнаяФорма.Состояние) Тогда
			КоличествоЗаписываемых = КоличествоЗаписываемых + 1;
		КонецЕсли;
	КонецЦикла;

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

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

			Прервать;
		КонецЕсли;
	КонецЦикла

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

&НаСервере
Процедура ЗаписатьСостоянияОригиналовПервичныхДокументов()

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

	НачатьТранзакцию();
	Попытка
	 
		Блокировка.Заблокировать();

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

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

		КонецЦикла;

		УчетОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Владелец, 
			Запись.Состояние);
		ЗафиксироватьТранзакцию();
		
	Исключение
		ОтменитьТранзакцию(); 
		ВызватьИсключение;  
	КонецПопытки;
	
КонецПроцедуры

&НаСервере
Процедура ВосстановитьНастройки(ВосстанавливатьФильтр)

	Настройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
		"РегистрСведений.СостоянияОригиналовПервичныхДокументов.Форма.ИзменениеСостоянийОригиналовПервичныхДокументов",
		"ФильтрПечатныхФорм");

	Если ВосстанавливатьФильтр Тогда 
		Если ТипЗнч(Настройки) = Тип("Структура") Тогда
			ФильтрПечатныхФорм = Настройки.ФильтрПечатныхФорм;
		КонецЕсли;
	КонецЕсли;	
	
КонецПроцедуры

&НаСервере
Процедура СохранитьНастройки()

	ИменаСохраняемыхРеквизитов = "ФильтрПечатныхФорм";

	Настройки = Новый Структура(ИменаСохраняемыхРеквизитов);
	ЗаполнитьЗначенияСвойств(Настройки, ЭтотОбъект);

	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
		"РегистрСведений.СостоянияОригиналовПервичныхДокументов.Форма.ИзменениеСостоянийОригиналовПервичныхДокументов",
		"ФильтрПечатныхФорм", Настройки);

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

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

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