При работе в режиме толстого клиента на обычных формах разработчики и пользователи иногда сталкиваются с критической ошибкой: при попытке интерактивного поиска (по нажатию сочетания клавиш Ctrl+F или быстром наборе текста) программа 1С внезапно закрывается с сообщением о прекращении работы (Access Violation). Разберем причины такого поведения и выясним, какими практическими способами можно навсегда решить эту проблему.
Проанализируем контекст возникновения ошибки. Сбой наиболее характерен для конфигураций на обычных формах (например, в типовых конфигурациях вроде ЗУП 2.5, УПП 1.3, КА 1.1 или собственных внешних обработках) и связан с несколькими ключевыми факторами:
8.3.9.1818 и 8.3.9.1850). Внутренний механизм платформы, отвечающий за переиндексацию данных и контекстный поиск по элементу управления ТабличноеПоле, некорректно обращался к памяти.Данные у табличного поля напрямую ссылается на источник (например, на табличную часть объекта или таблицу значений), а колонки генерируются автоматически. При попытке инициализации поискового индекса платформа теряет валидный указатель на строку или колонку.ПриВыводеСтроки или ПриПолученииДанных, при динамической фильтрации списка во время поиска вызов методов форматирования (например, УстановитьТекст) усиливает вероятность аварии.Рассмотрим решение, которое помогло автору обсуждения прямо в конфигураторе без смены версии платформы. Если табличное поле используется в обработке или форме, которую можно модифицировать, разберем по шагам порядок действий:
ТабличноеПоле.Данные и полностью очистим его значение (оно должно остаться пустым).Значение элемента управления, а не через свойство Данные формы.Посмотрим на пример правильной инициализации и заполнения табличного поля в программном коде:
// Привязываем таблицу значений к табличному полю через свойство Значение
ЭлементыФормы.ТабличноеПоле.Значение = ТаблицаИсточник;
// Если колонки не были созданы интерактивно в конфигураторе, создаем их явно:
ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
Такой подход устраняет внутренний конфликт между объектом метаданных и визуальным элементом управления, позволяя стандартному поиску работать без вылетов.
Если ошибка возникает в стандартных документах типовых конфигураций, находящихся на полной поддержке вендора (например, в документе «График отпусков организаций» в ЗУП 2.5), менять свойства табличных полей в формах нецелесообразно. В такой ситуации проанализируем версию используемой платформы:
8.3.9, а также полностью отсутствует в ветке 8.3.10 и более поздних версиях 1С:Предприятия. Обновление платформы до актуального стабильного релиза является наиболее правильным системным решением.8.3.8), где этот механизм работал без сбоев.Если обновить платформу прямо сейчас нельзя, а перенастройка колонок не помогла из-за сложных обработчиков оформления, рассмотрим альтернативный вариант — создание собственного поиска в обход стандартного диалога.
Разберем по шагам, как организовать безопасный поиск:
Посмотрим на пример реализации поиска через метод НайтиСтроки():
ПараметрыОтбора = Новый Структура("Сотрудник", ПоисковоеЗначение);
НайденныеСтроки = ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
// Позиционируем курсор на первой найденной строке
ЭлементыФормы.ТабличноеПоле.ТекущаяСтрока = НайденныеСтроки[0];
КонецЕсли;
Также можно применить встроенную фильтрацию через коллекцию Отбор самого табличного поля:
ЭлементыФормы.ТабличноеПоле.Отбор.Сотрудник.Значение = ПоисковоеЗначение;
ЭлементыФормы.ТабличноеПоле.Отбор.Сотрудник.Использование = Истина;
Если в табличном поле используется динамическое форматирование ячеек, проанализируем код процедур-обработчиков. Во время поиска перерисовка таблицы происходит непрерывно при каждом изменении поисковой фразы.
Убедимся, что в процедурах ПриВыводеСтроки и ПриПолученииДанных не выполняются тяжелые запросы или неявные обращения к несуществующим колонкам. При необходимости временно отключим изменение свойства Текст через метод УстановитьТекст для проблемной колонки, чтобы проверить стабильность работы поиска.