Имя: Пароль:
1C
1C 7.7
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) ну, с этимм не разу не сталкивался, вроде всегда контекст брало норм.
К = глВзятьКонтекст(Контекст); - надо делать до передачи "К" в процедуру
Закон Брукера: Даже маленькая практика стоит большой теории.