Почему аварийно завершается работа 1С при поиске по строке в документе на обычных формах?

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При переходе конфигураций на обычных формах (например, «1С:Зарплата и Управление Персоналом 2.5») на платформу ветки 1С:Предприятие 8.3 разработчики и пользователи нередко сталкиваются с внезапным аварийным завершением работы программы (дамп, ошибка APPCRASH). Рассмотрим конкретную ситуацию: в документе График отпусков попытка выполнить быстрый поиск по строке в табличном поле по колонкам «Сотрудник» или «Примечание» приводит к мгновенному крашу приложения, тогда как поиск по дате отрабатывает штатно.

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

Причина возникновения сбоя

Выясним причину аварийного завершения. Ошибка вызвана поведением движка интерфейса платформы 1С при обработке табличных полей на обычных формах при одновременном совпадении трех факторов:

  1. Табличное поле размещено на обычной форме толстого клиента.
  2. В обработчиках событий ПриВыводеСтроки или ПриПолученииДанных используется программная модификация текста ячейки через метод УстановитьТекст().
  3. Для соответствующей колонки или ячейки включено свойство АвтоВысотаЯчейки (значение Истина).

Посмотрим на пример проблемного кода в модуле формы документа:


Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Подмена текста вызывает сбой при поиске
    ОформлениеСтроки.Ячейки.Примечание.УстановитьТекст(СтрокаОтпуска.Примечание);
КонецПроцедуры

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

Способ 1. Отключение автовысоты ячейки программно или в свойствах

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

Сделать это можно интерактивно в конфигураторе: откроем свойства колонки (например, «Примечание») и снимем флаг Автовысота ячейки. Также можно принудительно отключить это свойство программно при инициализации формы:


Процедура ПриОткрытии()
    // Отключаем автовысоту для предотвращения падения платформы
    ЭлементыФормы.ТабличнаяЧасть.Колонки.Примечание.АвтоВысотаЯчейки = Ложь;
    ЭлементыФормы.ТабличнаяЧасть.Колонки.Сотрудник.АвтоВысотаЯчейки = Ложь;
КонецПроцедуры

Это устраняет конфликт пересчета высоты строк при фильтрации данных через стандартную строку поиска.

Способ 2. Пересоздание колонки табличного поля

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

При удалении и повторном создании элемента управления все его свойства инициализируются значениями по умолчанию. Свойство АвтоВысотаЯчейки при создании новой колонки сбрасывается в Ложь. Кроме того, пересоздание элемента очищает сохраненные пользовательские настройки отображения колонок. В результате триггер ошибки исчезает, и поиск начинает работать корректно.

Способ 3. Отказ от ручной подмены текста в пользу привязки данных

Проанализируем альтернативный архитектурный подход. Метод УстановитьТекст() подменяет видимое строковое представление ячейки «на лету», что усложняет индексацию и поиск. Если выводимое значение можно получить заранее, правильнее использовать прямое связывание с данными.

  1. Если реквизит присутствует в строке источника данных (табличной части или наборе строк), укажем его непосредственно в свойстве Данные колонки табличного поля.
  2. Если значение является вычисляемым, заполним его в реквизитах строки до отображения данных пользователю, отказавшись от вызова УстановитьТекст() в обработчике ПриВыводеСтроки:

// Вместо подмены текста в ПриВыводеСтроки
// заполняем данные напрямую в источнике данных таблицы
Для Каждого СтрокаТЧ Из Объект.ГрафикОтпусков Цикл
    СтрокаТЧ.Примечание = ПолучитьПримечание(СтрокаТЧ);
КонецЦикла;

Способ 4. Сброс пользовательских настроек формы

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

Для устранения сохраненного состояния выполним сброс настроек формы у пользователя:

  1. В окне проблемного документа нажмем кнопку Действия (или откроем контекстное меню таблицы).
  2. Выберем пункт Установить стандартные настройки.
  3. Перезапустим форму документа.

Способ 5. Разделение версий платформы для разных информационных баз

Если обновление платформы до ветки 8.3.9 потребовалось ради другой конфигурации (например, «Бухгалтерия предприятия» с новыми веб-сервисами), не обязательно запускать конфигурацию на обычных формах на этой же версии. В окне запуска информационных баз 1С можно явно зафиксировать стабильную версию платформы для устаревшей конфигурации.

Для этого в окне списка баз перейдем в Изменить → Далее и в поле Версия 1С:Предприятия укажем стабильный релиз (например, 8.3.8), исключив проявление платформенных ошибок в рабочей среде.

← На главную