При настройке вида цены со способом задания «Произвольный запрос к данным ИБ» на базе предопределенной схемы компоновки данных (СКД) «Себестоимость без дополнительных расходов» в конфигурации «1С:Управление торговлей 11» пользователи нередко сталкиваются с ситуацией, когда рассчитанная себестоимость в несколько раз превышает фактическую цену последней закупки. Разберем детально, почему типовой запрос дает завышенный результат, как разблокировать и скорректировать схему СКД, а также как устроена архитектура регистрации и применения цен в системе.
Проанализируем внутреннее устройство типового запроса схемы компоновки данных. Расчет себестоимости формируется путем объединения двух выборок данных из регистра накопления СебестоимостьТоваров:
ВидДвиженияНакопления.Приход за период с начала месяца по дату документа. Если за месяц выполнен расчет себестоимости (проведен документ РасчетСебестоимостиТоваров), стоимость берется из регистра сведений СтоимостьТоваров, иначе — напрямую из регистра накопления.РегистрНакопления.СебестоимостьТоваров.Остатки.После объединения двух таблиц запрос суммирует всю стоимость и все количество, после чего выполняет деление:
ВЫБОР
КОГДА СУММА(СебестоимостьТоваров.Количество) > 0
ТОГДА ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.Стоимость) / СУММА(СебестоимостьТоваров.Количество) КАК ЧИСЛО(15, 2))
ИНАЧЕ 0
КОНЕЦ КАК Цена
Выясним причину завышения себестоимости. Основная проблема этой схемы кроется в нескольких факторах учета:
СебестоимостьТоваров. Запрос суммирует суммы приходов без вычитания расходов. При активном перемещении одной и той же партии стоимость многократно удваивается в оборотах прихода, а деление на фактическое количество дает искаженную среднюю цену.Стоимость и СтоимостьБезНДС могут по-разному заполняться в зависимости от учетной политики организации и флага ЦенаВключаетНДС в справочнике ВидыЦен.Чтобы исключить суммирование остатков на начало месяца и приходов за текущий период, изменим логику расчета. Если в текущем месяце были поступления, будем рассчитывать себестоимость исключительно по фактическим приходам. Если же приходов не было, используем входящие остатки на начало месяца.
Для этого в объединении запросов разделим поля стоимости и остатков, а расчет результирующего поля Цена запишем следующим образом:
ВЫБОР
КОГДА СУММА(СебестоимостьТоваров.Количество) > 0 ТОГДА
ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.Стоимость) / СУММА(СебестоимостьТоваров.Количество) КАК ЧИСЛО(15, 2))
ИНАЧЕ
ВЫБОР
КОГДА СУММА(СебестоимостьТоваров.КоличествоОстаток) > 0 ТОГДА
ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.СтоимостьОстаток) / СУММА(СебестоимостьТоваров.КоличествоОстаток) КАК ЧИСЛО(15, 2))
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК Цена
При попытке изменить СКД в существующей карточке вида цены кнопка «Редактировать схему компоновки данных» часто оказывается недоступной. Рассмотрим, как снять блокировку.
За запрет изменения ключевых полей отвечает подсистема БСП «Запрет редактирования ключевых реквизитов объектов» (метод ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты). Она блокирует элементы формы при открытии существующего элемента.
Разблокировать схему можно двумя путями:
ВидыЦен в меню «Еще» (или «Все действия») необходимо нажать команду «Разрешить редактирование реквизитов» и подтвердить действие. После этого доступность СКД восстанавливается без правок в коде.
#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
// Действия по открытию конструктора СКД
#КонецЕсли
После изменения схемы компоновки данных пользователи часто открывают форму «Цены (прайс-лист)» и видят старые значения. Разберем, как устроен механизм расчета цен в УТ 11.
Обработка «Цены (прайс-лист)» — это интерфейс для визуального просмотра и подготовки документа переоценки. Для видов цен, рассчитываемых по данным информационной базы (статических):
ЦеныНоменклатуры.УстановкаЦенНоменклатуры).УстановкаЦенНоменклатуры, который записывает рассчитанные по СКД данные в регистр сведений ЦеныНоменклатуры.Если при доработке схемы или процедур расчета требуется программно получить дополнительные реквизиты или сведения номенклатуры, не следует создавать собственные запросы к регистру ДополнительныеСведения. Рекомендуется использовать типовые методы БСП из общего модуля УправлениеСвойствами:
Для получения одного значения дополнительного сведения:
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаНоменклатуру, СвойствоИлиИмя);
Для чтения группы дополнительных реквизитов и сведений:
ТаблицаСвойств = УправлениеСвойствами.ЗначенияСвойств(МассивСсылок, Истина, Истина);
Использование штатных механизмов БСП гарантирует корректную работу при обновлении конфигурации и сохраняет целостность логики ценообразования программы.