• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Запрос к регистру накопления при проведении документа

  • Автор темы Автор темы Marija
  • Дата начала Дата начала
M

Marija

Подскажите, плиз, как при проведении документа "Реализация товаров и услуг" определить сколько осталось отгрузить уже с учетом проводок этого документа?
Я написала запрос в ОбработкеПроведения, но по текущему документу еще нет в этот момент информации в регистрах. Есть в модуле документа что-то типа "ПослеПроведения"? =)
Мой запрос:
Код:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
...
// USR-Modification on 09 July 2010 by Mariya - Begin	
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
|	ЗаказыПокупателейОстаткиИОбороты.Номенклатура КАК Номенклатура,
|	ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток КАК ОсталосьОтгрузить
|ИЗ
|	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты() КАК ЗаказыПокупателейОстаткиИОбороты
|ГДЕ
|	ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя = &ЗаказПокупателя
|{УПОРЯДОЧИТЬ ПО
|	Номенклатура.*}
|ИТОГИ
|	СУММА(ОсталосьОтгрузить)
|ПО
|	ОБЩИЕ,
|	ЗаказПокупателя,
|	Номенклатура
|{ИТОГИ ПО
|	Номенклатура.*}";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("ЗаказПокупателя",Сделка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.ОсталосьОтгрузить = 0 Тогда
НачислитьБонус = Истина;
Иначе
НачислитьБонус = Ложь;
КонецЕсли;	
КонецЕсли;
...
// USR-Modification on 09 July 2010 by Mariya - End
КонецПроцедуры // ОбработкаПроведения()
 
Достаточно дубовый вариант - перебрать строки документа (если номенклатура в них живет, конечно). При переборе вызывать запрос (только ещё добавить в него фильтр по номенклатуре) и сравнивать количество в запросе и количество в строке документа. Если не совпадают - значит НачислитьБонус = ложь.

Другой вариант - это использование РегистрНакопленияМенеджер.Остатки() с фильтрованием (проверка та-же) А вот дальше вопрос - в семерке была штука под названием Актуальность(), а вот в восьмерке я её не наблюдаю. С ней все фактические изменения при проведении документа тут-же отражались на итогах. Может в восьмерке это ПересчитатьТекущиеИтоги?

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

Значит набор движений отдельно, документ отдельно? и завсегда автоматом? Это есть очень хорошо! Тогда у автора поста скорее всего запрос идет раньше создания и записи набора записей регистра.
 
По идее после записи движений в регистр, можно уже получать остатки с учетом текущего документа
В какой момент происходит запись движений в регистр? Я свой запрос вставила в конец процедуры ОбработкаПроведения, в которой все движения по регистрам уже прошли. И все равно по текущему доку пока еще нет данных в регистрах накопления....
"По идее" я тоже так думала, а на практике вышло совсем иначе...
 
Запись происходит в момент НаборДвижений.Записать();

Может ему РАЗРЕШЕННЫЕ мешает? Хотя это вроде на права доступа чтоб не ругалось...

А как выглядит проведение по регистрам в виде кода?
 
Чтоб узнать хватит ли остатков на складе, используйте параметры виртуальной таблицы оборотов, четвертый параметр кажется. "Метод дополнения - движения и граница периода" и как параметр в запрос массив номенклатуры документа.
 
Чтото я Вас не понимаю. Зачем вам именно при "проведении" документа чтото вычислять, что потом еще должно попасть в форму ( так мне показалось)?Просто ПриЗаписи() этого делать нельзя? Например при условии, что документ проведен. Если проведен и остаток по запросу = 0 тогда и начисляйте свой бонус.
Как мне кажется, смысл процедуры ОбработкаПРоведения не в том, чтобы производить какието расчеты уже после записи, а в том, чтобы "положить" данные в нужные регистры.
 
Чтото я Вас не понимаю. Зачем вам именно при "проведении" документа чтото вычислять, что потом еще должно попасть в форму ( так мне показалось)?Просто ПриЗаписи() этого делать нельзя? Например при условии, что документ проведен. Если проведен и остаток по запросу = 0 тогда и начисляйте свой бонус.
Как мне кажется, смысл процедуры ОбработкаПРоведения не в том, чтобы производить какието расчеты уже после записи, а в том, чтобы "положить" данные в нужные регистры.
А в какой момент тогда определять, что документ проведен и остаток = 0? Если мне нужно автоматически, без лишних движений менеджеров, начислять бонусы (Создавать новый док "Бонусы"), при условии что товар по заказу реализован полностью.
 
