Имя: Пароль:
1C
1С v8
Управляемые формы. запросы.
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, поэтому нет смысла копировать записи, там по-любому делается через удаление старых записей и создание новых.

в общем выбрось всё это на помойку. И не парься.
Закон Брукера: Даже маленькая практика стоит большой теории.