При переходе конфигураций на обычных формах (например, «1С:Зарплата и Управление Персоналом 2.5») на платформу ветки 1С:Предприятие 8.3 разработчики и пользователи нередко сталкиваются с внезапным аварийным завершением работы программы (дамп, ошибка APPCRASH). Рассмотрим конкретную ситуацию: в документе График отпусков попытка выполнить быстрый поиск по строке в табличном поле по колонкам «Сотрудник» или «Примечание» приводит к мгновенному крашу приложения, тогда как поиск по дате отрабатывает штатно.
Проанализируем природу этой ошибки, выясним, почему она проявляется именно при определенных условиях, и разберем практические способы решения проблемы.
Выясним причину аварийного завершения. Ошибка вызвана поведением движка интерфейса платформы 1С при обработке табличных полей на обычных формах при одновременном совпадении трех факторов:
ПриВыводеСтроки или ПриПолученииДанных используется программная модификация текста ячейки через метод УстановитьТекст().АвтоВысотаЯчейки (значение Истина).Посмотрим на пример проблемного кода в модуле формы документа:
Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Подмена текста вызывает сбой при поиске
ОформлениеСтроки.Ячейки.Примечание.УстановитьТекст(СтрокаОтпуска.Примечание);
КонецПроцедуры
При стандартном открытии формы и прокрутке списка данный код выполняется корректно. Однако в момент выполнения поиска платформа запускает внутренний алгоритм фильтрации и динамического пересчета геометрии строк с учетом вычисленного текста. При включенной автовысоте ячейки происходит ошибка адресации памяти в платформенных библиотеках, что приводит к завершению процесса без возможности перехвата исключения через Попытка ... Исключение.
Разберем по шагам наиболее быстрый и надежный способ устранения проблемы без изменения логики вывода данных. Для этого необходимо выключить расчет автовысоты для проблемных колонок табличного поля.
Сделать это можно интерактивно в конфигураторе: откроем свойства колонки (например, «Примечание») и снимем флаг Автовысота ячейки. Также можно принудительно отключить это свойство программно при инициализации формы:
Процедура ПриОткрытии()
// Отключаем автовысоту для предотвращения падения платформы
ЭлементыФормы.ТабличнаяЧасть.Колонки.Примечание.АвтоВысотаЯчейки = Ложь;
ЭлементыФормы.ТабличнаяЧасть.Колонки.Сотрудник.АвтоВысотаЯчейки = Ложь;
КонецПроцедуры
Это устраняет конфликт пересчета высоты строк при фильтрации данных через стандартную строку поиска.
Рассмотрим подробнее обходное решение, упомянутое на практике: удаление проблемной колонки из табличного поля формы в конфигураторе и добавление ее заново. Почему этот способ работает?
При удалении и повторном создании элемента управления все его свойства инициализируются значениями по умолчанию. Свойство АвтоВысотаЯчейки при создании новой колонки сбрасывается в Ложь. Кроме того, пересоздание элемента очищает сохраненные пользовательские настройки отображения колонок. В результате триггер ошибки исчезает, и поиск начинает работать корректно.
Проанализируем альтернативный архитектурный подход. Метод УстановитьТекст() подменяет видимое строковое представление ячейки «на лету», что усложняет индексацию и поиск. Если выводимое значение можно получить заранее, правильнее использовать прямое связывание с данными.
Данные колонки табличного поля.УстановитьТекст() в обработчике ПриВыводеСтроки:
// Вместо подмены текста в ПриВыводеСтроки
// заполняем данные напрямую в источнике данных таблицы
Для Каждого СтрокаТЧ Из Объект.ГрафикОтпусков Цикл
СтрокаТЧ.Примечание = ПолучитьПримечание(СтрокаТЧ);
КонецЦикла;
Иногда после исправления конфигурации у части пользователей падение продолжает повторяться. Это происходит из-за того, что платформа сохраняет параметры табличного поля (включая ширину, порядок и автовысоту колонок) в пользовательском кэше настроек.
Для устранения сохраненного состояния выполним сброс настроек формы у пользователя:
Если обновление платформы до ветки 8.3.9 потребовалось ради другой конфигурации (например, «Бухгалтерия предприятия» с новыми веб-сервисами), не обязательно запускать конфигурацию на обычных формах на этой же версии. В окне запуска информационных баз 1С можно явно зафиксировать стабильную версию платформы для устаревшей конфигурации.
Для этого в окне списка баз перейдем в Изменить → Далее и в поле Версия 1С:Предприятия укажем стабильный релиз (например, 8.3.8), исключив проявление платформенных ошибок в рабочей среде.