Чтоб узнать хватит ли остатков на складе, используйте параметры виртуальной таблицы оборотов, четвертый параметр кажется. "Метод дополнения - движения и граница периода" и как параметр в запрос массив номенклатуры документа.
Мне нужно узнать не сколько остатков на складе, а сколько реализовано по заказу (если заказ реализован полностью, тогда начислять бонус). А что за "Метод дополнения - движения и граница периода"? Можно поподробнее?
 
Запись происходит в момент НаборДвижений.Записать();

Может ему РАЗРЕШЕННЫЕ мешает? Хотя это вроде на права доступа чтоб не ругалось...

А как выглядит проведение по регистрам в виде кода?
Код можно посмотреть в типовой УТ, обработка проведения документа "Реализация товаров и услуг".
Там много вложенных процедур...
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ОбработкаПроведения</div></div><div class="sp-body"><div class="sp-content">
Код:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)

(...)
// Движения по документу
Если Не Отказ Тогда

// Подготовим таблицу скидок для проведения.
ТаблицаПоСкидкам = ПодготовитьТаблицуСкидок(ТаблицаПоТоварам, ТаблицаПоУслугам, СтруктураШапкиДокумента);

ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, ТаблицаПоТаре,
ТаблицаПоУслугам, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок);
КонецЕсли; 

// USR-Modification on 09 July 2010 by Mariya - Begin 	
//Если заказ оплачен и реализован, тогда - НачислитьБонус
НачислитьБонус = Ложь;
(...)
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
|	ЗаказыПокупателейОстаткиИОбороты.Номенклатура КАК Номенклатура,
|	ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток КАК ОсталосьОтгрузить
|ИЗ
|	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты() КАК ЗаказыПокупателейОстаткиИОбороты
|ГДЕ
|	ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя = &ЗаказПокупателя
|{УПОРЯДОЧИТЬ ПО
|	Номенклатура.*}
|ИТОГИ
|	СУММА(ОсталосьОтгрузить)
|ПО
|	ОБЩИЕ,
|	ЗаказПокупателя,
|	Номенклатура
|{ИТОГИ ПО
|	Номенклатура.*}";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("ЗаказПокупателя",Сделка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.ОсталосьОтгрузить = 0 Тогда
НачислитьБонус = Истина;
Иначе
НачислитьБонус = Ложь;
КонецЕсли;	
КонецЕсли;	

Если НачислитьБонус и Сделка.НачислитьБонус Тогда
(...)
СделкаОбъект.Записать();
КонецЕсли;	
КонецЕсли;
// USR-Modification on 09 July 2010 by Mariya - End

КонецПроцедуры // ОбработкаПроведения()
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ДвиженияПоРегистрам</div></div><div class="sp-body"><div class="sp-content">
Код:
Процедура ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, 
ТаблицаПоТоварам, ТаблицаПоСкидкам, ТаблицаПоТаре, ТаблицаПоУслугам, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок)

ТаблицаПоКомплектам = УправлениеЗапасами.СформироватьТаблицуКомплектующих(ТаблицаПоТоварам, ЭтотОбъект);

ДвиженияПоРегистрамУпр(РежимПроведения, СтруктураШапкиДокумента,
ТаблицаПоТоварам, ТаблицаПоКомплектам, ТаблицаПоСкидкам, ТаблицаПоТаре, ТаблицаПоУслугам, 
ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок);

ДвиженияПоРегиструТоварыОрганизаций(РежимПроведения, СтруктураШапкиДокумента,
ТаблицаПоКомплектам, ТаблицаПоТаре, ТаблицаПоУслугам, Отказ, Заголовок);

Если СтруктураШапкиДокумента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем Тогда
ДвиженияПоРегистрамОперативныхВзаиморасчетов(РежимПроведения, ТаблицаПоВзаиморасчетам,
Отказ, Заголовок, СтруктураШапкиДокумента);
КонецЕсли;

ДвиженияПоРегиструСписанныеТовары(СтруктураШапкиДокумента, ТаблицаПоКомплектам, 
ТаблицаПоТаре, Отказ, Заголовок);

Если СтруктураШапкиДокумента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем Тогда

СтруктураТаблицыВыручки = Новый структура("НомерСтроки, Номенклатура, ВидЦенности, Ценность, Партия, Услуга 
|,СтавкаНДС, Сумма, СуммаВал, НДС, НДСВал, СуммаБезНДС, СуммаБезНДСВал
|,Комиссионный,Комитент,ДоговорКомиссии,ВалютаРасчетовСКомитентом
|,СуммаСписания, Количество");

//Формируем таблицу выручки с нужной структурой и заполняем по таблице услуг
ТаблицаВыручки = ОбщегоНазначения.СформироватьТаблицуЗначений(ТаблицаПоУслугам,СтруктураТаблицыВыручки,,Истина);

ВыручкаПоТоварам = ОбщегоНазначения.СформироватьТаблицуЗначений(ТаблицаПоТоварам,СтруктураТаблицыВыручки,,Истина);
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ВыручкаПоТоварам,ТаблицаВыручки );

ТаблицаВыручки.ЗаполнитьЗначения(Ложь, "Комиссионный");
ТаблицаВыручки.ЗаполнитьЗначения(0,	"Количество");

ТаблицаАвансов = Новый ТаблицаЗначений;
ТаблицаАвансов.Колонки.Добавить("ДокументОплаты");
ДвиженияРегистровПодсистемыНДС(СтруктураШапкиДокумента, ТаблицаПоУслугам, ТаблицаВыручки, ТаблицаАвансов, Отказ, Заголовок);

КонецЕсли;

Если ТаблицаПоКомплектам.Количество() + ТаблицаПоТаре.Количество() >0 тогда

// Зарегистрируем в последовательности УУ
Если ОтражатьВУправленческомУчете Тогда
ЗаписьРегистрации = ПринадлежностьПоследовательностям.ПартионныйУчет.Добавить();
ЗаписьРегистрации.Период	 = Дата;
КонецЕсли;
КонецЕсли;

// Проводить по партиям сразу нужно если установлен параметр
// учетной политики СписыватьПартииПриПроведенииДокументов
ПроводитьПоПартиям = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).СписыватьПартииПриПроведенииДокументов;

Если ПроводитьПоПартиям Тогда

УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(Ссылка, Движения.СписанныеТовары.Выгрузить());

Иначе

// В неоперативном режиме границы последовательностей сдвигаются назад, если они позже документа.
Если РежимПроведения = РежимПроведенияДокумента.Неоперативный Тогда
УправлениеЗапасамиПартионныйУчет.СдвигГраницыПоследовательностиПартионногоУ
четаНазад(Дата, Ссылка, Организация);
КонецЕсли;

КонецЕсли;

КонецПроцедуры
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ДвиженияПоРегистрамУпр</div></div><div class="sp-body"><div class="sp-content">
Код:
Процедура ДвиженияПоРегистрамУпр(РежимПроведения, СтруктураШапкиДокумента, 
ТаблицаПоТоварам, ТаблицаПоКомплектам, ТаблицаПоСкидкам, ТаблицаПоТаре, ТаблицаПоУслугам, 
ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок)

Если ОтражатьВУправленческомУчете Тогда

УправлениеВзаиморасчетами.ВыполнитьДвиженияПоРегистрамУпрВзаиморасчетов(ЭтотОбъект, СтруктураШапкиДокумента, 
мСтруктураПараметровВзаиморасчетов, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, 
ВидДвиженияНакопления.Приход, Отказ, Заголовок);

Если СтруктураШапкиДокумента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем Тогда
Если СуммаДокумента <> 0 Тогда

// По регистру ПродажиПоДисконтнымКартам.
Если ЗначениеЗаполнено(СтруктураШапкиДокумента.ДисконтнаяКарта) Тогда
НаборДвижений = Движения.ПродажиПоДисконтнымКартам;

// Получим таблицу значений, совпадающую со структурой набора записей регистра.
ТаблицаДвижений = НаборДвижений.ВыгрузитьКолонки();

// Заполним таблицу движений.
СтрокаДвижений = ТаблицаДвижений.Добавить();
СтрокаДвижений.ДисконтнаяКарта = СтруктураШапкиДокумента.ДисконтнаяКарта;
СтрокаДвижений.ВладелецДисконтнойКарты = СтруктураШапкиДокумента.Контрагент;
СтрокаДвижений.Сумма = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(СуммаДокумента, ВалютаДокумента,
СтруктураШапкиДокумента.ВалютаУправленческогоУчета,
СтруктураШапкиДокумента.КурсДокумента,
СтруктураШапкиДокумента.КурсВалютыУправленческогоУчета,
СтруктураШапкиДокумента.КратностьДокумента,
СтруктураШапкиДокумента.КратностьВалютыУправленческогоУчета);

НаборДвижений.мПериод		 = Дата;
НаборДвижений.мТаблицаДвижений = ТаблицаДвижений;

Если Не Отказ Тогда
НаборДвижений.ВыполнитьДвижения();
КонецЕсли;
КонецЕсли;
КонецЕсли;

// ТОВАРЫ ПО РЕГИСТРУ Продажи.

НаборДвижений = Движения.Продажи;

ТаблицаДвижений = НаборДвижений.ВыгрузитьКолонки();

ТаблицаПоТоварам.Колонки.НДС.Имя = "НДСВрем";
ТаблицаПоТоварам.Колонки.НДСУпр.Имя = "НДС";			

// Заполним таблицу движений.

Если СтруктураШапкиДокумента.ВедениеУчетаПоПроектам Тогда

УправлениеПроектами.ОтразитьДвиженияПоПроектам(ТаблицаПоТоварам,ТаблицаДвижений, Проект, Дата, "Продажи");

Иначе

ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварам, ТаблицаДвижений);

КонецЕсли;

ТаблицаДвижений.ЗаполнитьЗначения(ДоговорКонтрагента,"ДоговорКонтрагента");
ТаблицаДвижений.ЗаполнитьЗначения(Контрагент , "Контрагент");
ТаблицаДвижений.ЗаполнитьЗначения(Организация, "Организация");
ТаблицаДвижений.ЗаполнитьЗначения(Ссылка,"ДокументПродажи");
ТаблицаДвижений.ЗаполнитьЗначения(Подразделение,"Подразделение");
// Когда взаиморасчеты ведутся по счетам, поле заказ покупателя в таб.части будет пустое (нет типа Документ.СчетНаОплату)
Если СтруктураШапкиДокумента.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоСчетам Тогда
ТаблицаДвижений.ЗаполнитьЗначения(СтруктураШапкиДокумента.Сделка, "ЗаказПокупателя");
КонецЕсли;


НаборДвижений.мПериод			= Дата;
НаборДвижений.мТаблицаДвижений  = ТаблицаДвижений;

Если Не Отказ Тогда
Движения.Продажи.ВыполнитьДвижения();
КонецЕсли;

// УСЛУГИ ПО РЕГИСТРУ Продажи.

НаборДвижений = Движения.Продажи;

ТаблицаДвижений = НаборДвижений.ВыгрузитьКолонки();

ТаблицаПоУслугам.Колонки.НДС.Имя = "НДСВрем";
ТаблицаПоУслугам.Колонки.НДСУпр.Имя = "НДС";

// Заполним таблицу движений.

Если СтруктураШапкиДокумента.ВедениеУчетаПоПроектам Тогда

УправлениеПроектами.ОтразитьДвиженияПоПроектам(ТаблицаПоУслугам,ТаблицаДвижений, Проект, Дата, "Продажи");

Иначе

ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоУслугам, ТаблицаДвижений);

КонецЕсли;

ТаблицаДвижений.ЗаполнитьЗначения(ДоговорКонтрагента,"ДоговорКонтрагента");
ТаблицаДвижений.ЗаполнитьЗначения(Контрагент , "Контрагент");
ТаблицаДвижений.ЗаполнитьЗначения(Организация, "Организация");
ТаблицаДвижений.ЗаполнитьЗначения(Ссылка,"ДокументПродажи");
ТаблицаДвижений.ЗаполнитьЗначения(Подразделение,"Подразделение");
// Когда взаиморасчеты ведутся по счетам, поле заказ покупателя в таб.части будет пустое (нет типа Документ.СчетНаОплату)
Если СтруктураШапкиДокумента.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоСчетам Тогда
ТаблицаДвижений.ЗаполнитьЗначения(СтруктураШапкиДокумента.Сделка, "ЗаказПокупателя");
КонецЕсли;

НаборДвижений.мПериод			= Дата;
НаборДвижений.мТаблицаДвижений  = ТаблицаДвижений;

Если Не Отказ Тогда
Движения.Продажи.ВыполнитьДвижения();
КонецЕсли;

// ПО РЕГИСТРУ ПредоставленныеСкидки.
НаборДвижений = Движения.ПредоставленныеСкидки;

ТаблицаДвижений = НаборДвижений.ВыгрузитьКолонки();

// Заполним таблицу движений.
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоСкидкам, ТаблицаДвижений);

ТаблицаДвижений.ЗаполнитьЗначения(Ссылка,"ДокументСкидки");
ТаблицаДвижений.ЗаполнитьЗначения(ДоговорКонтрагента,"ПолучательСкидки");

НаборДвижений.мПериод			= Дата;
НаборДвижений.мТаблицаДвижений  = ТаблицаДвижений;

Если Не Отказ Тогда
Движения.ПредоставленныеСкидки.ВыполнитьДвижения();
КонецЕсли;

ТаблицаПоТоварам.Колонки.НДС.Имя = "НДСУпр";			
ТаблицаПоТоварам.Колонки.НДСВрем.Имя = "НДС";

ТаблицаПоУслугам.Колонки.НДС.Имя = "НДСУпр";			
ТаблицаПоУслугам.Колонки.НДСВрем.Имя = "НДС";

КонецЕсли;

Если ВидПередачи = Перечисления.ВидыПередачиТоваров.СоСклада Тогда
// ТОВАРЫ ПО РЕГИСТРУ ТоварыНаСкладах.

ВидСкладаОпт = Новый Структура("ВидСклада", Перечисления.ВидыСкладов.Оптовый);
РезультатЗапросаКомплектыОпт = ОбщегоНазначения.ОтобратьСтрокиПоКритериям(ТаблицаПоКомплектам, ВидСкладаОпт);
РезультатЗапросаТараОпт	 = ОбщегоНазначения.ОтобратьСтрокиПоКритериям(ТаблицаПоТаре,	  ВидСкладаОпт);

Если Не РезультатЗапросаКомплектыОпт.Пустой() ИЛИ НЕ РезультатЗапросаТараОпт.Пустой() Тогда

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

Если НЕ Отказ Тогда
СтруктТаблицДокумента = Новый Структура;
СтруктТаблицДокумента.Вставить("КомплектыОпт", РезультатЗапросаКомплектыОпт.Выгрузить());
СтруктТаблицДокумента.Вставить("ТараОпт",	 РезультатЗапросаТараОпт	 .Выгрузить());

ТаблицыДанныхДокумента = ОбщегоНазначения.ЗагрузитьТаблицыДокументаВСтруктуру(Движения.ТоварыНаСкладах, СтруктТаблицДокумента);

ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "Качество", Справочники.Качество.Новый, "ТараОпт");

ОбщегоНазначения.ЗаписатьТаблицыДокументаВРегистр(Движения.ТоварыНаСкладах, ВидДвиженияНакопления.Расход, ТаблицыДанныхДокумента, Дата);
КонецЕсли;

КонецЕсли;

ВидСкладаРозн = Новый Структура("ВидСклада", Перечисления.ВидыСкладов.Розничный);
РезультатЗапросаКомплектыРозн = ОбщегоНазначения.ОтобратьСтрокиПоКритериям(ТаблицаПоКомплектам, ВидСкладаРозн);
РезультатЗапросаТараРозн	 = ОбщегоНазначения.ОтобратьСтрокиПоКритериям(ТаблицаПоТаре,	  ВидСкладаРозн);

Если Не РезультатЗапросаКомплектыРозн.Пустой() ИЛИ НЕ РезультатЗапросаТараРозн.Пустой() Тогда
// Проверка остатков при оперативном проведении.
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Движения.ТоварыВРознице.КонтрольОстатков(ЭтотОбъект, "Товары",		 СтруктураШапкиДокумента, Отказ, Заголовок);
Движения.ТоварыВРознице.КонтрольОстатков(ЭтотОбъект, "ВозвратнаяТара", СтруктураШапкиДокумента, Отказ, Заголовок);
КонецЕсли;

Если Не Отказ Тогда
ТаблицаКомплектыРозн = РезультатЗапросаКомплектыРозн.Выгрузить();
ТаблицаТараРозн	 = РезультатЗапросаТараРозн.Выгрузить();

ТаблицаКомплектыРозн.Колонки.Добавить("СуммаПродажная", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15, 2));

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

УправлениеРозничнойТорговлей.ЗаполнитьКолонкуСуммаПродажная(ТаблицаКомплектыРозн, ТаблицаПоЦенам, "ВидСклада");
КонецЕсли;

ТаблицаТараРозн.Колонки.Добавить("СуммаПродажная", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15, 2));

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

УправлениеРозничнойТорговлей.ЗаполнитьКолонкуСуммаПродажная(ТаблицаТараРозн, ТаблицаПоЦенам, "ВидСклада");
КонецЕсли;

СтруктТаблицДокумента = Новый Структура;
СтруктТаблицДокумента.Вставить("КомплектыРозн", ТаблицаКомплектыРозн);
СтруктТаблицДокумента.Вставить("ТараРозн"	 , ТаблицаТараРозн);

ТаблицыДанныхДокумента = ОбщегоНазначения.ЗагрузитьТаблицыДокументаВСтруктуру(Движения.ТоварыВРознице, СтруктТаблицДокумента);

ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "Качество", Справочники.Качество.Новый, "ТараРозн");

ОбщегоНазначения.ЗаписатьТаблицыДокументаВРегистр(Движения.ТоварыВРознице, ВидДвиженияНакопления.Расход, ТаблицыДанныхДокумента, Дата);
КонецЕсли;

КонецЕсли;

Иначе // отпуск по ордеру

// Проверка остатков при оперативном проведении.
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Движения.ТоварыКПередачеСоСкладов.КонтрольОстатков(ЭтотОбъект, "Товары",		 СтруктураШапкиДокумента, Отказ, Заголовок);
Движения.ТоварыКПередачеСоСкладов.КонтрольОстатков(ЭтотОбъект, "ВозвратнаяТара", СтруктураШапкиДокумента, Отказ, Заголовок);
КонецЕсли;

// ТОВАРЫ И ТАРА ПО РЕГИСТРУ ТоварыКПередачеСоСкладов.
Если Не Отказ Тогда

СтруктТаблицДокумента = Новый Структура;
СтруктТаблицДокумента.Вставить("ТаблицаТовары", ТаблицаПоКомплектам);
СтруктТаблицДокумента.Вставить("ТаблицаПоТаре", ТаблицаПоТаре);

ТаблицыДанныхДокумента = ОбщегоНазначения.ЗагрузитьТаблицыДокументаВСтруктуру(Движения.ТоварыКПередачеСоСкладов, СтруктТаблицДокумента);

ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "ДокументПередачи", Ссылка);
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "СтатусПартии",	 Перечисления.СтатусыПартийТоваров.Купленный,	 "ТаблицаТовары");
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "СтатусПартии",	 Перечисления.СтатусыПартийТоваров.ВозвратнаяТара, "ТаблицаПоТаре");
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "Качество",		 Справочники.Качество.Новый,					  "ТаблицаПоТаре");

ОбщегоНазначения.ЗаписатьТаблицыДокументаВРегистр(Движения.ТоварыКПередачеСоСкладов, ВидДвиженияНакопления.Приход, ТаблицыДанныхДокумента, Дата);

КонецЕсли;
КонецЕсли;

// Проверка остатков лимитов возвратной тары при оперативном проведении.
Если РежимПроведения = РежимПроведенияДокумента.Оперативный И ТаблицаПоТаре.Количество()<>0 Тогда
Движения.ТоварыПереданные.КонтрольЛимитовВозвратнойТары(ЭтотОбъект, СтруктураШапкиДокумента, Отказ, Заголовок);
КонецЕсли;

// ТАРА ПО РЕГИСТРУ ТоварыПереданные
Если Не Отказ Тогда
СтруктТаблицДокумента = Новый Структура;
СтруктТаблицДокумента.Вставить("ТаблицаПоТаре", ТаблицаПоТаре);

КопияТаблицаПоТаре = ТаблицаПоТаре.Скопировать();
КопияТаблицаПоТаре.Колонки.ЗаказПокупателя.Имя = "Сделка";

СтруктТаблицДокумента = Новый Структура;
СтруктТаблицДокумента.Вставить("ТаблицаПоТаре", КопияТаблицаПоТаре);

Если СтруктураШапкиДокумента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером Тогда
КопияТовары = ТаблицаПоТоварам.Скопировать();

КопияТовары.Колонки.ЗаказПокупателя.Имя = "Сделка";

СтруктТаблицДокумента.Вставить("ТаблицаТовары", КопияТовары);
КонецЕсли;

ТаблицыДанныхДокумента = ОбщегоНазначения.ЗагрузитьТаблицыДокументаВСтруктуру(Движения.ТоварыПереданные, СтруктТаблицДокумента);

Если СтруктураШапкиДокумента.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоСчетам Тогда
Для Каждого ТаблицаДанных Из ТаблицыДанныхДокумента Цикл
ТаблицаДанных.Значение.ЗаполнитьЗначения(Сделка, "Сделка");
КонецЦикла;
КонецЕсли;

ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "ДоговорКонтрагента", ДоговорКонтрагента);
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "Контрагент",		 Контрагент);
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "Организация",		Организация);
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "СтатусПередачи",	 Перечисления.СтатусыПолученияПередачиТоваров.ВозвратнаяТара, "ТаблицаПоТаре");

