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