При разработке расширений часто возникает необходимость скорректировать поведение стандартных объектов конфигурации без внесения изменений в основную базу. Одной из таких задач является снятие ограничения на ввод отрицательных чисел для определенных реквизитов. Разберем подробно, как это реализовать, какие существуют технические ограничения и к каким последствиям в учете это может привести.
Рассмотрим основной вопрос: можно ли программно или через визуальный редактор расширения изменить свойство Неотрицательное? Ответ — да, это возможно. Однако здесь существует критически важное условие, касающееся версии платформы 1С:Предприятие. Проанализируем технические требования: возможность расширения свойств метаданных, влияющих на проверку данных, была существенно дополнена в версии 8.3.17.
Если ваша основная конфигурация и расширение имеют режим совместимости ниже 8.3.17, платформа может не позволить изменить это свойство или проигнорировать его в режиме исполнения. Поэтому первым делом проверим настройки режима совместимости в свойствах корня конфигурации и самого расширения. Выясним причину, почему это работает именно так: платформа должна гарантировать, что механизмы расширения метаданных согласованы с ядром системы.
Многих разработчиков терзают сомнения: не приведет ли снятие флага Неотрицательное к масштабной реструктуризации таблиц базы данных в MS SQL Server или PostgreSQL? Разберем этот момент подробнее. В платформе 1С тип данных Число на уровне СУБД практически всегда создается с поддержкой знака. Свойство Неотрицательное является логическим ограничением, которое накладывает сама платформа 1С при записи объекта или валидации данных в интерфейсе.
Посмотрим на ситуацию с точки зрения физического хранения:
Просто снять флаг у реквизита объекта в расширении зачастую недостаточно. Проанализируем, как это влияет на пользовательский интерфейс. Если реквизит выведен на форму, платформа автоматически применяет ограничения к полю ввода. Однако существуют нюансы:
Неотрицательное было установлено вручную для конкретного элемента (поля ввода), то изменение в объекте не «пробросится» автоматически. В этом случае нам придется заимствовать саму форму в расширение и менять свойства элемента формы.Выясним, какие подводные камни ждут нас в коде конфигурации. Даже если платформа разрешила ввод отрицательного числа, типовой код (особенно в 1С:Бухгалтерия 3.0) может содержать жесткие проверки. Рассмотрим пример перехвата таких проверок. Часто в модуле объекта в процедуре ПередЗаписью или ОбработкаПроверкиЗаполнения встречаются условия, блокирующие запись отрицательных сумм.
Для обхода таких ограничений мы можем использовать аннотации расширений. Посмотрим на пример кода, который позволяет игнорировать стандартную проверку:
&Вместо("ПроверитьЗаполнениеДокумента")
Процедура Расш1_ПроверитьЗаполнениеДокумента(Отказ)
// Вызываем стандартную логику, если нужно
ПродолжитьВызов(Отказ);
// Если стандартная логика установила Отказ из-за отрицательного числа,
// а мы сознательно это разрешаем для конкретного реквизита:
Если Отказ Тогда
// Здесь можно добавить логику анализа сообщений об ошибках
// и принудительно сбросить флаг Отказ, если причина только в знаке
Отказ = Ложь;
КонецЕсли;
КонецПроцедуры
Важно: Проанализируем алгоритмы проведения. В бухгалтерском учете отрицательные суммы в документах реализации (например, в «Отчете комиссионера») могут привести к некорректному формированию проводок или движений по регистрам накопления. Система может не «понять» отрицательный расход и выдать ошибку при расчете себестоимости или партионного учета.
Разберем ситуацию, когда изменение свойств реквизита — не самый лучший путь. В типовых решениях 1С (БП, ERP, УТ) для отражения возвратов или корректировок реализации предусмотрены специальные механизмы. Например, в документе «Отчет комиссионера» существует отдельная табличная часть Возвраты. Использование этой вкладки методологически верно, так как она правильно закрывает взаиморасчеты и сторнирует движения.
Если мы все же решим использовать «минусы» в основной табличной части, нам придется столкнуться со следующими сложностями:
Подводя итог, можно сказать: технически снять флаг Неотрицательное через расширение несложно. Однако это лишь верхушка айсберга. Проанализируем последовательность действий для безопасного внедрения:
ПолеВвода.Если ... < 0 Тогда для этого реквизита.Рассмотрев все риски, мы рекомендуем сначала убедиться, что бизнес-задачу нельзя решить штатными средствами (вкладки «Возвраты», документы «Корректировка реализации» или «Сторно»). Если же использование отрицательных чисел неизбежно, делайте это максимально аккуратно, сопровождая изменения комментариями в коде расширения.