Если СтруктураШапкиДокумента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером Тогда
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "СтатусПередачи", Перечисления.СтатусыПолученияПередачиТоваров.НаКомиссию,	 "ТаблицаТовары");
КонецЕсли;

ОбщегоНазначения.ЗаписатьТаблицыДокументаВРегистр(Движения.ТоварыПереданные, ВидДвиженияНакопления.Приход, ТаблицыДанныхДокумента, Дата);
КонецЕсли;

// ТОВАР, ТАРА И УСЛУГИ ПО РЕГИСТРУ ЗаказыПокупателей.

// Проверка остатков при оперативном проведении.
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Движения.ЗаказыПокупателей.КонтрольПревышенияОбъемаЗаказа(ЭтотОбъект, СтруктураШапкиДокумента, "Товары",		 Отказ, Заголовок);
Движения.ЗаказыПокупателей.КонтрольПревышенияОбъемаЗаказа(ЭтотОбъект, СтруктураШапкиДокумента, "ВозвратнаяТара", Отказ, Заголовок);
Движения.ЗаказыПокупателей.КонтрольПревышенияОбъемаЗаказа(ЭтотОбъект, СтруктураШапкиДокумента, "Услуги",		 Отказ, Заголовок);
КонецЕсли;

Если Не Отказ Тогда
СтруктТаблицДокумента = Новый Структура;
СтруктТаблицДокумента.Вставить("ТаблицаПоТоварам", ТаблицаПоТоварам);
СтруктТаблицДокумента.Вставить("ТаблицаПоТаре",	ТаблицаПоТаре);
СтруктТаблицДокумента.Вставить("ТаблицаПоУслугам", ТаблицаПоУслугам);

ТаблицыДанныхДокумента = ОбщегоНазначения.ЗагрузитьТаблицыДокументаВСтруктуру(Движения.ЗаказыПокупателей, СтруктТаблицДокумента);
ОбщегоНазначения.УдалитьСтрокиИзТаблицДокумента(ТаблицыДанныхДокумента, "ЗаказПокупателя");

ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "ДоговорКонтрагента", ДоговорКонтрагента);
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "СтатусПартии",	  Перечисления.СтатусыПартийТоваров.Купленный, "ТаблицаПоТоварам,ТаблицаПоУслугам");
ОбщегоНазначения.УстановитьЗначениеВТаблицыДокумента(ТаблицыДанныхДокумента, "СтатусПартии",	  Перечисления.СтатусыПартийТоваров.ВозвратнаяТара, "ТаблицаПоТаре");

ОбщегоНазначения.ЗаписатьТаблицыДокументаВРегистр(Движения.ЗаказыПокупателей, ВидДвиженияНакопления.Расход, ТаблицыДанныхДокумента, Дата);
КонецЕсли;

// Если есть списание из резерва, то надо списать резерв
ТаблицаПоТоварамИзРезерва = ТаблицаПоТоварам.Скопировать();
Сч = 0;
Пока Сч < ТаблицаПоТоварамИзРезерва.Количество() Цикл
СтрокаТаблицы = ТаблицаПоТоварамИзРезерва.Получить(Сч);
Если СтрокаТаблицы.СпособСписанияОстаткаТоваров <> Перечисления.СпособыСписанияОстаткаТоваров.ИзРезерва
ИЛИ НЕ ЗначениеЗаполнено(СтрокаТаблицы.ЗаказПокупателя) Тогда
ТаблицаПоТоварамИзРезерва.Удалить(СтрокаТаблицы);
Иначе 
Сч = Сч + 1;
КонецЕсли; 
КонецЦикла;

Если ТаблицаПоТоварамИзРезерва.Количество() > 0 Тогда
НаборДвижений = Движения.ТоварыВРезервеНаСкладах;

// Получим таблицу значений, совпадающую со структурой набора записей регистра.
ТаблицаДвижений = НаборДвижений.ВыгрузитьКолонки();

// Заполним таблицу движений.
ТаблицаПоТоварамИзРезерва.Колонки.ЗаказПокупателя.Имя = "ДокументРезерва";
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТоварамИзРезерва, ТаблицаДвижений);

НаборДвижений.мПериод			= Дата;
НаборДвижений.мТаблицаДвижений  = ТаблицаДвижений;

// Проверка остатков при оперативном проведении.
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
НаборДвижений.КонтрольОстатков(ЭтотОбъект, "Товары", СтруктураШапкиДокумента, Отказ, Заголовок);
КонецЕсли;

Если Не Отказ Тогда
Движения.ТоварыВРезервеНаСкладах.ВыполнитьРасход();
КонецЕсли;

КонецЕсли;

ТаблицаПоТареИзРезерва = ТаблицаПоТаре.Скопировать();
Сч = 0;
Пока Сч < ТаблицаПоТареИзРезерва.Количество() Цикл
СтрокаТаблицы = ТаблицаПоТареИзРезерва.Получить(Сч);
Если СтрокаТаблицы.СпособСписанияОстаткаТоваров <> Перечисления.СпособыСписанияОстаткаТоваров.ИзРезерва
ИЛИ НЕ ЗначениеЗаполнено(СтрокаТаблицы.ЗаказПокупателя) Тогда
ТаблицаПоТареИзРезерва.Удалить(СтрокаТаблицы);
Иначе 
Сч = Сч + 1;
КонецЕсли; 
КонецЦикла;

Если ТаблицаПоТареИзРезерва.Количество() > 0 Тогда

НаборДвижений = Движения.ТоварыВРезервеНаСкладах;

// Получим таблицу значений, совпадающую со структурой набора записей регистра.
ТаблицаДвижений = НаборДвижений.ВыгрузитьКолонки();

// Заполним таблицу движений.
ТаблицаПоТареИзРезерва.Колонки.ЗаказПокупателя.Имя = "ДокументРезерва";
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТареИзРезерва, ТаблицаДвижений);

НаборДвижений.мПериод			= Дата;
НаборДвижений.мТаблицаДвижений  = ТаблицаДвижений;

// Проверка остатков при оперативном проведении.
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
НаборДвижений.КонтрольОстатков(ЭтотОбъект, "ВозвратнаяТара", СтруктураШапкиДокумента, Отказ, Заголовок);
КонецЕсли;

Если Не Отказ Тогда
Движения.ТоварыВРезервеНаСкладах.ВыполнитьРасход();
КонецЕсли;

КонецЕсли;

КонецЕсли; // Если ОтражатьВУправленческомУчете

КонецПроцедуры // ДвиженияПоРегистрамУпр()
 
Если уж Вам так надо, чтобы все выводилось "автоматом" то я бы действовал так:перед записью (ну или если оооочень уж хочется - то при проведении) документа получал остатки без учета текущих ( или будущих) движений, из них - вычитал нужные суммы по документу, формировал нужный Вам бонус, а только потом делал бы движения.
 
Мне кажется движения можно принудительно записать до окончания проведения, и тогда движения попадут в остатки.
 
Мне нужно узнать не сколько остатков на складе, а сколько реализовано по заказу (если заказ реализован полностью, тогда начислять бонус). А что за "Метод дополнения - движения и граница периода"? Можно поподробнее?

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

Мне кажется движения можно принудительно записать до окончания проведения, и тогда движения попадут в остатки.

Методически не верное решение. Разрешается писать в регистр с помощью метода "Записать()" только в том случае, если полученные данные потом используются для формирования движений по второму регистру. Принудительная же запись должна быть сразу удалена из регистра.
 
Да, это как раз помогло, спасибо! А точно не на что не повлияет в дальнейшем такая хитрость?

например вариант - первые движения записали, а на вторых движениях произошло исключение, и документ пошел на отказ проведения. А вот первые-то движения остаются, так как уже записаны (если ошибаюсь - поправьте).
 
например вариант - первые движения записали, а на вторых движениях произошло исключение, и документ пошел на отказ проведения. А вот первые-то движения остаются, так как уже записаны (если ошибаюсь - поправьте).
Все проведение ведь в транзакции. Откат транзакции должен произойти.
 
Код:
Процедура ОбработкаПроведения(Отказ, Режим)
НаборДвижений = Движения.РеализацияУслуг;
Движение = НаборДвижений.Добавить();
Движение.Период = Дата;
Движение.Организация = Организация;
Движение.Сумма = 1000;
НаборДвижений.Записать();

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	РеализацияУслуг.Организация
|ИЗ
|	РегистрНакопления.РеализацияУслуг КАК РеализацияУслуг
|ГДЕ
|	РеализацияУслуг.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор",Ссылка );

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(ВЫборка.Организация);

КонецЦикла;


Отказ = Истина;
Возврат;
КонецПроцедуры


Пишет "операция не выполнена", движений не создается.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab