![]() |
![]() |
![]() |
|
Порча контекста дока при Таб.Показать(,,-1) | ☑ | ||
---|---|---|---|---|
0
andrewks
09.07.11
✎
13:51
|
Суть в следующем:
есть Док1, в ТЧ которого есть документы вида Заявка. есть внеш.печ.форма у Док1, куда передаётся контекст этого дока в ней идёт цикл по ТЧ, в котором у каждого дока Заявка ищется подчинённый док Накладная, и если он найден, то вызывается внеш.печ.форма уже у дока Накладная. там идёт печать на принтер с предпросмотром и показом диалога печати, т.е. так: ИсхТабл.Показать(глНазваниеДокументаВжурнале(Докум),"",1); ИсхТабл.Напечатать(1); ИсхТабл.Показать(,,-1); так вот, после выполнения третьей строчки инициированная в цикле выборка ТЧ контекста Док1 сбивается, т.е. после 2-й строки может несколько раз повториться опять 2-я строка, потом может на 1-ю перейти, потом опять на 2-ю и так до бесконечности при отсутствии этой строчки всё ок. если выборку ТЧ делаем не у контекста Док1, а у объекта типа Документ, то с этой строчкой работает нормально. сам контекст вроде явно не портится, но вот выборка сбивается. никто не сталкивался с таким? |
|||
1
1Сергей
09.07.11
✎
14:06
|
может там в таблице чего-то заумное?
|
|||
2
andrewks
09.07.11
✎
14:10
|
(1) например? никаких картинок и прочих объектов. да и выскакивает только при закрытии таблицы. если оставлять - всё ок.
только мусор этот потом не нужен. пока решил ч/з замену обработки контекста на объект Документ |
|||
3
Сияющий Асинхраль
09.07.11
✎
14:26
|
(2) Это старая фича семерки, просто лучше одновременно из разных объектов не печатать
|
|||
4
andrewks
09.07.11
✎
14:32
|
(3) не сталкивался.
во внеш.печ.форме Док1 я ничего не печатаю, это я её просто обозвал так, это просто обычная обработка, а вот из неё я уже дёргаю внеш печ формы |
|||
5
Злопчинский
09.07.11
✎
14:35
|
смотри аккуратно работу с контекстами
|
|||
6
1Сергей
09.07.11
✎
14:35
|
(4) а во вторую печатную форму (которая действительно печатная) передаётся контекст Док1 или просто Заявка?
|
|||
7
andrewks
09.07.11
✎
14:36
|
(6) туда перадаётся не Док1 и не Заявка, а другой док, в виде ссылки на объект Документ
|
|||
8
1Сергей
09.07.11
✎
14:39
|
(7) т.е. ты в своей обработке перебираешь строки Док1, потом для каждой заявки ищешь подчиненные накладные и их печатаешь через внеш.печ.обработку. я правильно понял?
|
|||
9
Злопчинский
09.07.11
✎
14:40
|
кидай обработки на e.meil@mail.ru - посмотрим.
|
|||
10
andrewks
09.07.11
✎
14:41
|
(9) щас не могу, да и некогда - надо быстрей закончить и свалить.
вечером дома красиво всё оформлю и выложу. не переключайтесь :) |
|||
11
andrewks
09.07.11
✎
14:42
|
(8) да
|
|||
12
Злопчинский
09.07.11
✎
14:42
|
...хочется что-то глобальнее автоматизировать, корме супермаркетов
|
|||
13
Злопчинский
09.07.11
✎
14:43
|
(10) где вечер, а где я....
|
|||
14
1Сергей
09.07.11
✎
14:44
|
(11) мало кота
|
|||
15
andrewks
09.07.11
✎
17:56
|
вот, оформил.
всё даже проще получилось, прямо в контексте Док1 то же самое получается. http://zalil.ru/31399932 самое интересное - смещение позиции в выборке иногда происходит даже в одном такте цикла (!!!) |
|||
16
TeddySlaf
09.07.11
✎
19:56
|
(15) чёто не повторяются у меня твои баги - все работает нормально, всё по порядку.
Тока по-ходу несколько вопросов - упрёков :) 1). зачем ищещь только первую попавшую накладную в ПодчиненныхДокументах? А если таких накладных будет больше? Это ж возможно. Я б так и шёл циклом по всем найденным накладным, ссылающимся на нужную заявку. Хотя... 2). На всякий случай заполнение всех передаваемых в обработку параметров полностью переместил бы непосредственно к перед вызовом обработки. Т.к. переменная Параметры - она же не только для входных, в нее могут передать и выходные значения.
|
|||
17
andrewks
09.07.11
✎
20:02
|
(16) ты на код особо не зри в плане эффективности и прочего, это я на коленке написал для демонстрации эффекта.
насчёт "чёто не повторяются у меня твои баги - все работает нормально, всё по порядку. " - шозанах? какой релиз? какая ось? проверял на разных компах, релиз 27, системы хрюша и вынь2к3, везде проявляется. ты точно в коде ничего не менял перед запуском? запости, что в окне сообщений выводится |
|||
18
Cthulhu
09.07.11
✎
20:59
|
ВК?
|
|||
19
andrewks
09.07.11
✎
21:09
|
(18) без никаких ВК
|
|||
20
TeddySlaf
09.07.11
✎
21:15
|
(17) ничего не менял.
потом сделал как в (16), добавил еще накладную, сслылающуюся на Заявку1, тоже сделал Печать:
В каждой печатной форме по 5 товаров опо порядку с 1 по 5. XP SP3 (zver), 7.7.025 (1cv7s.exe крякнутая), DBF - :) |
|||
21
andrewks
09.07.11
✎
21:24
|
(20) 27 релиза нет?
|
|||
22
TeddySlaf
09.07.11
✎
21:54
|
(21) ща поставлю.
Дописал ert для обработки документа "Свод" (на основе процедуры Печать из Свода), все-равно всё нормуль. |
|||
23
Злопчинский
09.07.11
✎
21:55
|
Строка № 1, заявка: Заявка 1
Строка № 1, накл: Накладная 1 Строка № 2, заявка: Заявка 2 Строка № 2, накл: Накладная 2 Строка № 3, заявка: Заявка 3 Строка № 3, накл: Накладная 3 Строка № 4, заявка: Заявка 4 Строка № 4, накл: Накладная 4 Строка № 5, заявка: Заявка 5 Строка № 5, накл: Накладная 5 |
|||
24
TeddySlaf
09.07.11
✎
21:56
|
[Code]
Пробую теги форума. а как вставить текст, чтобы он был свернутым, а не портянкой на всю страницу форума? вот через Code в квадратных скобках, может быть? [/Code] |
|||
25
Злопчинский
09.07.11
✎
21:57
|
(15) вот мой результат в (23)
|
|||
26
TeddySlaf
09.07.11
✎
22:00
|
(21) релиз 27. эффект тотже - нормуль! я лишь сообщений добавил, да и процедуру печати из (16) взял
|
|||
27
Злопчинский
09.07.11
✎
22:04
|
где именно в этом коде сбивается У ТЕБЯ выборка?
. ДокНакл=СоздатьОбъект("Документ"); ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл Сообщить("Строка № "+НомерСтроки+", заявка: "+Заявка); Если Заявка.Выбран()=0 Тогда Продолжить; КонецЕсли; Накл=""; ДокНакл.ВыбратьПодчиненныеДокументы(,,Заявка); Пока ДокНакл.ПолучитьДокумент()=1 Цикл Если (ДокНакл.Вид()="Накладная") И (ДокНакл.ПометкаУдаления()=0) Тогда Накл=ДокНакл.ТекущийДокумент(); Прервать; КонецЕсли; КонецЦикла; Если ПустоеЗначение(Накл)=0 Тогда Сообщить("Строка № "+НомерСтроки+", накл: "+Накл); Параметры.Установить("Контекст",Накл); ОткрытьФорму("Отчет", Параметры, КаталогИБ()+"\ExtForms\nakl_print.ert"); КонецЕсли; КонецЦикла; |
|||
28
Злопчинский
09.07.11
✎
22:07
|
в (0) написано:
. есть Док1, в ТЧ которого есть документы вида Заявка. есть внеш.печ.форма у Док1, куда передаётся контекст этого дока . ну вообщем-то тотально неверно написано в (0) и в том коде, который представлен. . в внешнюю печформу не передается ни контекст Док1, ни контекст заявок из ТЧ док1, в впф передается документы-детя Заявок, мало того, передается НЕ КОНТЕКСТ, а ссылка на подчиненный док. |
|||
29
Злопчинский
09.07.11
✎
22:11
|
переформулируй (0) нормальным языком, а то от обилимя Док ТЧ - крышу сносит...
. а приведенный в примере код - отрабатывает нормально и будет нормально, потоому как DGA а примере с контекстом документа СВОД никаким образом не связана |
|||
30
TeddySlaf
09.07.11
✎
22:17
|
(29) дык вот щас попробовал передать из Печати свода не конкретно найденную накладную, а прямо:
а в ert, переместил его поиск накладных этого свода.
результат опять нормальный. |
|||
31
TeddySlaf
09.07.11
✎
22:19
|
(30) +
|
|||
32
Злопчинский
09.07.11
✎
22:23
|
Выборка строк документа СВОД сбиваться не будет, потому как печатная форма, вызываемая в тестовом коде никак с контекстом документа Свод не связана.
. а в (0) надо искать на форме функцию, которая считает какие-то итоги и осуществляет перебор строк документа, при этом инициализация выборки строк документа в прототипе тестового кода - как -то разнесена от выборки строк.. |
|||
33
TeddySlaf
09.07.11
✎
22:24
|
(0) а вообще по работе с ТабличнойЧастью Контекста помню что-то обсуждалось на Мисте.
Тоже бывали какие-то траблы. Вроде советовали делать через Выгрузить/ЗагрузитьТабличнуюЧасть() в таблицуЗначений. И работать уже с таблицей Значений. |
|||
34
TeddySlaf
09.07.11
✎
22:27
|
(32) кстати да, вполне возможно, что там на форме наворочено нечто гремучее.
Отсюда выход: не передавать контекст, а передавать документ - делов-то: написать не Контекс, а ТекущийДокумент(). |
|||
35
andrewks
09.07.11
✎
22:34
|
блин, да ничего не наворочано.
могу дать посмотреть ч/з ammyy admin |
|||
36
andrewks
09.07.11
✎
22:50
|
записал скринплэй http://zalil.ru/31400993
упорно не могу понять, почему проблема выскакивает только у меня |
|||
37
Злопчинский
09.07.11
✎
22:51
|
(34) в этом случае будут проблемы при модификации документа...
|
|||
38
andrewks
09.07.11
✎
22:52
|
(32) ну как же, код начинает выполняться именно в контексте дока Свод.
насчёт наворочанных форм и прочих функций на форме - у меня глючит даже пустая конфа из (15) |
|||
39
Злопчинский
09.07.11
✎
22:55
|
давай тимвьювер ид/пароль на e.meil@mail.ru
|
|||
40
andrewks
09.07.11
✎
22:59
|
(39) замылил
|
|||
41
Злопчинский
09.07.11
✎
23:01
|
пока вставь параллельно этот код
Процедура ПоКнопкеПечать() ДокНакл=СоздатьОбъект("Документ"); ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл Сообщить("Строка № "+НомерСтроки+", заявка: "+Заявка); Если Заявка.Выбран()=0 Тогда Продолжить; КонецЕсли; Накл=""; ДокНакл.ВыбратьПодчиненныеДокументы(Заявка,,Заявка); Пока ДокНакл.ПолучитьДокумент()=1 Цикл Если (ДокНакл.Вид()="Накладная") И (ДокНакл.ПометкаУдаления()=0) Тогда Накл=ДокНакл.ТекущийДокумент(); Сообщить("Строка № "+НомерСтроки+", накл: "+Накл); Прервать; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры |
|||
42
Злопчинский
10.07.11
✎
00:05
|
оборжака!!!!
|
|||
43
Злопчинский
10.07.11
✎
00:06
|
подкючился тимом
я запускаю - у меня все ок он запускает - плохо... не любит его.. ;-) . путем тыканья выяснили как воспроизвести ошибку и впрочих условиях - у меня дома удалось воспроизвести |
|||
44
andrewks
10.07.11
✎
00:06
|
важное дополнение:
глюк воспроизводится только при полнооконном режиме работы внутренних 1совских окошек |
|||
45
Злопчинский
10.07.11
✎
00:07
|
на кнопку печать в приведенном выше контрольном примере надо жмакать - ПРЕДВАРИТЕЛЬНО РАЗВЕРНУВ ФОРМУ ДОКУМЕНТА В ПОЛНОЭКРАННЫЙ РЕЖИМ
|
|||
46
Злопчинский
10.07.11
✎
00:08
|
мое неграмотное имховое мнение - это связано как-то с фокусом (по разному он себя ведет в разных режимах окон)
. для усиления эффекта можно написать ОткрытьФормуМодально - тогда зациклит на второй строке |
|||
47
andrewks
10.07.11
✎
00:09
|
уточняю, глюк воспроизводится именно при одновременном выполнении четырёх условий:
1. выборка именно ТЧ контекста, а не ТЧ объекта Документ 2. закрытие таблицы ч/з Показать(,,-1) 3. вызов внешней обработки ч/з ОткрытьФорму или ОткрытьФормуМодально (неважно) 4. полнооконный режим работы |
|||
48
Злопчинский
10.07.11
✎
00:09
|
при перефокусировании окон - текущая строка ТЧ выборки открытой на ЭКРАНЕ формы - остается неизменной... отсюда и идет повторное позиционирование - от текущей строки (которяа не меняется)
|
|||
49
andrewks
10.07.11
✎
00:10
|
большое спасибо Злопчинский за участие в мозговом штурме
|
|||
50
Злопчинский
10.07.11
✎
00:12
|
(47) неверные пункты!
|
|||
51
Злопчинский
10.07.11
✎
00:15
|
главный пункт, который тут вредит
. ИсхТабл.Показать(Строка(Докум),"",1); ИсхТабл.Напечатать(1); ИсхТабл.Показать(,,-1); . заключается в строке . ИсхТабл.Показать(Строка(Докум),"",1); . если ее заремить - все работает ок... а показ печатнйо формы почему-то именно в полноэкранном режиме уводит фокус из выполняемой формы документа на показ печатной формы; текущая строка ТЧ дока остается "незафиксированной" - и абзац... . пипл, которому еще не сожрал мозг снеговик, и которые лучше меня знают внутренности - может более внятно прокомментируют |
|||
52
Злопчинский
10.07.11
✎
00:21
|
сия траблофича однозначно связана с позиционированием текущей строки на форме документа..
|
|||
53
andrewks
10.07.11
✎
00:21
|
(51) если убрать ИсхТабл.Показать(,,-1); - тоже всё работает :)
и вообще, при исключении любого из условий в (47) - работает |
|||
54
Злопчинский
10.07.11
✎
00:30
|
О!!
проблема в следующем (возможно мы тут херню несли) ДокНакл.ВыбратьПодчиненныеДокументы(,,Заявка); - при исполнении этого оператора сбивается содержимое "НомерСтроки" |
|||
55
Злопчинский
10.07.11
✎
00:31
|
(53) Показать(,,-1) - это следствие, прична в ИсхТабл.Показать(Строка(Докум),"",1); ;-)
|
|||
56
Злопчинский
10.07.11
✎
00:32
|
ага!!!!!!!!!
|
|||
57
Злопчинский
10.07.11
✎
00:32
|
документ Свод является подчиненным документу Заявка, поэтому такая трабла и происходит...
|
|||
58
Злопчинский
10.07.11
✎
00:41
|
Итак...
|
|||
59
Злопчинский
10.07.11
✎
00:42
|
при коде
. Процедура ПоКнопкеПечать() ОчиститьокноСообщений(); Параметры = СоздатьОбъект("СписокЗначений"); Параметры.ДобавитьЗначение("", "Контекст"); Параметры.ДобавитьЗначение(1, "Устройство"); Параметры.ДобавитьЗначение(2, "КоличествоКопий"); ДокНакл=СоздатьОбъект("Документ"); ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл Сообщить("Строка № "+НомерСтроки+", заявка: "+Заявка); Если Заявка.Выбран()=1 Тогда Накл=""; ДокНакл.ВыбратьПодчиненныеДокументы(,,Заявка); Пока ДокНакл.ПолучитьДокумент()=1 Цикл Если (ДокНакл.Вид()="Накладная") И (ДокНакл.ПометкаУдаления()=0) Тогда Накл=ДокНакл.ТекущийДокумент(); Прервать; КонецЕсли; КонецЦикла; Если ПустоеЗначение(Накл)=0 Тогда Сообщить("Строка № "+НомерСтроки+", накл: "+Накл); Параметры.Установить("Контекст",Накл); ОткрытьФормуМодально("Отчет", Параметры, КаталогИБ()+"\ExtForms\nakl_print.ert"); КонецЕсли; КонецЕсли; КонецЦикла; . проблема "усилена" модальным открытием - при полноэкранном режиме открытия документа - траблафича проявляется во все й красе... |
|||
60
Злопчинский
10.07.11
✎
00:44
|
после оператора открытьформумодально() - выборка строк ТЧ сбивается в начало...
|
|||
61
Злопчинский
10.07.11
✎
00:49
|
что блин странно больше всего - что при использовании ОткрытьФорму() - оператор ДокНакл.ВыбратьПодчиненныеДокументы(,,Заявка); - на третьем шаге сбивает НомерСтроки в 1...
. а при использовании ОткрытьФормуМодально() - все ок... |
|||
62
Злопчинский
10.07.11
✎
01:05
|
в принципе как должен выглядеть беспроблемный код в этой ситуевине - уже ясно - надо "включить" ЯВНОЕ указание обрабатываемой строки - это можно делать разными вариантами - и выгрузкой в ТЗ и прочими...
|
|||
63
Злопчинский
10.07.11
✎
01:13
|
http://dump.ru/file/5305457
- по ссылке лежит модифицированный тест, демонстрирующий разнотипные бяки обсуждаемого вопроса. тесты 1,2 - в принципе навернео одинаковые - потыкайтесь в них побольше и понажимайте эскейпы массово... . тест 4 - самый "правильный", но и его при массовом эскейпе можно "загнать в угол" . тест 3 (и при масовом эскейпе тест 4) - в данном конкретном случае - даёт правильные результаты, но косячит в выводимых данных в части номера строки табличной части формы документа. . кому интересно - пусть потыкает в тесты и прокомментирует, особенно тест №1 |
|||
64
Злопчинский
10.07.11
✎
01:18
|
рекомендации:
. работая с выборкой по ТЧ дока в контексте формы дока - не использовать последовательную выборку строк; . осторожно работать с визуальными окнами, которые уводят фокус с окна формы дока; . избегать полноэкарнного режима (тут ваще непонятно почему именно это так обостряет проблему); . при необходимости осуществить выборку ТЧ - работать с принудительным указанием текущей строки: КС = КоличествоСтрок(); Для ы=1 по КС Цикл ПолучитьСтрокуПоНомеру(ы); ... КонецЦикла; . НЕ ИСПОЛЬЗОВАТЬ НомерСтроки в качестве исходных данных!!! Пользоваться для этого НЕЗАВИСМЫМ счетчиков (например, как выше: ы) |
|||
65
Злопчинский
10.07.11
✎
01:19
|
вот такое большое тупое резюме.
я все сказал. Цезарь умыл руки.. |
|||
66
Злопчинский
10.07.11
✎
01:21
|
вот интересно, как анлогичный тест себя в снеговике поведет..?
|
|||
67
TeddySlaf
10.07.11
✎
05:37
|
(65) о как! о_О
Казалось бы причем тут Лужков? В посте-воспоминании (33) примерно это и вспоминалось. |
|||
68
TeddySlaf
10.07.11
✎
05:41
|
(65) "я старый солдат, я не знаю слов любви..."
Спасибо. Интересно было поучаствовать, понаблюдать в столь продуктивной дискуссии. :) |
|||
69
DJ Anthon
10.07.11
✎
08:16
|
у меня была похожая проблема, решилась кратковременным переводом дока в полноэкранный режим (при необходимости). глазу даже незаметно.
|
|||
70
andrewks
10.07.11
✎
09:23
|
(67) в (33) упоминается совершенно другая багофича, просто способ обхода пересекается. а так - ничего общего
(69) прикольно. т.е. наоборот у тебя глючило только в не полнооконном режиме? |
|||
71
DJ Anthon
10.07.11
✎
10:10
|
нет, не в полноэкранном, а после процедуры смена режима контекст становился доступным на микросекунду, которой хватало на выполнение кода (как ни странно, 3-й год этот код работает и не багит). даже не возвращая обратно в другой режим через секунду можно было убедиться, что контекст запорчен.
и с таблицей значений / многострочной частью обход траблы решился тем же способом. не делился решением на мисте только потому, что тут мои решения считаются наиглупейшими, иногда это оказывалось правдой... |
|||
72
DJ Anthon
10.07.11
✎
10:17
|
(70) кстати, интуитивно я чувствовал, что есть обход проблемы (хотя ее можно было вообще не решать, это чисто для себя) и никак не мог его найти, но рыл, рыл, рыл и, в итоге, случайно нашел решение, был сильно удивлен, насколько случайно его удалось обнаружить, интуиция меня не подводит, в этом я уже 100% убедился.
|
|||
73
Злопчинский
10.07.11
✎
14:16
|
я когда-то давно тоже наступал на аналогичные грабли какие-то с обходом ТЧ в форме дока, помню что заборол, но что уже было - не помню.. с тех пор просто аккуратно стараюсь писать такие вещи...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |