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