При работе с мелкооптовой торговлей, крепежом, электронными компонентами или химическим сырьем пользователи часто сталкиваются с ситуацией, когда поставщик выставляет первичные документы (например, УПД или ТОРГ-12) с ценами, имеющими 3 или 4 знака после запятой. Попытка ввести такую цену в типовую конфигурацию «1С:Комплексная автоматизация 2» или «1С:ERP» наталкивается на жесткое ограничение платформы: стандартные реквизиты цен рассчитаны строго на 2 знака после запятой.
В этой статье мы подробно разберем, почему изменение точности «в лоб» через конфигуратор является критической ошибкой, какие риски это несет для учета себестоимости и интеграций, а также рассмотрим три практических и безопасных способа решения этой задачи без снятия конфигурации с поддержки.
Первое побуждение начинающего разработчика — открыть конфигуратор, найти нужный документ (например, ПриобретениеТоваровУслуг) и увеличить масштаб реквизита Цена в табличной части до 4 знаков. Давайте разберем, почему этот путь ведет к катастрофе:
ОпределяемыеТипы (такие как ОпределяемыйТип.ДенежнаяСуммаНеотрицательная или ОпределяемыйТип.Цена). Если изменить масштаб в определяемом типе, изменения автоматически каскадом пройдут по всей системе. Это затронет не только цены в закупках, но и розничные цены, плановую себестоимость, регистры накопления взаиморасчетов и проводок. Начнут «разъезжаться» копейки при округлениях НДС по всей базе.Количество * Цена = Сумма без НДС при 4 знаках в цене и округленной до 2 знаков сумме вызовет математические расхождения, что является поводом для отказа покупателю в налоговом вычете по НДС.Давайте проанализируем альтернативные варианты решения этой задачи, которые сохранят типовой функционал системы и решат проблему пользователей.
Самый простой, методологически верный и абсолютно типовой способ — использовать механизмы упаковок или кратных единиц измерения. Для этого не требуется привлекать программиста.
Выясним причину проблемы на конкретном примере. Предположим, поставщик присылает мелкие детали (например, «Шпунька металлическая») в количестве 10 000 штук по цене 1,5252 рубля за штуку. Итоговая сумма накладной составляет 15 252,00 рубля. Вводить цену 1,5252 напрямую программа не позволяет.
Разберем по шагам, как решить это с помощью упаковок:
ПриобретениеТоваровУслуг укажем единицу измерения не «шт.», а созданную нами упаковку «Тысяча шт.».Результат: Итоговая сумма рассчитывается идеально точно: 10 * 1525,20 = 15 252,00 руб. Складской учет ведется в базовых штуках (на склад поступит ровно 10 000 штук), а финансовый контур оперирует стандартной ценой с двумя знаками после запятой. Никаких доработок системы не требуется.
Если заказчик категорически отказывается работать с упаковками (например, операторы привыкли вбивать документы строго по спецификации поставщика «один в один»), мы можем применить изящное техническое решение с использованием расширения конфигурации.
Суть метода заключается в том, что мы добавляем в табличную часть документа ПриобретениеТоваровУслуг.Товары новый вспомогательный реквизит ЦенаВнешняя с точностью 4 знака. Он будет отображаться на форме вместо стандартной цены, а система при его изменении сама рассчитает корректную сумму (до 2 знаков) и запишет обратно в стандартную колонку «Цена» результат деления итоговой суммы на количество.
Давайте рассмотрим подробнее алгоритм реализации этого механизма через расширение конфигурации:
Товары документа ПриобретениеТоваровУслуг.ЦенаВнешняя с типом Число(15, 4).ФормаДокумента в расширение. Скроем стандартную колонку Цена на форме и выведем вместо нее новую колонку ЦенаВнешняя.ЦенаВнешняя создадим обработчик события ПриИзменении на клиенте.Посмотрим на пример программного кода, который необходимо написать в модуле формы расширения:
&НаКлиенте
Процедура Расш1_ТоварыЦенаВнешняяПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
Если СтрокаТабличнойЧасти <> Неопределено Тогда
// 1. Рассчитываем точную сумму на основании четырехзначной цены
ТочнаяСумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.ЦенаВнешняя;
// 2. Округляем сумму до копеек (2 знака после запятой) для соответствия учетным стандартам РФ
СтрокаТабличнойЧасти.Сумма = Округлить(ТочнаяСумма, 2);
// 3. Вычисляем обратную цену для записи в стандартный реквизит 1С
Если СтрокаТабличнойЧасти.Количество <> 0 Тогда
СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Количество;
Иначе
СтрокаТабличнойЧасти.Цена = 0;
КонецЕсли;
// 4. Оповещаем форму о необходимости пересчитать НДС и прочие зависимые показатели
// Для этого вызываем типовой обработчик пересчета строки табличной части
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", Истина);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", Истина);
// Применяем стандартную обработку пересчета строки
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокаТабличнойЧасти, СтруктураДействий, Объект);
КонецЕсли;
КонецПроцедуры
Преимущества данного подхода:
Этот метод часто используется опытными бухгалтерами, когда подобные «сложные» закупки происходят редко и разворачивать технические доработки не имеет экономического смысла.
В первичном документе поставщика всегда есть три ключевые величины для каждой строки: Количество, Цена и Итоговая сумма. Математически, для проведения документа в системе 1С критически важны только Количество и Сумма. Именно эти показатели формируют проводки по взаиморасчетам и стоимость оприходованных запасов на складе.
Вместо того чтобы вводить цену 1,5252 руб. для количества 1000 шт., оператору достаточно выполнить следующие действия:
Количество значением 1000.Цена и сразу ввести в колонку Сумма итоговое значение из накладной — 1525,20.Да, рассчитанная цена будет отличаться от прайсовой цены поставщика на несколько копеек из-за округления. Однако итоговая сумма документа, сумма НДС и взаиморасчеты с контрагентом сойдутся «копейка в копейку» с бумажным оригиналом. Для налоговой инспекции и складского учета данный документ будет абсолютно легитимным.
Если единственная проблема, с которой сталкивается заказчик — это несоответствие печатной формы ТОРГ-12 или УПД, которую они выставляют своим покупателям, то лучшим решением будет создание внешней печатной формы.
В этом случае в самой информационной базе все расчеты ведутся по стандартным правилам (с округлением цены до 2 знаков). Но при печати документа система программно рассчитывает цену для каждой строки как Сумма / Количество и выводит полученный результат в печатную форму в формате с 4 знаками после запятой.
Для форматирования вывода цены в коде печатной формы мы можем применить следующую конструкцию:
// Форматируем вывод вычисляемой цены до 4 знаков после запятой
ЦенаДляПечати = Формат(ОбластьСтроки.Сумма / ОбластьСтроки.Количество, "ЧЦ=15; ЧДЦ=4");
Такой подход полностью снимает вопросы со стороны требовательных покупателей и исключает необходимость внесения изменений в логику проведения документов и конфигурацию базы данных.
Подводя итог анализу проблемы, дадим практические рекомендации по выбору оптимального пути: