Имя: Пароль:
1C
1C 7.7
v7: Глюк с периодическим реквизитом
, ,
0 DrRaptor
 
30.01.13
14:06
Процедура ПриОткрытии()
   
   Если ПустоеЗначение(Документы.Получить(РабочаяДата()))=0 Тогда
   
       ТабЗнач = ЗначениеИзСтроки(Документы.Получить(РабочаяДата()));
       
       Для Н=1 По ТабЗнач.РазмерСписка() Цикл
           
           ВыборДоков.Установить(СокрЛП(ТабЗнач.ПолучитьЗначение(Н)),ТабЗнач.ПолучитьЗначение(Н));
           
       КонецЦикла;

   КонецЕсли;

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

Выдает ошибку:
Если ПустоеЗначение(Документы.Получить(РабочаяДата()))=0 Тогда
{Справочник.Комиссии.Форма.Модуль(16)}: Значение не представляет агрегатный объект (Получить)

Нигде в тексте модуля формы нет "ИспользоватьДату".
Реквизит "Документы" - это строка длиной 500, периодический (без галочки "изменяется документами")

В чем дело? Подскажите, пожалуйста.
18 пипец
 
30.01.13
14:23
не поверишь - можно при открытии справочника открывать документ
19 Надсмотрщик
 
30.01.13
14:23
(9) Откуда такие "спецы" берутся? После таких ЛОПАТОЙ за год не разгребешь!   :-)
20 Privalov
 
30.01.13
14:24
(16) ППЦ!!
21 zladenuw
 
30.01.13
14:25
(16) зачем ? если можно запросом получить и вывести в Табличный документ
22 DrRaptor
 
30.01.13
14:27
Объясняю на пальцах:

есть справочник видов комиссиий
в этом справочнике прописывается метод начисления этой кломиссии, устанавливается перечень тарифов, к которым она относится, и перечень документов, в которых эта комиссия может списываться

И все эти перечни должны хранить историю изменений.
23 DrRaptor
 
30.01.13
14:29
Предложите ваши варианты решения, если все такие умные
24 zladenuw
 
30.01.13
14:29
(22) я за подчиненный справочник, а хотя можно и документ
25 Ёпрст
 
30.01.13
14:31
регистр
26 Ёпрст
 
30.01.13
14:31
хотя, можно и на справочнике
27 Ёпрст
 
30.01.13
14:31
без разницы.
28 пипец
 
30.01.13
14:32
(23) тбе ж все рассказали - или подчиненный справочник у которого реквизит элемента - элемент из списка вариантов или документ как реквизит справочника с табличной частью
29 DrRaptor
 
30.01.13
14:37
Ну подчиненный документ более логично...
30 Надсмотрщик
 
30.01.13
14:39
(23) Подчиненный справочник.
31 DrRaptor
 
30.01.13
14:44
Поменял на тип "Документ" - то же самое выдает. Не может получить/установить значение на дату. Че за хрень?
32 пипец
 
30.01.13
14:50
глЗаписьПериодическихРеквизитов(Контекст, Список);
33 Builder
 
30.01.13
14:51
(22) Это все работает или ты только пишешь этот функционал?
34 DrRaptor
 
30.01.13
14:52
Пишу с нуля
35 Ёпрст
 
30.01.13
15:01
(31) см. (4)
36 DrRaptor
 
30.01.13
15:12
Переименовал в "Документы" в "Доксы" - то же самое
37 Boroda
 
30.01.13
15:24
А может сделать наоборот - создать в документах реквизит типа "Комиссия" с типом твоего справочника. И документ "знает" как начислять комиссию по этой ссылке.
38 DrRaptor
 
30.01.13
15:27
В документе и так есть такой реквизит - комиссия в документе предлагается к заполнению, но это не значит, что мы её обязательно заполним. И нужно комиссию докам назначать, а не наоборот.
39 DrRaptor
 
30.01.13
15:30
Не нужно менять мою логику - просто скажите почему периодический реквизит не берется.
Такое в другом справочнике уже было - пришлось использовать .Значение и .ДатаЗнач - но это очень муторно.
40 DrRaptor
 
