Как в отчете Прайс-лист вывести остатки без учета резерва в 1С:УТ 11.4

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

В типовой конфигурации 1С:Управление торговлей редакции 11.4 отчет «Прайс-лист» по умолчанию выводит общий остаток товара на складах. Однако для эффективных продаж менеджерам часто необходимо видеть не просто физическое наличие, а доступный остаток — то есть количество товара, которое еще не забронировано под другие заказы. Рассмотрим подробно, как изменить логику формирования отчета, чтобы функция Остаток() учитывала резервы, аналогично отчету «Остатки и доступность товаров».

Разберем архитектуру хранения данных об остатках

Прежде чем приступать к правке отчета, проанализируем ситуацию с регистрами. В старых версиях УТ 11 данные брались из регистра накопления ТоварыНаСкладах. В современных редакциях (начиная с 11.4.14 и выше) за расчет доступности отвечает более сложный механизм — регистр накопления «Распределение запасов».

Этот регистр хранит данные в разрезе следующих состояний:

Для решения нашей задачи нам необходимо обратиться именно к виртуальной таблице РегистрНакопления.РаспределениеЗапасов.Остатки.

Проанализируем особенности формирования отчета Прайс-лист

Важно понимать, что отчет «Прайс-лист» в УТ 11 реализован не как классический отчет на Системе компоновки данных (СКД), который можно подправить в визуальном конструкторе за пять минут. Его структура формируется динамически. Основная логика сбора данных сосредоточена в модуле менеджера справочника Номенклатура.

Когда пользователь вызывает формирование прайс-листа, система выполняет сложный запрос, который объединяет цены, характеристики и остатки. Чтобы поле Остаток стало отображать данные без резерва, нам придется вмешаться в этот процесс.

Шаг 1: Изменение запроса в схеме компоновки данных

Выясним причину, по которой замена запроса (как упоминалось в сообщении 2 форума) не сразу дает результат. Если вы редактируете макет ПрайсЛист в конфигураторе, вам необходимо добавить левое соединение с регистром РаспределениеЗапасов.Остатки.

Пример фрагмента запроса, который нужно интегрировать в основную выборку:


ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РаспределениеЗапасов.Остатки(&Период, ) КАК РаспределениеЗапасовОстатки
ПО (РаспределениеЗапасовОстатки.Номенклатура = ИсходныеДанные.Номенклатура)
    И (РаспределениеЗапасовОстатки.Характеристика = ИсходныеДанные.Характеристика)
    И (РаспределениеЗапасовОстатки.Склад = ИсходныеДанные.Склад)

В блоке ВЫБРАТЬ необходимо указать поле Доступно:

ЕСТЬNULL(РаспределениеЗапасовОстатки.ДоступноОстаток, 0) КАК Доступно

Шаг 2: Работа с вычисляемыми полями

Как справедливо замечено в сообщении 3, поле может быть вычисляемым. В настройках СКД на вкладке «Вычисляемые поля» мы можем создать новое поле ОстатокБезРезерва.

Рассмотрим выражение, которое следует прописать для этого поля:

ВЫБОР КОГДА Доступно < 0 ТОГДА 0 ИНАЧЕ Доступно КОНЕЦ

Это позволит избежать отрицательных значений в прайс-листе, если по каким-то причинам резервы превысили фактический остаток (например, при разрешении отгрузки в «минус»).

Шаг 3: Корректировка функции Остаток()

В отчете «Прайс-лист» поле остатка часто выводится через агрегатные функции или предопределенные настройки компоновки. Чтобы вместо физического наличия выводилось доступное количество, выполним следующие действия:

  1. Найдем в схеме компоновки данных (макет ПрайсЛист) набор данных, отвечающий за остатки.
  2. Заменим ресурс ВНаличии (или аналогичное поле) на наше новое поле Доступно.
  3. В настройках варианта отчета (на вкладке «Выбранные поля») убедимся, что используется именно то поле, которое мы вытянули из регистра РаспределениеЗапасов.

Шаг 4: Программная модификация через расширение

Поскольку мы работаем с типовой конфигурацией УТ 11.4.14.181, крайне рекомендуется использовать расширение конфигурации, чтобы не снимать основную программу с поддержки. Рассмотрим, как перехватить формирование данных в модуле менеджера.

Нам потребуется найти процедуру, которая готовит временную таблицу с остатками. Обычно это методы, связанные с ПодготовитьДанныеДляПрайсЛиста. Мы можем использовать метод &После или &Вместо, чтобы модифицировать текст запроса динамически.

Посмотрим на пример кода в расширении:


&Вместо("ТекстЗапросаДляОстатков")
Функция Мой_ТекстЗапросаДляОстатков()
    Текст = 
    "ВЫБРАТЬ
    |    РаспределениеЗапасовОстатки.Номенклатура КАК Номенклатура,
    |    РаспределениеЗапасовОстатки.Характеристика КАК Характеристика,
    |    СУММА(РаспределениеЗапасовОстатки.Доступно) КАК Остаток
    |ИЗ
    |    РегистрНакопления.РаспределениеЗапасов.Остатки(&Период, ) КАК РаспределениеЗапасовОстатки
    |СГРУППИРОВАТЬ ПО
    |    РаспределениеЗапасовОстатки.Номенклатура,
    |    РаспределениеЗапасовОстатки.Характеристика";
    Возврат Текст;
КонецФункции

Важные нюансы и рекомендации

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

Учет настроек доступности. Помните, что в УТ 11 существует функциональная опция «Учитывать резервы при расчете остатков в прайс-листах» (в некоторых релизах она может называться иначе или отсутствовать в явном виде). Перед тем как кодить, проверьте раздел НСИ и администрирование -> Настройка разделов -> Продажи -> Прайс-лист. Возможно, ваша версия уже поддерживает это переключателем.

Проблема «пустых полей». Если после изменения запроса в колонке остатков стало пусто, выясним причину. Чаще всего это происходит из-за ВНУТРЕННЕГО СОЕДИНЕНИЯ вместо ЛЕВОГО. Если товара нет в регистре РаспределениеЗапасов (остаток равен 0), то при внутреннем соединении вся строка номенклатуры может исчезнуть из прайса. Всегда используйте ЛЕВОЕ СОЕДИНЕНИЕ и функцию ЕСТЬNULL.

Таким образом, мы выяснили, что для отображения остатков без резерва в прайс-листе необходимо переориентировать запрос с регистра ТоварыНаСкладах на таблицу Остатки регистра РаспределениеЗапасов, используя поле Доступно. Это обеспечит полное соответствие данных прайс-листа и отчета «Остатки и доступность».

← На главную