Уважаемые коллеги, мы сталкиваемся с достаточно распространенной проблемой при работе с управляемыми формами в 1С:Предприятие, а именно с некорректным обновлением данных на форме после интерактивных действий. В данном конкретном случае речь идет о версии 1С:ITIL 1.2.7.1, где при перетаскивании задачи на канбан-доске из одной колонки в другую, задача исчезает из исходной колонки, но не появляется в целевой. Актуальные данные отображаются только после перезапуска обработки. Давайте вместе проанализируем эту ситуацию и найдем возможные пути решения.
Прежде чем перейти к конкретным шагам по исправлению, давайте выясним, почему такое поведение может возникать. Понимание корня проблемы поможет нам выбрать наиболее эффективный метод её устранения.
Некорректное обновление динамического списка. Платформа 1С:Предприятие по умолчанию не всегда автоматически обновляет динамические списки после изменений, произошедших вне стандартных форм редактирования (например, при интерактивном перетаскивании, которое может вызывать прямой запрос к базе данных или изменение объекта без вызова стандартной формы записи). Если в коде обработки канбан-доски не предусмотрено явное обновление списка после операции drag-and-drop, мы можем столкнуться с тем, что данные на форме становятся неактуальными. Это особенно актуально, если после обновления конфигурации логика обновления была нарушена или не учтены все сценарии.
Проблемы с кэшем. Ошибки, возникающие после обновлений конфигурации, очень часто связаны с некорректным кэшированием метаданных. Система может использовать устаревшие структуры данных, хранящиеся в кэше, что приводит к некорректному отображению форм и данных. Это может проявляться в "кривом" отображении или полном отсутствии данных до тех пор, пока кэш не будет очищен.
Изменения в механизме перетаскивания (Drag-and-Drop). Механизм drag-and-drop в 1С требует тщательной настройки событий источника и приемника данных. Если после обновления конфигурации изменились стандартные действия, связанные с перетаскиванием, или их обработка, то задача может быть фактически перетащена и данные в базе изменены, но отображение на форме не будет обновлено. Нам нужно будет проверить обработчики событий перетаскивания.
Ошибки в запросах. Как верно заметил автор сообщения, проблема может крыться в динамическом запросе, который формирует данные для канбан-доски. Если после обновления произошли изменения в структуре данных, на которые опирается запрос, или в самом запросе появились логические ошибки, он может возвращать неполные или некорректные данные для отображения. Это приводит к тому, что задача "исчезает" или "не появляется", хотя в базе она может быть.
Некорректная обработка событий "ПослеЗаписи" или "ОповеститьОбИзменении". Для того чтобы динамические списки и управляемые формы автоматически обновлялись при изменении данных, особенно если эти изменения происходят в другой форме или программно, необходимо использовать механизм оповещений. Методы Оповестить и ОповеститьОбИзменении играют ключевую роль в синхронизации данных между различными частями приложения. Если этот механизм был реализован некорректно или нарушен после обновления, форма не будет автоматически перерисовываться, что мы и наблюдаем.
Теперь, когда мы понимаем возможные причины, давайте рассмотрим конкретные шаги, которые мы можем предпринять для устранения этой проблемы. Мы будем двигаться от самых простых решений к более сложным, требующим анализа кода.
Одним из наиболее прямолинейных решений является принудительный вызов обновления элементов формы или самой формы после выполнения операции перетаскивания. Мы должны найти место в коде, где происходит окончание перетаскивания (обычно это обработчики событий ПриНачалеПеретаскивания, ПриПеретаскивании, ПриОкончанииПеретаскивания элемента управления, представляющего собой целевую колонку или область канбан-доски).
Рассмотрим несколько методов для принудительного обновления:
Обновление динамического списка. Если канбан-доска реализована на базе динамического списка, мы можем обновить его данные следующим образом:
&НаКлиенте
Процедура ИмяЭлементаКанбанДоскиПриОкончанииПеретаскивания(Элемент, ПеретаскиваемыеДанные, СтандартнаяОбработка)
// Ваш код по изменению данных задачи (обращения)
// ...
// Принудительное обновление динамического списка
Элементы.ИмяДинамическогоСписка.Обновить();
КонецПроцедуры
Здесь ИмяДинамическогоСписка — это имя элемента формы типа "ДинамическийСписок", который отображает задачи на канбан-доске.
Обновление управляемой формы. Если мы работаем с реквизитами формы, которые отображаются на канбан-доске, или если требуется обновить всю форму целиком, мы можем использовать:
&НаКлиенте
Процедура ИмяЭлементаКанбанДоскиПриОкончанииПеретаскивания(Элемент, ПеретаскиваемыеДанные, СтандартнаяОбработка)
// Ваш код по изменению данных задачи (обращения)
// ...
// Обновить объект управляемой формы.
// Этот метод заново считывает данные объекта с сервера.
ЭтаФорма.Прочитать();
КонецПроцедуры
Метод ЭтаФорма.Прочитать() полезен, когда изменение затрагивает реквизиты, связанные с основным объектом формы. Однако он может быть избыточен, если нужно обновить только конкретную таблицу.
Обновление отображения данных элементов формы. Если изменения касаются реквизитов формы, которые влияют на отображение, но не являются частью динамического списка, мы можем использовать:
&НаКлиенте
Процедура ИмяЭлементаКанбанДоскиПриОкончанииПеретаскивания(Элемент, ПеретаскиваемыеДанные, СтандартнаяОбработка)
// Ваш код по изменению данных задачи (обращения)
// ...
// Принудительное обновление отображения данных на форме.
// Помогает, когда меняются свойства элементов управления,
// зависящие от реквизитов формы.
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
Мы должны внимательно проанализировать, какой именно элемент формы не обновляется, чтобы выбрать наиболее подходящий метод.
Если изменение задачи происходит в одной части программы (например, в модуле обработки или в серверной процедуре, вызванной из drag-and-drop), а канбан-доска находится в отдельной обработке или другой открытой форме, то для обновления данных необходимо использовать механизм оповещений. Это позволяет одной форме "сообщить" другой форме об изменениях.
Сначала, в той процедуре, где происходит фактическое изменение статуса задачи (например, после записи объекта задачи), мы должны вызвать метод Оповестить:
&НаСервереБезКонтекста
Процедура ИзменитьСтатусЗадачи(ЗадачаСсылка, НовыйСтатус)
// Здесь происходит изменение объекта задачи и его запись
// ...
// Оповещаем все открытые формы, которые могут быть заинтересованы в изменении
// Первый параметр - Идентификатор, можно использовать, например, "ОбновлениеЗадачи"
// Второй параметр - Параметр, здесь можем передать ссылку на измененную задачу
// Третий параметр - Источник, ссылка на текущую форму или объект
Оповестить("ОбновлениеЗадачи", ЗадачаСсылка);
КонецПроцедуры
Затем, в модуле формы обработки КанбанДоска, мы должны реализовать обработчик события ОбработкаОповещения:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновлениеЗадачи" Тогда
// Получили оповещение об изменении задачи
// Параметр содержит ссылку на измененную задачу
// Здесь вызываем процедуру, которая обновит данные канбан-доски
// Например, можно обновить динамический список или перечитать данные
Элементы.ИмяДинамическогоСписка.Обновить();
// Или, если у нас есть сложная логика, можем перечитать конкретную задачу
// и обновить её отображение
// Например, ПрочитатьДанныеПоЗадаче(Параметр);
КонецЕсли;
КонецПроцедуры
Мы должны убедиться, что ИмяСобытия совпадает, и правильно обрабатывать переданный Параметр.
В случае любых проблем с отображением после обновления, особенно если ранее все работало корректно, всегда рекомендуется выполнить чистку кэша. Это поможет убедиться, что система использует актуальные метаданные, а не устаревшие версии.
Очистка кэша на клиентской стороне: Мы можем удалить кэш вручную, закрыв все сеансы 1С и удалив каталоги кэша. Они обычно находятся по пути %LocalAppData%\1C\1Cv8 или %AppData%\1C\1Cv8, а также в каталоге пользователя C:\Users\ИмяПользователя\AppData\Roaming\1C\1cv8\. В каждом каталоге 1cv8 есть папки с GUID идентификаторами, которые соответствуют кэшу баз данных. Мы можем удалить все содержимое этих папок (или выбрать конкретную базу).
Очистка кэша на серверной стороне (для клиент-серверной версии): Если используется клиент-серверный вариант работы, то после чистки клиентского кэша может потребоваться перезапуск службы "Агент сервера 1С:Предприятия" (1C:Enterprise 8.3 Server Agent) на сервере. Это гарантирует, что сервер также будет использовать актуальные метаданные.
Мы знаем, что версия 1.2.7.1 достаточно старая. Производитель конфигурации 1С:ITILIUM активно развивает свой продукт. В более поздних версиях, таких как 3.1.15.9 или 4.6.1.2, были реализованы и доработаны механизмы канбан-доски, включая функции автоматического обновления и улучшения производительности. Если текущая версия не имеет подобных механизмов или они работают нестабильно, нам стоит рассмотреть возможность обновления конфигурации до более новой версии. Есть большая вероятность, что эта проблема уже решена на системном уровне в более актуальных релизах.
Мы можем проверить список изменений в поставках новых версий конфигурации на портале 1С:ИТС или у вашего партнера 1С, чтобы понять, какие улучшения были внесены в функциональность канбан-доски.
Если ни один из вышеперечисленных методов не помог, нам придется погрузиться в код конфигурации. Это особенно важно, если конфигурация была доработана или если проблема возникла после обновления типовой конфигурации. Мы должны внимательно проверить изменения в коде, связанные с канбан-доской, обработкой перетаскивания и динамическими списками.
Мы должны обратить внимание на следующие аспекты:
Обработчики событий drag-and-drop: Нам нужно найти и проанализировать процедуры-обработчики событий ПриНачалеПеретаскивания, ПриПеретаскивании и ПриОкончанииПеретаскивания для таблиц или полей формы, которые представляют колонки канбан-доски. Именно здесь определяется логика перемещения задачи и потенциальные вызовы для обновления.
Запросы к данным: Мы должны изучить запросы, формирующие данные для динамического списка канбан-доски. Возможно, в них есть ошибки или они не учитывают какие-то новые поля/статусы после обновления. Мы можем использовать "Консоль запросов" для отладки и проверки этих запросов.
Процедуры записи объекта: Если перетаскивание вызывает изменение объекта (например, "Обращение" или "Задача"), нам нужно проверить процедуры, отвечающие за запись этого объекта. Убедитесь, что после записи вызываются необходимые оповещения или что объект записывается корректно.
Сравнение/объединение конфигураций: Если у нас есть исходная типовая конфигурация (или предыдущая рабочая версия), мы можем использовать стандартные средства "Сравнить/Объединить конфигурации" в Конфигураторе, чтобы выявить изменения в модулях, формах и запросах, относящихся к канбан-доске. Это поможет нам найти место, где возникла проблема после обновления.
Для отладки мы можем устанавливать точки останова в подозрительных местах кода, чтобы пошагово просмотреть выполнение процедур и понять, на каком этапе происходит сбой или отсутствует вызов обновления.
В некоторых случаях проблемы с отображением данных или нестабильной работой могут быть связаны с ошибками в самой информационной базе. Платформа 1С предоставляет инструменты для проверки и исправления таких ошибок:
Утилита chdbfl.exe: Мы можем запустить утилиту проверки физической целостности базы данных (chdbfl.exe), которая находится в каталоге установки платформы 1С. Закройте все сеансы работы с базой данных перед использованием этой утилиты. Она поможет найти и исправить поврежденные индексы или другие низкоуровневые ошибки.
Режим "Тестирование и исправление" в Конфигураторе: В режиме "Конфигуратор" мы можем использовать пункт меню "Администрирование" -> "Тестирование и исправление...". Здесь мы можем выбрать различные проверки и исправления, включая проверку логической целостности базы данных, пересчет итогов и реиндексацию таблиц. Это может помочь в поиске и устранении ошибок, которые могут косвенно влиять на отображение данных.
Обязательно сделайте резервную копию информационной базы перед выполнением любых операций тестирования и исправления!
В заключение, проблема с некорректным обновлением канбан-доски в 1С:ITIL 1.2.7.1 является типичной для управляемых форм и требует системного подхода к отладке. Мы рекомендуем начать с простых шагов, таких как очистка кэша и принудительное обновление, а затем перейти к более глубокому анализу кода конфигурации и использованию механизмов оповещений. Обновление конфигурации до актуальной версии также может быть эффективным решением, поскольку многие подобные проблемы уже устранены разработчиками.