|
Управляемые формы. запросы. | ☑ | ||
---|---|---|---|---|
0
Rastas_
19.10.12
✎
16:37
|
Доброго времени суток!
Прошу помощи! не могу разобраться с механизмом работы. Если демо версия УТ 11. Сделал запрос к дописанному регистру сведений. запрос через консоль запросов возвращает верный результат, а если тот же запрос вызвать в модуле форме в отдельной процедуре с указанием &НаСервере возвращает пустое значение. В чем может быть проблема и как можно самому помониторить ошибку???? |
|||
1
ДенисЧ
19.10.12
✎
16:38
|
Проблема, как всегда, в одном и том же...
|
|||
2
Rastas_
19.10.12
✎
16:40
|
В чем же?
|
|||
3
Buster007
19.10.12
✎
16:40
|
(0)увы(
|
|||
4
Rastas_
19.10.12
✎
16:42
|
а реальную помощь кто-то может оказать??
|
|||
5
Buster007
19.10.12
✎
16:42
|
параметры в запросе устанавливаются?
|
|||
6
GLazNik
19.10.12
✎
16:43
|
(0) Процедурку чтоль покажи... если конечно она не очень большая...
|
|||
7
Rastas_
19.10.12
✎
16:43
|
Для проверки вырезал все параметры.
|
|||
8
Buster007
19.10.12
✎
16:44
|
экстрасенсы в отпуске...
|
|||
9
Rastas_
19.10.12
✎
16:46
|
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕД_ОтветственныеЛица.Регистратор, | ЕД_ОтветственныеЛица.Статус, | ЕД_ОтветственныеЛица.ДатаИзмененияСтатуса, | ЕД_ОтветственныеЛица.ПредыдущийСтатус |ИЗ | РегистрСведений.ЕД_ОтветственныеЛица КАК ЕД_ОтветственныеЛица"; Выборка = Запрос.Выполнить).Выгрузить(); Выборка.Количество(); КонецПроцедуры |
|||
10
GLazNik
19.10.12
✎
16:47
|
(9) и почему решили что оно не работает?
|
|||
11
Rastas_
19.10.12
✎
16:48
|
Выборка.Количество();
Возвращает 0, когда как этот же запрос через консоль запросов возвращает 1 строку |
|||
12
Rastas_
19.10.12
✎
16:51
|
завел произвольный регистр сведений подчиненный регистратору, не периодический. в него решил программно сделать запись. Получилось. а вот запросов через документ данные уже не могу вытащить.
|
|||
13
GLazNik
19.10.12
✎
16:53
|
(12) а это точна вся процедура? отсутствие скобки наводит на мысль, что перед она подверглась правке с вашей стороны
|
|||
14
Infsams654
19.10.12
✎
16:55
|
Процедура ПриЗаписиНаСервере(...
Процедура-обработчик вызывается после записи объекта (после события ПриЗаписи объекта) в базу данных, но до окончания транзакции записи. |
|||
15
Rastas_
19.10.12
✎
16:55
|
комментарии вырезал. это вся процедура.
|
|||
16
Rastas_
19.10.12
✎
16:58
|
переставил процедуру в
&НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) Та же беда. |
|||
17
GLazNik
19.10.12
✎
16:58
|
(15) точно точно? какой может быть комментарий тут: Запрос.Выполнить).
(14) ну если повторно записываем справочник, то запись то уже есть в базе... так что |
|||
18
Goggy
19.10.12
✎
16:59
|
(16) Создай свою, не жадничай.
|
|||
19
Rastas_
19.10.12
✎
17:08
|
создал. без результатов...
|
|||
20
GLazNik
19.10.12
✎
17:09
|
(19) вроде все нормально. а значит что-то ты не договариваешь.
|
|||
21
Rastas_
19.10.12
✎
17:15
|
создай регистр сведений подчиненный регистратору! в регистраторах указать Заказ поставщику. сделать несколько измерений пару ресурсов. чтобы данные брались из доументам. в момент записи документа выполнять поиск записей в регистре если записей нет то выполнить добавление если есть то скопировать записи(чтобы не было замещения) и выполнить запись в регистр сведений.
|
|||
22
Rastas_
19.10.12
✎
17:16
|
элементарная задача в принципе, но вот вытащить данные нивкакую не выходит.
|
|||
23
Infsams654
19.10.12
✎
17:21
|
(22) покажи всю процедуру с параметрами
|
|||
24
Rastas_
19.10.12
✎
17:54
|
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕД_ОтветственныеЛица.Регистратор, | ЕД_ОтветственныеЛица.Статус, | ЕД_ОтветственныеЛица.ДатаИзмененияСтатуса, | ЕД_ОтветственныеЛица.ПредыдущийСтатус |ИЗ | РегистрСведений.ЕД_ОтветственныеЛица КАК ЕД_ОтветственныеЛица | ЕД_ОтветственныеЛица.Регистратор = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка); Выборка = Запрос.Выполнить().Выгрузить(); НаборЗаписей = РегистрыСведений.ЕД_ОтветственныеЛица.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(ТекущийОбъект.Ссылка); Если Выборка.Количество()>0 тогда Для каждого строкаВыборка из Выборка цикл НоваяЗапись = НаборЗаписей.Добавить(); ЗаполнитьЗначенияСвойств(НоваяЗапись,строкаВыборка); Иначе НоваяЗапись = НаборЗаписей.Добавить(); /////// пишем реквизиты Конецесли; НаборЗаписей.Записать(); КонецПроцедуры |
|||
25
GLazNik
19.10.12
✎
17:55
|
Да что ж такое то...
ну не рабочий код жеж Если Выборка.Количество()>0 тогда Для каждого строкаВыборка из Выборка цикл НоваяЗапись = НаборЗаписей.Добавить(); ЗаполнитьЗначенияСвойств(НоваяЗапись,строкаВыборка); Иначе |
|||
26
Rastas_
19.10.12
✎
17:59
|
тут нужно разобрать принцип. Вы можете помочь имея данный код?
|
|||
27
Rastas_
19.10.12
✎
18:00
|
я сейчас проверяю именно им
|
|||
28
Rastas_
19.10.12
✎
18:00
|
перенес в процедуру после записи. (14) вы были правы. если объект новый, то запись выдаст ошибку!
|
|||
29
GLazNik
19.10.12
✎
18:02
|
(27) а вообще вся логика нарушена... если у тебя регистр подчинен регистратору, то и пиши движения в обработке проведения
|
|||
30
Rastas_
19.10.12
✎
18:03
|
хорошо, перенесу в проведение!
|
|||
31
GLazNik
19.10.12
✎
18:10
|
(30) переносить не надо... там все работает несколько иначе...
примерно так: ДвиженияОтветственныеЛица = Движения.ЕД_ОтветственныеЛица; ДвиженияОтветственныеЛица.Записывать(); ЗаписьДвижения = ДвиженияОтветственныеЛица.Добавить(); ЗаписьДвижения.<твои измерения и ресурсы> Все |
|||
32
Rastas_
22.10.12
✎
09:33
|
К сожалению не сработало...
|
|||
33
Rastas_
22.10.12
✎
09:54
|
Ап!
|
|||
34
Rastas_
22.10.12
✎
10:24
|
Хэлп!!
|
|||
35
Reset
22.10.12
✎
10:34
|
Я правильно понял, что ТС просит найти ошибку в своем коде, он его не выкладывает, а выкладывает дикие вырезки с дикими же (синтаксическими) ошибками?
|
|||
36
Reset
22.10.12
✎
10:41
|
"момент записи документа выполнять поиск записей в регистре .... если есть то скопировать записи(чтобы не было замещения) и выполнить запись в регистр сведений."
Фантасмагория какая-то. |
|||
37
Rastas_
22.10.12
✎
10:44
|
Не совсем! ошибок в коде я не прошу найти! меня интересует механизм. Есть регистр Сведений, к которому не выполняется запрос. почему он может не выполняться?
|
|||
38
Rastas_
22.10.12
✎
10:46
|
&НаСервере
Функция ПроверитьИВнестиИзмененияВИсториюИзмененияСтатусов(мОбъект, СтарыйСтатус) Экспорт Отказ = Ложь; ИсторияСтатусов = ПолучитьИсториюИзмененияСтатусов(Отказ, мОбъект); ТекущийСтатус = мОбъект.Статус; Если ИсторияСтатусов.Количество()>0 и ЗначениеЗаполнено(ТекущийСтатус) тогда СтрокаИстрорииСтатусов = ИсторияСтатусов[0]; Если СтрокаИстрорииСтатусов.Статус <> ТекущийСтатус тогда ЗаписатьИсториюИзмененияСтатусов(Отказ, мОбъект, ИсторияСтатусов, СтарыйСтатус, ТекущийСтатус) КонецЕсли; ИначеЕсли ИсторияСтатусов.Количество()= 0 и ЗначениеЗаполнено(ТекущийСтатус) тогда Если СтарыйСтатус <> ТекущийСтатус и ЗначениеЗаполнено(СтарыйСтатус) тогда ЗаписатьИсториюИзмененияСтатусов(Отказ, мОбъект, ИсторияСтатусов, СтарыйСтатус, ТекущийСтатус) КонецЕсли; Если СтарыйСтатус <> ТекущийСтатус и Не ЗначениеЗаполнено(СтарыйСтатус) тогда ЗаписатьИсториюИзмененияСтатусов(Отказ, мОбъект, ИсторияСтатусов, Неопределено, ТекущийСтатус) КонецЕсли; ИначеЕсли ИсторияСтатусов.Количество()> 0 и не ЗначениеЗаполнено(ТекущийСтатус) тогда СтрокаИстрорииСтатусов = ИсторияСтатусов[0]; Если СтрокаИстрорииСтатусов.Статус <> ТекущийСтатус тогда ЗаписатьИсториюИзмененияСтатусов(Отказ, мОбъект, ИсторияСтатусов, СтарыйСтатус, Неопределено) КонецЕсли; КонецЕсли; КонецФункции &НаСервере Функция ПолучитьИсториюИзмененияСтатусов(Отказ, мОбъект) экспорт //Проверяем есть ли статус Если не ЗначениеЗаполнено(мОбъект.Статус) тогда Отказ = Истина; КонецЕсли; //Если статус есть тогда получаем историю изменения статуса Если Не Отказ тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕД_ОтветственныеЛицаДокументов.Регистратор, | ЕД_ОтветственныеЛицаДокументов.Менеджер, | ЕД_ОтветственныеЛицаДокументов.Статус, | ЕД_ОтветственныеЛицаДокументов.Документ, | ЕД_ОтветственныеЛицаДокументов.ДатаИзмененияСтатуса, | ЕД_ОтветственныеЛицаДокументов.ПредыдущийСтатус |ИЗ | РегистрСведений.ЕД_ОтветственныеЛица КАК ЕД_ОтветственныеЛицаДокументов |ГДЕ | ЕД_ОтветственныеЛицаДокументов.Регистратор = &Регистратор"; Запрос.УстановитьПараметр("Регистратор", мОбъект.Ссылка); Выборка = Запрос.Выполнить().Выгрузить(); Выборка.Количество(); Если Выборка <> неопределено тогда Возврат Выборка; Иначе Отказ = Истина; Возврат Неопределено; КонецЕсли; КонецЕсли; КонецФункции &НаСервере Процедура ЗаписатьИсториюИзмененияСтатусов(Отказ, мОбъект, ТекущаяИстория, СтарыйСтатус, ТекущийСтатус) //упорядочим строки истории по дата изменения //переносим старую историю и добавим новую запись в Истории Если ТекущаяИстория <> Неопределено или ТекущийСтатус <> Неопределено Тогда //Обнуляем историю в регистре НаборЗаписей = РегистрыСведений.ЕД_ОтветственныеЛица.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(мОбъект.Ссылка); НаборЗаписей.Записывать = Истина; //Проверяем Есть ли история если есть то перезапишем её Если ТекущаяИстория.Количество()> 0 тогда //ТекущаяИстория.Сортировать("ДатаИзмененияСтатуса Убыв"); Если ТекущийСтатус <> Неопределено Тогда СтрокиИсториидляУдаления = ТекущаяИстория.НайтиСтроки(Новый Структура("Статус",ТекущийСтатус)); Если СтрокиИсториидляУдаления.Количество() > 0 тогда СтрокаИстрориидляУдаления = СтрокиИсториидляУдаления[0]; ТекущаяИстория.Удалить(СтрокаИстрориидляУдаления); КонецЕсли; КонецЕсли; Для каждого строкаТекущейИстории из ТекущаяИстория цикл НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Документ = строкаТекущейИстории.Документ; НоваяЗапись.Менеджер = строкаТекущейИстории.Менеджер; НоваяЗапись.ПредыдущийСтатус = строкаТекущейИстории.ПредыдущийСтатус; НоваяЗапись.Статус = строкаТекущейИстории.Статус; НоваяЗапись.ДатаИзмененияСтатуса = строкаТекущейИстории.ДатаИзмененияСтатуса; //ЗаполнитьЗначенияСвойств(НоваяЗапись, строкаТекущейИстории); КонецЦикла; КонецЕсли; //Проверяем есть ли сейчас Статус если есть то добавляем запись в историю Если ТекущийСтатус <> Неопределено Тогда НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Документ = мОбъект.Ссылка; НоваяЗапись.Менеджер = Пользователи.ТекущийПользователь(); НоваяЗапись.ПредыдущийСтатус = СтарыйСтатус; НоваяЗапись.Статус = ТекущийСтатус; НоваяЗапись.ДатаИзмененияСтатуса = ТекущаяДата(); КонецЕсли; НаборЗаписей.Записать(); КонецЕсли; КонецПроцедуры |
|||
39
Rastas_
22.10.12
✎
10:47
|
полный код трех связных процедур. но мне кажется это не является необходимым!
|
|||
40
Reset
22.10.12
✎
10:54
|
"ошибок в коде я не прошу найти"
"почему он может не выполняться?" - из-за ошибок в коде, кэп. |
|||
41
Reset
22.10.12
✎
10:55
|
Что такое мОбъект в ПроверитьИВнестиИзмененияВИсториюИзмененияСтатусов и почему по его ссылке долджны быть записи в регистре?
|
|||
42
Rastas_
22.10.12
✎
11:00
|
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) ЕД_НастройкиПользователя.ПроверитьИВнестиИзмененияВИсториюИзмененияСтатусов(ТекущийОбъект.Ссылка, СтарыйСтатус); ............ КонецПроцедуры |
|||
43
Rastas_
22.10.12
✎
11:00
|
Вызывается в документе ЗаказПоставщику.
|
|||
44
Reset
22.10.12
✎
11:08
|
*почему по его ссылке долджны быть записи в регистре?
ЗаписатьИсториюИзмененияСтатусов, к примеру, не заполняет Регистратор вообще (по моему, должно выдавать ошибку при записи) |
|||
45
Reset
22.10.12
✎
11:09
|
Если, конечно, кто-то умный не создал измерение с именем "регистратор"
|
|||
46
Rastas_
22.10.12
✎
11:13
|
не создал.
|
|||
47
Reset
22.10.12
✎
11:15
|
Тогда, вероятно, ЕД_ОтветственныеЛица - подчинен регистратору, а ЗаписатьИсториюИзмененияСтатусов никогда не добавляла записи в него.
|
|||
48
Reset
22.10.12
✎
11:16
|
*почему по его ссылке должны быть записи в регистре?
|
|||
49
Reset
22.10.12
✎
11:18
|
Короче, запрос в ПолучитьИсториюИзмененияСтатусов корректный.
Правильный ответ в (1) - проверяте параметры. |
|||
50
Rastas_
22.10.12
✎
11:21
|
я уже запрос без параметров сделал!! всё равно не возвращает данные, хотя они есть!
|
|||
51
Reset
22.10.12
✎
11:27
|
(50) Как определил, что ни есть?
|
|||
52
Reset
22.10.12
✎
11:27
|
что они*
|
|||
53
Rastas_
22.10.12
✎
11:29
|
консолью запросов. и напрямую открыв регистр сведений.
|
|||
54
Rastas_
22.10.12
✎
11:31
|
Платформа 1С:Предприятие 8.2 (8.2.16.352)
|
|||
55
Reset
22.10.12
✎
11:36
|
Утверждаешь, что запрос
Запрос.Текст = "ВЫБРАТЬ | ЕД_ОтветственныеЛицаДокументов.Регистратор |ИЗ | РегистрСведений.ЕД_ОтветственныеЛица КАК ЕД_ОтветственныеЛицаДокументов"; ТЗ = Запрос.Выполнить().Выгрузить(); Сообщить(ТЗ.Количество()); Дает разный результат в консоли и в коде конфигурации? |
|||
56
Cunni
22.10.12
✎
11:37
|
может я чушь сморожу, но вчера было нечто похожее, с одной только оговоркой, я результат смотрел уже на __выходе__ из серверной процедуры. Результат - таблица значений, которая доступна только на сервере, в клиент возвращалось 0.
|
|||
57
Reset
22.10.12
✎
11:38
|
Не чушь, хотя у него процедуры все три &НаСервере
|
|||
58
Rastas_
22.10.12
✎
12:38
|
Именно об этом и говорю, что на сервере и через консоль выдает разные результаты.
|
|||
59
Rastas_
22.10.12
✎
12:52
|
сейчас сделал несколько записей с разными документами. Через запрос в процедуре записи в регистре 2, а по данным консоли перед проведением документа записей 3. т.е. отсутствует записи текущего документа.
|
|||
60
Rastas_
22.10.12
✎
12:52
|
отсутствуют*
|
|||
61
Reset
22.10.12
✎
12:56
|
Очевидно, они удаляются перед проведением
|
|||
62
Reset
22.10.12
✎
12:57
|
Делать движения на основании своих движений - хреновая идея
|
|||
63
Rastas_
22.10.12
✎
13:01
|
ну а иначе рискую потерять данные. движения копируются в Тч там обрабатываются и просто делается новая запись. т.к. расчитываю на маленький объем данных то не критично.
|
|||
64
Rastas_
22.10.12
✎
15:38
|
час отладки и решение найдено!
|
|||
65
GLazNik
22.10.12
✎
15:42
|
(63) запретить редактировать проведенный документ? или по крайней мере менять реквизиты отвечающие за этот регистр? не?
|
|||
66
Aprobator
22.10.12
✎
15:47
|
(53) правильно делают - нефиг им делать в ПриЗаписи.
|
|||
67
Aprobator
22.10.12
✎
15:47
|
(66) к (59).
|
|||
68
Rastas_
22.10.12
✎
16:06
|
вся фишка в хитром механизме типовом!
ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект); добавил три строчки и всё. Если Объект.Движения.Найти("ЕД_ОтветственныеЛица") <> Неопределено Тогда Объект.Движения.ЕД_ОтветственныеЛица.Записывать = Ложь; КонецЕсли; Если нельзя поместить Код в при записи, то каким образом я могу получить измененный реквизит объекта??? |
|||
69
GLazNik
22.10.12
✎
16:11
|
По моему вы выбрали не верный путь решение вашей задачи. И сейчас пытаетесь изобрести велосипед с квадратными колесами.
Что конкретно вам нужно? какая стоит задача? |
|||
70
Rastas_
22.10.12
✎
16:23
|
я хочу в регистр сведений сохранять измененный реквизит. и вести историю изменения. Собственно, что и сделал.)
|
|||
71
Rastas_
23.10.12
✎
09:18
|
Glaznik, так будет предложение в логику работы??))) может твоё решение будет качественней?
|
|||
72
Aprobator
23.10.12
✎
09:53
|
нефига не понял - версирование что ли нужно? Только самобытное?
|
|||
73
Goggy
23.10.12
✎
10:06
|
Методологи фирмы 1С НАСТОЯТЕЛЬНО не рекомендует использовать запросы в модулях форм ваашпе.
Раз такая гулянка пошла,попробуй перенеси сам запрос в ф-цию в модуле менеджера с передачей параметров и скажи результат. |
|||
74
Aprobator
23.10.12
✎
10:07
|
(73) да ладно - динамический список и тот запрос юзает.
|
|||
75
Aprobator
23.10.12
✎
10:07
|
впрочем запрос запросу рознь.
|
|||
76
hhhh
23.10.12
✎
10:08
|
(71) вот это твое
"выполнять поиск записей в регистре если записей нет то выполнить добавление если есть то скопировать записи(чтобы не было замещения) " - это полный бред. В регистрах сведений в 1С нет update, поэтому нет смысла копировать записи, там по-любому делается через удаление старых записей и создание новых. в общем выбрось всё это на помойку. И не парься. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |