Обработка заполнения инвентаризации УТ 10.3

1. KaterinaMouse 54 16.03.15 23:57 Сейчас в теме
Доброго времени суток!, подскажите пожалуйста, пишу обработку для заполнения табличной части инвентаризации, заполнение происходит следующим образом
Запрос.Текст="ВЫБРАТЬ
	             |	СпрНоменклатура.Ссылка КАК Ссылка,
	             |	ЦеныНоменклатуры.Цена КАК Цена,
	             |	ВЫБОР
	             |		КОГДА СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) = 0
	             |				ИЛИ СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) ЕСТЬ NULL 
	             |			ТОГДА 0
	             |		КОГДА СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) <> 0
	             |			ТОГДА СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток)
	             |	КОНЕЦ КАК Количество,
	             |	ВЫБОР
	             |		КОГДА СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) = 0
	             |				ИЛИ СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) ЕСТЬ NULL 
	             |			ТОГДА 0
	             |		ИНАЧЕ СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) * ЦеныНоменклатуры.Цена
	             |	КОНЕЦ КАК СУММА,
	             |	ВЫБОР
	             |		КОГДА ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков ЕСТЬ NULL 
	             |			ТОГДА СпрНоменклатура.ЕдиницаХраненияОстатков
	             |		ИНАЧЕ ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков
	             |	КОНЕЦ КАК ЕдиницаОстатков,
	             |	ВЫБОР
	             |		КОГДА ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент ЕСТЬ NULL 
	             |			ТОГДА 1
	             |		ИНАЧЕ ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
	             |	КОНЕЦ КАК Коэфициент,
	             |	ТоварыНаСкладахОстатки.Качество
	             |ИЗ
	             |	РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
	             |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
	             |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК ТоварыНаСкладахОстатки
	             |			ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура.Ссылка
	             |		ПО ЦеныНоменклатуры.Номенклатура.Ссылка = СпрНоменклатура.Ссылка
	             |ГДЕ
	             |	СпрНоменклатура.ЭтоГруппа = ЛОЖЬ
	             |	И ЦеныНоменклатуры.ТипЦен = &ТипЦен
				 |  И СпрНоменклатура.ссылка В (&СписокНоменклатуры)
	             |
	             |СГРУППИРОВАТЬ ПО
	             |	СпрНоменклатура.Ссылка,
	             |	ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков,
	             |	ЦеныНоменклатуры.Цена,
	             |	ВЫБОР
	             |		КОГДА ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков ЕСТЬ NULL 
	             |			ТОГДА СпрНоменклатура.ЕдиницаХраненияОстатков
	             |		ИНАЧЕ ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков
	             |	КОНЕЦ,
	             |	ВЫБОР
	             |		КОГДА ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент ЕСТЬ NULL 
	             |			ТОГДА 1
	             |		ИНАЧЕ ТоварыНаСкладахОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
	             |	КОНЕЦ,
	             |	ТоварыНаСкладахОстатки.Качество";
	Если Объект.ЭтоНовый() Тогда
		Запрос.УстановитьПараметр("Дата",КонецДня(ТекущаяДата()));
	Иначе 
		Запрос.УстановитьПараметр("Дата",КонецДня(ЭтотОбъект.Дата));
	КонецЕсли;
	Запрос.УстановитьПараметр("ТипЦен",Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочные").Ссылка);
	Запрос.УстановитьПараметр("СписокНоменклатуры", СписокЗначенийНоменклатуры);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.количество);
		//Если Выборка.Количество = 0 Тогда
		//	Продолжить;
		//КонецЕсли;

		СтрокаТабличнойЧасти = Объект.Товары.Добавить();

		СтрокаТабличнойЧасти.Номенклатура     = Выборка.Ссылка;
		Если Выборка.Количество = 0 Тогда
		    СтрокаТабличнойЧасти.КоличествоУчет	  = 0;
			СтрокаТабличнойЧасти.Количество       = 0;
			СтрокаТабличнойЧасти.ЕдиницаИзмерения = Выборка.ЕдиницаОстатков;
			СтрокаТабличнойЧасти.Коэффициент      = Выборка.Коэфициент;
			СтрокаТабличнойЧасти.СуммаУчет        = Выборка.Сумма;
			СтрокаТабличнойЧасти.Цена             = 0;
		Иначе
			СтрокаТабличнойЧасти.КоличествоУчет   = Выборка.Количество;
			//СтрокаТабличнойЧасти.Количество       = ?(Объект.ТолькоУчетные, 0, СтрокаТабличнойЧасти.КоличествоУчет);
			СтрокаТабличнойЧасти.Количество       = СтрокаТабличнойЧасти.КоличествоУчет;
			СтрокаТабличнойЧасти.ЕдиницаИзмерения = Выборка.ЕдиницаОстатков;
			СтрокаТабличнойЧасти.Коэффициент      = Выборка.Коэфициент;
			СтрокаТабличнойЧасти.СуммаУчет        = Выборка.Сумма;
			//СтрокаТабличнойЧасти.Сумма            = ?(Объект.ТолькоУчетные, 0, Выборка.Сумма);
			СтрокаТабличнойЧасти.Сумма            = Выборка.Сумма;
            СтрокаТабличнойЧасти.Цена             = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.КоличествоУчет;
		КонецЕсли;
			СтрокаТабличнойЧасти.Качество    	  = Выборка.Качество;
Показать

ячейка учет.количество не заполняется, ячейка количество преставляется как "отсутствует", подскажите в чем может быть дело?
пробовал после пройтись по табличной части и проставить 0, результатов не дало.
Заранее спасибо!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. KaterinaMouse 54 17.03.15 00:02 Сейчас в теме
3. KaterinaMouse 54 17.03.15 00:02 Сейчас в теме
вот что получается в итоге
4. NE_ZNAIY 17.03.15 12:48 Сейчас в теме
Я плохо разбираюсь в коде.
Какую цель вы преследуете создавая свою обработку?
Чем не устраивает стандартная?
5. KaterinaMouse 54 17.03.15 14:27 Сейчас в теме
(4) NE_ZNAIY, Необходимо, что бы по всем позициям из выбранной группы номенклатуры заполнялась инвентаризация т.е если вывести группу на печать получаем следующее

но если заполнить инвентаризацию по той же группе, то получаем немного другую картинку, а именно позиций намного меньше
6. x_under 13 17.03.15 20:33 Сейчас в теме
(5) KaterinaMouse, мой вам совет: дорабатывайте запрос, который зашит в конфигурации. Т. е. опирается на партии товаров, а не на цены (причем получать надо виртуальную таблицу, а не реальную как у вас).

А я бы вообще не заморачивался: сделал обработку, которая просто заполняет список товаров из группы (без количеств и прочего), а далее используйте стандартную обработку Перезаполнить учетные количества и суммы
7. KaterinaMouse 54 17.03.15 21:14 Сейчас в теме
(6) x_under, спасибо за совет, попробую, отпишусь о результатах
8. AlexeyPapanov 470 17.03.15 21:57 Сейчас в теме
я писал похожую обработку. мне надо было учетные количества получить актуальные.
приведу фрагмент:

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Таблица",Товары);
	Запрос.УстановитьПараметр("Склад",СсылкаНаОбъект.Склад);
	Запрос.УстановитьПараметр("ДатаОстатков",СсылкаНаОбъект.Дата);
	
	Запрос.УстановитьПараметр("ПартионныйСклад", ВремСклад);
	Запрос.УстановитьПараметр("ПартионнаяОрганизация", ВремОрганизация);
	Запрос.УстановитьПараметр("ДокументСсылка",  СсылкаНаОбъект.Ссылка);
	
	
	Если СсылкаНаОбъект.Склад.ВидСклада = Перечисления.ВидыСкладов.Оптовый Тогда
		РегОстатки = "ТоварыНаСкладах";		
	Иначе
		РегОстатки = "ТоварыВРознице";
	КонецЕсли;
	
	Запрос.Текст = "ВЫБРАТЬ 
		|	Таблица.НомерСтроки,
		|	Таблица.ЕдиницаИзмерения,
		|	Таблица.Качество,
		|	Таблица.ЕдиницаИзмеренияМест,
		|	Таблица.Количество,
		|	Таблица.КоличествоМест,
		|	Таблица.КоличествоУчет,
		|	Таблица.Коэффициент,
		|	Таблица.Номенклатура,
		|	Таблица.Сумма,
		|	Таблица.СуммаУчет,
		|	Таблица.Цена,
		|	Таблица.СуммаРегл,
		|	Таблица.ЦенаВРознице
		|
		|ПОМЕСТИТЬ СписокНоменклатуры 
		|ИЗ 
		|	&Таблица КАК Таблица 
		|; 
		|
		|
		| 
		|ВЫБРАТЬ 
		|	СписокНоменклатуры.НомерСтроки,
		|	СписокНоменклатуры.Номенклатура,
		|	СписокНоменклатуры.Номенклатура.Артикул КАК Артикул,
		|	СписокНоменклатуры.ЕдиницаИзмерения,
		|	СписокНоменклатуры.Качество,
		|	СписокНоменклатуры.ЕдиницаИзмеренияМест,
		|	СписокНоменклатуры.Коэффициент,
