При работе в программе 1С:Управление нашей фирмой (УНФ) пользователи часто сталкиваются с ситуацией, когда встроенная обработка Формирование цен ведет себя непредсказуемо. Типичный сценарий: вы пытаетесь рассчитать новую цену на основе существующей (например, пересчитать оптовую цену из евро в рубли), но вместо ожидаемого значения переменная в формуле подставляет совершенно иную цифру, которой нет ни в актуальном прайс-листе, ни в истории изменений. В данной статье мы подробно разберем, почему это происходит, проанализируем внутренние механизмы системы и выясним, где искать «спрятанные» значения.
Рассмотрим ситуацию: в регистре сведений Цены номенклатуры зафиксирована цена 26 евро. Однако при открытии обработки Формирование цен и использовании переменной [ОптоваяЕвро] система упорно подставляет значение 34. Самое странное начинается, когда поведение меняется от контекста: если мы меняем саму цену в USD, подставляется верное значение 157.95, но если на основе этой же цены мы хотим рассчитать рублевый эквивалент, переменная внезапно возвращает 140.
Для решения этой загадки нам потребуется пройти путь от простых настроек интерфейса до анализа программного кода и запросов Системы компоновки данных (СКД).
Первым делом проанализируем самый очевидный источник данных — регистр сведений Цены номенклатуры. Важно понимать, что обработка Формирование цен делает «срез последних» на определенную дату.
Установка цен, дата которого случайно оказалась в будущем. В истории цен карточки номенклатуры такие записи могут быть не сразу заметны, если установлен фильтр по текущей дате.Проанализируем настройки самого Вида цен. Даже если пользователь уверен, что наценок нет, правила расчета могут быть переопределены внутри справочника.
Перейдем в раздел Продажи — Виды цен и откроем интересующий нас вид цены. Обратим внимание на следующие настройки:
Это один из самых сложных и неочевидных механизмов УНФ. Выясним причину, по которой цена в валюте при расчете рублевой цены может «искажаться».
Когда мы используем в формуле переменную [Цена в USD] для расчета Цены в РУБ, система не просто берет цифру из регистра. Она выполняет следующую цепочку:
Цены номенклатуры в валюте ее установки.Если между датой установки исходной цены и текущим моментом курс валюты управленческого учета сильно изменился, итоговое значение переменной в формуле будет отличаться от того, что вы видите в карточке товара. Совет: проверьте курсы в регистре сведений Курсы валют и убедитесь, что валюта учета настроена корректно.
Если настройки цен и курсов не дали ответа, проанализируем ситуацию как программисты. Обработка Формирование цен базируется на динамическом построении запроса. Пользователь в Сообщении 8 нашел критическую точку в коде:
&НаСервере
Процедура ИзменитьКолонкиНовыхЦенНаСервере(Результат)
ТаблицаФормыНоменклатуры = РеквизитФормыВЗначение("ТЧНоменклатура", Тип("ТаблицаЗначений"));
// Именно здесь в ТЧНоменклатура уже лежат "неверные" данные
КонецПроцедуры
Выясним, откуда данные попадают в ТЧНоменклатура. Они формируются с помощью Схемы компоновки данных (СКД), которая зашита внутри обработки. Рассмотрим основные причины «глюков» на уровне запроса:
[Цена] берется не из регистра цен, а из последних документов Приходная накладная. Если в последней закупке цена была 140, а в прайсе 157, система может отдать приоритет закупке.Цены номенклатуры есть две записи на одну и ту же секунду (например, от разных документов установки), запрос СКД может выбрать «первую попавшуюся», которая не совпадает с той, что отображается в интерфейсе карточки.Для того чтобы добиться предсказуемого поведения обработки, выполним следующие шаги:
Установка цен, созданные на ту же дату.Формирование цен при нажатии кнопки «Подобрать номенклатуру» убедитесь, что в фильтрах выбраны именно те колонки исходных цен, которые вы используете в формулах.ПриСозданииНаСервере обработки ФормированиеЦенНоменклатуры.Подводя итог, можно сказать, что 1С:УНФ — это гибкая, но сложная система. Значение «140» или «34» не берется из ниоткуда. Это всегда результат математического пересчета, завязанного на курсы валют, коэффициенты единиц измерения или настройки приоритетов источников данных в СКД. Тщательный аудит этих трех областей позволит вам полностью контролировать процесс ценообразования.