Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 мая 2024, 05:28

Создание механизма проверки статуса документов

Автор Alexandt, 06 сен 2021, 07:41

0 Пользователей и 1 гость просматривают эту тему.

Alexandt

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

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

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

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

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


Модуль формы

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

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


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

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



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

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

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

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

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

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

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

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

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

КонецЕсли;

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


Поиск родных

Версия платформы и конфигурации - какие?

Alexandt

1С:Предприятие 8.3 (8.3.17.1851)/
Конфигурация самописная,  т.е. для учебных целей все делается, чтобы потом смог в реальной базе сделать этот же механизм в конфигурации Общепит
Повторюсь, что все работало до того, как появился третий статус "К повторной проверке" и необходимость записи статуса в регистр еще до проведения документа. Сейчас при нажатии кнопки запись не идет, а после проведения документа в регистре отображается только статус "Не проверен". Извините, если криво объясняю, просто плохо разбираюсь еще.

Alexandt

Tак и не смог разобраться. Код изменил, но все равно запись в регистр неправильно идет. Отображается только статус "Не проверен", а вместо "К повторной проверке" или "Проверен" пустая строка.
Скину код, может кто поймет, в чем дело. Сначала модуль формы документа:
Процедура ИзменениеСтатусаПроверкиДокумента(Команда)
       
    Если  Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка  Тогда          //обработчик событий кнопки

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецФункции
                                     
 
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    //в обработчике ПередЗаписьюНаСервере в параметре ТекущийОбъект

    //находится сам прикладной объект, а не данные формы.

    //Соответственно доступны и ДополнительныеСвойства и

    //экспортная переменная модуля объекта

    ТекущийОбъект.ДополнительныеСвойства.Вставить("СтатусДокумента",СтатусДокумента);
   
   
КонецПроцедуры


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

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


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

    КонецЕсли;
 
КонецПроцедуры

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

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

   
    //НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);

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

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

    //НоваяЗапись.СтатусПроверки  = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен = Истина ИЛИ 

    //НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке = Истина;

    //Иначе   

    //    НоваяЗапись.СтатусПроверки  = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен;

    //КонецЕсли;

    ////

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

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

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск