1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программирован. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление
  2. Чат codeby в telegram перезагрузка. Обсуждаем вопросы информационной безопасности и методы защиты информации, программирование. Задавайте свои вопросы и комментируйте чужие. Подробнее ...

    Скрыть объявление

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

Тема в разделе "Базы данных и администрирование", создана пользователем Marija, 9 июл 2010.

  1. Marija

    Marija Гость

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

    puh14 Well-Known Member

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

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

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

    kaa Гость

    Репутация:
    0
    По идее после записи движений в регистр, можно уже получать остатки с учетом текущего документа
     
  4. puh14

    puh14 Well-Known Member

    Репутация:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Значит набор движений отдельно, документ отдельно? и завсегда автоматом? Это есть очень хорошо! Тогда у автора поста скорее всего запрос идет раньше создания и записи набора записей регистра.
     
  5. Marija

    Marija Гость

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

    puh14 Well-Known Member

    Репутация:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Запись происходит в момент НаборДвижений.Записать();

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

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

    Darlock Well-Known Member

    Репутация:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    560
    Симпатии:
    1
    Чтоб узнать хватит ли остатков на складе, используйте параметры виртуальной таблицы оборотов, четвертый параметр кажется. "Метод дополнения - движения и граница периода" и как параметр в запрос массив номенклатуры документа.
     
  8. tanat

    tanat Well-Known Member

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

    Marija Гость

    Репутация:
    0
    А в какой момент тогда определять, что документ проведен и остаток = 0? Если мне нужно автоматически, без лишних движений менеджеров, начислять бонусы (Создавать новый док "Бонусы"), при условии что товар по заказу реализован полностью.
     
  10. Marija

    Marija Гость

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

    Marija Гость

    Репутация:
    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 Тогда
    
    НаборДвижений = Движения.ТоварыВРезервеНаСкладах;
    
    // Получим таблицу значений, совпадающую со структурой набора записей регистра.
    ТаблицаДвижений = НаборДвижений.ВыгрузитьКолонки();
    
    // Заполним таблицу движений.
    ТаблицаПоТареИзРезерва.Колонки.ЗаказПокупателя.Имя = "ДокументРезерва";
    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТареИзРезерва, ТаблицаДвижений);
    
    НаборДвижений.мПериод			= Дата;
    НаборДвижений.мТаблицаДвижений  = ТаблицаДвижений;
    
    // Проверка остатков при оперативном проведении.
    Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
    НаборДвижений.КонтрольОстатков(ЭтотОбъект, "ВозвратнаяТара", СтруктураШапкиДокумента, Отказ, Заголовок);
    КонецЕсли;
    
    Если Не Отказ Тогда
    Движения.ТоварыВРезервеНаСкладах.ВыполнитьРасход();
    КонецЕсли;
    
    КонецЕсли;
    
    КонецЕсли; // Если ОтражатьВУправленческомУчете
    
    КонецПроцедуры // ДвиженияПоРегистрамУпр()
     
  12. tanat

    tanat Well-Known Member

    Репутация:
    0
    Регистрация:
    2 мар 2007
    Сообщения:
    265
    Симпатии:
    0
    Если уж Вам так надо, чтобы все выводилось "автоматом" то я бы действовал так:перед записью (ну или если оооочень уж хочется - то при проведении) документа получал остатки без учета текущих ( или будущих) движений, из них - вычитал нужные суммы по документу, формировал нужный Вам бонус, а только потом делал бы движения.
     
  13. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    Мне кажется движения можно принудительно записать до окончания проведения, и тогда движения попадут в остатки.
     
  14. Darlock

    Darlock Well-Known Member

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

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

    Marija Гость

    Репутация:
    0
    Да, это как раз помогло, спасибо! А точно не на что не повлияет в дальнейшем такая хитрость?
     
  16. puh14

    puh14 Well-Known Member

    Репутация:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    например вариант - первые движения записали, а на вторых движениях произошло исключение, и документ пошел на отказ проведения. А вот первые-то движения остаются, так как уже записаны (если ошибаюсь - поправьте).
     
  17. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    Все проведение ведь в транзакции. Откат транзакции должен произойти.
     
  18. Marija

    Marija Гость

    Репутация:
    0
    Т.е. вы предполагаете, что все же можно записать движения принудительно?
     
  19. Darlock

    Darlock Well-Known Member

    Репутация:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    560
    Симпатии:
    1
    Откат произойдет, только для тех движений, которые были подготовлены в набор, но не записаны еще.
     
  20. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    Код:
    Процедура ОбработкаПроведения(Отказ, Режим)
    НаборДвижений = Движения.РеализацияУслуг;
    Движение = НаборДвижений.Добавить();
    Движение.Период = Дата;
    Движение.Организация = Организация;
    Движение.Сумма = 1000;
    НаборДвижений.Записать();
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |	РеализацияУслуг.Организация
    |ИЗ
    |	РегистрНакопления.РеализацияУслуг КАК РеализацияУслуг
    |ГДЕ
    |	РеализацияУслуг.Регистратор = &Регистратор";
    
    Запрос.УстановитьПараметр("Регистратор",Ссылка );
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
    
    Сообщить(ВЫборка.Организация);
    
    КонецЦикла;
    
    
    Отказ = Истина;
    Возврат;
    КонецПроцедуры

    Пишет "операция не выполнена", движений не создается.
     
Загрузка...

Поделиться этой страницей