30.01.13
15:32
А может вообще запрещено обращаться из справочника к его реквизитам .Получить и .Установить ? Может их можно только при стороннем обращении к реквизиту использовать?
41 Ёпрст
 
30.01.13
15:34
Заремь весь код - усё будет работать.
1.Либо сделал Перем Документы в коде,
2. либо есть одноименная переменная в глобальнике
3. либо есть ИспользоватьДату

Но нлицо - 1
42 Boroda
 
30.01.13
15:35
Тога сделай так:  :)
Попытка
 рез = Документы.Получить(РабочаяДата());
Исключение
 рез = Документы;
КонецПопытки;
43 DrRaptor
 
30.01.13
15:36
(41) см (36)
44 Ёпрст
 
30.01.13
15:36
значит, п.3
45 DrRaptor
 
30.01.13
15:37
без Получить значение выдается, историю изменений показывает (соответственно реквизит действительно периодический)
46 Ёпрст
 
30.01.13
15:38
Хотя, тест на вшивость:

сообщить(ТипЗначенияСтр(Документы));
Сообщить(метаданные.Справочник(Вид()).Реквизит("Документы").Выбран());
47 Ёпрст
 
30.01.13
15:38
Сообщить(метаданные.Справочник(Вид()).Реквизит("Документы").периодический);
48 Ёпрст
 
30.01.13
15:39
Сообщить(метаданные.Справочник(Вид()).Реквизит("Документы").Тип));
49 DrRaptor
 
30.01.13
15:39
ИспользоватьДату - имеет разве глобальное влияние? Если где-то в одном из метаденных прописано - то все, каюк?
50 Ёпрст
 
30.01.13
15:40
(49) ты на (46-48) ответь
51 DrRaptor
 
30.01.13
15:45
метаданные.Справочник(Вид()).Реквизит("Доксы").Выбран() = 1
метаданные.Справочник(Вид()).Реквизит("Доксы").периодический = 1
 метаданные.Справочник(Вид()).Реквизит("Доксы").Тип = "Документ"
52 Ёпрст
 
30.01.13
15:46
сообщить(ТипЗначенияСтр(Документы));
53 Ёпрст
 
30.01.13
15:46
всё это воткнуть перед

Документы.Получить(РабочаяДата());
54 1Сергей
 
30.01.13
15:49
>>Реквизит "Документы" - это строка длиной 500, периодический (без галочки "изменяется документами")

>>метаданные.Справочник(Вид()).Реквизит("Доксы").Тип = "Документ"

Какая-то из черепашек врёт
55 DrRaptor
 
30.01.13
15:50
(54) см (31)
56 Ёпрст
 
30.01.13
15:50
На (52) будет ответ ?
57 DrRaptor
 
30.01.13
15:53
ТипЗначенияСтр(Доксы) = "Документ"
58 Ёпрст
 
30.01.13
15:54
(57) не верю.
59 Ёпрст
 
30.01.13
15:54
значит, есть использоватьДату в коде (ты её поди в глобальной проце вызываешь)
60 Ёпрст
 
30.01.13
15:55
или устанавливаешь через контекст открытой формы
61 DrRaptor
 
30.01.13
16:02
нет
поиск ссылок не находит использоватьДату
может есть какие-то галочки еще, которые влияют?
может глобальные настройки какие-то в конфигураторе?
62 DrRaptor
 
30.01.13
16:22
Ну что? Нет мыслей?
63 Ёпрст
 
30.01.13
16:23
(62) дай мд посмотреть
64 Ёпрст
 
30.01.13
16:23
Или кидай весь код модуля формы
65 DrRaptor
 
30.01.13
16:34
МД не дам
а форма вот:

Перем ТабЗнач;

