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