При работе с расширениями в конфигурации 1С:Зарплата и управление персоналом 3.1 разработчики часто сталкиваются с крайне неинформативными сообщениями об ошибках. Одной из самых загадочных является ошибка «Неопределенно», которая появляется без указания строки кода или описания проблемы. Особенно часто это происходит в документе ТабельУчетаРабочегоВремени при попытке открыть форму редактирования данных за конкретный день. В этой статье мы разберем причины возникновения этой ситуации, проанализируем поведение платформы и найдем надежные способы решения.
Рассмотрим типичную ситуацию: программист создает расширение для изменения логики формы документа Табель. Для корректной работы или изменения внешнего вида в расширение заимствуется не только форма, но и макет (тип SpreadsheetDocument), на основании которого строится визуальная сетка табеля. После этого при нажатии на ячейку с данными времени для вызова расшифровки (через общую форму РедактированиеДанныхУчетаВремениЗаДень) система выдает окно с текстом «Неопределенно». При этом отладчик может не фиксировать исключение, а после закрытия окна работа продолжается в штатном режиме.
Выясним причину: проблема кроется в механизме объединения макетов табличных документов в расширениях. Когда макет заимствуется, платформа пытается сопоставить области основного макета и макета из расширения. Если в расширенном макете присутствуют изменения, влияющие на геометрию строк или колонок, внутренние механизмы адресации 1С дают сбой.
Посмотрим на стандартный код, который инициирует открытие формы редактирования. В основной конфигурации процедура обработки выбора в табличном документе выглядит следующим образом:
&НаКлиенте
Процедура ДанныеТабеляПредставлениеВыбор(Элемент, Область, СтандартнаяОбработка)
ОткрытьФормуРедактированияДанных(Область);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуРедактированияДанных(Область)
НомерДня = Область.Право - 3;
ИдентификаторДанных = ИдентификаторДанныхИзСтрокиПредставления(Область);
Если НомерДня > День(Объект.ДатаОкончанияПериода) Или ИдентификаторДанных = Неопределено Тогда
Возврат;
КонецЕсли;
ДанныеДляРедактированияВХранилище(ИдентификаторДанных, НомерДня);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Ссылка", Объект.Ссылка);
ПараметрыОткрытия.Вставить("АдресРедактируемыхДанных", АдресРедактируемыхДанных);
ПараметрыОткрытия.Вставить("ТолькоПросмотр", ТолькоПросмотр);
Оповещение = Новый ОписаниеОповещения("ПослеОкончанииРедактированияДанныхОВремени", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.РедактированиеДанныхУчетаВремениЗаДень", ПараметрыОткрытия, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
При использовании расширения этот код может отрабатывать без ошибок, но само сообщение «Неопределенно» генерируется платформой в момент передачи управления форме расшифровки. Это происходит потому, что объект Область, передаваемый в процедуру, начинает ссылаться на некорректные индексы заимствованного макета.
Разберем наиболее эффективный метод устранения ошибки. По умолчанию при добавлении макета в расширение для него устанавливается свойство «Способ расширения» — «Объединять». В этом режиме платформа пытается динамически слить изменения из расширения с основным макетом. Если в макете есть сложные именованные области (что характерно для Табеля в ЗУП), происходит конфликт.
Для исправления ситуации выполним следующие шаги:
Важно: При использовании режима «Замещать» платформа полностью игнорирует макет основной конфигурации и использует только версию из расширения. Это гарантирует целостность индексов областей и устраняет ошибку. Однако помните, что при обновлении основной конфигурации вам придется вручную переносить изменения в макет расширения, так как автоматическое объединение будет отключено.
Проанализируем еще одну критическую точку — свойство «Автовысота» для строк макета. Практика показывает, что включение этого свойства в расширенном макете для строк, которые участвуют в программном расчете координат (как в случае с Табелем), практически всегда приводит к ошибке «Неопределенно».
Рассмотрим, почему это происходит:
Автовысоты заставляет платформу пересчитывать геометрию документа в момент рендеринга.Рекомендация: Отключите автовысоту для всех строк макета в расширении и задайте высоту строк вручную, если это необходимо для оформления.
Если вы попробовали указанные выше способы, но проблема сохраняется, проанализируем дополнительные факторы:
/ClearCache.Подведем итог: ошибка «Неопределенно» при работе с формами в ЗУП 3.1 чаще всего является следствием некорректного объединения метаданных макетов. Использование режима «Замещать» и контроль свойств высоты строк позволяют полностью избавиться от этой проблемы и обеспечить стабильную работу расширений.