Как добавить колонки цен и остатков в список номенклатуры в 1С:Управление торговлей 11?

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

При доработке формы списка справочника Номенклатура в конфигурации «1С:Управление торговлей 11» часто возникает необходимость вывести дополнительные сведения: текущий остаток товара на складах и его актуальную розничную или закупочную цену. Однако при редактировании запроса динамического списка разработчики сталкиваются с тем, что цены или остатки не отображаются, товары с нулевым остатком исчезают из списка, а пустые значения выглядят как незаполненные ячейки вместо привычного нуля.

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

Основные причины ошибок при связывании таблиц

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

  1. Ошибка привязки левого соединения: Распространенной ошибкой является связывание виртуальной таблицы среза последних регистра ЦеныНоменклатуры с виртуальной таблицей ТоварыНаСкладахОстатки вместо основного справочника Номенклатура. Если соединять цены с остатками по условию ПО Цены.Номенклатура = Остатки.Номенклатура, то для всех товаров, у которых нет остатка на складе, цена перестанет выводиться. Связывать цены всегда нужно напрямую со справочником: ПО Цены.Номенклатура = СпрНоменклатура.Ссылка.
  2. Превращение левого соединения во внутреннее: Если отбор по виду цены (например, ВидЦены.Наименование = "Розничная") поместить в общую секцию ГДЕ, СУБД отфильтрует все строки, где значение цены равно NULL. В результате в списке останутся только те позиции, для которых физически установлена цена указанного вида, а вся остальная номенклатура исчезнет из формы. Фильтрацию по виду цены необходимо выносить либо в параметры виртуальной таблицы среза последних, либо в условие соединения ПО.
  3. Пустые ячейки вместо нулей: По умолчанию платформа 1С не выводит символ «0» для отсутствующих численных значений или значений NULL, оставляя ячейку пустой. Чтобы принудительно показывать «0», требуется совместное использование функции ЕСТЬNULL в запросе и настройки формата поля.

Разбор правильного запроса для динамического списка

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


ВЫБРАТЬ ПЕРВЫЕ 1
    СпрВидЦен.Ссылка КАК Розница
ПОМЕСТИТЬ ВтРозница
ИЗ
    Справочник.ВидыЦен КАК СпрВидЦен
ГДЕ
    СпрВидЦен.Наименование = "Розничная"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Ссылка,
    СпрНоменклатура.Код КАК Код,
    СпрНоменклатура.Наименование КАК Наименование,
    СпрНоменклатура.Артикул КАК Артикул,
    СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
    СпрНоменклатура.Родитель КАК Родитель,
    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остатки,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
        ПО (ТоварыНаСкладахОстатки.Номенклатура = СпрНоменклатура.Ссылка)
        
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            , 
            ВидЦены В (ВЫБРАТЬ Вт.Розница ИЗ ВтРозница КАК Вт)
        ) КАК ЦеныНоменклатурыСрезПоследних
        ПО (СпрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура)
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа

Обратим внимание на ключевые моменты данного запроса:

  1. Мы использовали функцию ЕСТЬNULL(Поле, 0) для полей остатка и цены. Это позволяет заменить отсутствующие записи в регистрах (значение NULL) на числовой ноль.
  2. Фильтр вида цены перенесен в параметры виртуальной таблицы СрезПоследних. Это гарантирует, что ЛЕВОЕ СОЕДИНЕНИЕ не отсечет позицию номенклатуры, если для нее не задана цена.
  3. Оба левых соединения подвязаны непосредственно к полю СпрНоменклатура.Ссылка.

Настройка отображения нулей в элементах формы

Даже если в запросе используется функция ЕСТЬNULL, элемент формы (колонка таблицы) может скрывать нулевые значения. Выясним, как настроить отображение чисел по шагам:

  1. Перейдем в дерево элементов формы и выделим созданную колонку (например, Остатки или Цена).
  2. В панели свойств элемента найдем категорию Оформление и откроем свойство Формат (нажав на кнопку с тремя точками).
  3. В окне конструктора формата найдем параметр Отображать ноль или зададим строку формата вручную.
  4. Для явного отображения нуля укажем в строке формата выражение: ЧН=0 (где ЧН — «Число Ноль»).

После применения строки формата ЧН=0 ячейки с нулевыми значениями цен и остатков будут корректно выводить цифру 0 вместо пустых строк.

Оптимизация производительности динамического списка

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

← На главную