Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Форма списка справочника, Идентификатор тестового поля для дальнейшего расчета

v7: Форма списка справочника, Идентификатор тестового поля для дальнейшего расчета
Я
   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 написано сделано в Типовой ТиС в форме подбора номенклатуры.
   IgorA100
 
3 - 02.09.21 - 19:15
(1) (2) На первой колонке висит план раскраски, пробовал вешать на вторую - не работает :(
Ладно, попробую совместить с функцией раскраски.

Я уже больше 10лет вообще не касался 1С, а тут приспичило, вот уже полгода как потихоньку ковыряю..
   IgorA100
 
4 - 02.09.21 - 19:17
А, все, кажется понял в чем моя ошибка было......
Попробую - отпишусь.
   IgorA100
 
5 - 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) это про что/как? разверни баян!
   IgorA100
 
9 - 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 секунды - совершенно незаметно и эффективно пересчитывает. мек было тогда не жалко сервер нашгружать, да...
   IgorA100
 
16 - 03.09.21 - 10:37
(10) Так у меня вообще процедура формирования таблиц по кнопке с формы запускается. Без модальных режимов, без всякого навороченного. Т.е. чистая классика.
Переменную пробовал делать и глобальной для модуля и локальной для процедуры - пофиг. Пробовал даже такой изврат:
        Т = ПолучитьТаблицу("ОстаткиПоСкладу");

Функция ПолучитьТаблицу(ИмяТаблицы)
    Перем Т, ТТ;
    Т = СоздатьОбъект("Таблица");
    Т.ИсходнаяТаблица(ИмяТаблицы);
    Попытка
        Т.ИсходнаяТаблица(ИмяТаблицы);
        Возврат Т;
    Исключение
        ТТ = СоздатьОбъект("Таблица");
        ТТ.ИсходнаяТаблица(ИмяТаблицы);
        Возврат ТТ;
    КонецПопытки;
КонецФункции    // ПолучитьТаблицу(ИмяТаблицы)

Не помогает.

Еще раз алгоритм:
Открывается форма, далее заполняются склады для обработки и дата на форме обработки.
В цикле перебираем список складов и запускаем процедуру анализа складов. В начале этой процедуре выполняется 
    Т = СоздатьОбъект("Таблица");
    Т.ИсходнаяТаблица(ИмяТаблицы);
Т.е. для каждого склада нужна своя таблица.
Дале в процедуре идет цикл анализа номенклатуры.
После цикла анализа номенклатуры запускается процедура формирования и проведения документа. Так вот если документ проводится - проблем нет и при следующем цикла таблица инициализируется, а если документ не проводится - то ИНОГДА!!! возникает ошибка с ненайденной таблицей.
   IgorA100
 
17 - 03.09.21 - 10:39
(16) Т = ПолучитьТаблицу("ОстаткиПоСкладу"); Конечно так =>: Табл = ПолучитьТаблицу("ОстаткиПоСкладу");
   IgorA100
 
18 - 03.09.21 - 14:01
Что более интересно:
1. Если после ошибки проведения провести документ, то проблем нет.
2. Проведение доков вообще убрал в отдельную процедуру, т.е. если раньше формировался документ, записывался и проводился в одном месте, то сейчас формирую список доков, затем вызываю другую процедуру в которой проводу доки - глюк остается.
3. Если я по очереди обрабатываю склады (руками на форме выбираю по одному, а не по несколько), то проблемы нет. Т.е. физическое жмаканье по кнопе формы с вызовом функции или вызов той-же процедуры из цикла модуля формы имеют, в данном случае, разное поведение!
Ощущение, что после ошибки проведения что-то не то происходит с формой обработки. Форма.Обновить() не помогает.
Бред какой-то....
   Mikeware
 
19 - 03.09.21 - 14:11
(18) ну тогда "что ж показывайте своего друга"©
выкладывай на какую-нибудь файлопомойку
   IgorA100
 
20 - 03.09.21 - 14:31
(19) В обработке "черт ногу сломит" :) Она под комплексную с изменением. Т.е. если только просто код посмотреть, запустить на другой конфе ее будет не реально.
Я попробую почистить ее немного и тогда уж выложить.
   IgorA100
 
21 - 03.09.21 - 14:38
(19) Хотя, блин, у меня же еще всякие классы (мульен..) подгружаются в конфе. Это мне уже тогда надо новую конфу делать со всеми классами и т.п....
   IgorA100
 
