Как реализовать отбор номенклатуры по коллекциям в форме подбора 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

Вариант 1. Использование штатного метода ИспользоватьСписокЭлементов

Рассмотрим самый быстрый в разработке способ. Мы создаем отдельный справочник Коллекции и регистр сведений либо подчиненный справочник для хранения связей. При открытии формы подбора мы собираем список номенклатуры, входящей в выбранную коллекцию, в объект СписокЗначений и передаем его в форму подбора.

В коде модуля формы подбора накладывается фильтр:


// Пример наложения фильтра по списку значений
СписНоменклатуры = СоздатьОбъект("СписокЗначений");
// ... Заполнение СписНоменклатуры позициями из выбранной коллекции ...

ИспользоватьСписокЭлементов(СписНоменклатуры);

Несмотря на простоту, проанализируем побочные эффекты и ограничения метода ИспользоватьСписокЭлементов, о которых важно знать заранее:

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

Вариант 2. Подбор через подчиненный справочник связей

Разберем наиболее надежный и производительный штатный способ, не создающий проблем со скоростью работы в 1С 7.7. Для этого построим правильную архитектуру данных:

  1. Создадим справочник Коллекции.
  2. Создадим подчиненный ему справочник СоставКоллекций (владелец — Справочник.Коллекции). В состав реквизитов добавим реквизит Номенклатура типа Справочник.Номенклатура.
  3. Для реквизита Номенклатура включим сортировку и индексацию.

В этом случае при вызове подбора в документе открывается форма списка подчиненного справочника СоставКоллекций с предварительным позиционированием на владельце:


// Открытие формы подбора через подчиненный справочник
КонтекстПодбора = "";
ПараметрыПодбора = СоздатьОбъект("СписокЗначений");
ПараметрыПодбора.ДобавитьЗначение(ВыбраннаяКоллекция, "Владелец");

ОткрытьФорму("Справочник.СоставКоллекций.ФормаСписка", КонтекстПодбора, ПараметрыПодбора);

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


// Обработка выбора элемента в подчиненном справочнике
Процедура ПриВыбореСтроки()
    Если ПустоеЗначение(ТекущийЭлемент()) = 0 Тогда
        // Передаем в документ реальную номенклатуру
        ОповеститьОВыборе(ТекущийЭлемент().Номенклатура);
    КонецЕсли;
КонецПроцедуры

Преимущество метода: платформа использует штатный индекс подчинения, поэтому выборка открывается мгновенно независимо от общего объема номенклатуры в базе данных.

Вариант 3. Альтернативная форма подбора на объекте «ТаблицаЗначений»

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

Разберем по шагам логику работы такой обработки:

  1. На форме обработки размещается элемент диалога типа ТаблицаЗначений.
  2. При выборе пользователем нужной коллекции выполняется штатный объект Запрос по связям коллекций и номенклатуры.
  3. Результат запроса выгружается в таблицу на форме с помощью метода Запрос.Выгрузить(ТаблицаФормы).
  4. В таблице настраивается колонка для ввода количества, что позволяет реализовать множественный (пакетный) подбор: пользователь проставляет количество напротив нужных позиций и нажимает одну кнопку «Перенести в документ».

Вариант 4. Использование внешних компонент (1С++ и ТабличноеПоле)

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

Посмотрим на преимущества такого подхода:

  1. Прямой SQL-запрос мгновенно соединяет таблицу номенклатуры с таблицей состава коллекций и таблицей остатков.
  2. Данные загружаются постранично, только для видимой области экрана.
  3. Сохраняется высокая скорость скроллинга, сортировки по любой колонке и контекстного поиска без зависаний системы.
← На главную