Как изменить тип или точность реквизита формы через расширение в 1С

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

При разработке расширений для конфигураций 1С программисты часто сталкиваются с задачей изменения свойств уже существующих элементов. Одной из самых коварных проблем является изменение типа данных или точности числового реквизита формы. В отличие от реквизитов объекта (метаданных), реквизиты, созданные непосредственно в редакторе формы, ведут себя в расширениях иначе. Разберем подробно, почему стандартное изменение типа в конфигураторе расширения часто не приносит результата и как решить эту задачу гарантированным способом.

Почему прямое изменение типа в расширении не работает

Проанализируем ситуацию: вы добавили форму в расширение, нашли нужный реквизит (например, Разница с типом Число(15, 3)) и вручную изменили его тип на Число(15, 5). В конфигураторе расширения всё выглядит корректно, однако в режиме «Предприятие» поле по-прежнему обрезает знаки до трех после запятой. Выясним причину такого поведения платформы.

Основная сложность заключается в механизме слияния (merge) основной формы и формы расширения — для анализа таких конфликтов пригодится инструмент архитектурного анализа конфигурации и расширений. Платформа 1С отдает приоритет описанию типов из основной конфигурации для уже существующих реквизитов. Даже если расширение визуально позволяет изменить свойство, при компиляции формы на сервере «движок» может использовать старое определение типа. Кроме того, программное изменение типа существующего реквизита через метод ЭтаФорма.ИзменитьРеквизиты() также невозможно — этот метод позволяет только добавлять новые реквизиты или удалять те, что были созданы программно в этом же сеансе.

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

Способ 1: Создание дублирующего реквизита (Рекомендуемый метод)

Поскольку прямое редактирование типа существующего реквизита формы нестабильно, применим методику «подмены». Рассмотрим пошагово, как это реализовать:

  1. Создание нового реквизита: В расширении откройте редактор формы. В списке реквизитов (например, внутри табличной части формы) добавьте новый реквизит. Дайте ему уникальное имя, например, Разница_Расширение. Установите для него нужный тип — Число(15, 5).
  2. Размещение на форме: Перетащите новый реквизит в элементы формы (в ту же таблицу). Настройте его заголовок так же, как у оригинального поля.
  3. Скрытие старого элемента: Найдите оригинальный элемент формы (колонку Разница) и в свойствах расширения установите флаг Видимость = Ложь. Таким образом, пользователь будет видеть только ваше новое поле с правильной точностью.
  4. Синхронизация данных: Нам необходимо обеспечить передачу данных между типовой логикой и нашим новым полем. Для этого используем обработчики событий формы.

Проанализируем пример кода для инициализации данных при открытии формы:


&НаСервере
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
    // Заполняем наше новое поле данными из типового реквизита при загрузке
    Для Каждого СтрокаТЧ Из ЭтаФорма.Объект.Показания Цикл
        СтрокаТЧ.Разница_Расширение = СтрокаТЧ.Разница;
    КонецЦикла;
КонецПроцедуры

Способ 2: Программная подмена логики расчета

Если реквизит формы является расчетным (как в случае с «Разницей»), важно не только отобразить число с нужной точностью, но и изменить алгоритм, который это число вычисляет. Посмотрим на ситуацию: если в типовом коде прописано Сумма = Цена * Разница, то использование расширенного типа в интерфейсе не поможет, если расчет все равно округляет значение.

В этом случае эффективнее будет полностью перехватить расчет. Для проверки качества написанного кода можно использовать статический анализатор кода — с этой задачей справится панель разработчика для тестирования и отладки кода. Вместо того чтобы полагаться на значение в колонке Разница, выполним расчет напрямую через первичные данные (например, показания «Начало» и «Конец»), которые уже имеют нужную точность в метаданных.

Пример перехвата события изменения данных в расширении:


&НаКлиенте
Процедура Расш1_ПоказанияНачалоПриИзмененииПосле(Элемент)
    ТекущиеДанные = Элементы.Показания.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        // Выполняем расчет с высокой точностью в обход типового реквизита
        ТекущиеДанные.Разница_Расширение = ТекущиеДанные.ПоказанияКонец - ТекущиеДанные.ПоказанияНачало;
        // Если нужно, чтобы типовые механизмы видели изменение, 
        // записываем результат (с потерей точности для типового поля)
        ТекущиеДанные.Разница = ТекущиеДанные.Разница_Расширение;
    КонецЕсли;
КонецПроцедуры

Важные нюансы и отладка

Иногда после внесения изменений в расширение результат не виден из-за кэширования метаданных. Если вы уверены, что тип изменен верно, но система продолжает использовать старую разрядность, попробуйте следующие действия:

Подведем итог: наиболее стабильным и «чистым» способом изменения типа реквизита формы в расширении остается создание нового реквизита с нужными характеристиками и программная синхронизация значений. Это позволяет избежать конфликтов с ядром платформы и гарантирует сохранение точности данных при расчетах.

← На главную