|
Кнопка "Проверка статуса документов" в самописной конфигурации | ☑ | ||
---|---|---|---|---|
0
Alexandt
05.09.21
✎
21:42
|
Всем привет. Скажу сразу, я совсем новенький, так что сразу извиняюсь, если где-то сильно тупить буду. Прошу у вас помощи вот с таким заданием: есть пустая база,с одним документом, создано в целях тренировки, мне необходимо создать механизм проверки документов с тремя статусами, "Проверен", "Не проверен" и "На повторной проверке", которые берутся из перечисления.
Так же создан регистр сведений, в котором есть Измерение с ссылкой на документ, ресурсом "Статус", тип у которого ссылка на перечисление и реквизитами "Проверен"( ссылка на справочник Пользователи), Дата Проверки ( Тип "Дата"), Изменил( справочник.Пользователи) и Дата Изменения( Дата). Суть в том, что пользователь проверяет документ, нажимает на кнопку проверки и должна идти запись в регистр с правильным статусом, т.е. от проведения документа не зависит. Только созданный документ попадает в регистр со статусом "Не проверен", при нажатии на кнопку должен быть статус "Проверен", а после ее снятия статус "К повторной проверке" У меня было сделано так, что было 2 статуса проверки "Проверен" и "Не проверен", записи шли, но после проведения документа. Сейчас же появилось третье значение измерения "К повторной проверке"( После снятия кнопки, ставится этот статус) и задача записывать этот статус сразу после нажатия на кнопку, а не после проведения документа. Буду очень признателен, если кто поможет! Код скидываю ниже: Процедура ОбработкаПроведения(Документ, СтатусПроверки, ЭтоИзменениеДокумента = Истина) Экспорт НаборЗаписей = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗа писей(); // запись документов в регистр сведений НаборЗаписей.Отбор.Документ.Установить(Документ); //НаборЗаписей.Отбор.Регистратор.Установить(Ссылка); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() = 0 Тогда Запись = НаборЗаписей.Добавить(); Иначе //запись уже существует Запись = НаборЗаписей[0]; КонецЕсли; Запись.Документ = Документ; Запись.СтатусПроверки = СтатусПроверки; ТекущийПользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнф ормационнойБазы.ТекущийПользователь().Имя); Запись.Проверил = ТекущийПользователь; Запись.ДатаПроверки = ТекущаяДатаСеанса(); //ЭтоИзменениеДокумента = //Если ЭтоИзменениеДокумента Тогда Запись.Изменил = ТекущийПользователь; Запись.ДатаИзменения = ТекущаяДатаСеанса(); //КонецЕсли; НаборЗаписей.Записать(); КонецПроцедуры Модуль формы &НаКлиенте Процедура ИзменениеСтатусаПроверкиДокумента(Команда) Если ЭтаФорма.СтатусДокумента = Истина Тогда //обработчик событий кнопки ЭтаФорма.СтатусДокумента = Ложь ; ИначеЕсли ЭтаФорма.СтатусДокумента = Ложь Тогда ЭтаФорма.СтатусДокумента = Истина ; КонецЕсли; ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = ЭтаФорма.СтатусДокумента; //Показываем состояние кнопки на декорации форм Если ЭтаФорма.СтатусДокумента = Истина Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = Ложь Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + "Не нажата"; КонецЕсли; //Делаем кнопку нажатой и не нажатой Элементы.ИзменениеСтатусаПроверкиДокумента.Пометка = НЕ Элементы.ИзменениеСтатусаПроверкиДокумента.Пометка КонецПроцедуры &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) //в обработчике ПередЗаписьюНаСервере в параметре ТекущийОбъект //находится сам прикладной объект, а не данные формы. //Соответственно доступны и ДополнительныеСвойства и //экспортная переменная модуля объекта ТекущийОбъект.ДополнительныеСвойства.Вставить("СтатусДокумен та",СтатусДокумента); КонецПроцедуры &НаСервере Функция ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЛП_СтатусыПроверкиДокументов.СтатусПроверки КАК СтатусПроверки |ИЗ | РегистрСведений.ЛП_СтатусыПроверкиДокументов КАК ЛП_СтатусыПроверкиДокументов |ГДЕ | ЛП_СтатусыПроверкиДокументов.Документ = &Документ"; Запрос.УстановитьПараметр("Документ", СтатусДокумента); РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Возврат Ложь; КонецЕсли; ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); Если ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции |
|||
19
Kassern
08.09.21
✎
14:22
|
(18) на форме документа можешь вывести реквизит с текущим статусом, его можешь получать ПриСозданииНаСервере и перезаполнять при нажатии на кнопку смены статуса.
|
|||
20
Alexandt
08.09.21
✎
14:22
|
(17) Да, все правильно. Еще суть в том, что перезаписывать документ не надо, необходимо сделать так, чтобы при каждом нажатии на кнопке сразу менялся статус документа, без перепроведения.
|
|||
21
Kassern
08.09.21
✎
14:23
|
(20) а тут и нет привязки к проведению. У тебя есть регистр сведений где хранится история по статусам. Ты можешь вывести в Реквизит формы (не путать с реквизитом документа) последний статус, а по кнопке его обновлять и делать новую запись в регистр
|
|||
22
Kassern
08.09.21
✎
14:24
|
(21) проверять есть такая запись, как ты делаешь через набор нет смысла, у тебя каждый раз будет новая строчка создаваться, так как есть реквизит с датой.
|
|||
23
Alexandt
08.09.21
✎
14:27
|
(17) Спасибо, сейчас попробую.
(20) (21) Можно чуть подробнее? Совсем поплыл уже что-то, запутался окончательно |
|||
24
Kassern
08.09.21
✎
14:30
|
(23) что именно по подробнее? Чем отличается реквизит формы от реквизита документа? Как запросом получить последний статус?
|
|||
25
Alexandt
08.09.21
✎
14:36
|
(24)
У меня уже, вроде, есть такой запрос: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЛП_СтатусыПроверкиДокументов.СтатусПроверки КАК СтатусПроверки |ИЗ | РегистрСведений.ЛП_СтатусыПроверкиДокументов КАК ЛП_СтатусыПроверкиДокументов |ГДЕ | ЛП_СтатусыПроверкиДокументов.Документ = &Документ"; Запрос.УстановитьПараметр("Документ", Объект.Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); Если ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Не нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Ложь; //СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке = Ложь; ИначеЕсли ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Истина; //СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке = Истина; КонецЕсли; Если НЕ РольДоступна("ЛП_ИзменениеСтатусыПроверкиДокументов") Тогда Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Доступность = Ложь; КонецЕсли; КонецПроцедуры В нем что-то не так? |
|||
26
Kassern
08.09.21
✎
14:38
|
(25) а теперь своими словами расскажи что твой запрос делает и какую именно запись со статусом ты получаешь при "ВыборкаДетальныеЗаписи.Следующий();". У тебя может быть 20 строк со статусами с разным временем изменения, так какую именно строчку ты получишь?
|
|||
27
Alexandt
08.09.21
✎
14:59
|
Ой, стоп. Он же просто анализирует состоянии кнопки при статусе "проверен" и при статусе "Не проверен", если я правильно понял. А какую запись получаю при "ВыборкаДетальныеЗаписи.Следующий();"уже всё, не понял. У меня каша в голове совсем стала с этими статусами уже просто. Все работало при двух статусах "Проверен" и "Не проверен" и без условия, чтобы статус обновлялся после нажатия кнопки. Но как это все добавилось, то всё, я поплыл совсем
|
|||
28
Kassern
08.09.21
✎
15:05
|
(27) ну вот, погуляй немного, смени обстановку, и если повезет, может к вечеру светлая мысль придет. А по поводу последнего статуса, то в запросе есть возможность сортировки записей. Вместо всяких там бантиков в виде декораций, можно просто заголовок кнопки менять.
|
|||
29
Alexandt
09.09.21
✎
10:50
|
Посидел, попробовал разобраться, все равно не смог. Понимаю, что все перепутано, но разобраться не могу, а время поджимает уже. Ситуация сейчас такая, что запись в регистр идет неправильно, статус отображается неверно. Т.е. при нажатии на кнопку статус "Не проверен" и т.д. В голове каша уже. Можно как-то поэтапно рассказать, как исправить это, чтобы статусы ставились правильно и после нажатия на кнопки, а не после проведения документа? Буду очень благодарен!
Кусочек кода из (17) написал в обработке кнопки Процедура ИзменениеСтатусаПроверкиДокумента(Команда) после проверки текущего статуса, вышло вот так Если ЭтаФорма.СтатусДокумента = Истина И Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"); ИначеЕсли ЭтаФорма.СтатусДокумента = Ложь И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ИначеЕсли ЭтаФорма.СтатусДокумента = Ложь И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); ИначеЕсли ЭтаФорма.СтатусДокумента = Неопределено И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); КонецЕсли; МенеджерЗаписиСтатусаДокумента=РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписи(); МенеджерЗаписиСтатусаДокумента.СтатусПроверки=ПредопределенноеЗначение("Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен"); МенеджерЗаписиСтатусаДокумента.Дата=ТекущаяДата(); МенеджерЗаписиСтатусаДокумента.Пользователь=ПараметрыСеанса.ТекущийПользователь(); МенеджерЗаписиСтатусаДокумента.Документ=Объект.Ссылка;//надо только проверять записан ли документ в базу, если нет, то не давать писать в регистр. МенеджерЗаписиСтатусаДокумента.Записать(); Выдает ошибку {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(31,33)}: Переменная не определена (РегистрыСведений) МенеджерЗаписиСтатусаДокумента=<<?>>РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписи(); (Проверка: Тонкий клиент) {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(34,46)}: Процедура или функция с указанным именем не определена (Пользователь) МенеджерЗаписиСтатусаДокумента.Пользователь=<<?>>Пользователь(); (Проверка: Тонкий клиент) |
|||
30
Kassern
09.09.21
✎
10:56
|
(29) Переменная не определена (РегистрыСведений) на клиенте что ли пытаешься регистр записывать?
|
|||
31
Kassern
09.09.21
✎
10:57
|
(29) запись объектов должна быть на сервере, создай отдельную процедуру серверную для этого дела
|
|||
32
Kassern
09.09.21
✎
10:57
|
(31) и на будущее смотри методы в синтакс помошнике, там расписана доступность, где можно это дело выполнять
|
|||
33
Alexandt
09.09.21
✎
11:06
|
(30) Добавил в серверную процедуру, ошибок нет, но и ничего не изменилось.
|
|||
34
Kassern
09.09.21
✎
11:09
|
(33) что у тебя за переменная СтатусДокумента? Почему она то Истина то перечисление? Что должно было поменяться? В отладке логика верно отрабатывает в условиях?
|
|||
35
Kassern
09.09.21
✎
11:12
|
(33) "Только созданный документ попадает в регистр со статусом "Не проверен"" где это у тебя отрабатывается?
У тебя должна быть одна процедура которая пишет статусы в регистр, в эту процедуру ты передаешь параметром нужный статус. При создании один статус, при нажатии на кнопку - другой. |
|||
36
Alexandt
09.09.21
✎
11:14
|
(34) СтатусДокумента - реквизит формы с типом Булево, но на саму форму он не выведен. Смысл его был в хранении статуса документа, но на то время еще было всего 2 статуса, без "КПовторнойПроверке. Почему то истина, то перечисление, я уже сам не понимаю. Истину или ложь ставил когда было всего 2 статуса, потом начал пробовать добавить третий, где-то прочитал, что надо ставить перечисление и в итоге сам запутался, что надо ставить. В отладке я еще не разобрался, посмотрел вчера видео, но так и не понял в итоге, как с ней работать.
|
|||
37
Alexandt
09.09.21
✎
11:18
|
(35) Отрабатывается в Процедура ИзменениеСтатусаПроверкиДокумента(Команда) , вроде как...
Я так понимаю, что тут Если ЭтаФорма.СтатусДокумента = Истина И Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"); ИначеЕсли ЭтаФорма.СтатусДокумента = Ложь И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ИначеЕсли ЭтаФорма.СтатусДокумента = Ложь И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); ИначеЕсли ЭтаФорма.СтатусДокумента = Неопределено И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); КонецЕсли; |
|||
38
Alexandt
09.09.21
✎
11:20
|
Хотя у меня это же и в Процедура ОбработкаПроведения(Отказ, РежимПроведения), где идет запись документа в регистр сведений
|
|||
39
Alexandt
09.09.21
✎
11:21
|
(38)
Если ДополнительныеСвойства.Свойство("СтатусДокумента") Тогда РеквизитФормы = ДополнительныеСвойства.СтатусДокумента; Сообщить("Проведение: " + РеквизитФормы); КонецЕсли; Если РеквизитФормы = Ложь Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен; КонецЕсли; Если РеквизитФормы = Истина Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен; ИначеЕсли РеквизитФормы = Истина Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке; КонецЕсли; |
|||
40
Kassern
09.09.21
✎
11:26
|
(38) а зачем при проведении запись в регистр делаешь?
|
|||
41
Kassern
09.09.21
✎
11:30
|
(39) начни с малого, пока создай по кнопке на статус, проверь, что при нажатии статус меняется. А потом начинай объединять кнопки с логикой. Добавь реквизит на форму документа, назови его типа "статус проверки" с типом перечисления. При открытии документа и при нажатии на кнопочки обращайся к функции получения статуса. В ней сделай запрос к последнему статусу и возвращай его в реквизит формы.
|
|||
42
Kassern
09.09.21
✎
11:30
|
(41) и так по шагам от простого к сложному надеюсь решишь эту простенькую задачку
|
|||
43
Alexandt
09.09.21
✎
12:29
|
(40), (41), (42). Спасибо большое! Попробую сделать.
|
|||
44
Alexandt
13.09.21
✎
13:08
|
До сих пор мучаюсь с этим заданием, правда отвлекался на другие задания, но все же... Исправил одно и сломал другое. Я добился того, чтобы статус документа менялся с "проверен" на "На повторной проверке", но теперь только созданные документы попадают в регистр сведений с пустым статусом, а надо, чтобы было как раньше, чтобы только что созданный документ попадал в регистр со статусом "Не проверен". Может кто подскажет что?
Вот процедура обработки кнопки, если что: Процедура ИзменениеСтатусаПроверкиДокумента(Команда) Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка; Если Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда //обработчик событий кнопки ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"); ИначеЕсли НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ИначеЕсли НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); КонецЕсли; Если ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") И Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Не нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + "Не нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = Неопределено И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + "Не нажата"; КонецЕсли; |
|||
45
Kassern
13.09.21
✎
13:27
|
(44) чтобы создать запись с документом и статусом, необходимо, чтобы документ был записан в базе. Следовательно, вам нужно записать документ, далее уже создать запись регистр со статусом "не проверен".
|
|||
46
Alexandt
13.09.21
✎
13:42
|
(45) Можно чуть точнее? Я не совсем понимаю, что не так, раньше же так и работало.
|
|||
47
Kassern
13.09.21
✎
14:11
|
(46) вот ты скинул портянку со всякими условиями где меняется декорации и бантики на форме. Как этот кусок кода должен записывать статус "Не проверен"?
|
|||
48
Kassern
13.09.21
✎
14:15
|
(47) ты должен при первой записи документа создать запись в регистр статусов с нужным тебе статусом. Далее тебе надо менять статус по кнопке у записанного документа. При нажатии на кнопку делаешь запись с нужным статусом в регистр (тут уже проводить документ не надо). Где все это у тебя?
|
|||
49
Kassern
13.09.21
✎
14:16
|
(48) все что я вижу, это куча условий и изменение элементов формы. Где при открытии документа у тебя идет проверка текущего статуса и установка декорации под статус?
|
|||
50
Alexandt
13.09.21
✎
14:18
|
(48) Это все в модуле объекта документа
Процедура ОбработкаПроведения(Отказ, РежимПроведения) НаборЗаписей = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗаписей(); // запись документов в регистр сведений //НаборЗаписей.Прочитать(); НаборЗаписей.Отбор.Документ.Установить(Ссылка); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Документ = Ссылка; //СтатусДокумента = Ложь; Если ДополнительныеСвойства.Свойство("СтатусДокумента") Тогда РеквизитФормы = ДополнительныеСвойства.СтатусДокумента; Сообщить("Проведение: " + РеквизитФормы); КонецЕсли; Если РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен; ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен; ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке") Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке; КонецЕсли; Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя); НоваяЗапись.Проверил = Пользователь; НоваяЗапись.ДатаПроверки = ТекущаяДатаСеанса(); НоваяЗапись.Изменил = Пользователь; НоваяЗапись.ДатаИзменения = ТекущаяДатаСеанса(); НаборЗаписей.Записать(Истина); КонецПроцедуры Процедура ОбработкаУдаленияПроведения(Отказ) НаборЗаписей =РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Документ.Установить(Ссылка); НаборЗаписей.Прочитать(); НаборЗаписей.Очистить(); НаборЗаписей.Записать(); Если НЕ РольДоступна("ЛП_ИзменениеСтатусыПроверкиДокументов") Тогда Если Документы.ПеремещениеТоваров = Проведен и (Не Документы.ПеремещениеТоваров.ПометкаУдаления) Тогда ТолькоПросмотр = Проведен; КонецЕсли; КонецЕсли; КонецПроцедуры Только вот со сменой статуса документа при нажатии на кнопку так и не дошел еще. |
|||
51
Alexandt
13.09.21
✎
14:40
|
(49)
Проверка текущего статуса и установка декорации под статус в модуле формы Если ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") И Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Не нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + "Не нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = Неопределено И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + "Не нажата"; |
|||
52
Kassern
13.09.21
✎
15:53
|
(51) где у тебя запрос на получение текущего статуса?
|
|||
53
Alexandt
13.09.21
✎
15:55
|
(52) Вот он:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЛП_СтатусыПроверкиДокументов.СтатусПроверки КАК СтатусПроверки |ИЗ | РегистрСведений.ЛП_СтатусыПроверкиДокументов КАК ЛП_СтатусыПроверкиДокументов |ГДЕ | ЛП_СтатусыПроверкиДокументов.Документ = &Документ"; Запрос.УстановитьПараметр("Документ", Объект.Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); Если ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Истина; ИначеЕсли ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Истина; ИначеЕсли ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Не нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Ложь; КонецЕсли; Если НЕ РольДоступна("ЛП_ИзменениеСтатусыПроверкиДокументов") Тогда Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Доступность = Ложь; КонецЕсли; КонецПроцедуры |
|||
54
Kassern
13.09.21
✎
15:59
|
(53) ну вот смотри, у тебя есть табличка:
Док1,НеПроверен,Вася,13:30 Док1,Проверен,Вася,13:32 Док1,НаПовторнуюПроверку,Вася,13:40 Твой запрос какую запись вернет? Где у тебя сортировка? |
|||
55
Kassern
13.09.21
✎
16:04
|
(53) А что будет, если у тебя нет записей еще с регистром?
Как минимум у тебя должна быть проверка: Если ВыборкаДетальныеЗаписи.Следующий() Тогда тут уже логика КонецЕсли; |
|||
56
Alexandt
14.09.21
✎
07:28
|
(54), (55). Спасибо, исправил. Но теперь при создании нового документа в регистре создается запись "<Объект не найден> (34:837b00505680d93711ec15136de6cd3a)".
Видимо затупил, не так исправил Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЛП_СтатусыПроверкиДокументов.СтатусПроверки КАК СтатусПроверки |ИЗ | РегистрСведений.ЛП_СтатусыПроверкиДокументов КАК ЛП_СтатусыПроверкиДокументов |ГДЕ | ЛП_СтатусыПроверкиДокументов.Документ = &Документ | |УПОРЯДОЧИТЬ ПО | ЛП_СтатусыПроверкиДокументов.ДатаПроверки"; Запрос.УстановитьПараметр("Документ", Объект.Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Если ВыборкаДетальныеЗаписи.Следующий() Тогда ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен; ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Истина; ИначеЕсли ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Истина; ИначеЕсли ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Не нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Ложь; КонецЕсли; Если НЕ РольДоступна("ЛП_ИзменениеСтатусыПроверкиДокументов") Тогда Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Доступность = Ложь; КонецЕсли; КонецПроцедуры |
|||
57
Мимохожий Однако
14.09.21
✎
07:31
|
(56) Где в приведённом коде процедуры записи в регистр?
|
|||
58
Alexandt
14.09.21
✎
07:38
|
(57) Ой, точно же. Сюда как раз можно кусок кода, который скидывали выше, я так понимаю
МенеджерЗаписиСтатусаДокумента.Статус=НужныйСтатус; МенеджерЗаписиСтатусаДокумента.Дата=ТекущаяДата(); МенеджерЗаписиСтатусаДокумента.Пользователь=ПараметрыСеанса.ТекущийПользователь(); МенеджерЗаписиСтатусаДокумента.Документ=Объект.Ссылка;//надо только проверять записан ли документ в базу, если нет, то не давать писать в регистр. МенеджерЗаписиСтатусаДокумента.Записать(); |
|||
59
Alexandt
14.09.21
✎
07:47
|
Хотя не, бред какой-то...
|
|||
60
Мимохожий Однако
14.09.21
✎
07:51
|
(58) Если Объект.Ссылка=Неопределено Тогда
нахрен бежать отсюда |
|||
61
Alexandt
14.09.21
✎
08:04
|
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Если Объект.Ссылка=Неопределено Тогда ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен; КонецЕсли; КонецЕсли; Что-то типа такого? Извиняюсь, что совсем туплю( |
|||
62
Kassern
14.09.21
✎
09:00
|
(61) я уже не однократно писал тебе, если у тебя сам документ не записан в базу, то нет смысла писать запись в регистр. Следовательно нет смысла нажимать на кнопку смены статуса, если документа еще нет в базе.
|
|||
63
Kassern
14.09.21
✎
09:00
|
(62) вот поэтому у тебя и <Объект не найден> (34:837b00505680d93711ec15136de6cd3a)
|
|||
64
Kassern
14.09.21
✎
09:01
|
(56) А зачем ты упорядочил по возрастанию? Получается ты всегда будешь получать самый первый статус...
|
|||
65
Alexandt
14.09.21
✎
09:13
|
(62) Да, но суть то в том, что только созданный документ должен попадать в регистр со статусом "Не проверен". Этого и хочется добиться, помимо того, чтобы статус менялся после нажатия на кнопку, а не после проведения документа.
(56) Точно, исправил, спасибо |
|||
66
Kassern
14.09.21
✎
09:16
|
(65) еще раз повторю, созданный документ ни в какой регистр не попадет, потому что его еще нет в базе. У тебя была запись при проведении в регистр, в этот момент документ уже записан в базу в транзакции. А если ты тупо создал документ без записи, и начал тыкать кнопку смена статуса, то лови подобные ошибки
|
|||
67
Kassern
14.09.21
✎
09:17
|
(66) вот тут можешь на схеме глянуть, в какой момент документ записывается в базу
https://infostart.ru/1c/articles/1098803/ |
|||
68
Alexandt
14.09.21
✎
09:22
|
(66) Нет, я просто создавал документ и проводил его.Он есть в регистре, но статус у него "пустой", вместо "Не проверен", который раньше был. Это мне и нужно. Забыл указать, что документ провожу и закрываю.
(67) Сейчас прочту, спасибо |
|||
69
Kassern
14.09.21
✎
09:26
|
(68) так поставь точку останова в отладке в момент записи в регистр и посмотри что там у тебя.
|
|||
70
Alexandt
14.09.21
✎
09:33
|
(69) Я пробовал, но пока не научился им пользоваться. Смотрел видео, читал статьи, в итоге каша в голове
|
|||
71
Kassern
14.09.21
✎
09:42
|
(70) бяда....тебя не обучили пользоваться отладкой? Если база файловая, то просто запускаешь конфигуратор, ставишь точки в нужных местах кода(F9 на нужной строчке) и запускаешь из конфигуратора отладку (F5). Что в этом сложного? Если база серверная, тогда необходимо в ветке регистра с агентом 1с прописать в конце /debug.
|
|||
72
Alexandt
14.09.21
✎
09:46
|
(71) Нет, меня вообще не обучают, по сути. Я сам пытаюсь во всем разобраться. Прошел курсы по 1с, клюнул на вакансию с "обучением", которого по факту не оказалось. База файловая. Я знаю, как ставить точку, запускать саму отладку, но я не понимаю, что она мне дает, как по ней понять, что у меня не так. Умел бы пользоваться, то да, я бы быстро понял, в чем дело, наверное.
|
|||
73
Kassern
14.09.21
✎
10:17
|
вот поставил ты точку останова, 1ска на нее встала, жмякаешь такой Shift+F9 на выделенный кусок, к примеру на МенеждерРегистра, чтобы посмотреть как он заполнился, либо можешь посмотреть какое условие отрабатывает, можешь воспользоваться табло. В него просто куски кода вставляешь и видишь какой результат выполнения данных кусков на текущей точке останова.
|
|||
74
Alexandt
14.09.21
✎
10:18
|
Теперь понял, спасибо. Попробую сейчас.
|
|||
75
Kassern
14.09.21
✎
10:20
|
(72) лучше конечно тебе книжку какую нить умную по 1с почитать, либо видео уроки грамотные найти. В свое время у меня был здоровый "талмуд" по 1с и серия видео уроков с 9ю заданиями вроде. Месяц полтора и уже более менее начинаешь понимать что такое УФ, клиент-серверное взаимодействие, основные объекты конфигурации, простенькие решения и т.д.
|
|||
76
Alexandt
14.09.21
✎
10:25
|
(75) Я смотрю видео всякие, книги читаю. Проблема в том, что я раньше программирование вообще не изучал и у меня часто каша в голове появляется, т.е. я просто путаюсь. Вот я начинаю что-то делать, вроде мысль в голове появляется, а потом все. Мозг отключается и я перестаю вообще понимать всё
|
|||
77
Alexandt
14.09.21
✎
11:05
|
Так, можно еще раз повторить? Смотрите: Проверка уже созданных и проведенных документов в регистре работает правильно, т.е. нажимаю на кнопку проверки, появляется статус "Проверен", кнопка имеет вид "нажатой", затем при следующем нажатии появляется статус "На повторной проверке", кнопка имеет вид не нажатой. Все отлично. Далее осталось сделать то, что при создании документа при записи (или проведении) документа проверять наличие данного документа в регистре сведений "ЛП_СтатусыПроверкиДокументов", в случае его отсутствия в регистре, записывать данные по документу со статусом "не проверен". Затем уже сделать так, чтобы статус менялся после каждого нажатия на кнопку, без проведения документа
Вы предложили записать следующий кусок кода в отдельную серверную процедуру на модуле формы, все правильно? МенеджерЗаписиСтатусаДокумента=РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписи(); МенеджерЗаписиСтатусаДокумента.Статус=Проверен; МенеджерЗаписиСтатусаДокумента.Дата=ТекущаяДата(); МенеджерЗаписиСтатусаДокумента.Пользователь=ПараметрыСеанса.ТекущийПользователь(); МенеджерЗаписиСтатусаДокумента.Документ=Объект.Ссылка;//надо только проверять записан ли документ в базу, если нет, то не давать писать в регистр. МенеджерЗаписиСтатусаДокумента.Записать(); А затем в запросе, где у меня функция Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) вставить что-то типа такого и это должно помочь? Если ВыборкаДетальныеЗаписи.Следующий() Тогда Если Объект.Ссылка=Неопределено Тогда ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен; КонецЕсли; КонецЕсли; |
|||
78
hhhh
14.09.21
✎
11:15
|
попробуйте Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
|
|||
79
Alexandt
14.09.21
✎
11:26
|
(78) Ура, получилось, спасибо! Написал в конце запроса и все работает. Осталось понять, как сделать так, чтобы статус документа менялся без перепроведения документа, а после нажатия на кнопку.
|
|||
80
Kassern
14.09.21
✎
11:28
|
(77) лучше в модуль объекта документа пихнуть экспортную процедуру записи регистра. Тогда вы сможете без проблем и с формы обращаться к ней и в модуле объекта при проведении обратиться. ПриСозданииНаСервере, вы получаете текущий статус, если он есть то заполняете реквизит формы с перечислением, если записи нет, значит документ новый и ничего заполнять не нужно и писать в регистр тоже. А вот при проведении надо просто проверить также, если записи в регистре нет с документом, то сделать запись со статусом НеПроверен.
(79) Если документ записан в базу, то можно при нажатии на кнопку смены статуса просто делать запись в регистр и обновлять реквизит формы со статусом на форме. |
|||
81
Alexandt
14.09.21
✎
12:21
|
(80) " делать запись в регистр и обновлять реквизит формы со статусом на форме"
А не подскажете, как это сделать? Я гуглил раньше, были попытки сделать такое, но не вышло |
|||
82
Kassern
14.09.21
✎
12:43
|
(81)
Процедура ТвояКнопка(Команда) //Смотришь какой сейчас у тебя статус документа и понимаешь какой тебе нужно установить ОбновитьСтатусДокумента(НужныйСтатус); СтатусДокумента=НужныйСтатус //Обновили реквизит формы со статусом на новый. КонецПроцедуры |
|||
83
Alexandt
14.09.21
✎
13:02
|
Попробовал, выдает ошибку:
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(20,3)}: Процедура или функция с указанным именем не определена (ОбновитьСтатусДокумента) <<?>>ОбновитьСтатусДокумента(ЭтаФорма.СтатусДокумента.ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке")); (Проверка: Тонкий клиент) {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(26,3)}: Процедура или функция с указанным именем не определена (ОбновитьСтатусДокумента) <<?>>ОбновитьСтатусДокумента(ЭтаФорма.СтатусДокумента.ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")); (Проверка: Тонкий клиент) {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(32,3)}: Процедура или функция с указанным именем не определена (ОбновитьСтатусДокумента) <<?>>ОбновитьСтатусДокумента(ЭтаФорма.СтатусДокумента.ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")); (Проверка: Тонкий клиент |
|||
84
Kassern
14.09.21
✎
13:06
|
(83) а где у тебя процедура ОбновитьСтатусДокумента?
|
|||
85
Kassern
14.09.21
✎
13:06
|
(84) ее же еще написать надо, запихнуть туда кусочек с записью в регистр а статус из параметра процедуры получать.
|
|||
86
Alexandt
14.09.21
✎
14:21
|
(85) "запихнуть туда кусочек с записью в регистр а статус из параметра процедуры получать."
Кусочек с записью в регистр, это какой? Где мы анализируем статусы документа? Если ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Истина; ИначеЕсли ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Истина; ИначеЕсли ВыборкаДетальныеЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен Тогда ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Не нажата"; ЭтаФорма.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен ; Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = Ложь; КонецЕсли; И из какого параметра процедуры статус получать? Не совсем понял |
|||
87
Kassern
14.09.21
✎
14:28
|
(86) "кусочек с записью в регистр". Где у тебя кусок кода, где запись в регистр производится? Вот выдели его в отдельную процедуру.
|
|||
88
Kassern
14.09.21
✎
14:30
|
(87) Типа:
Процедура ОбновитьСтатусДокумента(НужныйСтатус) МенеджерЗаписи=регитсры.... МенеджерЗаписи.Поле1=... МенеджерЗаписи.Статус=НужныйСтатус; МенеджерЗаписи.Записать() КонецПроцедуры |
|||
89
Alexandt
14.09.21
✎
14:51
|
Что-то типа такого?
&НаСервере Процедура ОбновитьСтатусДокумента(Проверен,КПовторнойПроверке,НеПроверен) НаборЗаписей = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗаписей(); // НаборЗаписей.Отбор.Документ.Установить(Ссылка); НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Документ = Ссылка; Если ДополнительныеСвойства.Свойство("СтатусДокумента") Тогда РеквизитФормы = ДополнительныеСвойства.СтатусДокумента; Сообщить("Проведение: " + РеквизитФормы); КонецЕсли; НоваяЗапись.Статус=Проверен; НаборЗаписей.Записать(Истина); КонецПроцедуры Тогда ошибки сразу: {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(41,44)}: Переменная не определена (Ссылка) НаборЗаписей.Отбор.Документ.Установить(<<?>>Ссылка); (Проверка: Сервер) {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(43,28)}: Переменная не определена (Ссылка) НоваяЗапись.Документ = <<?>>Ссылка; (Проверка: Сервер) {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(45,10)}: Переменная не определена (ДополнительныеСвойства) Если <<?>>ДополнительныеСвойства.Свойство("СтатусДокумента") Тогда (Проверка: Сервер) {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(46,25)}: Переменная не определена (ДополнительныеСвойства) РеквизитФормы = <<?>>ДополнительныеСвойства.СтатусДокумента; (Проверка: Сервер) |
|||
90
Kassern
14.09.21
✎
15:06
|
(89) а зачем предавать 3 статуса в параметрах? Тебе же 1 надо установить, вот какой нужен, тот и передавай.
НаборЗаписей = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗаписей();// Зачем тебе набор? Я же тебе ранее писал, используй менеджер записи. Набор нужен, когда надо модифицировать запись, а в твоем случае, каждая запись будет уникальной. "Переменная не определена (Ссылка)" еще бы, Используй Объект.Ссылка. Смену статуса на форме надо делать только после того как запишешь регистр а не "по серединке" записи. |
|||
91
Kassern
14.09.21
✎
15:07
|
(90) зачем еще к ДополнительныеСвойства обращаешься я хз. К реквизитам формы ты можешь напрямую обращаться, тупо ТвойРеквизитФормы=НужноеЗаполнение;
|
|||
92
Alexandt
14.09.21
✎
15:14
|
(90) Спасибо, сейчас попробую
(91) К дополнительным свойствам пришла необходимость обращаться тогда, когда не могли из модуля объекта обратиться к модулю формы, если мне не изменяет память. Надо было обратиться как раз к реквизиту "СтатусДокумента", а по другому никак не получалось. |
|||
93
Kassern
14.09.21
✎
15:20
|
(92) дак не стоит к нему лезти. Текущий статус можно получить просто сделав запрос, у тебя он к тому же есть. Тем более при проведении документа нужно лишь 1 раз запись в регистр сделать, далее вообще не надо. В модуле формы обращайся напрямую к реквизиту формы
|
|||
94
Alexandt
14.09.21
✎
15:25
|
(93) Как-то так?
|
|||
95
Alexandt
14.09.21
✎
15:25
|
&НаСервере
Процедура ОбновитьСтатусДокумента(Проверен); МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьНаборЗаписей(); МенеджерЗаписи.Отбор.Документ.Установить(Объект.Ссылка); МенеджерЗаписи = МенеджерЗаписи.Добавить(); МенеджерЗаписи.Документ = Объект.Ссылка; МенеджерЗаписи.Записать(Истина); Если СтатусДокумента Тогда РеквизитФормы = Проверен КонецЕсли; МенеджерЗаписи.Статус = Проверен; КонецПроцедуры |
|||
96
Kassern
14.09.21
✎
15:27
|
(95) набор зачем создаешь?
Я же тебе писал выше: МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписей(); |
|||
97
Kassern
14.09.21
✎
15:27
|
(96) так же тебе необходимо все поля этого менеджера заполнить
|
|||
98
Alexandt
14.09.21
✎
15:34
|
(96) Не уследил, точно же, спасибо.
(97) Это как в самом регистре, типа Если РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен; ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен; ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке") Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке; КонецЕсли; Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя); НоваяЗапись.Проверил = Пользователь; НоваяЗапись.ДатаПроверки = ТекущаяДатаСеанса(); НоваяЗапись.Изменил = Пользователь; НоваяЗапись.ДатаИзменения = ТекущаяДатаСеанса(); НаборЗаписей.Записать(Истина); Только вместо НоваяЗапись МенеджерЗаписи? |
|||
99
Kassern
14.09.21
✎
15:35
|
(98) только вот логику вычисления можешь оставить у себя в кнопке, а в процедуре записи статуса уже нужный статус передавай.
|
|||
100
Kassern
14.09.21
✎
15:36
|
(98) и уже убери это гадость " Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя)" Используй либо Пользователи.ТекущийПользователь(), либо ПараметрыСеанса.ТекущийПользователь().
|
|||
101
Kassern
14.09.21
✎
15:37
|
(100) просто ради понимания поставь точку останова на пользователе и выдели кусок "ПользователиИнформационнойБазы.ТекущийПользователь()" жмякни shift+F9 и посмотри чем заполняется. Тогда поймешь какую глупость ты написал.
|
|||
102
Alexandt
14.09.21
✎
15:40
|
(99) Понял, спасибо. Еще не совсем понял, а какой это , "нужный" статус? Я не совсем понимаю. Мы же просто делаем смену статуса в регистре при нажатии на кнопку, а не после перепроведения документа, что за "нужный" статус, не могу доехать?
(100), (101) Так у меня же база пустая, реальных пользователей нет и берутся они из справочника "Пользователи". Хотя, так же они в списке пользователей есть, я создавал. Но спасибо за совет, я исправлю |
|||
103
Kassern
14.09.21
✎
15:44
|
(102) нужный статус, это тот который ты хочешь установить при нажатии на кнопку, либо при первой записи документа в базу. В зависимости от текущего статуса у тебя должна быть логика определения нужного статуса для установки.
|
|||
104
Kassern
14.09.21
✎
15:46
|
(103) вот ты вычислил, что сейчас документ в статусе Проверен, следовательно нужный статус у тебя будет к повторной проверке, вот ты его и передаешь в свою процедуру записи и записываешь в регистр, а после ставишь текущий статус к повторной проверке.
|
|||
105
Alexandt
14.09.21
✎
15:59
|
(103), (104) При нажатии на кнопку статус меняется на "проверен", при повторном нажатии "На повторной проверке". А при первой записи документа должен быть статус "Проверен", значит все правильно. Спасибо, попробую сделать
|
|||
106
Alexandt
15.09.21
✎
07:57
|
Сделал, но выдает такую ошибку:
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(42)}: Метод объекта не обнаружен (СоздатьМенеджерЗаписей) МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписей(); И пробовал вместо "Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя)" использовать либо Пользователи.ТекущийПользователь(), либо ПараметрыСеанса.ТекущийПользователь(), не находит переменную. |
|||
107
Alexandt
15.09.21
✎
08:00
|
Процедура ОбновитьСтатусДокумента(Проверен);
МенеджерЗаписи = РегистрыСведений.ЛП_СтатусыПроверкиДокументов.СоздатьМенеджерЗаписей(); МенеджерЗаписи.Отбор.Документ.Установить(Объект.Ссылка); МенеджерЗаписи = МенеджерЗаписи.Добавить(); МенеджерЗаписи.Документ = Объект.Ссылка; МенеджерЗаписи.Записать(Истина); МенеджерЗаписи.СтатусДокумента = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен; Если СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") Тогда МенеджерЗаписи.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке; КонецЕсли; Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя); МенеджерЗаписи.Проверил = Пользователь; МенеджерЗаписи.ДатаПроверки = ТекущаяДатаСеанса(); МенеджерЗаписи.Изменил = Пользователь; МенеджерЗаписи.ДатаИзменения = ТекущаяДатаСеанса(); КонецПроцедуры И сама кнопка: Процедура ИзменениеСтатусаПроверкиДокумента(Команда) Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка = НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка; Если Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда //обработчик событий кнопки ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"); ОбновитьСтатусДокумента(ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")); СтатусДокумента=ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); //Обновили реквизит формы со статусом на новый. ИначеЕсли НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ИначеЕсли НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); КонецЕсли; Если ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") И Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + " Не нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + "Не нажата"; ИначеЕсли ЭтаФорма.СтатусДокумента = Неопределено И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка И НЕ Элементы.КнопкаИзменениеСтатусаПроверкиДокумента.Пометка Тогда ЭтаФорма.СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); ЭтаФорма.Элементы.ДекорацияСтатус.Заголовок = " Статус проверки " + "Не нажата"; КонецЕсли; Если ЭтаФорма.Открыта() Тогда КонецЕсли; |
|||
108
Kassern
15.09.21
✎
09:05
|
(107) у тебя есть синтакс помощник. Без него тебе будет очень туго. Есть еще кнопка проверки модуля на ошибки. При чем можно тыкнуть и встать на строчку с ошибкой. Тебе же по русски написали, что метод "СоздатьМенеджерЗаписей" не обнаружен. Тут 2 варианта, либо ты его неправильно написал, либо используешь в не доступном месте (клиент например). вот встаешь на это место с методом после точки и нажимаешь cntr+пробел. 1ска тебе покажет список доступных методов. В твоем случае действительно такого метода нет. Есть "СоздатьМенеджерЗаписи"
|
|||
109
Kassern
15.09.21
✎
09:09
|
(107) по поводу текущего пользователя. Тут тоже самое. Пишешь такой ручками ПараметрыСеанса дальше ставишь точку и вуаля - видишь все методы/свойства. можешь даже написать первые буквы, чтобы сократить поиск и найти в списке текущий пользователь. Даже в твоем же коде кусок "ПользователиИнформационнойБазы.ТекущийПользователь()" возвращает справочник ссылку пользователи. А ты потом берешь получаешь у него имя и ищешь эту же ссылку по имени в этом же справочнике...
|
|||
110
Kassern
15.09.21
✎
09:10
|
в общем по теме я уже итак написал больше чем нужно. Читай книжки, смотри видяшки, найди себе наставника. Месяц-полтора при 5дневке с 9-18 хватает, чтобы с нуля не зная программирование вникнуть в тему и начать уже выполнять какую то работу.
|
|||
111
Alexandt
15.09.21
✎
09:14
|
Понял, спасибо. Я знаю про ctrl + пробел, он мне вообще ничего не выдает просто. Буду дальше пытаться, большое спасибо за помощь.
|
|||
112
Kassern
15.09.21
✎
09:22
|
(111) если cntr+пробел не подсказывает, значит не там пытаешься(клиент/сервер/толстый клиент и т.д.), либо в твоей конфигурации нет данного метода. Смотри синтакс помошник cntr+shift+F1 там по имени находи что тебе надо. Удобное еще перейти в дерево по найеному значению, чтобы все методы его посмотреть. У каждого указана его доступность. Если при проверке ругается на клиент/сервер, то дело именно в ней. У тебя скорее всего база пустышка, поэтому нет параметров сеанса и нет общего модуля Пользователи, поэтому тебе приходится так извращаться.
|
|||
113
Alexandt
15.09.21
✎
09:32
|
Да, база пустая, в ней всего один документ, справочник, регистр сведений и перечисление. Она создана для этого задания. Мог бы в тестовой базе делать, но там глаза разбегаются, слишком много модулей, процедур, функций, я путаюсь в них, поэтому посоветовали сначала в пустой базе это реализовать.А так, вроде как, все делаю по вашим советам. Общих модулей нет в этой базе, да.
|
|||
114
hhhh
15.09.21
✎
09:42
|
(98) вот это
Если РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.НеПроверен") Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.НеПроверен; ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.Проверен; ИначеЕсли РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке") Тогда НоваяЗапись.СтатусПроверки = Перечисления.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке; КонецЕсли; выкинь. напиши просто НоваяЗапись.СтатусПроверки = РеквизитФормы; |
|||
115
Alexandt
15.09.21
✎
12:44
|
(114) Спасибо, сделал. Но все равно одни ошибки. Если НоваяЗапись.СтатусПроверки = РеквизитФормы, то ошибка "Переменная не определена". Через ctrl + пробел попробовал, выдает РеквизитФормыВЗначение(СтатусДокумента). Так выдает "Несоответствие типов 1". Пробовал через менеджер записи, там на каждую строку ругается, что не найден менеджер записи. Пробую через НоваяЗапись, другие ошибки. Не думал, что автоматическая смена статуса без перепроведения документа такой трудной окажется в итоге для меня...
|
|||
116
Kassern
15.09.21
✎
12:48
|
(115) учись пользоваться отладкой. Смотри чтобы типы совпадали. Если к примеру у тебя НоваяЗапись.СтатусПроверки тип перечисление а ты туда пихаешь какой нибудь тип "элемент формы" а не перечисление, то не удивляйся подобным ошибкам.
|
|||
117
Alexandt
15.09.21
✎
12:52
|
(116) Спасибо, сейчас попробую перепроверить всё
|
|||
118
Alexandt
15.09.21
✎
13:32
|
Закомментировал то, на что выдавало ошибки, чисто ради эксперимента, и вот что заметил: При нажатии на кнопку 2 раза в регистре без перепроведения автоматически появляется пустая запись со статусом "Проверен", название документа не отображается. Ну это потому, что отбор закомментирован, программа выдает на него ошибку
Поле объекта не обнаружено (Отбор) {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(43)}: МенеджерЗаписи.Отбор.Документ.Установить(Объект.Ссылка); {Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(10)}: ОбновитьСтатусДокумента(ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен")); Точно такие же ошибки выдает на строки МенеджерЗаписи = МенеджерЗаписи.Добавить(); МенеджерЗаписи.Документ = Объект.Ссылка; Так же вместо "НоваяЗапись.СтатусПроверки = РеквизитФормы; написал: Если СтатусДокумента = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.Проверен") Тогда РеквизитФормы = ПредопределенноеЗначение("Перечисление.ЛП_ЭтапыПроверкиДокументов.КПовторнойПроверке"); КонецЕсли; Отладчик не работает почему-то, просто не останавливается на точке останова |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |