# Форум 1С > Конфигурирование, программирование 1С - Предприятие > 1С - Предприятие 8.0, 8.1, 8.2, 8.3 >  Смена "Статуса проверки документа" после нажатия на кнопку формы

## Alexandrrrr

Всем привет. Скажу сразу, я совсем новенький, так что сразу извиняюсь, если где-то сильно тупить буду. Прошу у вас помощи вот с таким заданием: есть пустая база,с одним документом, создано в целях тренировки, мне необходимо создать механизм проверки документов с тремя статусами, "Проверен", "Не проверен" и "На повторной проверке", которые берутся из перечисления. Цель задания учебная, я только учусь, пытаюсь разбираться в программировании.
Так же создан регистр сведений, в котором есть Измерение с ссылкой на документ, ресурсом "Статус", тип у которого ссылка на перечисление и реквизитами "Проверен"( ссылка на справочник Пользователи), Дата Проверки ( Тип "Дата"), Изменил( справочник.Пользователи) и Дата Изменения( Дата). Суть в том, что пользователь проверяет документ, нажимает на кнопку проверки и должна идти запись в регистр с правильным статусом, т.е. от проведения документа не зависит. Так же есть сама кнопка на форме "ИзменениеСтатусаПроверки  окумента(Команда)"
Только созданный документ попадает в регистр со статусом "Не проверен", при нажатии на кнопку должен быть статус "Проверен", а после ее снятия статус "К повторной проверке". Это все сделано. Теперь необходимо, чтобы статус в регистре  менялся не при перепроведении документа, а после нажатия на кнопку. Подскажите, пожалуйста, как реализовать это?  Скидываю модуль формы документа


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

	 Если ЭтаФорма.Открыта() Тогда
  	КонецЕсли;
	 
КонецПроцедуры

&НаСервере
Процедура ОбновитьСтатусДокумента(Проверен);
 	МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписи(); 
	//МенеджерЗаписи =  НоваяЗапись.Добавить();      
	МенеджерЗаписи.Документ = Объект.Ссылка;
	МенеджерЗаписи.Отбор.Документ.Установить(Объект.Ссылка);

   Если СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") Тогда
        МенеджерЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен;
    ИначеЕсли СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")Тогда 
        МенеджерЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен;
    ИначеЕсли СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке") Тогда
        МенеджерЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке;
    КонецЕсли;
	МенеджерЗаписи.СтатусПроверки = Проверен;
 	Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    МенеджерЗаписи.Проверил = Пользователь;
    МенеджерЗаписи.ДатаПроверки = ТекущаяДатаСеанса();
    МенеджерЗаписи.Изменил = Пользователь;    
    МенеджерЗаписи.ДатаИзменения = ТекущаяДатаСеанса();
    МенеджерЗаписи.Записать(Истина);
	
КонецПроцедуры

&НаСервере
Процедура ЗаписьВРегистр(Статус)

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

&НаСервере
Функция ОпределитьСтатус()

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	| СтатусыПроверкиДокументов.Статус КАК Статус
	|ИЗ
	| РегистрСведений.СтатусыПроверкиДокументов КАК СтатусыПроверкиДокументов
	|ГДЕ
	| СтатусыПроверкиДокументов.ДокументСсылка= &Документ";

	Запрос.УстановитьПараметр("Документ", Объект.Ссылка);
	Результат = Запрос.Выполнить();

	Если Результат.Пустой() Тогда
		СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен;
	Иначе
		ВыборкаДетальныеЗаписи = Результат.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		СтатусДокумента = ВыборкаДетальныеЗаписи.СтатусДокумента;
	КонецЦикла;
	КонецЕсли;
	Если НЕ ЗначениеЗаполнено(СтатусДокумента) Тогда
		СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен;
	КонецЕсли;

	Если СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен Тогда
		СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке;
	КонецЕсли;

	Если СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке Тогда
		СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке;
	КонецЕсли;

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


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

Так же скидываю модуль объекта документа: 


```
Процедура ОбработкаПроведения(Отказ, РежимПроведения) 
	
	НаборЗаписей = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗаписей(); // запись документов в регистр сведений
    НаборЗаписей.Отбор.Документ.Установить(Ссылка);
    НоваяЗапись = НаборЗаписей.Добавить();      
    НоваяЗапись.Документ = Ссылка;	

    Если ДополнительныеСвойства.Свойство("СтатусДокумента") Тогда
        РеквизитФормы = ДополнительныеСвойства.СтатусДокумента;
        Сообщить("Проведение: " + РеквизитФормы);
	КонецЕсли;
	
	
	НоваяЗапись.СтатусПроверки = РеквизитФормы;
	Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    НоваяЗапись.Проверил = Пользователь;
	НоваяЗапись.ДатаПроверки = ТекущаяДатаСеанса();
    НоваяЗапись.Изменил = Пользователь;    
	НоваяЗапись.ДатаИзменения = ТекущаяДатаСеанса();
    НаборЗаписей.Записать(Истина);
	
		
КонецПроцедуры

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





```

Буду очень благодарен за помощь!

----------


## Konor18

Сложно понять, что вы вообще хотите в итоге.
Расписываете какой-то алгоритм который работает в форме документа, и работает правильно по вашим словам.
А затем откуда-то появляется проведение документа и всё ломает.
Так удалите "лишние" строки в процедуре проведения и ... всё.
А вообще, такой алгоритм, который требуется в разных местах конфигурации лучше выносить в отдельную экспортную процедуру в общих модулях.

----------


## Alexandrrrr

В итоге мне необходимо сделать так, чтобы статус документа в регистре сведений менялся после нажатия на кнопку, а не после перепроведения документа. Изначально было всего два статуса: "Проверен" и "Не проверен" и не было необходимости в том, чтобы статус перезаписывался после нажатия на кнопку и все это работало. Потом появился третий статус "На повторной проверке" и необходимость в перезаписи статуса при каждом нажатии на кнопку, я стал всё это исправлять и вот в итоге что вышло. Честно говоря, я попросту запутался уже и не могу понять, как все это исправлять. Я понимаю, что какие-то строки тут лишние, но какие именно - не знаю. Я только учусь еще программированию, так что тяжело идет. По заданию в общий модуль и надо будет это все записывать, просто дело в том, что сейчас все делается в пустой базе, так как в тестовой базе слишком много всяких процедур, модулей, я в этом путаюсь и в итоге создал пустую базу, в которую добавил один документ, справочник, регистр сведений и перечисление и кнопку на форму документа. Все это нужно для задания. Еще, конечно, надо с ролями разобраться, разными пиктограммами кнопки для разных пользователей, но это совсем другая история и сначала надо доделать смену статуса в регистре при нажатии на кнопку, а не после перезаписи документа.

----------

