Имя: Пароль:
1C
1С v8
Как создать глобальную переменную типа Массив?
0 anikev
 
27.11.22
07:45
Здравствуйте! Столкнулся с проблемой создания глобального массива в обработке. У меня есть вкладки с динамическим созданием реквизитов. Если я второй раз перехожу на эту же вкладку, у меня ругается 1с на то, что реквизит уже создан и не нужно еще раз создавать реквизит. Поэтому у меня возникла сумасшедшая идея создать глобальную переменную с типом Массив, куда я при программном создании реквизита, буду еще сохранять в массив. А при переходе на другую вкладку, очищать этот массив. Так вот...  
1. Создал я переменную:
&НаСервере
  Перем МассивРеквизитовДляУдаления;
2. Пытаюсь её проинициализировать:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  МассивРеквизитовдляУдаления = Новый Массив ;
КонецПроцедуры
Но до инициализации у нее стоит тип НЕОПРЕДЕЛЕНО, возможно это и правильно, но меня смутило
3. После перехода на другую страницу, я проверяю нет ли записей в массиве
&НаСервере
  Процедура УдалитьРеквизитыПрограммно()
   Если НЕ МассивРеквизитовДляУдаления.Количество() = 0 Тогда
    ИзменитьРеквизиты( , МассивРеквизитовдляУдаления);
   КонецЕсли;
  КонецПроцедуры
Здесь тоже МассивРеквизитовДляУдаления с типом Неопределено - это уже точно плохо, потому что не могу вызвать Количество()
Скажите, пожалуйста, как правильно проинициализировать переменную?
Спасибо!
1 Beduin
 
27.11.22
08:12
У тебя все вкладки на одной форме?
2 anikev
 
27.11.22
08:14
(1) да
3 Beduin
 
27.11.22
08:26
Поставь точку останова в момент создания переменной и проверь при переходе на другую вкладку не инициализируется ли заново.
4 anikev
 
27.11.22
08:30
В момент создания переменной точка останова не отрабатывает.
Читал, что можно инициализировать переменную в конце модуля - я так и сделал, но тогда при переходе на другую вкладку она переинициализировалась и возвращала мне пустой массив, когда там уже были данные.
5 SleepyHead
 
гуру
27.11.22
08:34
(4) Переменная инициализируется при каждом серверном вызове.

Создай реквизит формы и храни в нем.
6 anikev
 
27.11.22
08:35
(5) Тоже об этом думал, но там нет типа "Массив"
7 SleepyHead
 
гуру
27.11.22
08:39
(6) Есть тип "Произвольный", можешь проинициализировать массивом при создании. Но хранить в нем можно только те значения, которые сериализуются.

Помнится, я как-то список значений использовал, потому что мне надо было хранить значения и представления значений. Вполне себе работает.
8 Chai Nic
 
27.11.22
08:43
(7) "Но хранить в нем можно только те значения, которые сериализуются."
Ага, а в том что сериализуется, можно хранить ссылку хоть на черта лысого)
Правда, иногда этот черт может дематериализоваться - это надо учитывать)
9 anikev
 
27.11.22
08:54
(8) Я понимаю, что динамический тип - это плохо. Типизация - это хорошо. Я пришел с ЯП Dart, но иногда 1С не понимаю)
10 anikev
 
27.11.22
08:55
(7) при  инициализации переменной с типом "Произвольный" мне платформа говорит:
  МассивРеквизитовдляУдаления = Новый Массив;
по причине:
Тип "Массив" не может использоваться в данных формы
11 Мимохожий Однако
 
27.11.22
09:03
(0) Добавить проверку на существование элемента формы перед созданием  пробовал?
12 anikev
 
27.11.22
09:09
(11) (В контексте переменной) Если я создаю ее на сервере, мне зачем что-то проверять на форме?
13 Гений 1С
 
гуру
27.11.22
09:15
(0) используй попытка-исключение. ггг
14 Гений 1С
 
гуру
27.11.22
09:15
на клиенте в переменной ты можешь хранить массив.
можешь также хранить списки в таблице формы.
15 Гений 1С
 
гуру
27.11.22
09:16

&НаКлиенте
Перем МойМассив;

&НаКлиенте ПриОткрытии()

  МойМассив = Новый Массив();


ггг.
16 anikev
 
27.11.22
09:20
(13) При бездумном использовании это приводит не к ггг, а "Что же все-таки сломалось". Я так не хочу
17 anikev
 
27.11.22
09:21
(15) Мне на клиенте это не нужно, на сервере вся логика работает
18 Garykom
 
гуру
27.11.22
09:23
хыхы
19 Garykom
 
гуру
27.11.22
09:24
1. глобальная переменная для этого не нужна
2. они и не сохраняются на сервере между вызовами
20 SleepyHead
 
гуру
27.11.22
09:28
(10) Хм.. ну что ж, список значений подойдет? Его точно можно.
21 anikev
 
27.11.22
09:29
(19) Почитай 5 пост, там тоже самое написано...
22 SleepyHead
 
гуру
27.11.22
09:29
А уж из списка значений можно выгрузить в массив.
23 anikev
 
27.11.22
09:30
(20) К сожалению, нет. Мне нужно просто массив реквизитов, чтобы их потом удалить.
24 SleepyHead
 
гуру
27.11.22
09:35
(23) СписокЗначений.ВыгрузитьЗначения() = массив
25 Garykom
 
гуру
27.11.22
09:36
(21) Дык это тебе почитать надо а не мне
Ты же не понимая как платформа 1С работает с УФ пытаешься хрень сделать
26 Garykom
 
гуру
27.11.22
09:37
(23) Дык удаляй кто тебе мешает
Даже в отдельный массив или список не обязательно свои созданные помещать, можно именем обойтись по шаблону
27 anikev
 
27.11.22
09:41
(25) Дык написали же уже, зачем повторяться...
28 anikev
 
27.11.22
09:42
(26) Дык зачем изобретать велосипед, может есть рациональные способы!
29 Garykom
 
гуру
27.11.22
09:53
(27) ты думаешь я собираюсь читать всю ветку?
30 Garykom
 
гуру
27.11.22
09:54
(28) велосипед это ты изобретаешь с массивом

когда просто своим реквизитам и элементам даешь имена типа "МойРеквизит_ИмяРеквизиат1" и т.д.
а затем просто по общему списку выбираешь ""МойРеквизит_*" и удаляешь
31 AneJIbcuH
 
27.11.22
10:03
(0) ФиксированныйМассив не пробовали?
32 anikev
 
27.11.22
10:12
(31) его нет в реквизитах формы
33 anikev
 
27.11.22
10:12
(30) Это идея, спасибо
34 hockeyist
 
27.11.22
10:24
(23) Тяжело тебе будет в 1С. Здесь постоянно так.
"Почему нельзя массив?" Да по кочану! Плюешься и идешь в обход. Список значений, таблица значений. Будешь каждый раз искать "рациональное" - сгоришь. Иногда оно действительно существует. Но очень иногда
35 Guk
 
27.11.22
10:28
>> Если я второй раз перехожу на эту же вкладку, у меня ругается 1с на то, что реквизит уже создан и не нужно еще раз создавать реквизит. Поэтому у меня возникла сумасшедшая идея создать глобальную переменную с типом Массив, куда я при программном создании реквизита, буду еще сохранять в массив

ты там точно программистом числишься? мне бы такая фуйня даже в голову не пришла...
36 anikev
 
27.11.22
10:55
(35) Не числюсь, а работаю. Ты не поверишь, но в ООП (Объектно-ориентированном программировании) как раз есть реализация глобального стейта, куда можно что-то положить и позже забрать.
37 anikev
 
27.11.22
10:58
(34) Понял, спасибо)
38 Guk
 
27.11.22
11:03
(36) в твоём случае массив не нужен...
39 Garykom
 
гуру
27.11.22
11:10
(36) Может получше ООП изучишь?
С его тремя китами в т.ч. Инкапсуляция
40 anikev
 
27.11.22
11:21
(39) Хорошо, я повторю. Это все переходит в оффтоп.
41 Гений 1С
 
гуру
27.11.22
11:35
(16) а зря. Могу, умею, практикую в попытка-исключение.
но кстати да, я проверял наличие реквизитов по наличию элементов формы, которые я создавал под эти реквизиты, если совсем параноик можешь проверить через ЗаполнитьЗначенияСвойств структуры.
42 Гений 1С
 
гуру
27.11.22
11:35
(34) да, 1С - это получение максимумального результата в максимально ограниченной среде.
43 RomanYS
 
27.11.22
11:43
(40) Да тема вроде раскрыта:
1. серверный контекст НЕ существует между серверными вызовами, поэтому "глобальная" переменная должна быть реквизитом формы.
2. скорее всего твою задачу можно решить без этого или постановка задачи вообще кривая. Но тут нужно знать собственно что тебе надо
44 anikev
 
27.11.22
11:59
Хорошо, попробую объяснить
Есть реализация:
у меня на форме есть группы вкладок с реквизитами, они динамически создаются.
Проблема:
Я хочу контролировать в массиве, что я удаляю.
45 anikev
 
27.11.22
12:10
Господа, пусть эта тема уйдет в архив. Прошу прошения у тех, кого я побеспокоил в этот выходной день. Благодарю всех тех, кто откликнулся! Желаю всем счастья! Спасибо за помощь, завтра буду разбираться.
46 RomanYS
 
27.11.22
12:23
(44) На форме у тебя элементы (а не реквизиты). Реквизиты тебе удалять не нужно вообще (или объясни зачем это может быть нужно), просто меняй видимость элементов или их групп.
47 Сергиус
 
27.11.22
12:53
(0)Если всё в рамках одной формы, создай реквизит формы МассивРеквизитовДляУдаления с типом Произвольный, и пихай туда.
48 Гений 1С
 
гуру
27.11.22
21:47
Как тут не поверить в ноосферу, если сегодня мне пришлось делать задачу товарища и вот аналогичная ситуация:


&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)  
    дор_СоздатьПоляФормы();
КонецПроцедуры

&НаСервере
&После("ОбновитьТаблицуДокументовНаСервере")
Процедура дор_ОбновитьТаблицуДокументовНаСервере(ВсеСтроки)
    
    дор_СоздатьПоляФормы();
    
    Для Каждого Строка ИЗ ТаблицаДокументов Цикл
        Попытка      
            Строка.дор_Валюта = Строка.Документ.ВалютаДокумента;
        Исключение
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

Процедура дор_СоздатьПоляФормы()
    
    Если Элементы.Найти("дор_Валюта") = Неопределено Тогда
        Реквизиты = Новый Массив;
        Реквизиты.Добавить(Новый РеквизитФормы("дор_Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты"), "ТаблицаДокументов", "Валюта", Истина));
        ИзменитьРеквизиты(Реквизиты);
        
        Привязка = Элементы.ТаблицаДокументовВидОперации;
        Элемент = Элементы.Вставить("дор_Валюта", Тип("ПолеФормы"), Привязка.Родитель, Привязка);
        Элемент.Вид = ВидПоляФормы.ПолеВвода;
        Элемент.АвтоМаксимальнаяШирина = ложь;
        Элемент.РастягиватьПоГоризонтали = ложь;
        Элемент.Ширина = 4;
        Элемент.ПутьКДанным = "ТаблицаДокументов.дор_Валюта";  
    КонецЕсли;
    
КонецПроцедуры
49 RomanYS
 
27.11.22
22:20
(48) Строка.дор_Валюта = Строка.Документ.ВалютаДокумента;

Это чтобы не было слишком быстро?
50 RomanYS
 
27.11.22
22:21
(48) зачем вообще реквизит? Они будут валюту редактировать?
51 Beduin
 
27.11.22
22:23
(48) А где-то есть просто объект типа "Класс" со своими переменными и методами без извращений вот этих.