Процедура ВводНового()
   
   сообщить(ТипЗначенияСтр(Доксы));
           
   ВыборДоков.Установить(СокрЛП(Перечисление.ТипДокумента.ВводДС),Перечисление.ТипДокумента.ВводДС);
   ВыборДоков.Установить(СокрЛП(Перечисление.ТипДокумента.ВыводДС),Перечисление.ТипДокумента.ВыводДС);
   ВыборДоков.Установить(СокрЛП(Перечисление.ТипДокумента.ПереводДС),Перечисление.ТипДокумента.ПереводДС);
   ВыборДоков.Установить(СокрЛП(Перечисление.ТипДокумента.КонвертацияВалюты),Перечисление.ТипДокумента.КонвертацияВалюты);
   ВыборДоков.Установить(СокрЛП(Перечисление.ТипДокумента.ЗаймДС),Перечисление.ТипДокумента.ЗаймДС);
   ВыборДоков.Установить(СокрЛП(Перечисление.ТипДокумента.ПогашениеЗаймаДС),Перечисление.ТипДокумента.ПогашениеЗаймаДС);    
       
КонецПроцедуры

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

   КонецЕсли;

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

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

   Доксы.Установить(РабочаяДата(),ЗначениеВСтроку(ТабЗнач));
   
КонецПроцедуры


ТабЗнач = СоздатьОбъект("СписокЗначений");
66 DrRaptor
 
30.01.13
16:35
только что это дает? - ошибка то уже на первой строчке алгоритма выскакивает
67 Ёпрст
 
30.01.13
16:39
(66)
вставляем, результаты в студию:

Процедура ПриОткрытии()
   
  Сообщить(ТипЗначенияСтр(Доксы));
  Сообщить(Доксы);
  Сообщить(Метаданные.Справочник(Вид()).Реквизит("Доксы").Выбран());
Сообщить(Метаданные.Справочник(Вид()).Реквизит("Доксы").периодический);



   Если ПустоеЗначение(Доксы.Получить(ТекущаяДата()))=0 Тогда
68 DrRaptor
 
30.01.13
16:55
Ответы системы в том же порядке:

Документ

1
1
69 Ёпрст
 
30.01.13
16:56
и ?
Ошибка то какая потом ?
70 DrRaptor
 
30.01.13
17:00
Если ПустоеЗначение(Доксы.Получить(ТекущаяДата()))=0 Тогда
{Справочник.Комиссии.Форма.Модуль(23)}: Поле агрегатного объекта не обнаружено (Получить)
71 Ёпрст
 
30.01.13
17:01
(70) где то ты врешь или не договариваешь
дай мд
72 Ёпрст
 
30.01.13
17:02
+

вот это что ?
Доксы.Установить(РабочаяДата(),ЗначениеВСтроку(ТабЗнач));
зачет ага, в документы что-то устанавливать
73 Ёпрст
 
30.01.13
17:02
на форме поди, тоже есть Доксы ?
:))
74 DrRaptor
 
30.01.13
17:07
(72) - не понял в чем вопрос?
(73) - на форме нет Доксов, там СписокЗначений "ВфборДоков"
75 Ёпрст
 
30.01.13
17:11
(72) Доксы - документ, откуда там Установить(РабочаяДата(),ЗначениеВСтроку(ТабЗнач));  ?
76 Ёпрст
 
30.01.13
17:12
впрочем, как и бред с
ТабЗнач = ЗначениеИзСтроки(Доксы.Получить(ТекущаяДата()));
77 DrRaptor
 
30.01.13
17:19
Потому что сначала бал тип "Строка", да не важно это - я создал новый пустой справочник с одним реквизитом - то же самое
78 Ёпрст
 
30.01.13
17:20
Ты это.. где всё это пишешь то хоть ? в Форме элемента или в форме списка справочника ?
79 Ёпрст
 
30.01.13
17:22
Ну и наконец, последний тест
Сообщить(Выбран());
80 Ёпрст
 
30.01.13
17:22
он так сказать, контрольный, в голову
81 фобка
 
30.01.13
17:24
"Процедура ПриОткрытии()
   
  Сообщить(ТипЗначенияСтр(Доксы));"

"Ответы системы в том же порядке:

Документ"
82 фобка
 
30.01.13
17:27
стопэ.. это строка или документ? он периодический точно?
83 DrRaptor
 
30.01.13
17:28
Не там мы копаем - есть какой то еще пунктик, который влияет на периодические реквизиты
84 DrRaptor
 
30.01.13
17:30
Я создал новый пустой справочник. Сделал один периодический реквизит "Доксы" типа "Строка" длиной 10.

В форму диалога вставил алгоритм:

