При разработке расширений в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью изменить параметры существующих реквизитов. Типичный пример: стандартная точность цены в два знака после запятой не удовлетворяет требованиям бизнеса (например, при расчетах в валюте или при работе с ГСМ), и требуется увеличить ее до пяти знаков. Однако простая попытка изменить тип данных в заимствованном объекте часто приводит к ошибке: «Значение контролируемого свойства Тип не совпадает со значением в расширяемой конфигурации».
В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно изменять числовые параметры в расширениях и какие архитектурные нюансы платформы необходимо учитывать.
Рассмотрим ситуацию: мы заимствовали документ ПриходнаяНакладная, перешли в табличную часть Запасы и попытались изменить точность у реквизита Цена. Платформа тут же блокирует это действие или выдает ошибку при запуске в режиме «1С:Предприятие».
Выясним причину такого поведения. Платформа 1С строго следит за целостностью данных. Если объект заимствован, по умолчанию для его свойства «Тип» устанавливается режим «Проверять». Это означает, что тип в расширении должен быть идентичен типу в основной конфигурации. Любое отклонение (даже увеличение точности) воспринимается системой как потенциальный конфликт.
Проанализируем основные факторы, влияющие на возможность изменения типа:
Цена редко имеет прямой тип Число. Чаще всего он ссылается на ОпределяемыйТип.ДенежнаяСуммаЛюбая или ОпределяемыйТип.Цена.Если реквизит, который мы хотим изменить, использует Определяемый тип, то менять точность напрямую в реквизите табличной части бесполезно и технически неверно. Разберем по шагам правильный алгоритм:
Шаг 1. Идентификация типа. Перейдем в основную конфигурацию и посмотрим на свойство «Тип» реквизита Цена. Если там указан «ОпределяемыйТип...», нам нужно работать именно с ним.
Шаг 2. Заимствование типа. Добавим этот ОпределяемыйТип в наше расширение. Важно: мы не создаем новый, а именно заимствуем существующий.
Шаг 3. Редактирование в расширении. В окне свойств определяемого типа в расширении найдем раздел «Тип». Нажмем на гиперссылку с описанием типа (обычно это Число (15, 2)). Изменим точность на нужную нам, например, на 5. После этого общая длина может автоматически скорректироваться (например, до 18, 5).
Почему это эффективно? Когда мы меняем точность в определяемом типе в расширении, платформа автоматически «подтягивает» эти изменения во все реквизиты, которые используют данный тип. Это избавляет нас от необходимости вручную менять десятки реквизитов в разных документах и справочниках.
Если же реквизит имеет простой тип Число, и мы все равно получаем ошибку контроля свойств, выполним следующие действия:
1. В расширении выделим заимствованный реквизит.
2. В палитре свойств найдем свойство «Тип».
3. Обратим внимание на колонку с пиктограммой «лупы» или «флажка», которая отвечает за проверку свойства. Нам необходимо убедиться, что расширение позволяет увеличение параметров.
Важное правило платформы: Увеличивать длину или точность в расширении можно, а уменьшать — категорически запрещено. Уменьшение точности приведет к потере данных, чего платформа не допустит при обновлении конфигурации базы данных.
Иногда возникают ситуации, когда типовые механизмы конфигурации жестко завязаны на стандартную точность (например, в сложных модулях расчета себестоимости или при интеграции с внешними системами). В таких случаях изменение стандартного реквизита может «сломать» логику программы.
Проанализируем альтернативный метод решения:
ЦенаРасширенная.Число (15, 5).Цена скроем (или сделаем только для чтения).Посмотрим на пример кода в модуле формы документа:
&НаКлиенте
Процедура Расш1_ЦенаРасширеннаяПриИзменении(Элемент)
ТекущиеДанные = Элементы.Запасы.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Записываем точное значение для наших нужд
ТекущиеДанные.ЦенаРасширенная = ТекущиеДанные.ЦенаРасширенная;
// Записываем округленное значение в типовой реквизит для совместимости
ТекущиеДанные.Цена = Окр(ТекущиеДанные.ЦенаРасширенная, 2);
// Пересчитываем сумму по стандартному алгоритму
ОбработкаТабличнойЧастиКлиент.РассчитатьСуммуТабЧасти(ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
Рассмотрим важный аспект, о котором часто забывают: регистры. Если вы изменили точность цены в документе до 5 знаков, но при проведении документа данные попадают в регистр накопления (например, ВыручкаИПродажи или ЗапасыНаСкладах), где ресурс Сумма или Цена все еще имеет точность 2 знака, вы столкнетесь с проблемой «хвостов».
При умножении количества на цену с 5 знаками вы получите очень точную сумму. Но при записи в регистр эта сумма будет округлена до 2 знаков. В итоге накопленная сумма в регистре не будет биться с детальными расчетами.
Рекомендация: Если вы расширяете точность в документах, обязательно проанализируйте всю цепочку движений. Возможно, вам потребуется заимствовать и соответствующие Регистры накопления, чтобы изменить точность их ресурсов. В противном случае управленческий учет потеряет смысл из-за постоянных копеечных погрешностей.
Чтобы изменения структуры данных (длины и точности) вступили в силу, расширение должно соответствовать определенным критериям:
Подведем итог: изменение точности через расширение — задача выполнимая, если правильно определить, используется ли в системе ОпределяемыйТип, и соблюдать правила платформы по увеличению (но не уменьшению) разрядности чисел.