Как изменить точность или длину реквизита табличной части через расширение в 1С

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

При разработке расширений в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью изменить параметры существующих реквизитов. Типичный пример: стандартная точность цены в два знака после запятой не удовлетворяет требованиям бизнеса (например, при расчетах в валюте или при работе с ГСМ), и требуется увеличить ее до пяти знаков. Однако простая попытка изменить тип данных в заимствованном объекте часто приводит к ошибке: «Значение контролируемого свойства Тип не совпадает со значением в расширяемой конфигурации».

В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно изменять числовые параметры в расширениях и какие архитектурные нюансы платформы необходимо учитывать.

Анализируем причину ошибки «Несовпадение контролируемого свойства»

Рассмотрим ситуацию: мы заимствовали документ ПриходнаяНакладная, перешли в табличную часть Запасы и попытались изменить точность у реквизита Цена. Платформа тут же блокирует это действие или выдает ошибку при запуске в режиме «1С:Предприятие».

Выясним причину такого поведения. Платформа 1С строго следит за целостностью данных. Если объект заимствован, по умолчанию для его свойства «Тип» устанавливается режим «Проверять». Это означает, что тип в расширении должен быть идентичен типу в основной конфигурации. Любое отклонение (даже увеличение точности) воспринимается системой как потенциальный конфликт.

Проанализируем основные факторы, влияющие на возможность изменения типа:

  1. Режим совместимости конфигурации: Если основная конфигурация работает в режиме совместимости ниже 8.3.12, возможности расширения по модификации структуры данных крайне ограничены. Начиная с версии 8.3.15 и выше, механизмы стали гораздо гибче.
  2. Определяемые типы (Defined Types): В современных типовых решениях (ERP, УТ 11, КА) реквизит Цена редко имеет прямой тип Число. Чаще всего он ссылается на ОпределяемыйТип.ДенежнаяСуммаЛюбая или ОпределяемыйТип.Цена.

Вариант 1: Изменение точности через Определяемый тип

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

Шаг 1. Идентификация типа. Перейдем в основную конфигурацию и посмотрим на свойство «Тип» реквизита Цена. Если там указан «ОпределяемыйТип...», нам нужно работать именно с ним.

Шаг 2. Заимствование типа. Добавим этот ОпределяемыйТип в наше расширение. Важно: мы не создаем новый, а именно заимствуем существующий.

Шаг 3. Редактирование в расширении. В окне свойств определяемого типа в расширении найдем раздел «Тип». Нажмем на гиперссылку с описанием типа (обычно это Число (15, 2)). Изменим точность на нужную нам, например, на 5. После этого общая длина может автоматически скорректироваться (например, до 18, 5).

Почему это эффективно? Когда мы меняем точность в определяемом типе в расширении, платформа автоматически «подтягивает» эти изменения во все реквизиты, которые используют данный тип. Это избавляет нас от необходимости вручную менять десятки реквизитов в разных документах и справочниках.

Вариант 2: Изменение прямого числового типа

Если же реквизит имеет простой тип Число, и мы все равно получаем ошибку контроля свойств, выполним следующие действия:

1. В расширении выделим заимствованный реквизит.
2. В палитре свойств найдем свойство «Тип».
3. Обратим внимание на колонку с пиктограммой «лупы» или «флажка», которая отвечает за проверку свойства. Нам необходимо убедиться, что расширение позволяет увеличение параметров.

Важное правило платформы: Увеличивать длину или точность в расширении можно, а уменьшать — категорически запрещено. Уменьшение точности приведет к потере данных, чего платформа не допустит при обновлении конфигурации базы данных.

Вариант 3: Создание альтернативного реквизита

Иногда возникают ситуации, когда типовые механизмы конфигурации жестко завязаны на стандартную точность (например, в сложных модулях расчета себестоимости или при интеграции с внешними системами). В таких случаях изменение стандартного реквизита может «сломать» логику программы.

Проанализируем альтернативный метод решения:

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

Посмотрим на пример кода в модуле формы документа:


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

Влияние на регистры накопления

Рассмотрим важный аспект, о котором часто забывают: регистры. Если вы изменили точность цены в документе до 5 знаков, но при проведении документа данные попадают в регистр накопления (например, ВыручкаИПродажи или ЗапасыНаСкладах), где ресурс Сумма или Цена все еще имеет точность 2 знака, вы столкнетесь с проблемой «хвостов».

При умножении количества на цену с 5 знаками вы получите очень точную сумму. Но при записи в регистр эта сумма будет округлена до 2 знаков. В итоге накопленная сумма в регистре не будет биться с детальными расчетами.

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

Технические требования для применения изменений

Чтобы изменения структуры данных (длины и точности) вступили в силу, расширение должно соответствовать определенным критериям:

Подведем итог: изменение точности через расширение — задача выполнимая, если правильно определить, используется ли в системе ОпределяемыйТип, и соблюдать правила платформы по увеличению (но не уменьшению) разрядности чисел.

← На главную