Процедура ПриОткрытии()
   
   
   Доксы.Установить(ТекущаяДата(),"Привет");
       
   Сообщить(Доксы.Получить(ТекущаяДата()));


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

При открытии ошибка:

Доксы.Установить(ТекущаяДата(),"Привет");
{Справочник.Проверка.Форма.Модуль(4)}: Значение не представляет агрегатный объект (Установить)
85 sapphire
 
30.01.13
17:31
Доксы... Беггинсы...Моя прелесть (с)
86 DrRaptor
 
30.01.13
17:31
Ну нет там ничего больше! Форма новая чистая. Просто .Установить не работает.
87 Ёпрст
 
30.01.13
17:34
(86) см. (79) это ответ на (0) и всю ветку целиком.
далее (80)
88 Ёпрст
 
30.01.13
17:34
если еще не понял - нет периодики у НЕ записанного элемента.
89 DrRaptor
 
30.01.13
17:38
Доксы.Установить(ТекущаяДата(),"Привет");
   
   Доксы.Записать();
       
   Сообщить(Доксы.Получить(ТекущаяДата()));

тоже не работает
90 пипец
 
30.01.13
17:40
"Доксы" типа "Строка" длиной 10.  (с) за такое расстреливать нада - без права переписки
91 DrRaptor
 
30.01.13
17:41
(90) - опять не понял. Что еще не так!!??
Напишите ваш правильный алгоритм.
А то так и не помогли пока
92 viktor_vv
 
30.01.13
17:45
(88) Самое прикольное, что в форме диалога справочника и для записанного не работает

ИдентификаторПериодическогоРеквизита.Получить() ;

:).
Спецом у себя проверил.
93 miki
 
30.01.13
17:46
(87)+1
94 DrRaptor
 
30.01.13
17:46
(88) - что мне делать то?
95 DrRaptor
 
30.01.13
17:47
может из формы справочника нельзя обращаться таким образом к реквизиту?
96 фобка
 
30.01.13
17:47
да, не работает
Процедура ПриОткрытии()
   
  Если Выбран() = 1 Тогда
     Сообщить(Рек1.Получить(ТекущаяДата()));
  КонецЕсли;

КонецПроцедуры
97 Ёпрст
 
30.01.13
17:48
(91)

Процедура ПриОткрытии()
   Если Выбран()=0 Тогда
       Предупреждение("ПНХ, альфредо!"+"" ""+"нет периодики у таких элементов"+"" ""+запиши их, для начала");
   Иначе
   
        Доксы.Установить(ТекущаяДата(),"Привет");
        Сообщить(Доксы.Получить(ТекущаяДата()));
   КонецЕсли;


КонецПроцедуры
98 viktor_vv
 
30.01.13
17:48
Вот так работает

Процедура ПриОткрытии()
   Сообщить(ТекущийЭлемент().Курс.Получить(РабочаяДата()));
КонецПроцедуры
99 viktor_vv
 
30.01.13
17:49
(98)+ И для незаписанного тоже.
100 пипец
 
30.01.13
17:49
реквизит формы и периодический реквизит не находящийся на форма без записатьпериодический отрабатывать просто так не будет
101 DrRaptor
 
30.01.13
17:52
Кто-нибудь, напишите работающий алгоритм записи значения в реквизит
102 фобка
 
30.01.13
17:53
(101) написали уже,  запись (97) чтение (98)
103 Ёпрст
 
30.01.13
17:55
Я б воткнул ИспользоватьДату и не заморачивался
104 пипец
 
30.01.13
17:57
Функция глЗаписьПериодическихРеквизитов(КонтекстФормы, СписокРеквизитов=0, НоваяДата=0,
   ПерваяДата=0, СвязьРеквизитов=0, НеизменяемыеРеквизиты="") Экспорт
   
   Если ТипЗначенияСтр(СписокРеквизитов) <> "СписокЗначений" Тогда
       СписокРеквизитов = СоздатьОбъект("СписокЗначений");
       
       МДСправочник = Метаданные.Справочник(КонтекстФормы.Вид());
       
       Сч = 1;
       
       Пока МДСправочник.Реквизит(Сч).Выбран() = 1 Цикл
           
           Если МДСправочник.Реквизит(Сч).Периодический = 1 Тогда
               Идентификатор = МДСправочник.Реквизит(Сч).Идентификатор;
               Если Найти("," + НеизменяемыеРеквизиты + ",", "," + Идентификатор + ",") = 0  Тогда
                   СписокРеквизитов.ДобавитьЗначение(КонтекстФормы.ПолучитьАтрибут(Идентификатор), Идентификатор);
               КонецЕсли;
           КонецЕсли;
           
           Сч = Сч + 1;
           
       КонецЦикла;
   КонецЕсли;    
   
   // Список параметров обработки ЗаписьПериодическихРеквизитов.
   Параметр = СоздатьОбъект("СписокЗначений");
   Параметр.Установить("КонтекстФормы",    КонтекстФормы);
   Параметр.Установить("СписокРеквизитов", СписокРеквизитов);
   Параметр.Установить("НоваяДата",        НоваяДата);
   Параметр.Установить("ПерваяДата",       ПерваяДата);
   Параметр.Установить("СвязьРеквизитов",  СвязьРеквизитов);
   
   ОткрытьФормуМодально("Обработка.ЗаписьПериодическихРеквизитов", Параметр);
   
   Возврат Параметр;
   
КонецФункции // глЗаписьПериодическихРеквизитов()
105 фобка
 
30.01.13
17:58
Процедура Кнопа()
   
  Если Выбран() = 1 Тогда
     Спр = СоздатьОбъект("Справочник.Новый1");
     Спр.НайтиЭлемент(ТекущийЭлемент());
     Спр.Рек1.Установить(ТекущаяДата(),"Привет2");

     Сообщить(ТекущийЭлемент().Рек1.Получить(ТекущаяДата()));
  КонецЕсли;

КонецПроцедуры
106 фобка
 
30.01.13
17:58
Спр.Записать() нетрэба
107 DrRaptor
 
30.01.13
17:58
(102) -
Доксы.Установить(ТекущаяДата(),"Привет");
{Справочник.Проверка.Форма.Модуль(7)}: Значение не представляет агрегатный объект (Установить)
108 фобка
 
30.01.13
18:00
(107) -> (105)
109 Ёпрст
 
30.01.13
18:00
(107) ясен пень, у тебя Доксы - документ, а не список значений
110 viktor_vv
 
30.01.13
18:03
(109) Да не, скорее всего из-за того что в форме диалога

(107) Так попробуй
Если Выбран() = 1 Тогда
ТекущийЭлемент().Доксы.Установить(ТекущаяДата(),"Привет") ;
КонецЕсли ;

Или (105) .
111 DrRaptor
 
30.01.13
18:07
Только так работает:

Процедура ПриОткрытии()
   
   
   Если Выбран() = 1 Тогда
                 
      Спр = СоздатьОбъект("Справочник.Проверка");
      Спр.НайтиЭлемент(ТекущийЭлемент());
      Спр.Доксы.Установить(ТекущаяДата(),"Привет");
     
     КонецЕсли;    
   
   Сообщить(ТекущийЭлемент().Доксы.Получить(ТекущаяДата()));
   
КонецПроцедуры
112 viktor_vv
 
30.01.13
18:08
(110) Не, через текущийЭлемент() установить не работает.
Остается (105).
113 DrRaptor
 
30.01.13
18:09
Вывод: как я и говорил, изнутри нельзя обратится к реквизиту командой .Получить / .Установить
114 Ёпрст
 
30.01.13
18:09
(113) можно:
из СП:
Метод  можно использовать только для объектов-справочников, созданных функцией СоздатьОбъект.
115 Ёпрст
 
30.01.13
18:11
а вообще, всё это не нужно
Либо использоватьДату, либо через объект Периодический
116 viktor_vv
 
30.01.13
18:11
В принципе логично, в синтаксисе

Реквизит.Получить() , Реквизит.Установить()

в диалоге самого элемента
эти методы не могут получить ID элемента, вряд ли при вызове метода контролируется из какого контекста они вызываются.
117 DrRaptor
 
30.01.13
18:27
Фобке спаисбо
Остальным я поражаюсь: почему вы считаете других тупее себя?