Создаю из шаблона демо-конфигурацию "Управление торговлей" и пустую базу. В демо-конфигурации уже имеются данные, пустая база девственно чиста.

Создаю справочник Номенклатура, Ячейки и подчиненный номенклатуре справочник ЕдиницыИзмерения.

Создаю документ WHSПриход.
Оказывается у документа есть параметр Движения, который предоставляет доступ к фиксированному набору записей по каждому регистру.

Оперативное проведение

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

При перепроведении документов используется неоперативное проведение - экономится время на контроль остатков, к тому же перепроведение не останавливается, если остатков не хватает.

В принципе, можно игнорировать эти два способа и проводить однообразно, но это действительно грамотный ход. К тому же, на эти два способа можно разграничить доступ.

При проведении документа до точки актуальности итогов (ТА) спрашивается как его проводить - оперативно или нет? Если оперативно по умолчанию время ставится после точки актуальности.

Проведение документов

Простой пример проведения (записывается в модуле документа):

 
Процедура ОбработкаПроведения(Отказ, Режим)
	Набор=Движения["WHSОстатки"];
  	Для каждого СтрокаТЧ из Товары Цикл
  		Движ=Набор.ДобавитьРасход();
		Движ.Период=Дата;
		Движ.Склад=Склад;
		Движ.Ячейка=СтрокаТЧ.Ячейка;
		Движ.Паллет=СтрокаТЧ.Паллет;
		Движ.Номенклатура=СтрокаТЧ.Номенклатура;
  		Движ.Количество=СтрокаТЧ.Количество*СтрокаТЧ.ЕдиницаИзмерения.Коэффициент;
  КонецЦикла
 КонецПроцедуры // ОбработкаПроведения
 

Сначала через обращение к доступной в модуле документа переменной Движения определяется набор движений по регистру WHSОстатки.
Затем в переменной СтрокаТЧ перебираются все строки табличной части Товары.
Затем в набор добавляется очередное движение прихода Движ.
Устанавливаются реквизиты движения.
Набор в конце не записывается, 1С запишет его сама.
Для каждого движения нужно указать период движения (можно указывать разные даты).
По умолчанию регистратором движения указывается текущий документ.

Как видно, все реквизиты документа доступны по именам, но можно обращаться к ним и так, например: ЭтотОбъект.Дата.

Проверка наличия остатков

Сразу решил отказаться от использование функции Остатки, т.к. при изменении измерений регистров придется переписывать вызов этой функции, т.к. в ней количество и порядок параметров определяется количеством и порядком измерений регистра.

Итак, будем использовать запрос.

	Если Режим=РежимПроведенияДокумента.Оперативный Тогда
		Для каждого СтрокаТЧ из Товары Цикл
			ТекКоличество=СтрокаТЧ.Количество*СтрокаТЧ.ЕдиницаИзмерения.Коэффициент;
			ТекТовар=СтрокаТЧ.Номенклатура;
			ТекДата=Дата;
			ТекстЗапроса="
				|ВЫБРАТЬ
				|	WHSОстатки.Номенклатура КАК Номенклатура,
				|	WHSОстатки.КоличествоОстаток КАК Остаток
				|ИЗ
				|  	РегистрНакопления.WHSОстатки.Остатки(&Дата) КАК WHSОстатки 
				|ГДЕ
				|  	(Номенклатура=&Товар)
				|";
			
			КонецЦикла;
			флДостаточноОстатка=Истина;
			
			Запрос=Новый Запрос(ТекстЗапроса);
			Запрос.УстановитьПараметр("Дата",Дата);
			Запрос.УстановитьПараметр("Товар",ТекТовар);
			РезультатЗапроса=Запрос.Выполнить();
			Выборка=РезультатЗапроса.Выбрать();
			Пока Выборка.Следующий() Цикл
				Если Выборка.Остаток < ТекКоличество Тогда
					Сообщить("Недостаточно остатка товара "+Выборка.Номенклатура+" нужно "+ТекКоличество+", а имется только "+Выборка.Остаток);
					флДостаточноОстатка=Ложь;
				КонецЕсли;
			КонецЦикла;
			Если Не флДостаточноОстатка Тогда
				Отказ=Истина;
				Возврат;
			КонецЕсли;
	КонецЕсли;

Запрос написан на SQL-подобном языке запросов 1С, SQL - это приятно.

Итак, мы строим запрос к таблице остатков регистров накопления WHSОстатки на дату (позицию) документа.
Остатки получаем только в разрезе номенклатуры. Строим запрос для каждой номенклатуры в документе и сравниваем количества.

Отказ в проведении осуществляется через выставление параметра Отказ, переданного в Обработку проведения в Истину.

Контроль остатков осуществляется только при оперативном проведении.

Конечно, это не самый производительный код, было бы удобнее прямо в запросе сравнить количество товара из табличной части и остаток товара из регистра.

Ковыряния в интерфейсе

Мне нужно было, чтобы ячейка в табличной части выбиралась только из списка ячеек, подчиненных данному складу (реквизиту документа). Оказывается, у реквизитов формы есть параметр "Использовать владельца"