//		|	СписокНоменклатуры.Цена,
		|	ВЫРАЗИТЬ( ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			СписокНоменклатуры.Цена
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток) / СУММА(ОстаткиПартий.КоличествоОстаток)
		|		КОНЕЦ 
		|	КАК ЧИСЛО(15,2)
		|	) КАК Цена,
		|	СписокНоменклатуры.ЦенаВРознице,
		|	СУММА(СписокНоменклатуры.Количество),
		|	СУММА(СписокНоменклатуры.КоличествоМест),
		|	СУММА(СписокНоменклатуры.КоличествоУчет) КАК Количество2,
		|	СУММА(ЕСТЬNULL(ОстаткиТоваров.КоличествоОстаток,0)) КАК КоличествоУчет,
//		|	СУММА(СписокНоменклатуры.Сумма),
		|	ВЫРАЗИТЬ( ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			СУММА(СписокНоменклатуры.Сумма)
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток) * СУММА(СписокНоменклатуры.Количество) / СУММА(ОстаткиПартий.КоличествоОстаток)
		|		КОНЕЦ 
		|	КАК ЧИСЛО(15,2)
		|	) КАК Сумма,
		|	СУММА(СписокНоменклатуры.СуммаУчет) КАК СуммаУчет2,
//		|	СУММА(СписокНоменклатуры.СуммаРегл),
		|	ВЫРАЗИТЬ( ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			СУММА(СписокНоменклатуры.СуммаРегл)
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток) * СУММА(СписокНоменклатуры.Количество) / СУММА(ОстаткиПартий.КоличествоОстаток)
		|		КОНЕЦ 
		|	КАК ЧИСЛО(15,2)
		|	) КАК СуммаРегл,
		|	ВЫРАЗИТЬ( ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			0 
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток)*СУММА(ОстаткиТоваров.КоличествоОстаток)
		|			/ СУММА(ОстаткиПартий.КоличествоОстаток)
		|		КОНЕЦ 
		|	КАК ЧИСЛО(15,2)
		|	) КАК СуммаУчет
		|
		|ИЗ 
		|	СписокНоменклатуры КАК СписокНоменклатуры
		|
		|	ЛЕВОЕ СОЕДИНЕНИЕ 
		|		РегистрНакопления." + РегОстатки + ".Остатки(&ДатаОстатков, 
		|	                Номенклатура в (ВЫБРАТЬ Номенклатура ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары
		|	                                ГДЕ Документ.ИнвентаризацияТоваровНаСкладе.Товары.Ссылка = &ДокументСсылка)
		|	              И Склад = &Склад
		|	) КАК ОстаткиТоваров
		|	ПО 
		|		СписокНоменклатуры.Номенклатура = ОстаткиТоваров.Номенклатура
		|
		|
		|
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&ДатаОстатков, 
		|	                Номенклатура в (Выбрать Номенклатура ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары
		|	                                ГДЕ Документ.ИнвентаризацияТоваровНаСкладе.Товары.Ссылка = &ДокументСсылка)
		|	              И Склад = &ПартионныйСклад И Организация = &ПартионнаяОрганизация) КАК ОстаткиПартий
		|	ПО
		|		ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура
		|		И СписокНоменклатуры.Номенклатура = ОстаткиПартий.Номенклатура
		|
		|
		|СГРУППИРОВАТЬ ПО
		|	СписокНоменклатуры.НомерСтроки,
		|	СписокНоменклатуры.Номенклатура,
		|	СписокНоменклатуры.Номенклатура.Артикул,
		|	СписокНоменклатуры.ЕдиницаИзмерения,
		|	СписокНоменклатуры.Качество,
		|	СписокНоменклатуры.ЕдиницаИзмеренияМест,
		|	СписокНоменклатуры.Коэффициент,
		|	СписокНоменклатуры.Цена,
		|	СписокНоменклатуры.ЦенаВРознице
		|
		|УПОРЯДОЧИТЬ ПО
        |	СписокНоменклатуры.НомерСтроки
		|";
Показать
9. AlexeyPapanov 470 17.03.15 22:04 Сейчас в теме
еще грамотные люди советуют, что в параметрах виртуальной таблицы "Остатки" надо накладывать отбор на номенклатуру.
иначе 1с извлекает остатки по всей номенклатуре, а потом приклеивает левым соединением только ту часть, что нужна вам. это неоптимально.

 |    ЛЕВОЕ СОЕДИНЕНИЕ 
        |        РегистрНакопления." + РегОстатки + ".Остатки(&ДатаОстатков, 
        |                    Номенклатура в (ВЫБРАТЬ Номенклатура ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары
        |                                    ГДЕ Документ.ИнвентаризацияТоваровНаСкладе.Товары.Ссылка = &ДокументСсылка)
        |                  И Склад = &Склад
        |    ) КАК ОстаткиТоваров

так вы извлечете остатки только по номенклатуре из табличной части документа.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот