|
v7: Форма списка справочника, Идентификатор тестового поля для дальнейшего расчета | ☑ | ||
---|---|---|---|---|
0
IgorA100
02.09.21
✎
18:57
|
Есть форма списка справочника, в нескольких столбцах нужно выводить реквизит другого связанного справочника с текущим элементом.
Сейчас в каждом таком столбце прописано: глНайтиКонтрагента(ТекущийЭлемент()).Рек1 глНайтиКонтрагента(ТекущийЭлемент()).Рек2 и т.д. Т.е. идет постоянный поиск, замедляющий работу. А хочется сделать так, что например в одном добавленном текстовом столбце формы списка рассчитать значение ЧегоНашли = глНайтиКонтрагента(ТекущийЭлемент()) а далее уже к нему обращаться типа: ЧегоНашли.Рек1 ЧегоНашли.Рек2 Но что-то не работает такое извращение :( |
|||
1
Смотрящий
02.09.21
✎
19:05
|
(0) В форме списка справочника на первую колонку функцию вешай, во вторую, третью и т.д. колонки пиши переменные, переменные заполняй в функции
|
|||
2
Злопчинский
02.09.21
✎
19:07
|
(0) см. по п.1
знал бы типовые - давно бы сделал, так как в п.1 написано сделано в Типовой ТиС в форме подбора номенклатуры. |
|||
3
IgorA100
02.09.21
✎
19:15
|
(1) (2) На первой колонке висит план раскраски, пробовал вешать на вторую - не работает :(
Ладно, попробую совместить с функцией раскраски. Я уже больше 10лет вообще не касался 1С, а тут приспичило, вот уже полгода как потихоньку ковыряю.. |
|||
4
IgorA100
02.09.21
✎
19:17
|
А, все, кажется понял в чем моя ошибка было......
Попробую - отпишусь. |
|||
5
IgorA100
02.09.21
✎
19:42
|
(1) (2) ОГРОМНОЕ СПАСИБО!
Все прекрасно работает и не в первой колонке. |
|||
6
Злопчинский
02.09.21
✎
21:35
|
(5) Галктико вздохнула с облегчением...
|
|||
7
серый КТУЛХУ
02.09.21
✎
21:51
|
про кэш-тз с таймаутами с автообновленем по времени в отдельной колонке - никто не подсказывал еще?..
а, ну и ладненько. |
|||
8
Злопчинский
03.09.21
✎
00:05
|
(7) это про что/как? разверни баян!
|
|||
9
IgorA100
03.09.21
✎
00:55
|
(6) Типа того, но... на очень короткое время...
Сейчас не могу побороть глюк, когда НЕ видится имя таблицы печатной формы. ЗЫ: Вынести Т = СоздатьОбъект("Таблица"); Т.ИсходнаяТаблица(ИмяТаблицы); в "ПриОткрытии()" не предлагать (там то оно работает) А мне нужно в цикле создавать и отображать новые таблицы. У меня запускается обработка складов по списку, при обработке каждого склада формируется две таблицы, которые нужно отобразить. После формирования таблицы формируется и проводится документ. Так вот, если документ НЕ провелся (ошибка), то появляется глюк с не найденной таблицей. Если провелся - проблем нет. Бред какой-то... (7) Я и не слышал про это. Можно меня "пальцем ткнуть" ? :) |
|||
10
Злопчинский
03.09.21
✎
01:45
|
(9) недавно у меня тоже наткунлся. как починил не помню. и из-за чего это - не помню, забыл, Ёпрст пояснит если только. Плюс порыщи здесь по формум, этот вопрос подымался по-моему отдельнйо веткой как-то, там были расследования.
попробуй сделай Т глобальной в модуле формы. с работой в процедуре "ПриОткрытии" (и в формексовских ПослеОткрытия и ПриСоздании) есть "глюки/фичи" (особливо когда из этой процедуры надо открыть другую форму, когда эта дочерняя форма открывается модально - там есть определенные траблы, когда писал фейсы для ТСД - приходилось извращаться. . так вот - в ряде случаев - может и в твоем поможет такой маневр: . в ПриОткрытии() сделай мин.необходимые дейстия, и запусти типа Форма.ОбработкаОжидания("ТвояПроцедура",1); далее Процедура ТвояПроцедура() Форма.ОбработкаОжидания("",0); //здесь делаем что нужно //заодно на форме счетчик процесса обновляем |
|||
11
серый КТУЛХУ
03.09.21
✎
01:52
|
(8): переменная модуля - КэшТЗ. и переменная модуля - КэшСЗ (индекс для КэшТЗ).
в КэшТЗ колоки: ТМЦ, дата+время (в виде числа ГГГГММДДччммсс), и по колонке на каждую расчетную колонку. 1. во первой расчетной колонке функция формулы делает вотето: ТекДатаВремя = Число(Формат(ТекущаяДата(),"ДГГГГММДД")+СтрЗаменить(Прав("00"+ТекущееВремя(),8),":","")); НомСтрКэш = Число(КэшСЗ.Получить(ТекущийЭлемент.ПолныйКод()); Если НомСтрКэш = 0 Тогда КэшТЗ.НоваяСтрока(); КэшТЗ.ТМЦ = ТекущийЭлемент(); КэшТЗ.ДатаВремя = 10000000000000; КэшСЗ.Установить(КэшТЗ.ТМЦ.ПолныйКод(),КэшТЗ.НомерСтроки); Иначе КэшТЗ.ПолучитьСтрокуПоНомеру() КонецЕсли; Если ТекДатаВремя > КэшТЗ.ДатаВремя + ИнтервалОбновленияСек Тогда // рассчитать все расчетные колонки КэшТЗ.<РасчетныеКолонки> КэшТЗ.ДатаВремя = Число(Формат(ТекущаяДата(),"ДГГГГММДД")+СтрЗаменить(Прав("00"+ТекущееВремя(),8),":","")); КонецЕсли; и тупо дернуть и вернуть что нужно показывать в первой колонке а в остальных колонках функция формулы делает топо: Возврат КэшТЗ.<ЧоТамНадоДляЭтойКолонки> |
|||
12
серый КТУЛХУ
03.09.21
✎
01:53
|
Иначе КэшТЗ.ПолучитьСтрокуПоНомеру(НомСтрКэш) КонецЕсли; //конечно же прдн
|
|||
13
Злопчинский
03.09.21
✎
01:55
|
(11) а, то есть для расчетных колонок просто кэширует с таймаутом?
|
|||
14
серый КТУЛХУ
03.09.21
✎
02:13
|
(13): именно.
|
|||
15
серый КТУЛХУ
03.09.21
✎
02:21
|
(13): я там у себя еще переменную модуля ТекНомерСтрокиПроверкиКэша добавлял, в 1 ее инициализировал, и по обработке ожидания: локальный счетчик проверок инициализировать в нуль, и цикл пока локальный счетчик проверок не превысит лимит: ТекНомерСтрокиПроверкиКэша=ТекНомерСтрокиПроверкиКэша+1, КэшТЗ.ПолучитьСтрокуПоНомеру(ТекНомерСтрокиПроверкиКэша), проверить таймаут и если надо - перерассчитать ...
эта беда отрабатывает только при ездействии и потихоньку перелопачивает и обновляет кэш.. там даже совсем маленький лимит строк для пересчета (до десяти) на таймауте 2-3 секунды - совершенно незаметно и эффективно пересчитывает. мек было тогда не жалко сервер нашгружать, да... |
|||
16
IgorA100
03.09.21
✎
10:37
|
(10) Так у меня вообще процедура формирования таблиц по кнопке с формы запускается. Без модальных режимов, без всякого навороченного. Т.е. чистая классика.
Переменную пробовал делать и глобальной для модуля и локальной для процедуры - пофиг. Пробовал даже такой изврат: Т = ПолучитьТаблицу("ОстаткиПоСкладу"); Функция ПолучитьТаблицу(ИмяТаблицы) Перем Т, ТТ; Т = СоздатьОбъект("Таблица"); Т.ИсходнаяТаблица(ИмяТаблицы); Попытка Т.ИсходнаяТаблица(ИмяТаблицы); Возврат Т; Исключение ТТ = СоздатьОбъект("Таблица"); ТТ.ИсходнаяТаблица(ИмяТаблицы); Возврат ТТ; КонецПопытки; КонецФункции // ПолучитьТаблицу(ИмяТаблицы) Не помогает. Еще раз алгоритм: Открывается форма, далее заполняются склады для обработки и дата на форме обработки. В цикле перебираем список складов и запускаем процедуру анализа складов. В начале этой процедуре выполняется Т = СоздатьОбъект("Таблица"); Т.ИсходнаяТаблица(ИмяТаблицы); Т.е. для каждого склада нужна своя таблица. Дале в процедуре идет цикл анализа номенклатуры. После цикла анализа номенклатуры запускается процедура формирования и проведения документа. Так вот если документ проводится - проблем нет и при следующем цикла таблица инициализируется, а если документ не проводится - то ИНОГДА!!! возникает ошибка с ненайденной таблицей. |
|||
17
IgorA100
03.09.21
✎
10:39
|
(16) Т = ПолучитьТаблицу("ОстаткиПоСкладу"); Конечно так =>: Табл = ПолучитьТаблицу("ОстаткиПоСкладу");
|
|||
18
IgorA100
03.09.21
✎
14:01
|
Что более интересно:
1. Если после ошибки проведения провести документ, то проблем нет. 2. Проведение доков вообще убрал в отдельную процедуру, т.е. если раньше формировался документ, записывался и проводился в одном месте, то сейчас формирую список доков, затем вызываю другую процедуру в которой проводу доки - глюк остается. 3. Если я по очереди обрабатываю склады (руками на форме выбираю по одному, а не по несколько), то проблемы нет. Т.е. физическое жмаканье по кнопе формы с вызовом функции или вызов той-же процедуры из цикла модуля формы имеют, в данном случае, разное поведение! Ощущение, что после ошибки проведения что-то не то происходит с формой обработки. Форма.Обновить() не помогает. Бред какой-то.... |
|||
19
Mikeware
03.09.21
✎
14:11
|
(18) ну тогда "что ж показывайте своего друга"©
выкладывай на какую-нибудь файлопомойку |
|||
20
IgorA100
03.09.21
✎
14:31
|
(19) В обработке "черт ногу сломит" :) Она под комплексную с изменением. Т.е. если только просто код посмотреть, запустить на другой конфе ее будет не реально.
Я попробую почистить ее немного и тогда уж выложить. |
|||
21
IgorA100
03.09.21
✎
14:38
|
(19) Хотя, блин, у меня же еще всякие классы (мульен..) подгружаются в конфе. Это мне уже тогда надо новую конфу делать со всеми классами и т.п....
|
|||
22
IgorA100
03.09.21
✎
15:22
|
(19) Сделал обработку без всякого мусора, которая глючит и на типовой комплексной.
https://disk.yandex.ru/d/TuZB_872HOh69w В процедуре Сформировать() нужно указать коды двух любых фирм имеющихся в конфигурации. Остальное все должно быть понятно. |
|||
23
Злопчинский
03.09.21
✎
16:19
|
(22) на ТиСе работать должна?
|
|||
24
IgorA100
03.09.21
✎
16:25
|
(23) Если там есть ф-ция "глЗаполнитьШапку", то будет.
|
|||
25
Злопчинский
03.09.21
✎
16:29
|
(22) Трабл воспроизводится
|
|||
26
IgorA100
03.09.21
✎
16:30
|
(25) Че, правда?????????
Я уже и запрос выкинул, и промежуточную процедуру. Все выкинул, все равно глючит... Т.е. это не у меня маразм произошел? |
|||
27
IgorA100
03.09.21
✎
16:32
|
Вот совсем минимальный код, который на любой платформе запустится
https://disk.yandex.ru/d/3xYK0xpOuri5dg Ну не может его так колбасить... Не может.... |
|||
28
Злопчинский
03.09.21
✎
16:36
|
та работает
Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ОстаткиПоСкладу"); Для ъ=1 По О.РазмерСписка() Цикл ТекОбъект = О.ПолучитьЗначение(ъ); ОстаткиПоСкладу(ТекОбъект); КонецЦикла; |
|||
29
Злопчинский
03.09.21
✎
16:37
|
если впихнуть внутрь цикла - ломается
|
|||
30
IgorA100
03.09.21
✎
16:38
|
(28) Так то да.
НО, мне внутри цикла нужна новая таблица, а в этом случае все просто перезапишется в старой.... |
|||
31
IgorA100
03.09.21
✎
16:40
|
(29) Да блин, с какого перепуга ломается все если док не провелся.... неужели это старинный глюк про который особо никто и не знал...
И если в цикле ломается создание новой таблицы, то как мне в цикле получать новые таблицы? |
|||
32
Злопчинский
03.09.21
✎
16:45
|
почему - вот хз...
как обойти - это понятно. |
|||
33
Злопчинский
03.09.21
✎
16:45
|
но осадочек остался...
|
|||
34
Злопчинский
03.09.21
✎
16:46
|
вынеси макет во внешний моксель, типа так
Таб.ИсходнаяТаблица(КаталогИБ()+"таблица1.mxl"); . благодарить можно лобызанием ступней... ;-) |
|||
35
Злопчинский
03.09.21
✎
16:48
|
(31) второй вариант обхода - сделай Таб.ИсходнаяТаблица(ТутВстроенныйМакет); перед циклом, будет все выводится в одну ТАб.
|
|||
36
IgorA100
03.09.21
✎
16:50
|
(34) Попробую с внешним макетом.
(35) В одной таблице - не вариант... Я еще попробовал перед циклом заранее наклепать пустых таблиц в СЗ, а затем в цикле из СЗ их получать, работает.. Но все это какие-то извращения.... |
|||
37
IgorA100
03.09.21
✎
20:23
|
Кстати, еще заметил, что если ВКЛЮЧЕНО комментирование действий и ОТКРЫТО окно с комментариями, то глюк НЕ проявляется!
|
|||
38
Злопчинский
03.09.21
✎
21:10
|
(37) где-то что-то внутрях ломается, теряется контекст какой-то... Ёпрст нужен, он все знает
|
|||
39
Смотрящий
03.09.21
✎
21:24
|
(25) Не воспроизводится
|
|||
40
Смотрящий
03.09.21
✎
21:36
|
Аоспроизводится (
|
|||
41
Злопчинский
03.09.21
✎
22:44
|
(37) кста, интересно.
а если запуститься без дополнительных ВК...? |
|||
42
IgorA100
03.09.21
✎
23:12
|
(41) Так а в чистой комплексной и так вроде ничего из ВК не грузится, разве что может 1с++...
(38) Угу. И не хочется выносить mxl и не хочется сразу создавать массив объектов таблиц, т.к. в реальности у меня две таблицы читаются и для второй я заранее не знаю сколько таблиц будет. Полсотни создавать с запасов - как-то коряво это... Плохо, что нет возможности скопировать сам объект. Вот можно было бы так: Создал таблицу Таб, использовал метод ИсходнаяТаблица и написал бы Таб1 = Таб, а потом Таб1 бы и заполнял, потом Таб2 = Таб. Но фига.... |
|||
43
IgorA100
03.09.21
✎
23:31
|
ААааааа.....
ЕСТЬ РЕШЕНИЕ!!! После открытия создаем объект "Сервис" Далее в цикла просто вызываем процедуру через сервис: Сервис.ВыполнитьПроцедуру(глВзятьКонтекст(Контекст),"ОстаткиПоСкладу",ТекОбъект); Вуаля.... Все работает!!! Глюк не воспроизводится, контекст не теряется! |
|||
44
IgorA100
03.09.21
✎
23:50
|
(43) Только метод "ВыполнитьПроцедуру" не понимает передачу одного параметра в выполняемую процедуру, нужно даже при одном параметре передавать список из этого одного параметра, но это фигня, пара лишних строк кода...
|
|||
45
Злопчинский
04.09.21
✎
00:08
|
(42) "И не хочется выносить mxl"
- а по мне это как раз самое правильное решение (безотносительно к данной проблеме) |
|||
46
Злопчинский
04.09.21
✎
00:10
|
(42) "Плохо, что нет возможности скопировать сам объект.
Вот можно было бы так: Создал таблицу Таб, использовал метод ИсходнаяТаблица и написал бы Таб1 = Таб, а потом Таб1 бы и заполнял, потом Таб2 = Таб. Но фига...." чето мутно как-то . опиши попроще и доступнее что ты хочешь скопировать имеем один макет. и что мы хотим сделать? |
|||
47
Злопчинский
04.09.21
✎
00:11
|
(43) совершенно излишне. достаточно из внешнего макета загрузить...
|
|||
48
IgorA100
04.09.21
✎
00:32
|
(46)
Таб = СоздатьОбъект("Таблица"); - я создал объект. Таб.ИсходнаяТаблица("ОстаткиПоСкладу"); - модифицировал объект методом. В итоге у меня есть модифицированный объект "Таб". Я хочу его "размножить". Я пишу: Таб1 = Таб. Таб2 = Таб. По идее у меня должно быть три объекта, но у меня по факту 1 объект "Таб" и + две ссылки на него "Таб1" и "Таб2" Далее - Я чего-то делаю с Таб1 и с Таб2.... Далее: Таб1.Показать() - должен отобразиться объект "Таб1" Таб2.Показать() - должен отобразиться объект "Таб2" В реальности же отобразится "Таб" Это как в ООП. А тут похоже такого нет... (47) Как раз не излишество. Если я захочу перетащить обработку в другое место, мне нужно еще и про макет не забыть, а если пройдет пару лет и я про макет забуду и он удалится ? Или мне макет изменить надо через год-два-три и я буду вспоминать, почему-же у меня изменения таблицы из формы никак не повлияло на результат, или, если таблицы в форме вообще не будет, мне надо вспоминать, почему так получилось и анализировать код. А если таблиц 3-5 ? Не удобно, это уже как совсем "крайний вариант"... |
|||
49
IgorA100
04.09.21
✎
00:35
|
(45) Ну тут может дело привычки, не знаю... Как по мне, помнить десятки макетов где лежат и к чему относятся - лишние затраты мозговой деятельности :) Можно именам макетов давать имена обработок + суффиксы и хранить всегда рядом друг с другом, но к этому нужно привыкать...
Для меня все хранить в одном файле - привычней. |
|||
50
Злопчинский
04.09.21
✎
00:44
|
(49) "Для меня все хранить в одном файле - привычней."
в контексте проблемы: в макете храни блобом сам макет при запуске обработки - смотрим есть ли внешний макет? если нет - распаковываем из себя из макета-блоба внешний макет и кладем его во внешний файл. ;-) . так например продвинутые любят 1С++, формекс ипрочие ВК втихую устанавливать из-под себя ;-) |
|||
51
IgorA100
04.09.21
✎
00:51
|
(50) УУуу.... какой хитрый :) В общем-то да, такой вариант имеет право на жизнь, но! Или править нужно два макета, или перед/после правки встроенного, нужно не забыть "прибить" внешний ;)
|
|||
52
Злопчинский
04.09.21
✎
00:53
|
(51) фигня! зато сколько возможностей! ;-)
|
|||
53
IgorA100
04.09.21
✎
01:00
|
(52) А в чем, глобально, преимущество? Кроме избегания глюкавости?
|
|||
54
Ёпрст
04.09.21
✎
11:36
|
(27)
//Перем Таб; Эффект не воспроизводится. И не зависит , провелся документ или нет. |
|||
55
Злопчинский
04.09.21
✎
11:38
|
(54) а почему если раскомментарить - ломается? что не так?
|
|||
56
IgorA100
04.09.21
✎
12:36
|
(54) Только что проверил - у меня воспроизводится и с закомментированной переменной.
Комментирование действий выключено7 со включенным комментированием и открытым окном комментариев глюк не воспроизводится. |
|||
57
Злопчинский
04.09.21
✎
12:53
|
(56) аналогично.
Если закомментарить переменную модуля - все равно воспроизводится. |
|||
58
Злопчинский
04.09.21
✎
12:54
|
отключил загрузку всех ВК - не помогло...
|
|||
59
IgorA100
04.09.21
✎
12:57
|
(58) Ёпрст - шаман, и у него шаманский компьютер :)
Ждем его для продолжения воспроизведений бага |
|||
60
victuan1
06.09.21
✎
06:44
|
(31) Да, это старинный глюк платформы - теряется контекст таблиц текущей формы, если вызывать другую форму, в которой используется Таблица с отображением совместно с диалогом (не обязательно в Режиме ввода данных).
Именно такая форма с такой таблицей открывается при трассировке проведения документа в типовых конфах (встроенная обработка Трассировка). Вот модифицировал пример - https://disk.yandex.ru/d/qOcnhgLbEWnSUg Вместо проведения дока сделал просто вызов внешней обработки Тест.ert, в которой используется такая Таблица - она всё ломает. Можно использовать на любой конфе, в т.ч. нетиповой и пустой. Процедура СформироватьПеремещение() Перем Путь,Имя; РасположениеФайла(Путь,Имя); ОткрытьФорму("Отчет",,Путь+"Тест.ert"); //Док = СоздатьОбъект("Документ.ПеремещениеТМЦ"); //Док.Новый(); //Док.ДатаДок = ВыбКонПериода; //Док.УстановитьВремя(23,59,59); //Док.УстановитьНовыйНомер(); //Док.Записать(); //Док.Провести(); КонецПроцедуры // СформироватьПеремещение(ТаблицаДвижений, Запрос.Склад) |
|||
61
Злопчинский
06.09.21
✎
07:41
|
(60) "Именно такая форма с такой таблицей открывается при трассировке проведения документа в типовых конфах (встроенная обработка Трассировка)."
- у мен ятрассировка не включается, инфо о непроведении документа а табло выводится. все равно ломается. а в (39) "Кстати, еще заметил, что если ВКЛЮЧЕНО комментирование действий и ОТКРЫТО окно с комментариями, то глюк НЕ проявляется!" . т.е. как-то все наоборот? если трассировка включена - то все работает... |
|||
62
Злопчинский
06.09.21
✎
07:46
|
(60) проверил по мод.примеру - да, ломается.
|
|||
63
Злопчинский
06.09.21
✎
07:47
|
Я натыкался на такую ошибку когда никаких сообщений/манипуляцийкак вмо.примере не использовалось...
|
|||
64
Ёпрст
06.09.21
✎
08:51
|
(60)
Да уж. Таб.ИсходнаяТаблица("ОстаткиПоСкладу",РасположениеФайла()); //Чудо! Глюкак нет..правда, формекс нужен. |
|||
65
Злопчинский
06.09.21
✎
12:14
|
(64) млин, застрелиться и не жить!
. Спасибо тебе, премудрый Ёпрст, что не оставляешь нас, сирых и убогих клюшечников, своей милостью! Будем молиться за твое здравие! |
|||
66
IgorA100
06.09.21
✎
13:49
|
(64) Красивое решение! И проще, чем мое предложенное тут (43) с использованием запуска процедуры через "Сервис"
Действительно работает, СПАСИБО! Блин, читал доку по Формексу, но как-то не обратил внимания на доп. параметр "Путь", который указывает где искать таблицу. (61) Это видно как-то связано с тем, что форма уже открыта! Т.е. ломается при попытке открытия другой формы, IMHO. Могу быть и не прав. |
|||
67
IgorA100
06.09.21
✎
13:50
|
(65) Поддерживаю :)
|
|||
68
IgorA100
07.09.21
✎
15:02
|
Да, с контекстом наблюдается "задница" и в других случаях...
Например, из документа вызывается глобальная процедура (передать туда документ конечно можно, но нужно перелопатить ХХ вызовов процедуры) и из этой процедуры я хочу получить контекст документа, я пишу: К = глВзятьКонтекст(Контекст); И в итоге а "К" пустота (а ИНОГДА, так получается получить контекст), при этом, если я в отладчике выполняю глВзятьКонтекст(Контекст), то контекст без проблем получаю. Во как... |
|||
69
Злопчинский
07.09.21
✎
18:23
|
(68) ну, с этимм не разу не сталкивался, вроде всегда контекст брало норм.
К = глВзятьКонтекст(Контекст); - надо делать до передачи "К" в процедуру |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |