Вход | Регистрация
    1  2

Кнопка "Проверка статуса документов" в самописной конфигурации

Кнопка "Проверка статуса документов" в самописной конфигурации
Я
   Alexandt
 
05.09.21 - 21:42
Всем привет. Скажу сразу, я совсем новенький, так что сразу извиняюсь, если где-то сильно тупить буду. Прошу у вас помощи вот с таким заданием: есть пустая база,с одним документом, создано в целях тренировки, мне необходимо создать механизм проверки документов с тремя статусами, "Проверен", "Не проверен" и "На повторной проверке", которые берутся из перечисления.
Так же создан регистр сведений, в котором есть Измерение с ссылкой на документ, ресурсом "Статус", тип у которого ссылка на перечисление и реквизитами "Проверен"( ссылка на справочник Пользователи), Дата Проверки ( Тип "Дата"), Изменил( справочник.Пользователи) и Дата Изменения( Дата). Суть в том, что пользователь проверяет документ, нажимает на кнопку проверки и должна идти запись в регистр с правильным статусом, т.е. от проведения документа не зависит.
Только созданный документ попадает в регистр со статусом "Не проверен", при нажатии на кнопку должен быть статус "Проверен", а после ее снятия статус "К повторной проверке"
У меня было сделано так, что было 2 статуса проверки "Проверен" и "Не проверен", записи шли, но после проведения документа. Сейчас же появилось третье значение измерения "К повторной проверке"( После снятия кнопки, ставится этот статус) и задача записывать этот статус сразу после нажатия на кнопку, а не после проведения документа. Буду очень признателен, если кто поможет!

Код скидываю ниже:

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

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

НаборЗаписей.Записать();

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


Модуль формы

&НаКлиенте
Процедура ИзменениеСтатусаПроверкиДокумента(Команда)

Если ЭтаФорма.СтатусДокумента = Истина Тогда //обработчик событий кнопки
ЭтаФорма.СтатусДокумента = Ложь ;
ИначеЕсли ЭтаФорма.СтатусДокумента = Ложь Тогда
ЭтаФорма.СтатусДокумента = Истина ;
КонецЕсли;


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

//Делаем кнопку нажатой и не нажатой
Элементы.ИзменениеСтатусаПроверкиДокумента.Пометка = НЕ Элементы.ИзменениеСтатусаПроверкиДокумента.Пометка
КонецПроцедуры



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

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

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

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

Запрос.УстановитьПараметр("Документ", СтатусДокумента);

РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Ложь;
КонецЕсли;

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

ВыборкаДетальныеЗаписи.Следующий();

Если ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен Тогда
Возврат Ложь;
Иначе
Возврат Истина;

КонецЕсли;

КонецФункции
   Kassern
 
101 - 14.09.21 - 15:37
(100) просто ради понимания поставь точку останова на пользователе и выдели кусок "ПользователиИнформационнойБазы.ТекущийПользователь()" жмякни shift+F9 и посмотри чем заполняется. Тогда поймешь какую глупость ты написал.
   Alexandt
 
102 - 14.09.21 - 15:40
(99) Понял, спасибо. Еще не совсем понял, а какой  это , "нужный" статус? Я не совсем понимаю. Мы же просто делаем смену статуса в регистре при нажатии на кнопку, а не после перепроведения документа, что за "нужный" статус, не могу доехать?

(100), (101) Так у меня же база пустая, реальных пользователей нет и берутся они из справочника "Пользователи". Хотя, так же они в списке пользователей есть, я создавал. Но спасибо за совет, я исправлю
   Kassern
 
103 - 14.09.21 - 15:44
(102) нужный статус, это тот который ты хочешь установить при нажатии на кнопку, либо при первой записи документа в базу. В зависимости от текущего статуса у тебя должна быть логика определения нужного статуса для установки.
   Kassern
 
104 - 14.09.21 - 15:46
(103) вот ты вычислил, что сейчас документ в статусе Проверен, следовательно нужный статус у тебя будет к повторной проверке, вот ты его и передаешь в свою процедуру записи и записываешь в регистр, а после ставишь текущий статус к повторной проверке.
   Alexandt
 
105 - 14.09.21 - 15:59
(103), (104) При нажатии на кнопку статус меняется на "проверен", при повторном нажатии "На повторной проверке". А при первой записи документа должен быть статус "Проверен", значит все правильно.  Спасибо, попробую сделать
   Alexandt
 
106 - 15.09.21 - 07:57
Сделал, но выдает такую ошибку:

{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(42)}: Метод объекта не обнаружен (СоздатьМенеджерЗаписей)
    МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписей();

И пробовал вместо "Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя)" использовать либо Пользователи.ТекущийПользователь(), либо ПараметрыСеанса.ТекущийПользователь(), не находит переменную.
   Alexandt
 
107 - 15.09.21 - 08:00
Процедура ОбновитьСтатусДокумента(Проверен);
    МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписей();
    МенеджерЗаписи.Отбор.Документ.Установить(Объект.Ссылка);
    МенеджерЗаписи = МенеджерЗаписи.Добавить();      
    МенеджерЗаписи.Документ = Объект.Ссылка;        
    МенеджерЗаписи.Записать(Истина);
    МенеджерЗаписи.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен;
    Если СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") Тогда
        МенеджерЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке;
    КонецЕсли;
    
    Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    МенеджерЗаписи.Проверил = Пользователь;
    МенеджерЗаписи.ДатаПроверки = ТекущаяДатаСеанса();
    МенеджерЗаписи.Изменил = Пользователь;    
    МенеджерЗаписи.ДатаИзменения = ТекущаяДатаСеанса();
    
КонецПроцедуры





И сама кнопка:

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

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

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

     Если ЭтаФорма.Открыта() Тогда
      КонецЕсли;
   Kassern
 
108 - 15.09.21 - 09:05
(107) у тебя есть синтакс помощник. Без него тебе будет очень туго. Есть еще кнопка проверки модуля на ошибки. При чем можно тыкнуть и встать на строчку с ошибкой. Тебе же по русски написали, что метод "СоздатьМенеджерЗаписей" не обнаружен. Тут 2 варианта, либо ты его неправильно написал, либо используешь в не доступном месте (клиент например). вот встаешь на это место с методом  после точки и нажимаешь cntr+пробел. 1ска тебе покажет список доступных методов. В твоем случае действительно такого метода нет. Есть "СоздатьМенеджерЗаписи"
   Kassern
 
109 - 15.09.21 - 09:09
(107) по поводу текущего пользователя. Тут тоже самое. Пишешь такой ручками ПараметрыСеанса дальше ставишь точку и вуаля - видишь все методы/свойства. можешь даже написать первые буквы, чтобы сократить поиск и найти в списке текущий пользователь. Даже в твоем же коде кусок "ПользователиИнформационнойБазы.ТекущийПользователь()" возвращает справочник ссылку пользователи. А ты потом берешь получаешь у него имя и ищешь эту же ссылку по имени в этом же справочнике...
   Kassern
 
110 - 15.09.21 - 09:10
в общем по теме я уже итак написал больше чем нужно. Читай книжки, смотри видяшки, найди себе наставника. Месяц-полтора при 5дневке с 9-18 хватает, чтобы с нуля не зная программирование вникнуть в тему и начать уже выполнять какую то работу.
   Alexandt
 
111 - 15.09.21 - 09:14
Понял, спасибо. Я знаю про ctrl + пробел, он мне вообще ничего не выдает просто. Буду дальше пытаться,  большое спасибо за помощь.
   Kassern
 
112 - 15.09.21 - 09:22
(111) если cntr+пробел не подсказывает, значит не там пытаешься(клиент/сервер/толстый клиент и т.д.), либо в твоей конфигурации нет данного метода. Смотри синтакс помошник cntr+shift+F1 там по имени находи что тебе надо. Удобное еще перейти в дерево по найеному значению, чтобы все методы его посмотреть. У каждого указана его доступность. Если при проверке ругается на клиент/сервер, то дело именно в ней. У тебя скорее всего база пустышка, поэтому нет параметров сеанса и нет общего модуля Пользователи, поэтому тебе приходится так извращаться.
   Alexandt
 
113 - 15.09.21 - 09:32
Да, база пустая, в ней всего один документ, справочник, регистр сведений и перечисление. Она создана для этого задания. Мог бы в тестовой базе делать, но там глаза разбегаются, слишком много модулей, процедур, функций, я путаюсь в них, поэтому посоветовали сначала в пустой базе это реализовать.А так, вроде как, все делаю по вашим советам. Общих модулей нет в этой базе, да.
   hhhh
 
114 - 15.09.21 - 09:42
(98) вот это
Если РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") Тогда
        НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен;
    ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")Тогда 
        НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен;
    ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке") Тогда
        НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке;
    КонецЕсли;


выкинь.

напиши просто

НоваяЗапись.СтатусПроверки = РеквизитФормы;
   Alexandt
 
115 - 15.09.21 - 12:44
(114) Спасибо, сделал. Но все равно одни ошибки. Если НоваяЗапись.СтатусПроверки = РеквизитФормы, то ошибка "Переменная не определена". Через ctrl + пробел попробовал, выдает РеквизитФормыВЗначение(СтатусДокумента). Так выдает "Несоответствие типов 1". Пробовал через менеджер записи, там на каждую строку ругается, что не найден менеджер записи. Пробую через НоваяЗапись, другие ошибки. Не думал, что автоматическая смена статуса без перепроведения документа такой трудной окажется в итоге для меня...
   Kassern
 
116 - 15.09.21 - 12:48
(115) учись пользоваться отладкой. Смотри чтобы типы совпадали. Если к примеру у тебя НоваяЗапись.СтатусПроверки тип перечисление а ты туда пихаешь какой нибудь тип "элемент формы" а не перечисление, то не удивляйся подобным ошибкам.
   Alexandt
 
117 - 15.09.21 - 12:52
(116) Спасибо, сейчас попробую перепроверить всё
   Alexandt
 
118 - 15.09.21 - 13:32
Закомментировал то, на что выдавало ошибки, чисто ради эксперимента, и вот что заметил: При нажатии на кнопку 2 раза в регистре без перепроведения автоматически появляется пустая запись со статусом "Проверен", название документа не отображается. Ну это потому, что отбор закомментирован, программа выдает на него ошибку

Поле объекта не обнаружено (Отбор)
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(43)}:    МенеджерЗаписи.Отбор.Документ.Установить(Объект.Ссылка);
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(10)}:        ОбновитьСтатусДокумента(ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"));

Точно такие же ошибки выдает на строки 
МенеджерЗаписи = МенеджерЗаписи.Добавить(); 
     МенеджерЗаписи.Документ = Объект.Ссылка; 

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


Отладчик не работает почему-то, просто не останавливается на точке останова
  1  2

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.