Почему вид цены «Себестоимость» в УТ 11 рассчитывает завышенные цены и как скорректировать схему компоновки данных?

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

При настройке вида цены со способом задания «Произвольный запрос к данным ИБ» на базе предопределенной схемы компоновки данных (СКД) «Себестоимость без дополнительных расходов» в конфигурации «1С:Управление торговлей 11» пользователи нередко сталкиваются с ситуацией, когда рассчитанная себестоимость в несколько раз превышает фактическую цену последней закупки. Разберем детально, почему типовой запрос дает завышенный результат, как разблокировать и скорректировать схему СКД, а также как устроена архитектура регистрации и применения цен в системе.

Анализ логики типового запроса СКД «Себестоимость»

Проанализируем внутреннее устройство типового запроса схемы компоновки данных. Расчет себестоимости формируется путем объединения двух выборок данных из регистра накопления СебестоимостьТоваров:

  1. Обороты прихода за текущий месяц: берутся все движения с видом движения ВидДвиженияНакопления.Приход за период с начала месяца по дату документа. Если за месяц выполнен расчет себестоимости (проведен документ РасчетСебестоимостиТоваров), стоимость берется из регистра сведений СтоимостьТоваров, иначе — напрямую из регистра накопления.
  2. Остатки на начало месяца: выбираются остатки стоимости и количества на начало месяца из виртуальной таблицы РегистрНакопления.СебестоимостьТоваров.Остатки.

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


ВЫБОР
    КОГДА СУММА(СебестоимостьТоваров.Количество) > 0
        ТОГДА ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.Стоимость) / СУММА(СебестоимостьТоваров.Количество) КАК ЧИСЛО(15, 2))
    ИНАЧЕ 0
КОНЕЦ КАК Цена

Выясним причину завышения себестоимости. Основная проблема этой схемы кроется в нескольких факторах учета:

  1. Внутренние перемещения товаров: любое перемещение между складами или организациями внутри месяца формирует новый приход по регистру СебестоимостьТоваров. Запрос суммирует суммы приходов без вычитания расходов. При активном перемещении одной и той же партии стоимость многократно удваивается в оборотах прихода, а деление на фактическое количество дает искаженную среднюю цену.
  2. Смешивание остатков и приходов: если товар поступил в текущем месяце, но на начало месяца уже висел остаток (например, зависшие суммовые остатки прошлых периодов при нулевом количестве из-за ошибок партионного учета), прямое объединение двух источников приводит к завышению цены.
  3. Разница в учете НДС: поле Стоимость и СтоимостьБезНДС могут по-разному заполняться в зависимости от учетной политики организации и флага ЦенаВключаетНДС в справочнике ВидыЦен.

Корректировка алгоритма расчета цены в СКД

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

Для этого в объединении запросов разделим поля стоимости и остатков, а расчет результирующего поля Цена запишем следующим образом:


ВЫБОР
    КОГДА СУММА(СебестоимостьТоваров.Количество) > 0 ТОГДА
        ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.Стоимость) / СУММА(СебестоимостьТоваров.Количество) КАК ЧИСЛО(15, 2))
    ИНАЧЕ
        ВЫБОР
            КОГДА СУММА(СебестоимостьТоваров.КоличествоОстаток) > 0 ТОГДА
                ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.СтоимостьОстаток) / СУММА(СебестоимостьТоваров.КоличествоОстаток) КАК ЧИСЛО(15, 2))
            ИНАЧЕ 0
        КОНЕЦ
КОНЕЦ КАК Цена

Как разблокировать редактирование схемы СКД в виде цены

При попытке изменить СКД в существующей карточке вида цены кнопка «Редактировать схему компоновки данных» часто оказывается недоступной. Рассмотрим, как снять блокировку.

За запрет изменения ключевых полей отвечает подсистема БСП «Запрет редактирования ключевых реквизитов объектов» (метод ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты). Она блокирует элементы формы при открытии существующего элемента.

Разблокировать схему можно двумя путями:

  1. Штатный пользовательский способ: в форме элемента справочника ВидыЦен в меню «Еще» (или «Все действия») необходимо нажать команду «Разрешить редактирование реквизитов» и подтвердить действие. После этого доступность СКД восстанавливается без правок в коде.
  2. Программный способ (для внешних обработок или расширений): если редактирование схемы выполняется в коде, проверку доступности контекста толстого клиента следует обрамлять директивами компиляции:
    
    #Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
        // Действия по открытию конструктора СКД
    #КонецЕсли
    

Почему изменения в СКД не отображаются в рабочем месте «Цены (прайс-лист)»

После изменения схемы компоновки данных пользователи часто открывают форму «Цены (прайс-лист)» и видят старые значения. Разберем, как устроен механизм расчета цен в УТ 11.

Обработка «Цены (прайс-лист)» — это интерфейс для визуального просмотра и подготовки документа переоценки. Для видов цен, рассчитываемых по данным информационной базы (статических):

  1. Цены не рассчитываются динамически «на лету» в самом отчете прайс-листа — они считываются из регистра сведений ЦеныНоменклатуры.
  2. Запуск расчета по схеме СКД происходит только в момент выполнения процедуры расчета (команда «Установить цены» или при формировании документа УстановкаЦенНоменклатуры).
  3. Новые значения цен вступают в силу только после проведения документа УстановкаЦенНоменклатуры, который записывает рассчитанные по СКД данные в регистр сведений ЦеныНоменклатуры.

Получение дополнительных реквизитов и сведений в коде

Если при доработке схемы или процедур расчета требуется программно получить дополнительные реквизиты или сведения номенклатуры, не следует создавать собственные запросы к регистру ДополнительныеСведения. Рекомендуется использовать типовые методы БСП из общего модуля УправлениеСвойствами:

Для получения одного значения дополнительного сведения:


ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаНоменклатуру, СвойствоИлиИмя);

Для чтения группы дополнительных реквизитов и сведений:


ТаблицаСвойств = УправлениеСвойствами.ЗначенияСвойств(МассивСсылок, Истина, Истина);

Использование штатных механизмов БСП гарантирует корректную работу при обновлении конфигурации и сохраняет целостность логики ценообразования программы.

← На главную