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