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