22 - 03.09.21 - 15:22
(19) Сделал обработку без всякого мусора, которая глючит и на типовой комплексной.
https://disk.yandex.ru/d/TuZB_872HOh69w
В процедуре Сформировать() нужно указать коды двух любых фирм имеющихся в конфигурации.
Остальное все должно быть понятно.
   Злопчинский
 
23 - 03.09.21 - 16:19
(22) на ТиСе работать должна?
   IgorA100
 
24 - 03.09.21 - 16:25
(23) Если там есть ф-ция "глЗаполнитьШапку", то будет.
   Злопчинский
 
25 - 03.09.21 - 16:29
(22) Трабл воспроизводится
   IgorA100
 
26 - 03.09.21 - 16:30
(25) Че, правда?????????
Я уже и запрос выкинул, и промежуточную процедуру. Все выкинул, все равно глючит...
Т.е. это не у меня маразм произошел?
   IgorA100
 
27 - 03.09.21 - 16:32
Вот совсем минимальный код, который на любой платформе запустится
https://disk.yandex.ru/d/3xYK0xpOuri5dg

Ну не может его так колбасить... Не может....
   Злопчинский
 
28 - 03.09.21 - 16:36
та работает
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("ОстаткиПоСкладу");
    
    Для ъ=1 По О.РазмерСписка() Цикл
        ТекОбъект = О.ПолучитьЗначение(ъ);
        ОстаткиПоСкладу(ТекОбъект);
    КонецЦикла;
   Злопчинский
 
29 - 03.09.21 - 16:37
если впихнуть внутрь цикла - ломается
   IgorA100
 
30 - 03.09.21 - 16:38
(28) Так то да.
НО, мне внутри цикла нужна новая таблица, а в этом случае все просто перезапишется в старой....
 
 
   IgorA100
 
31 - 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) второй вариант обхода - сделай Таб.ИсходнаяТаблица(ТутВстроенныйМакет); перед циклом, будет все выводится в одну ТАб.
   IgorA100
 
36 - 03.09.21 - 16:50
(34) Попробую с внешним макетом.
(35) В одной таблице - не вариант...
Я еще попробовал перед циклом заранее наклепать пустых таблиц в СЗ, а затем в цикле из СЗ их получать, работает..
Но все это какие-то извращения....
   IgorA100
 
37 - 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) кста, интересно.
а если запуститься без дополнительных ВК...?
   IgorA100
 
42 - 03.09.21 - 23:12
(41) Так а в чистой комплексной и так вроде ничего из ВК не грузится, разве что может 1с++...
(38) Угу. И не хочется выносить mxl и не хочется сразу создавать массив объектов таблиц, т.к. в реальности у меня две таблицы читаются и для второй я заранее не знаю сколько таблиц будет. Полсотни создавать с запасов - как-то коряво это...
Плохо, что нет возможности скопировать сам объект.
Вот можно было бы так: Создал таблицу Таб, использовал метод ИсходнаяТаблица и написал бы Таб1 = Таб, а потом Таб1 бы и заполнял, потом Таб2 = Таб. Но фига....
   IgorA100
 
43 - 03.09.21 - 23:31
ААааааа.....
ЕСТЬ РЕШЕНИЕ!!!
После открытия создаем объект "Сервис"
Далее в цикла просто вызываем процедуру через сервис:         
Сервис.ВыполнитьПроцедуру(глВзятьКонтекст(Контекст),"ОстаткиПоСкладу",ТекОбъект);

Вуаля.... Все работает!!! Глюк не воспроизводится, контекст не теряется!
   IgorA100
 
44 - 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) совершенно излишне. достаточно из внешнего макета загрузить...
   IgorA100
 
48 - 04.09.21 - 00:32
(46)
Таб = СоздатьОбъект("Таблица"); - я создал объект.
Таб.ИсходнаяТаблица("ОстаткиПоСкладу"); - модифицировал объект методом.
В итоге у меня есть модифицированный объект "Таб".
Я хочу его "размножить".
Я пишу:
Таб1 = Таб.
Таб2 = Таб.
По идее у меня должно быть три объекта, но у меня по факту 1 объект "Таб" и + две ссылки на него "Таб1" и "Таб2"
Далее - Я чего-то делаю с Таб1 и с Таб2....
Далее:
Таб1.Показать() - должен отобразиться объект "Таб1"
Таб2.Показать() - должен отобразиться объект "Таб2"
В реальности же отобразится "Таб"
Это как в ООП.
А тут похоже такого нет...
(47) Как раз не излишество. Если я захочу перетащить обработку в другое место, мне нужно еще и про макет не забыть, а если пройдет пару лет и я про макет забуду и он удалится ? Или мне макет изменить надо через год-два-три и я буду вспоминать, почему-же у меня изменения таблицы из формы никак не повлияло на результат, или, если таблицы в форме вообще не будет, мне надо вспоминать, почему так получилось и анализировать код. А если таблиц 3-5 ? Не удобно, это уже как совсем "крайний вариант"...
   IgorA100
 
