В последних версиях 1С:Управление торговлей 11.5 (начиная с релиза 11.5.18 и выше), а также в актуальных сборках ERP 2.5 и КА 2.5, многие пользователи столкнулись с изменением привычного алгоритма работы. Если раньше при создании документа Установка цен номенклатуры на основании Приобретения товаров и услуг система автоматически пересчитывала все цены в базовые единицы хранения (например, в «штуки»), то теперь она оставляет те единицы измерения, которые были указаны в приходе (коробки, упаковки, паллеты). В этой статье мы подробно разберем, почему это произошло, и рассмотрим несколько способов вернуть удобный вам механизм работы.
Проанализируем ситуацию с точки зрения разработчиков 1С. Основная причина перехода на фиксацию цен в единицах поставки — борьба с ошибками округления. Рассмотрим классический пример: вы закупаете коробку товара из 3 штук за 1000 рублей. Если система принудительно пересчитает цену в единицы хранения, то цена за 1 штуку составит 333,3333... рубля. При записи в базу число будет округлено до двух или четырех знаков. Когда в дальнейшем потребуется восстановить стоимость всей коробки (например, для возврата поставщику или складской отчетности), обратное умножение даст 999,99 рубля. Разница в одну копейку создает проблемы в регламентированном учете и взаиморасчетах.
Чтобы обеспечить точность «копейка в копейку», в новых релизах был внедрен принцип: в какой единице товар поступил, в такой он и расценивается по умолчанию. Однако для управленческого учета и формирования прайс-листа это часто неудобно, так как менеджеры привыкли оперировать ценой за штуку.
Этот метод считается наиболее «чистым», так как он не требует внесения изменений в программный код конфигурации, а использует штатный механизм настройки видов цен. Рассмотрим по шагам, как реализовать этот подход, если у вас есть доступ к копии базы старого релиза (до 11.5.18) или демонстрационной базе:
Толстый клиент.Еще).Таким образом, система начнет использовать старый алгоритм запроса к базе данных, который игнорирует упаковки из документа-основания и всегда обращается к базовой единице хранения Номенклатура.ЕдиницаИзмерения.
Если позиций в документе не слишком много или вы не хотите менять настройки видов цен, можно воспользоваться встроенным помощником в самом документе Установка цен номенклатуры. Посмотрим, как это сделать максимально быстро:
В созданном документе установки цен нажмем кнопку Изменить цены. В открывшемся меню выберем команду Изменить состав строк или сразу найдем опцию Пересчитать в единицы хранения. После выбора этого действия система автоматически выполнит следующие операции:
Важный момент: при таком подходе обязательно проверяйте итоговые суммы, чтобы избежать тех самых ошибок округления в иррациональных числах.
Для компаний с большим документооборотом ручной пересчет каждой установки цен неприемлем. В этом случае программисту 1С целесообразно создать небольшое расширение. Проанализируем техническую сторону вопроса. Основная логика заполнения документа на основании находится в обработке ПомощникУстановкиЦенНоменклатуры и общем модуле Ценообразование. В качестве готовой альтернативы собственной разработке можно использовать обработку для заполнения установки цен напрямую из поступлений.
Нам потребуется перехватить процедуру, отвечающую за загрузку данных из документов закупки. В коде расширения необходимо принудительно установить признак использования базовых единиц. Пример логики, которую можно реализовать в процедуре ПередЗаполнениемДанных (условно):
// В расширении для обработки ПомощникУстановкиЦенНоменклатуры
&Вместо("ПодготовитьДанныеДляЗаполнения")
Процедура Имя_ПодготовитьДанныеДляЗаполнения(Параметры)
// Вызываем оригинальный метод
ПродолжитьВызов(Параметры);
// Перебираем загруженные данные и принудительно меняем упаковку на пустую ссылку (ед. хранения)
Для Каждого СтрокаДанных Из Параметры.ТаблицаЦен Цикл
Если ЗначениеЗаполнено(СтрокаДанных.Упаковка) Тогда
Коэффициент = 1;
Если СтрокаДанных.Упаковка.Коэффициент <> 0 Тогда
Коэффициент = СтрокаДанных.Упаковка.Коэффициент;
КонецЕсли;
СтрокаДанных.Цена = СтрокаДанных.Цена / Коэффициент;
СтрокаДанных.Упаковка = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обратите внимание, что использование ПустаяСсылка() для справочника УпаковкиЕдиницыИзмерения в логике УТ 11 как раз означает использование базовой единицы хранения номенклатуры.
Разберем ситуацию, упомянутую в обсуждении: когда деление цены упаковки на количество дает бесконечную дробь. Если ваш бизнес-процесс требует обязательной расценки в штуках, мы рекомендуем изменить параметры учета в разделе НСИ и администрирование — Номенклатура — Единицы измерения.
Увеличьте точность хранения цены. По умолчанию в 1С используется 2 знака после запятой. Если установить точность до 3 или 4 знаков, погрешность округления при пересчете из упаковок в штуки станет пренебрежимо малой, что снимет большинство вопросов при сопоставлении документов закупки и продажи. Помните, что изменение точности цены — это серьезный шаг, который повлияет на отображение цен во всех печатных формах и отчетах, поэтому предварительно протестируйте это на копии базы.
Выбор способа решения зависит от ваших ресурсов:
Помощника установки цен.