Парочка интересных багов.

30.10.19

Разработка - Механизмы платформы 1С

Баги, обнаруженные на платформе 8.3 после перехода с 8.2.

Добрый день, друзья!

Недавно стал участником перехода с платформы 8.2 на 8.3. База старая и сто раз переписанная. К сожалению, непосредственное участие принять не удалось, зато мне выпала честь исправлять появившиеся баги после перехода. Пару самых интересных по моему мнению опишу в этой статье.

Пояснения: переход осуществлялся с версии платформы 8.2.19.130 на 8.3.13.1690. И конфигурация написана на обычных формах (на самом деле там всё смешано, но большая часть на обычных), то есть все случаи будут затрагивать работу в обычном приложении. Ладно, поехали.

Случай 1.

Предисловие.

Мы все хорошо знаем, что при автоподборе текста стандартный алгоритм такой: ищутся первые 50 записей, найденных по реквизитам, указанным в параметре "Ввод по строке" объекта вот здесь:

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

Теперь посмотрим, как происходит автоподбор текста на разных платформах:

 - 8.2. Всё как обычно.

  - 8.3. После автоподбора курсор переносится в конец подобранной строки.

Для тех, кто смотрит в монитор или пишет быстрее того момента, когда срабатывает обработчик, это, может быть, и не проблема. У остальных же это вызвало, мягко говоря, недовольство. Что поделать, придется переписывать стандартную обработку...

Для начала, нужно получить из метаданных все поля ввода по строке и в соответствии с этим формировать запрос. Прилагаю листинг ниже.

Процедура ПолеВвода1АвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ТекстЗапросаПоле = "";
	ТекстЗапросаУсловие = "";
	КоличествоПолейВводаПоСтроке = Метаданные.Справочники.НомераГТД.ВводПоСтроке.Количество();
	Для ТекСтрока = 1 По КоличествоПолейВводаПоСтроке Цикл
		
		ПолеВводПоСтроке = Метаданные.Справочники.НомераГТД.ВводПоСтроке.Получить(ТекСтрока - 1);
		
		ТекстЗапросаПоле = ТекстЗапросаПоле + "
		|		КОГДА НомераГТД." + ПолеВводПоСтроке.Имя + " ПОДОБНО &Текст
		|			ТОГДА НомераГТД." + ПолеВводПоСтроке.Имя;
		
		ТекстЗапросаУсловие = ?(ТекСтрока = 1, "(", "") + ТекстЗапросаУсловие + "
		| НомераГТД." + ПолеВводПоСтроке.Имя + " ПОДОБНО &Текст" + ?(ТекСтрока = КоличествоПолейВводаПоСтроке, ")", Символы.ПС + "ИЛИ ");
		
	КонецЦикла; 
	
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Текст", Текст + "%");
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ВЫБОР"
	+ ТекстЗапросаПоле + "
	|	КОНЕЦ КАК ТекстАвтоПодбора,
	|	НомераГТД.Представление,
	|	НомераГТД.Ссылка
	|ИЗ
	|	Справочник.НомераГТД КАК НомераГТД
	|ГДЕ " + ТекстЗапросаУсловие;
	РезультатЗапроса = Запрос.Выполнить();
	Если Не РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		КоличествоЗаписей = Выборка.Количество();
		Если Выборка.Количество() = 1 Тогда
			Выборка.Следующий();
			ТекстАвтоПодбора = Выборка.ТекстАвтоПодбора;
		ИначеЕсли Выборка.Количество() <= 50 Тогда	
			СписокВыбора = Новый СписокЗначений;
			Пока Выборка.Следующий() Цикл
				СписокВыбора.Добавить(Выборка.Ссылка, 
									  ?(Выборка.ТекстАвтоПодбора = Выборка.Представление, СокрЛП(Выборка.ТекстАвтоПодбора), СокрЛП(Выборка.ТекстАвтоПодбора) + " (" + СокрЛП(Выборка.Представление) + ")"));	
			КонецЦикла;
			ВыбранноеЗначение = ВыбратьИзСписка(СписокВыбора, Элемент);					  
			Если ВыбранноеЗначение <> Неопределено Тогда
				Элемент.Значение = ВыбранноеЗначение.Значение;
			КонецЕсли; 					  
		КонецЕсли; 
	КонецЕсли; 	
КонецПроцедуры

Можно было бы не париться и просто обратиться с поиском по коду. С другой стороны, мы хотим повторить полный функционал платформы и нам нельзя игнорировать настройки, указанные в метаданных. После формирования запроса проверяем количество записей результата: если запись одна, то просто приравниваем результат к параметру ТекстАвтоПодбора. Интересно, что, если вручную установить этот параметр, то баг пропадет. Если записей не больше пятидесяти, то формируем список значений и формируем выбор из списка. Для оптимизации запроса можно, конечно, вписать "ВЫБРАТЬ ПЕРВЫЕ 51", но я подумал, что это может выжечь кому-нибудь глаза, поэтому не стал:)

Вроде готово, смотрим результат:

 - когда найденная запись только одна;

  - когда записей несколько;

Также, когда записей несколько, но они найдены не по полю основного представления, то представление элемента нужно также внести в скобки в списке выбора. Для теста специально добавил в поля ввода ещё один реквизит. Процесс добавления:

 -внес в индекс

  - добавил в поля ввода по строке.

Результат автоподбора текста:

Вот так в итоге получилось.

 

Случай 2.

Предисловие.

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

Итак, вот какой жук нашелся. Для наглядности создам обработку с двумя строчками кода при изменении поля ввода: первая строчка очищает значение элемента, вторая устанавливает свойство ТекущийЭлемент = Элемент. Смотрим:

 - 8.2 всё ок;

 - 8.3 вторая строчка кода не срабатывает...

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

Нашелся выход из данной ситуации не сказать, что прямо идеальный, но другого выхода не нашлось. С выходом платформы 8.3 на форме появился новый обработчик ОбновлениеОтображения. Хотя в методичке по этому обработчику говорится, что так делать нельзя из-за возможности падения производительности системы, как я уже говорил, другого выхода не нашлось. Итак, пишу листинг:

Перем ЭтоИзменениеНужногоПоля;

Процедура ПолеВводаПостояннымКурсоромПриИзменении(Элемент)
	Элемент.Значение = "";
КонецПроцедуры

Процедура ОбновлениеОтображения()
	Если ЭтоИзменениеНужногоПоля Тогда
		ТекущийЭлемент = ЭлементыФормы.ПолеВводаПостояннымКурсором;
	КонецЕсли; 	
КонецПроцедуры

Процедура ПолеВводаПостояннымКурсоромОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
	Если ЗначениеЗаполнено(Элемент.Значение) Тогда
		ЭтоИзменениеНужногоПоля = Истина;
	КонецЕсли; 
КонецПроцедуры

ЭтоИзменениеНужногоПоля = Ложь;

Итак, создаю глобальную переменную формы ЭтоИзменениеНужногоПоля. Она нужна для того, чтобы возврат в нужный элемент формы происходил только после нужного мне события. При окончании ввода текста в нужном поле ввода при заполненном значении устанавливаю значение моей переменной в Истина. После всех обработчиков срабатывает обработчик ОбновлениеОтображения. Там я проверяю, что, если изменено нужное поле, то ставлю ТекущийЭлемент в нужный элемент формы. Вуаля. Результат:

 - норм.

Вроде бы косяки и мелкие, но пришлось достаточно попотеть, чтобы их устранить. После всего я подумал, что на 8.3 лучше работать на управляемых формах... Может, я здесь, конечно, и не прав. В любом случае хочу сказать, что в таких ситуациях, когда перестают работать привычные для тебя методы работы и приходится в быстром порядке придумывать новые, получаешь наибольший опыт. Такой выход из зоны комфорта помогает взглянуть на привычные вещи с другой стороны и ещё это весело. Но это не точно:)

Переход 8.2 8.3 Баг Фича

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4512    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5289    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8819    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15984    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 30.10.19 13:21 Сейчас в теме
Использовать обычные формы на 8.3 в 2019 это как поехать на тверскую не на бмв, а на дилижансе с парой дохлых кляч.

разработчики платформы могли попросту "забить болт" на тонкости в обычных формах и я бы тоже так сделал.
user1878860; muwa_; Касаткин; chg; SarethDark; Repich; +6 8 Ответить
9. Dream_kz 129 30.10.19 16:08 Сейчас в теме
(1)
Использовать обычные формы на 8.3 в 2019

Деловые линии на обычных формах, и ч0?
10. VmvLer 30.10.19 16:14 Сейчас в теме
(9) я не помню не знаю никаких деловых линий и прочего некрофильского 1С-софта и ч0?
IgorS; Vafla; +2 1 Ответить
24. Yashazz 4709 30.06.20 12:24 Сейчас в теме
(10) Сразу видно, что о крупных внедрениях 1С вы не знаете. Попробуйте Морозову на экзамене по 1С-Эксперту сказать про систему "Деловых линий", что это "некрофильский софт", я на вас посмотрю) Это одна из крупнейших разработок, где они даже платформу слегка модифицировали под нужды клиента (да-да), там более 6 тысяч пользователей в параллель на множество нагруженных операций. Советую поискать и почитать инфу об этом внедрении, его лично 1С-центральная делала.
16. stepan_s 31.10.19 06:13 Сейчас в теме
(1) :) я тут на днях в розничном магазине АРМ 1С77 встретил.... Согласно Вашей логике, они должны были давно в розницу на 8.3 убежать... Только зачем?
А вот перейти на 8.3 с обычными формами не претит, т.к.вендор сказал что наследуется и все хорошо.....
19. hasp_x 156 31.10.19 13:14 Сейчас в теме
(16) тоже 77 еще используем
2. YanTsys 12 30.10.19 13:24 Сейчас в теме
С багом из статьи пока не встречался, но зато очень мешает когда при копировании в строку поиска текста например из Excel кроме искомого текста в конце строки подставляется еще и знак переноса строки ¶ и 1с в итоге ничего не находит пока его не удалишь...
3. Senator_I 166 30.10.19 13:35 Сейчас в теме
Зачем старую перепиленную базу на 8.3 переводить?
4. YannikAlx 43 30.10.19 13:48 Сейчас в теме
(3) А чтоб повеселиться? Скучно ведь, когда все нормально работает....
5. fromlion 167 30.10.19 14:24 Сейчас в теме
(3) как вариант чтоб избежать зоопарка платформ, т.к. может стоять параллельно БП и ЗУП которые просят новую платформу.
astrallight; Kolunya; Alfars; alex-l19041; Master861C; +5 Ответить
6. Senator_I 166 30.10.19 14:51 Сейчас в теме
(5) да, вполне вероятно, когда есть базы, требующие платформы 8.3
20. SlavaKron 31.10.19 13:22 Сейчас в теме
(5) Для этого есть режим совместимости.
21. fromlion 167 31.10.19 14:19 Сейчас в теме
(20) Для чего есть режим совместимости?
22. SlavaKron 31.10.19 14:22 Сейчас в теме
(21)
чтоб избежать зоопарка платформ, т.к. может стоять параллельно БП и ЗУП которые просят новую платформу
23. fromlion 167 31.10.19 14:57 Сейчас в теме
(22)видимо я потерял мысль, т.к. я отвечал своим 5 постом на вопрос 3 поста.
7. RomanCrow13 111 30.10.19 15:26 Сейчас в теме
(3)
1) Внедрение БСП,
2) JSON
3) SSL
4) Все базы на одной платформе
5) Подсветка кода наконец!
JohnyDeath; +1 Ответить
8. Senator_I 166 30.10.19 15:28 Сейчас в теме
(7) а, ну это аргумент конечно. Чтобы построить новое надо сломать старое.
11. RocKeR_13 1317 30.10.19 18:00 Сейчас в теме
чтобы сработал обработчик ПриИзменении приходится после сканирования вставлять символ переноса каретки, после это поле очищается и курсор переносится туда же

У вас сканер не прописан в подключаемом оборудовании что ли? И в целом непонятен пример: зачем очищать поле после сканирования?
15. RomanCrow13 111 31.10.19 02:03 Сейчас в теме
(11)
В УТ 10.2 нет библиотеки подключаемого оборудования.
Я сделал очистку для наглядности, срабатывает ли команда ТекущийЭлемент = Элемент. А в целом, в поле ввода юзер вбивает штрих-код, при изменении происходит обработка данных в соответствии с введённым штрих-кодом. После обработки поле ввода должно очищаться и текущим элементом должен снова стать элемент ввода кода, чтобы снова вбивать новые штрих-коды.
12. bulpi 215 30.10.19 19:47 Сейчас в теме
Замечание:
Вместо ОбновлениеОтображения() в типовых используют однократный запуск обработчика ожидания с таймаутом 0.1 сек
13. genayo 30.10.19 22:06 Сейчас в теме
(12) Зачем так делают в типовых?
18. bulpi 215 31.10.19 12:14 Сейчас в теме
(13)
Чтобы перевести курсор на нужное поле (например)
14. genayo 30.10.19 22:10 Сейчас в теме
А так да, не буду, пожалуй, на 8.2 с 8.3 специализированную конфу переводить...
17. user710334_koshil.v 31.10.19 09:14 Сейчас в теме
Спасибо! Один в один ситуация описанная в п. 2. Только это не баг 8.2 - 8.3. У меня это проявилось при переходе с 8.3.10 на 8.3.13.1690. Есть две самописки одна на обычных, одна полностью на УФ. Теперь именно из за неизвестных багов на ОФ я боюсь обновлять платформу на 14-15.
25. Yashazz 4709 30.06.20 12:25 Сейчас в теме
Если я начну все баги обычных форм на 8.3 описывать, тут их не 2, а 50 точно будет. И среди них есть гораздо более интересные, чем поведение поля ввода.
Оставьте свое сообщение