При разработке и поддержке внешних обработок в среде 1С:Предприятие 8.3 программисты иногда сталкиваются с крайне странным поведением интерфейса в тонком клиенте. Представьте ситуацию: вы открываете форму обработки в конфигураторе, видите все поля ввода, таблицы и кнопки, но при запуске в режиме «Предприятие» часть элементов бесследно исчезает. Причем пропадают не все элементы, а только те, которые связаны с реквизитами самого объекта обработки. В этой статье мы подробно разберем, почему это происходит и какими способами можно восстановить работоспособность формы.
Рассмотрим ситуацию детальнее. Проверить код на ошибки поможет Анализ конфигураций, расширений, отчетов и обработок на наличие ошибок (версия 5). Анализ состава расширений.. Типичные признаки данной ошибки выглядят следующим образом:
ПолеВвода, ТаблицаЗначений или КоманднаяПанель.ПриСозданииНаСервере() обнаруживается, что пропавшие элементы отсутствуют в коллекции Элементы формы, что подтверждает Анализ структуры метаданных.Основной вывод, который можно сделать на этапе анализа: форма перестает «видеть» реквизиты собственного объекта. Если в свойстве ПутьКДанным указано значение, начинающееся с Объект., платформа по какой-то причине исключает такой элемент из отрисовки.
Как показывает практика, одним из самых быстрых и эффективных способов решения проблемы является временная интеграция внешней обработки в состав основной конфигурации. Разберем этот процесс по шагам:
Почему это помогает? При выполнении этих действий происходит сброс внутреннего GUID обработки. Тонкий клиент часто кэширует структуру внешних файлов по их идентификаторам. Если структура объекта изменилась, а идентификатор остался прежним, возникает конфликт десериализации, и платформа «выбрасывает» элементы, которые не смогла сопоставить с данными.
Если метод с пересохранением через конфигурацию не помог или вы хотите застраховаться от подобных ошибок в будущем, рассмотрим более фундаментальный подход — отказ от использования ПутьКДанным, указывающего на Объект.
Проанализируем ситуацию: реквизиты объекта внешней обработки (в отличие от документов или справочников) не сохраняются в базе данных автоматически. Они существуют только в памяти, пока открыта форма. Следовательно, мы можем заменить их на реквизиты самой формы без потери функциональности.
Порядок действий:
Объекта.ПутьКДанным заменим, например, Объект.Контрагент на просто Контрагент (имя реквизита формы).Объект.ИмяРеквизита, их следует заменить на непосредственное обращение к реквизитам формы.Важное примечание по табличным частям: Использование табличных частей объекта иногда удобнее, так как платформа позволяет пользователю интерактивно менять порядок колонок в ТЧ объекта, что сложнее реализовать для ТаблицыЗначений, являющейся реквизитом формы. Однако стабильность работы в тонком клиенте часто перевешивает эти мелкие удобства.
Иногда проблема кроется в «зависшем» кэше сервера 1С или локального компьютера пользователя. Посмотрим на еще один простой, но действенный прием:
Используем команду Файл — Сохранить копию.... Это действие отличается от «Сохранить как» тем, что платформа генерирует абсолютно новый файл с чистыми внутренними идентификаторами. Часто после открытия такой «чистой» копии элементы формы возвращаются на свои места.
Также рекомендуем выполнить очистку кэша тонкого клиента. Для этого можно запустить базу с параметром /ClearCache или вручную удалить папки из каталогов %AppData%\1C\1Cv8\.
Выясним глубокие причины, которые могут приводить к «невидимости» элементов:
ПутьКДанным.Чтобы убедиться, что проблема именно в связи с данными, можно добавить в процедуру ПриСозданииНаСервере следующий отладочный код:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверим наличие конкретного элемента в коллекции
ИмяЭлемента = "ГруппаКонтрагент";
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
Сообщить("Внимание: Элемент " + ИмяЭлемента + " не создан платформой!");
КонецЕсли;
// Проанализируем количество элементов
ОбщееКоличество = Элементы.Количество();
// Если здесь число меньше, чем вы ожидаете увидеть в конфигураторе -
// значит, имеет место ошибка десериализации формы.
КонецПроцедуры
Резюме: Если вы столкнулись с исчезновением элементов, не спешите переписывать всю обработку. Сначала попробуйте метод с временной вставкой в конфигурацию или сохранением копии. Это решит проблему в 90% случаев. Если же ошибка повторяется, переведите критически важные поля с реквизитов Объекта на реквизиты Формы — это самый надежный архитектурный путь для внешних инструментов в управляемом приложении.