Как увеличить разрядность цены до 4 знаков после запятой в «1С:Комплексная автоматизация 2» и «1С:ERP»?

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

При работе с мелкооптовой торговлей, крепежом, электронными компонентами или химическим сырьем пользователи часто сталкиваются с ситуацией, когда поставщик выставляет первичные документы (например, УПД или ТОРГ-12) с ценами, имеющими 3 или 4 знака после запятой. Попытка ввести такую цену в типовую конфигурацию «1С:Комплексная автоматизация 2» или «1С:ERP» наталкивается на жесткое ограничение платформы: стандартные реквизиты цен рассчитаны строго на 2 знака после запятой.

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

Почему нельзя просто изменить точность реквизитов в Конфигураторе?

Первое побуждение начинающего разработчика — открыть конфигуратор, найти нужный документ (например, ПриобретениеТоваровУслуг) и увеличить масштаб реквизита Цена в табличной части до 4 знаков. Давайте разберем, почему этот путь ведет к катастрофе:

  1. Определяемые типы данных. В современных ERP-системах разрядность большинства денежных показателей регулируется через механизм ОпределяемыеТипы (такие как ОпределяемыйТип.ДенежнаяСуммаНеотрицательная или ОпределяемыйТип.Цена). Если изменить масштаб в определяемом типе, изменения автоматически каскадом пройдут по всей системе. Это затронет не только цены в закупках, но и розничные цены, плановую себестоимость, регистры накопления взаиморасчетов и проводок. Начнут «разъезжаться» копейки при округлениях НДС по всей базе.
  2. Сложности с обновлениями. Изменение свойств контролируемых реквизитов (таких как точность и масштаб) напрямую через механизм расширений заблокировано платформой 1С из соображений целостности данных. Вам придется полностью снимать конфигурацию с поддержки. Учитывая частоту выхода обновлений для «1С:Комплексная автоматизация» и «1С:ERP», последующая поддержка такой измененной базы превратится в кошмар и потребует огромных бюджетов.
  3. Проблемы с электронным документооборотом (ЭДО). Форматы обмена электронными документами (УПД, счета-фактуры), утвержденные ФНС РФ, имеют жестко регламентированную структуру XML-схем. Передача цен с неустановленной разрядностью может привести к тому, что выгруженный файл не пройдет валидацию на стороне оператора ЭДО или принимающего шлюза налогового органа. Более того, формула Количество * Цена = Сумма без НДС при 4 знаках в цене и округленной до 2 знаков сумме вызовет математические расхождения, что является поводом для отказа покупателю в налоговом вычете по НДС.

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

Решение 1. Переход на кратные единицы измерения или упаковки (Рекомендуемый стандартный метод)

Самый простой, методологически верный и абсолютно типовой способ — использовать механизмы упаковок или кратных единиц измерения. Для этого не требуется привлекать программиста.

Выясним причину проблемы на конкретном примере. Предположим, поставщик присылает мелкие детали (например, «Шпунька металлическая») в количестве 10 000 штук по цене 1,5252 рубля за штуку. Итоговая сумма накладной составляет 15 252,00 рубля. Вводить цену 1,5252 напрямую программа не позволяет.

Разберем по шагам, как решить это с помощью упаковок:

  1. Откроем карточку номенклатуры «Шпунька металлическая».
  2. В разделе «Единицы измерения и условия хранения» включим использование упаковок.
  3. Создадим индивидуальную или типовую упаковку с названием «Тысяча шт.» (или «Упаковка 1000 шт.») с коэффициентом сопоставления к базовой единице измерения равным 1000.
  4. При оформлении документа ПриобретениеТоваровУслуг укажем единицу измерения не «шт.», а созданную нами упаковку «Тысяча шт.».
  5. Количество в документе укажем как 10 (что эквивалентно 10 000 базовых штук), а цену укажем за упаковку — 1525,20 руб.

Результат: Итоговая сумма рассчитывается идеально точно: 10 * 1525,20 = 15 252,00 руб. Складской учет ведется в базовых штуках (на склад поступит ровно 10 000 штук), а финансовый контур оперирует стандартной ценой с двумя знаками после запятой. Никаких доработок системы не требуется.

Решение 2. Использование виртуального реквизита в расширении конфигурации (Лучший технический компромисс)

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

Суть метода заключается в том, что мы добавляем в табличную часть документа ПриобретениеТоваровУслуг.Товары новый вспомогательный реквизит ЦенаВнешняя с точностью 4 знака. Он будет отображаться на форме вместо стандартной цены, а система при его изменении сама рассчитает корректную сумму (до 2 знаков) и запишет обратно в стандартную колонку «Цена» результат деления итоговой суммы на количество.

Давайте рассмотрим подробнее алгоритм реализации этого механизма через расширение конфигурации:

  1. Создадим новое расширение конфигурации (с включенной поддержкой безопасного режима).
  2. Добавим в расширение табличную часть Товары документа ПриобретениеТоваровУслуг.
  3. В расширении создадим новый реквизит табличной части ЦенаВнешняя с типом Число(15, 4).
  4. Заимствуем форму документа ФормаДокумента в расширение. Скроем стандартную колонку Цена на форме и выведем вместо нее новую колонку ЦенаВнешняя.
  5. Для нового поля ЦенаВнешняя создадим обработчик события ПриИзменении на клиенте.

Посмотрим на пример программного кода, который необходимо написать в модуле формы расширения:


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

Преимущества данного подхода:

Решение 3. Ввод через Количество и Сумму без использования цены (Организационный обходной путь)

Этот метод часто используется опытными бухгалтерами, когда подобные «сложные» закупки происходят редко и разворачивать технические доработки не имеет экономического смысла.

В первичном документе поставщика всегда есть три ключевые величины для каждой строки: Количество, Цена и Итоговая сумма. Математически, для проведения документа в системе 1С критически важны только Количество и Сумма. Именно эти показатели формируют проводки по взаиморасчетам и стоимость оприходованных запасов на складе.

Вместо того чтобы вводить цену 1,5252 руб. для количества 1000 шт., оператору достаточно выполнить следующие действия:

  1. В табличной части документа выбрать номенклатурную позицию.
  2. Заполнить колонку Количество значением 1000.
  3. Миновать колонку Цена и сразу ввести в колонку Сумма итоговое значение из накладной — 1525,20.
  4. Программа автоматически рассчитает цену как результат деления суммы на количество, получив значение 1,53.

Да, рассчитанная цена будет отличаться от прайсовой цены поставщика на несколько копеек из-за округления. Однако итоговая сумма документа, сумма НДС и взаиморасчеты с контрагентом сойдутся «копейка в копейку» с бумажным оригиналом. Для налоговой инспекции и складского учета данный документ будет абсолютно легитимным.

Решение 4. Использование внешних печатных форм

Если единственная проблема, с которой сталкивается заказчик — это несоответствие печатной формы ТОРГ-12 или УПД, которую они выставляют своим покупателям, то лучшим решением будет создание внешней печатной формы.

В этом случае в самой информационной базе все расчеты ведутся по стандартным правилам (с округлением цены до 2 знаков). Но при печати документа система программно рассчитывает цену для каждой строки как Сумма / Количество и выводит полученный результат в печатную форму в формате с 4 знаками после запятой.

Для форматирования вывода цены в коде печатной формы мы можем применить следующую конструкцию:


// Форматируем вывод вычисляемой цены до 4 знаков после запятой
ЦенаДляПечати = Формат(ОбластьСтроки.Сумма / ОбластьСтроки.Количество, "ЧЦ=15; ЧДЦ=4");

Такой подход полностью снимает вопросы со стороны требовательных покупателей и исключает необходимость внесения изменений в логику проведения документов и конфигурацию базы данных.

Резюме и рекомендации

Подводя итог анализу проблемы, дадим практические рекомендации по выбору оптимального пути:

← На главную