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

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

Marija

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

puh14

Достаточно дубовый вариант - перебрать строки документа (если номенклатура в них живет, конечно). При переборе вызывать запрос (только ещё добавить в него фильтр по номенклатуре) и сравнивать количество в запросе и количество в строке документа. Если не совпадают - значит НачислитьБонус = ложь.

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

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

kaa

По идее после записи движений в регистр, можно уже получать остатки с учетом текущего документа
 
P

puh14

По идее после записи движений в регистр, можно уже получать остатки с учетом текущего документа

Значит набор движений отдельно, документ отдельно? и завсегда автоматом? Это есть очень хорошо! Тогда у автора поста скорее всего запрос идет раньше создания и записи набора записей регистра.
 
M

Marija

По идее после записи движений в регистр, можно уже получать остатки с учетом текущего документа
В какой момент происходит запись движений в регистр? Я свой запрос вставила в конец процедуры ОбработкаПроведения, в которой все движения по регистрам уже прошли. И все равно по текущему доку пока еще нет данных в регистрах накопления....
"По идее" я тоже так думала, а на практике вышло совсем иначе...
 
P

puh14

Запись происходит в момент НаборДвижений.Записать();

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

А как выглядит проведение по регистрам в виде кода?
 
D

Darlock

Чтоб узнать хватит ли остатков на складе, используйте параметры виртуальной таблицы оборотов, четвертый параметр кажется. "Метод дополнения - движения и граница периода" и как параметр в запрос массив номенклатуры документа.
 
T

tanat

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

Marija

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

Marija

Чтоб узнать хватит ли остатков на складе, используйте параметры виртуальной таблицы оборотов, четвертый параметр кажется. "Метод дополнения - движения и граница периода" и как параметр в запрос массив номенклатуры документа.
Мне нужно узнать не сколько остатков на складе, а сколько реализовано по заказу (если заказ реализован полностью, тогда начислять бонус). А что за "Метод дополнения - движения и граница периода"? Можно поподробнее?
 
M

Marija

Запись происходит в момент НаборДвижений.Записать();

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

А как выглядит проведение по регистрам в виде кода?
Код можно посмотреть в типовой УТ, обработка проведения документа "Реализация товаров и услуг".
Там много вложенных процедур...
<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 Тогда

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

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

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

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

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

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

КонецЕсли;

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

КонецПроцедуры // ДвиженияПоРегистрамУпр()
 
T

tanat

Если уж Вам так надо, чтобы все выводилось "автоматом" то я бы действовал так:перед записью (ну или если оооочень уж хочется - то при проведении) документа получал остатки без учета текущих ( или будущих) движений, из них - вычитал нужные суммы по документу, формировал нужный Вам бонус, а только потом делал бы движения.
 
U

unknown181538

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

Darlock

Мне нужно узнать не сколько остатков на складе, а сколько реализовано по заказу (если заказ реализован полностью, тогда начислять бонус). А что за "Метод дополнения - движения и граница периода"? Можно поподробнее?

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

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

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

Marija

Мне кажется движения можно принудительно записать до окончания проведения, и тогда движения попадут в остатки.
Да, это как раз помогло, спасибо! А точно не на что не повлияет в дальнейшем такая хитрость?
 
P

puh14

Да, это как раз помогло, спасибо! А точно не на что не повлияет в дальнейшем такая хитрость?

например вариант - первые движения записали, а на вторых движениях произошло исключение, и документ пошел на отказ проведения. А вот первые-то движения остаются, так как уже записаны (если ошибаюсь - поправьте).
 
U

unknown181538

например вариант - первые движения записали, а на вторых движениях произошло исключение, и документ пошел на отказ проведения. А вот первые-то движения остаются, так как уже записаны (если ошибаюсь - поправьте).
Все проведение ведь в транзакции. Откат транзакции должен произойти.
 
U

unknown181538

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

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

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

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

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

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

КонецЦикла;


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


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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!