49 - 04.09.21 - 00:35
(45) Ну тут может дело привычки, не знаю... Как по мне, помнить десятки макетов где лежат и к чему относятся - лишние затраты мозговой деятельности :) Можно именам макетов давать имена обработок + суффиксы и хранить всегда рядом друг с другом, но к этому нужно привыкать...
Для меня все хранить в одном файле - привычней.
   Злопчинский
 
50 - 04.09.21 - 00:44
(49) "Для меня все хранить в одном файле - привычней."
в контексте проблемы: в макете храни блобом сам макет
при запуске обработки - смотрим есть ли внешний макет? если нет - распаковываем из себя из макета-блоба внешний макет и кладем его во внешний файл. ;-)
.
так например продвинутые любят 1С++, формекс ипрочие ВК втихую устанавливать из-под себя ;-)
   IgorA100
 
51 - 04.09.21 - 00:51
(50) УУуу.... какой хитрый :) В общем-то да, такой вариант имеет право на жизнь, но! Или править нужно два макета, или перед/после правки встроенного, нужно не забыть "прибить" внешний ;)
   Злопчинский
 
52 - 04.09.21 - 00:53
(51) фигня! зато сколько возможностей! ;-)
   IgorA100
 
53 - 04.09.21 - 01:00
(52) А в чем, глобально, преимущество? Кроме избегания глюкавости?
   Ёпрст
 
54 - 04.09.21 - 11:36
(27)
//Перем Таб;


Эффект не воспроизводится.
И не зависит , провелся документ или нет.
   Злопчинский
 
55 - 04.09.21 - 11:38
(54) а почему если раскомментарить - ломается? что не так?
   IgorA100
 
56 - 04.09.21 - 12:36
(54) Только что проверил - у меня воспроизводится и с закомментированной переменной.
Комментирование действий выключено7 со включенным комментированием и открытым окном комментариев глюк не воспроизводится.
   Злопчинский
 
57 - 04.09.21 - 12:53
(56) аналогично.
Если закомментарить переменную модуля - все равно воспроизводится.
   Злопчинский
 
58 - 04.09.21 - 12:54
отключил загрузку всех ВК - не помогло...
   IgorA100
 
59 - 04.09.21 - 12:57
(58) Ёпрст - шаман, и у него шаманский компьютер :)
Ждем его для продолжения воспроизведений бага
   victuan1
 
60 - 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) млин, застрелиться и не жить!
.
Спасибо тебе, премудрый Ёпрст, что не оставляешь нас, сирых и убогих клюшечников, своей милостью!
Будем молиться за твое здравие!
   IgorA100
 
66 - 06.09.21 - 13:49
(64) Красивое решение! И проще, чем мое предложенное тут (43) с использованием запуска процедуры через "Сервис"
Действительно работает, СПАСИБО!
Блин, читал доку по Формексу, но как-то не обратил внимания на доп. параметр "Путь", который указывает где искать таблицу.
(61) Это видно как-то связано с тем, что форма уже открыта! Т.е. ломается при попытке открытия другой формы, IMHO. Могу быть и не прав.
   IgorA100
 
67 - 06.09.21 - 13:50
(65) Поддерживаю :)
   IgorA100
 
68 - 07.09.21 - 15:02
Да, с контекстом наблюдается "задница" и в других случаях...
Например, из документа вызывается глобальная процедура (передать туда документ конечно можно, но нужно перелопатить ХХ вызовов процедуры) и из этой процедуры я хочу получить контекст документа, я пишу:
К = глВзятьКонтекст(Контекст);
И в итоге а "К" пустота (а ИНОГДА, так получается получить контекст), при этом, если я в отладчике выполняю глВзятьКонтекст(Контекст), то контекст без проблем получаю. Во как...
   Злопчинский
 
69 - 07.09.21 - 18:23
(68) ну, с этимм не разу не сталкивался, вроде всегда контекст брало норм.
К = глВзятьКонтекст(Контекст); - надо делать до передачи "К" в процедуру


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.