Как реализовать подбор товаров и характеристик в одной таблице в 1С:УНФ?

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

Уважаемые читатели, сегодня мы разберем актуальную проблему, с которой сталкиваются многие пользователи и разработчики в 1С:УНФ (и других конфигурациях, таких как УТ или Розница) при работе с подбором товаров, имеющих характеристики. Стандартный механизм подбора часто организован в два этапа: сначала мы выбираем номенклатуру, а затем из отдельной таблицы – ее характеристику. Это может быть неудобно и замедлять работу, особенно при большом ассортименте.

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

Суть проблемы: Двухэтапный подбор товаров с характеристиками

Давайте проанализируем текущую ситуацию. Как правило, стандартный подбор товаров в конфигурации 1С:УНФ 1.6 выглядит следующим образом:

  1. Первая таблица: Отображается список товаров (например, "Товар 1", "Товар 2", "Товар 3").
  2. Вторая таблица: После выбора конкретного товара (например, "Товар 1"), в этой таблице отображаются его характеристики (например, "Характеристика 1" для Товара 1, "Характеристика 2" для Товара 1) с указанием доступного количества.

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

Желаемый результат: Единая таблица для подбора

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

Такое представление значительно упростит поиск и выбор нужного товара, сокращая количество действий пользователя.

Основное решение: Динамический список с произвольным запросом

Наиболее эффективным и гибким способом реализации такого подбора является использование динамического списка с включенным свойством "ПроизвольныйЗапрос". Давайте рассмотрим подробнее, почему именно этот механизм подходит нам и как его использовать.

Что такое Динамический список?

Динамический список — это мощный инструмент в системе 1С, который позволяет отображать данные из базы данных на форме, используя Систему Компоновки Данных (СКД). В отличие от статических таблиц, динамический список может загружать данные порциями, фильтровать их, сортировать и группировать, что обеспечивает высокую производительность при работе с большими объемами информации.

Свойство "ПроизвольныйЗапрос"

Когда мы устанавливаем свойство "ПроизвольныйЗапрос" для динамического списка в значение "Истина", мы получаем возможность написать свой собственный SQL-подобный запрос на языке 1С. Этот запрос будет выполнять выборку данных непосредственно из базы, позволяя нам объединять информацию из различных таблиц и регистров так, как нам необходимо. Это именно то, что нужно для нашей задачи.

Реализация решения: Шаг за шагом

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

Шаг 1: Создание или модификация динамического списка

  1. Сначала нам потребуется вынести форму подбора номенклатуры в расширение, чтобы не изменять типовую конфигурацию напрямую. Это позволит сохранить возможность обновлений.
  2. В этой форме находим существующий динамический список (или добавляем новый, если требуется) и устанавливаем у него свойство ПроизвольныйЗапрос в значение Истина.
  3. Далее открываем "Настройка списка" или соответствующее окно для редактирования запроса динамического списка.

Шаг 2: Создание запроса для объединения данных

Ключевым элементом нашего решения является запрос. Он должен объединить данные из справочника "Номенклатура" и справочника "ХарактеристикиНоменклатуры". Мы будем использовать оператор ЛЕВОЕ СОЕДИНЕНИЕ, чтобы гарантировать, что в списке отобразятся все номенклатурные позиции, даже те, у которых нет характеристик (хотя для большинства товаров с характеристиками это не будет актуально, это хорошая практика).

Вот базовый пример запроса, который объединяет номенклатуру и ее характеристики:


ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК НоменклатураСсылка,
    СправочникНоменклатура.Наименование КАК НоменклатураНаименование,
    ХарактеристикиНоменклатуры.Ссылка КАК ХарактеристикаСсылка,
    ХарактеристикиНоменклатуры.Наименование КАК ХарактеристикаНаименование,
    СправочникНоменклатура.Артикул КАК Артикул
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
        ПО СправочникНоменклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец
УПОРЯДОЧИТЬ ПО
    НоменклатураНаименование, ХарактеристикаНаименование

Разберем этот запрос:

В результате выполнения такого запроса мы получим список, где каждая номенклатурная позиция будет продублирована для каждой своей характеристики, что и является нашим желаемым результатом. Например, если "Футболка" имеет характеристики "Красная" и "Синяя", в списке будет две строки: "Футболка (Красная)" и "Футболка (Синяя)".

Шаг 3: Добавление остатков и штрихкодов

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

Для остатков мы используем виртуальную таблицу Остатки регистра накопления "ТоварыНаСкладах". Для штрихкодов — регистр сведений "Штрихкоды".

Пример расширенного запроса:


ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК НоменклатураСсылка,
    СправочникНоменклатура.Наименование КАК НоменклатураНаименование,
    ХарактеристикиНоменклатуры.Ссылка КАК ХарактеристикаСсылка,
    ХарактеристикиНоменклатуры.Наименование КАК ХарактеристикаНаименование,
    СправочникНоменклатура.Артикул КАК Артикул,
    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
    Штрихкоды.Штрихкод КАК Штрихкод
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
        ПО СправочникНоменклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                &Дата,
                Склад = &Склад
            ) КАК ТоварыНаСкладахОстатки
        ПО СправочникНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
        И ХарактеристикиНоменклатуры.Ссылка = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
        ПО СправочникНоменклатура.Ссылка = Штрихкоды.Номенклатура
        И ХарактеристикиНоменклатуры.Ссылка = Штрихкоды.ХарактеристикаНоменклатуры
УПОРЯДОЧИТЬ ПО
    НоменклатураНаименование, ХарактеристикаНаименование

Рассмотрим добавленные части запроса:

Шаг 4: Настройка полей динамического списка

После того как запрос готов, нам нужно настроить отображение полей в динамическом списке. Для каждого поля, указанного в секции ВЫБРАТЬ, мы можем добавить соответствующую колонку в табличную часть формы. Важно обеспечить читаемость, возможно, объединив наименования номенклатуры и характеристики в одну колонку, если это будет удобно для пользователя.

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

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

  1. Выбирайте только необходимые поля: Избегайте использования ВЫБРАТЬ *. Выбирайте только те поля, которые действительно нужны для отображения или для дальнейшего использования в логике формы.
  2. Минимизируйте количество соединений: Хотя в нашем случае соединения с характеристиками, остатками и штрихкодами необходимы, старайтесь избегать избыточных соединений или вложенных запросов, которые могут замедлять работу.
  3. Индексы базы данных: Убедитесь, что поля, используемые в условиях соединения (ПО) и в условиях отбора (ГДЕ, если вы добавите фильтрацию), имеют соответствующие индексы в базе данных. Это существенно ускоряет выполнение запросов. В типовых конфигурациях 1С большинство таких полей уже проиндексировано.
  4. Параметризация запросов: Используйте параметры (как &Дата и &Склад в нашем примере) для фильтрации данных. Это позволяет СУБД кэшировать планы выполнения запросов и обеспечивает более высокую производительность, чем динамическое формирование условий в строке запроса.
  5. Динамическое считывание данных: Свойство "Динамическое считывание данных" в свойствах динамического списка влияет на то, какими порциями данные забираются из базы. Для больших списков лучше оставлять его включенным, чтобы не загружать весь объем данных сразу.
  6. Проблемы с большими строковыми полями: Если в запросе используются большие строковые поля, особенно с функцией ВЫРАЗИТЬ, это может замедлять работу. В таких случаях иногда требуется сокращать размер строк или загружать такие поля отдельно по требованию.

Взаимодействие с пользователем и дальнейшее развитие

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

  1. Фильтрация и поиск: Динамический список по умолчанию предоставляет возможности для быстрого поиска и фильтрации по любой колонке. Пользователь сможет быстро найти товар по наименованию, артикулу, характеристике или штрихкоду. Можно также добавить стандартные фильтры, например, "В наличии" для отображения только товаров с положительным остатком.
  2. Перенос в документ: При выборе строки из такого списка, в документ будут перенесены не только номенклатура, но и ее характеристика, а также выбранное количество. Мы можем настроить этот механизм в обработчике выбора элемента списка.
  3. Использование расширений: Мы уже упоминали, что все изменения лучше реализовывать через расширения конфигурации. Это обеспечивает бесшовное обновление типовой конфигурации в будущем.
  4. Плюсы использования характеристик: Использование характеристик вместо создания отдельных номенклатурных позиций для каждого варианта товара значительно упрощает работу с большим ассортиментом. Оно уменьшает объем справочника "Номенклатура", делает его более управляемым, упрощает обмен данными с сайтами и отслеживание статистики.

Заключение

Реализация подбора товаров и их характеристик в одной таблице с помощью динамического списка и произвольного запроса — это эффективное и гибкое решение для конфигураций 1С, таких как УНФ, УТ и Розница. Мы рассмотрели, как построить запрос, добавить в него остатки и штрихкоды, а также уделили внимание вопросам производительности. Такой подход не только значительно улучшит удобство работы пользователей, но и позволит более эффективно управлять большим ассортиментом товаров.

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

← На главную