PDA

Просмотр полной версии : Смена "Статуса проверки документа" после нажатия на кнопку формы



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


&НаКлиенте
Процедура ИзменениеСтатусаПроверкиД окумента(Команда)
Элементы.КнопкаИзменениеС� �атусаПроверкиДокумента.По метка = НЕ Элементы.КнопкаИзменениеС� �атусаПроверкиДокумента.По метка;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Возврат СтатусДокумента;

КонецФункции


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


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


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

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

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

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


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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

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


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


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

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

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

ТолькоПросмотр = Проведен;
КонецЕсли;
КонецЕсли;

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








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

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

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