в коллекцию ПолучитьМодифицированныеДокументы() поместилось неправильное имя расширения

tormozit Открыто Высокий

В конфигурации есть модуль "Сервер1" и расширение "Расширение1" с префиксом "Расш1", в котором создано расширение этого модуля.
Я открыл модуль Сервер1 из расширения и начал писать в нем новый метод для теста. Затем переключился в другой модуль и вызывал подсказка Т9. Получил коллекцию ПолучитьМодифицированныеДокументы(), содержащую 2 модуля:

  1. сначала модуль Сервер1 с пустым именем расширения (ИмяКонфигурации)
  2. затем модуль Сервер1 с правильным именем расширения (ИмяКонфигурации)

Естественно что п.1 перезаписал в моем кэше модулей реальный модуль конфигурации.
Сам модуль конфигурации я не открывал.
Кажется что DocumentRuntimeId у обоих документов был одинаковым. Прошу подтвердить это предположение по логу.

В целом проблема не разовая. Замечал много раз как модуль расширения имел пустое свойство ИмяКонфигурации и потому попадал в кэш модулей конфигурации, затирая расширяемый модуль конфигурации.

Текст модуля на момент открытия

&Вместо("Стек")
Функция Расш1_Стек() Экспорт     
	// Вставить содержимое метода.1
	Результат = ПродолжитьВызов();// 
	Ценбур();
	Возврат Результат;             
КонецФункции

&После("Проц1")
Процедура Расш1_Проц1()
	// Вставить содержимое метода.
КонецПроцедуры

Текст модуля пришедший с неправильным именем расширения

&Вместо("Стек")
Функция Расш1_Стек() Экспорт     
	// Вставить содержимое метода.1
	Результат = ПродолжитьВызов();// 
	Ценбур();
	Возврат Результат;             
КонецФункции

&После("Проц1")
Процедура Расш1_Проц1()
	// Вставить содержимое метода.
КонецПроцедуры

П

Конечный текст модуля

&Вместо("Стек")
Функция Расш1_Стек() Экспорт     
	// Вставить содержимое метода.1
	Результат = ПродолжитьВызов();// 
	Ценбур();
	Возврат Результат;             
КонецФункции

&После("Проц1")
Процедура Расш1_Проц1()
	// Вставить содержимое метода.
КонецПроцедуры

Процедура Расш1_Новая() Экспорт 
КонецПроцедуры

Ссылка скрыта

Комментарии

bolsun
#1, ред. 13 января 2024 13:04

Почему ИмяКонфигурации пустое пока выясняю. Но зачем перезатирать в этом случае модуль основной конфигурации? Ведь свойство ИмяКонфигурации в документе не соответствует имени конфигурации.


bolsun
#2, 13 января 2024 13:15

Посмотрел алгоритм. ИмяКонфигурации может быть пустым, если документ был изменен и добавлен в список измененных до идентификации.
Тогда имя конфигурации будет пустым. Могу конечно его в этом случае в таком виде "?" отправлять.


tormozit
#3, 13 января 2024 13:27

Пустое значение свойства ИмяКонфигурации у меня трактуется как равнозначное имени основной конфигурации.


tormozit
#4, ред. 13 января 2024 13:32

Если ты не можешь привязать документ к конкретному имени конфигурации (расширения), то лучше вообще его не добавляй в эту коллекцию, т.к. непонятно какую пользу можно из его изменений извлечь. Только лишние сложности.


tormozit
#5, 13 января 2024 13:38

По-хорошему, кажется ты бы мог после выполнения идентификации окна документа найти по идентификатору документа его этой коллекции измененных документов и там вписать уточненные значения атрибутов. В таком случае будет смысл от хранения такого измененного документа, но имя конфигурации нужно тогда как ты предложил временно устанавливать в "?"


bolsun
#6, 13 января 2024 13:53

(4) tormozit, мне они нужны в этой коллекции даже если имя конфигурации неизвестно. Я использую эти данные в автосохранении модулей. Просто пропускай их тогда.


