Как в управляемых формах 1С организовать ручной выбор партии или поступления с отображением текущих остатков?

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

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

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

Решение: Форма выбора на базе динамического списка с произвольным запросом

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

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

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

Важные особенности и тонкости работы с динамическими списками

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

Alternative архитектурные варианты

Выбор партии вручную оператором в форме документа — не единственное решение задачи. В зависимости от бизнес-процессов компании можно рассмотреть альтернативные варианты:

  1. Автоматическое списание партий при проведении (FIFO / LIFO): Оставить реквизит партии в форме документа необязательным или вовсе скрытым. Распределение партий и серий выполняется автоматически на сервере в транзакции проведения документа по алгоритмам FIFO или по срокам годности. Это исключает ошибки человеческого фактора и ускоряет работу пользователей.
  2. Групповая форма подбора (корзина): Вместо построчного выбора из каждой ячейки вызывается отдельная обработка подбора товара. В ней пользователь видит список позиций с остатками по партиям, набирает нужное количество в корзину и одной кнопкой переносит готовый массив строк в документ.
  3. Команда «Заполнить партии»: Документ заполняется товарами без указания партий, а затем по кнопке на форме вызывается серверная процедура, которая опрашивает остатки и автоматически распределяет документы поступления по строкам табличной части.
← На главную