Как в 1С 7.7 скрыть пустые партии без приходного документа при подборе в документах?

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

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

Ограничения платформы 1С 7.7 при работе с отборами в справочниках

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

  1. Ограничение метода УстановитьОтбор: штатный метод формы списка справочника работает исключительно на точное равенство конкретному значению. Наложить условие вида «не равно пустому документу» или проверить признак заполненности стандартными параметрами отбора невозможно. Кроме того, реквизит обязательно должен иметь признак «Отбор» или «Сортировка» в метаданных.
  2. Особенности метода ИспользоватьСписокЭлементов: данный метод позволяет ограничить выборку элементов заранее сформированным списком значений (объектом типа СписокЗначений). Однако при больших объемах справочника его использование приводит к падению производительности. Кроме того, разработчику требуется вручную обновлять список при каждом изменении иерархии или выборе родителя.

Способ 1. Добавление реквизита с флагом отбора (штатный и быстрый метод)

Посмотрим на самое простое и производительное решение в рамках штатного функционала справочников 1С 7.7. Поскольку метод УстановитьОтбор поддерживает проверку на равенство, мы можем добавить отдельный числовой флаг.

Разберем реализацию по шагам:

  1. В конфигураторе открываем метаданные справочника Партии и добавляем новый реквизит (например, ЕстьДокумент, тип: Число, длина: 1, точность: 0).
  2. В свойствах реквизита обязательно устанавливаем флаг «Отбор».
  3. В модуле формы элемента справочника или в предопределенной процедуре ПриЗаписи прописываем автоматическое заполнение признака:

Процедура ПриЗаписи()
    Если ПустоеЗначение(ПриходныйДокумент) = 0 Тогда
        ЕстьДокумент = 1;
    Иначе
        ЕстьДокумент = 0;
    КонецЕсли;
КонецПроцедуры
  1. В модуле формы списка или формы подбора справочника партий в процедуре ПриОткрытии устанавливаем отбор по заполненным элементам:

Процедура ПриОткрытии()
    УстановитьОтбор("ЕстьДокумент", 1);
КонецПроцедуры

Преимущество: такой отбор работает на уровне индексов базы данных DBF/SQL, не создавая избыточной нагрузки при открытии списка.

Способ 2. Ограничение списка через ИспользоватьСписокЭлементов

Рассмотрим вариант фильтрации без изменения метаданных конфигурации с помощью метода ИспользоватьСписокЭлементов. В этом случае мы заранее собираем список только тех партий, у которых заполнен реквизит ПриходныйДокумент.


Процедура ОбновитьСписокПартий()
    Спис = СоздатьОбъект("СписокЗначений");
    Спр = СоздатьОбъект("Справочник.Партии");
    
    // Позиционируемся на владельце (Номенклатуре)
    Спр.ИспользоватьВладельца(ТекущийВладелец);
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если ПустоеЗначение(Спр.ПриходныйДокумент) = 0 Тогда
            Спис.ДобавитьЗначение(Спр.ТекущийЭлемент());
        КонецЕсли;
    КонецЦикла;
    
    ИспользоватьСписокЭлементов(Спис);
КонецПроцедуры

Процедура ПриОткрытии()
    ОбновитьСписокПартий();
КонецПроцедуры

Процедура ПриВыбореРодителя(НовыйРодитель)
    ОбновитьСписокПартий();
КонецПроцедуры

Процедура ПриСменеИерархии(Режим)
    ОбновитьСписокПартий();
КонецПроцедуры

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

Способ 3. Замена формы списка на Таблицу Значений или подбор по остаткам

Наиболее функциональный подход для учета в торговых системах — подбор партий не из плоского справочника, а непосредственно из регистра остатков (например, ОстаткиТМЦ или ПартииНаличие).

Разберем логику построения такого интерфейса:

  1. Вместо типовой формы списка справочника создается отдельная форма подбора с элементом диалога типа ТаблицаЗначений.
  2. При открытии формы выполняется запрос к регистру остатков с фильтром по текущей номенклатуре и складу документа:

Процедура ЗаполнитьПартииПоОстаткам(ВыбНоменклатура, ВыбСклад)
    ТЗПартий.Очистить();
    
    Рег = СоздатьОбъект("Регистр.ОстаткиТМЦ");
    Рег.УстановитьЗначениеФильтра("Номенклатура", ВыбНоменклатура);
    Рег.УстановитьЗначениеФильтра("Склад", ВыбСклад);
    
    Рег.ВыбратьИтоги();
    Пока Рег.ПолучитьИтог() = 1 Цикл
        ТекПартия = Рег.Партия;
        // Проверяем наличие приходного документа и положительный остаток
        Если (ПустоеЗначение(ТекПартия.ПриходныйДокумент) = 0) И (Рег.Количество > 0) Тогда
            ТЗПартий.НоваяСтрока();
            ТЗПартий.Партия = ТекПартия;
            ТЗПартий.Количество = Рег.Количество;
            ТЗПартий.Цена = ТекПартия.ЦенаПрод;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Способ 4. Исключение создания пустых партий на уровне бизнес-логики

Выясним причину появления элементов без документов: чаще всего в ТиС пустые партии создаются автоматически при разрешенном списании «в минус» или при некорректном проведении расходных накладных задним числом.

Чтобы предотвратить их возникновение:

  1. В константах и настройках параметров учета отключите возможность списания ТМЦ при отрицательных остатках.
  2. В процедуре ОбработкаПроведения документов оприходования и списания добавьте обязательную валидацию заполнения партий, блокируя создание записей с пустым значением ПриходныйДокумент.
← На главную