Почему 1С аварийно завершает работу при поиске в табличном поле и как это исправить?

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

При работе в режиме толстого клиента на обычных формах разработчики и пользователи иногда сталкиваются с критической ошибкой: при попытке интерактивного поиска (по нажатию сочетания клавиш Ctrl+F или быстром наборе текста) программа 1С внезапно закрывается с сообщением о прекращении работы (Access Violation). Разберем причины такого поведения и выясним, какими практическими способами можно навсегда решить эту проблему.

Причины аварийного завершения программы

Проанализируем контекст возникновения ошибки. Сбой наиболее характерен для конфигураций на обычных формах (например, в типовых конфигурациях вроде ЗУП 2.5, УПП 1.3, КА 1.1 или собственных внешних обработках) и связан с несколькими ключевыми факторами:

  1. Ошибка конкретных версий платформы. Сбой активно проявлялся в ранних релизах ветки 8.3.9 (например, сборках 8.3.9.1818 и 8.3.9.1850). Внутренний механизм платформы, отвечающий за переиндексацию данных и контекстный поиск по элементу управления ТабличноеПоле, некорректно обращался к памяти.
  2. Конфликт привязки данных. Авария происходит в момент, когда свойство Данные у табличного поля напрямую ссылается на источник (например, на табличную часть объекта или таблицу значений), а колонки генерируются автоматически. При попытке инициализации поискового индекса платформа теряет валидный указатель на строку или колонку.
  3. Особенности обработчиков отрисовки. Если у элемента управления подключены события ПриВыводеСтроки или ПриПолученииДанных, при динамической фильтрации списка во время поиска вызов методов форматирования (например, УстановитьТекст) усиливает вероятность аварии.

Способ 1. Ручное добавление колонок и изменение привязки данных

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

  1. Откроем форму объекта в конфигураторе и перейдем в свойства проблемного элемента ТабличноеПоле.
  2. Найдем свойство Данные и полностью очистим его значение (оно должно остаться пустым).
  3. Добавим необходимые колонки вручную через контекстное меню табличного поля (пункт меню «Добавить колонку»). Для каждой созданной колонки обязательно укажем соответствующее имя и тип данных.
  4. Привязку таблицы с данными выполним программно через свойство Значение элемента управления, а не через свойство Данные формы.

Посмотрим на пример правильной инициализации и заполнения табличного поля в программном коде:


// Привязываем таблицу значений к табличному полю через свойство Значение
ЭлементыФормы.ТабличноеПоле.Значение = ТаблицаИсточник;

// Если колонки не были созданы интерактивно в конфигураторе, создаем их явно:
ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();

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

Способ 2. Обновление или откат релиза платформы

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

  1. Обновление на стабильный релиз. Ошибка была устранена в последующих сервисных выпусках ветки 8.3.9, а также полностью отсутствует в ветке 8.3.10 и более поздних версиях 1С:Предприятия. Обновление платформы до актуального стабильного релиза является наиболее правильным системным решением.
  2. Временный откат версии. Если оперативное обновление до более новых релизов невозможно из-за требований инфраструктуры, можно временно вернуться на стабильные сборки предыдущей ветки (например, 8.3.8), где этот механизм работал без сбоев.

Способ 3. Реализация пользовательского поиска и фильтрации

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

Разберем по шагам, как организовать безопасный поиск:

  1. Разместим на форме отдельное поле ввода для поисковой строки и командную кнопку «Найти».
  2. В обработчике нажатия кнопки выполним поиск строк методами таблицы значений и переместим фокус.

Посмотрим на пример реализации поиска через метод НайтиСтроки():


ПараметрыОтбора = Новый Структура("Сотрудник", ПоисковоеЗначение);
НайденныеСтроки = ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда
    // Позиционируем курсор на первой найденной строке
    ЭлементыФормы.ТабличноеПоле.ТекущаяСтрока = НайденныеСтроки[0];
КонецЕсли;

Также можно применить встроенную фильтрацию через коллекцию Отбор самого табличного поля:


ЭлементыФормы.ТабличноеПоле.Отбор.Сотрудник.Значение = ПоисковоеЗначение;
ЭлементыФормы.ТабличноеПоле.Отбор.Сотрудник.Использование = Истина;

Способ 4. Корректировка событий «ПриПолученииДанных» и «ПриВыводеСтроки»

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

Убедимся, что в процедурах ПриВыводеСтроки и ПриПолученииДанных не выполняются тяжелые запросы или неявные обращения к несуществующим колонкам. При необходимости временно отключим изменение свойства Текст через метод УстановитьТекст для проблемной колонки, чтобы проверить стабильность работы поиска.

← На главную