tormozit
#7, ред. 13 января 2024 14:04

Почему нельзя сделать вместо пустого имени конфигурации "?"? Если ты так сделаешь, будет однозначно понятно, что это твой внутренний документ.


bolsun
#8, 13 января 2024 14:07

(7) tormozit, я не говорил, что нельзя. Наоборот предложил это. Выше я написал, про то что не могу их исключить совсем. Значит будет "?".


bolsun
#9, 13 января 2024 20:32

Вобще делать "?" вместо пустой строки не очень хорошо. У них разные значения. "?" - была попытка получения, но не удалось получить по какой-то причине. Пустая строка - не было попытки получения.
У меня на это завязано логика, если я сейчас начну это все менять, то может полететь многое. У себя я не буду это менять.
Но могу заменять пустую сроку на "?" перед отправкой в API, но тогда сложно будет определить причину отсутствия имени конфигурации.
Опять же самое простое решение игнорировать пустую строку при обновлении кэша.


tormozit
#10, 13 января 2024 20:45

Понял. Сделаю игнорирование документа из этой коллекции с пустым значением свойства ИмяКонфигурации.
tormozit изменил статус на Закрыто


tormozit
#11, ред. 05 февраля 2024 22:57

Часто в коллекции ПолучитьМодифицированныеДокументы() приходит документ с пустым свойством ИмяКонфигурации. Это происходит регулярно с момента закрытия этой заявки, когда я добавил игнорирование документа с таким значением свойства. Из-за этого ИР адаптер не видит изменений другого модуля.
Такой измененный документ содержит правильные

  • текст
  • заголовок
  • позиция
  • заголовок конфигуратора

но неправильные

  • ИмяКонфигурации
  • ...

Прошу расследовать причину не заполнения этого свойства.

yw0p6sg0Iy.mp4

Ссылка скрыта

tormozit изменил статус на Открыто


tormozit
#12, ред. 05 февраля 2024 23:10

Я так понял, что происходит это (пустое свойство ИмяКонфигурации) в случае, если с момента открытия модуля в нем что то изменили без вызова команд требующих идентификации документа.
Поэтому предлагаю при активном ИР адаптере вызывать идентификацию при первом же изменении в модуле.


bolsun
#13, ред. 05 февраля 2024 23:19

(12) tormozit, пробовали же такой вариант, получается не очень. Когда идентификация происходит в момент вызова подсказки и пользователь уже подсознательно готов ждать какое-то время - то этот процесс не вызывает дискомфорта. В отличие от варианта, в котором при любом действии начинается что-то непонятное. А пользователь всего лишь пробел добавил или перенос строки удалил / добавил.

Также, скорее всего в этих измененных модулях нет критически важных изменений, а какие-то незначительные правки, т.к. не был задействован вызов подсказки.


tormozit
#14, ред. 05 февраля 2024 23:38

(13) bolsun, про важные изменения думаю мое видео довольно красноречиво демонстрирует - я добавил новый метод вставкой из буфера и не могу его позвать его из соседнего модуля.

Нашел еще признак по которому можно быстрее выявить, что модуль относится к любому расширению. Открыть контекстное меню и найти в нем недоступную команду добавления в расширение.

Этого будет достаточно для редактирования модулей основной конфигурации, т.е. знать относится ли модуль к ней или нет, пока не было полноценной идентификации документа. Если относится то в свойство ИмяКонфигурации поместишь имя основной конфигурации или #, иначе - пустую строку как раньше.


bolsun
#15, ред. 05 февраля 2024 23:41

(13) bolsun, про важные изменения думаю мое видео довольно красноречиво демонстрирует - я добавил новый метод вставкой из буфера и не могу его позвать его из соседнего модуля.

Я же написал "скорее всего", т.е. в основном. Понятно, что без вызова подсказки можно внести и важные изменения.

Нашел еще признак по которому можно быстрее выявить, что модуль относится к любому расширению. Этого мне будет достаточно, т.е. знать относится ли модуль к основной конфигурации или нет. Если относится то в свойство ИмяКонфигурации поместишь #, иначе - пустую строку как раньше.

Да, это должно быть быстрее. Правда запинки все равно будут при вызове меню и может быть несколько расширений, и модуль может быть не развернут. Но если это не смущает, то можно попробовать.


tormozit
#16, ред. 05 февраля 2024 23:43

(15) bolsun, задержка понятное дело будет, но кажется что заметно короче. Имя расширения в этой ситуации не играет роли, т.к. для любого расширения поведение останется старым - изменения будут игнорироваться до выполнения полноценной идентификации. В этом состоянии важно только понять, относится ли модуль к основной конфигурации.


bolsun
#17, ред. 05 февраля 2024 23:44

(16) tormozit,

Имя расширения в этой ситуации не играет роли, т.к. для любого расширения поведение останется старым - изменения будут игнорироваться до выполнения полноценной идентификации.

ну совсем игнорировать может и не стоит, если известно, что расширение одно. Но не знаю, получаешь ли ты такую информацию.


tormozit
#18, ред. 06 февраля 2024 00:21

(15) bolsun, если окно модуля не развернуто, то в этом режиме не нужно пытаться его временно разворачивать, т.к. это относительно долго.


tormozit
#19, 08 февраля 2024 21:43

Можешь сделать пробную сборку?


bolsun
#20, 08 февраля 2024 23:13

(19) tormozit, думаю пока над реализацией.
Не нравится мне теперь эта затея. Изменение может вызывать сильный дискомфорт у пользователя.
Придется блокировать ввод на время отображения меню, а пользователь может что-то делать в это время (кликнуть мышью например).


bolsun
#21, ред. 08 февраля 2024 23:20

Сейчас мы вызываем идентификацию, когда юзер печатает текст, в процессе показа подсказки и это не вызывает дискомфорта. Мышь обычно в это время не используется.

А в процесе изменения модуля с использованием мыши, поведение непредсказуемо.


tormozit
#22, 09 февраля 2024 08:04

Еще можно сделать так. При первом изменении без идентификации в модуле при подключенном подписчике на модификации модулей - показывать долгое всплывающее уведомление. Оно должно давать понять

  1. Что изменения документа не отслеживаются, до выполнения идентификации модуля
  2. Клик по уведомлению запускает идентификацию документа
  3. Вызов команд адаптера или Т9 делает идентификацию автоматически

Если пользователь не делает явную идентификацию и затем идентификация документа вызывается неявно, то в этот момент показывать уведомление "Начато отслеживание изменений модуля ХХХ".


tormozit
#23, ред. 12 февраля 2024 08:44

Пока я сделал такой костыль для пропуска неидентифицированных модулей

			Если Не ЗначениеЗаполнено(ИмяКонфигурации) Тогда
				Если СтрДлина(Документ.Текст) < 1000 Тогда 
					Продолжить;
				КонецЕсли; 
				НачалоТекста = Лев(Документ.Текст, 50000); // Для ускорения анализа
				Если Ложь
					Или Найти(НачалоТекста, Символы.ПС + "&После(""") > 0
					Или Найти(НачалоТекста, Символы.ПС + "&Перед(""") > 0
					Или Найти(НачалоТекста, Символы.ПС + "&Вместо(""") > 0
					Или Найти(НачалоТекста, Символы.ПС + "&ИзменениеИКонтроль(""") > 0
				Тогда 
					Продолжить;
				КонецЕсли;
			КонецЕсли;

Он сразу относит к конфигурации неидентифицрованные модули размером более 1000 символов, в которых нет характерных для модуля расширения фрагментов. Таким образом для немаленьких модулей конфигурации проблема исчезает. Но в мелких модулях конфигурации и во всех модулях расширений она остается.


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера