Отбор по местам хранения в документе инвентаризация

1. dag_ssa 15.02.14 19:02 Сейчас в теме
Здравствуйте ! Господа программисты . Подскажите пожалуйста как добавить в документ инвентаризация отбор по местам хранения ?
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Rothschild 15.02.14 19:37 Сейчас в теме
(1) dag_ssa, что значит добавить отбор "по месту хранения"
обычно ивентаризацию делают для одного "места хранения", т.е склада.
+
3. dag_ssa 16.02.14 21:09 Сейчас в теме
(2) Rothschild, Места хранения = Стеллажи , ячейки , Полки и тд. У каждого товара имеется место хранения . Необходимо каждый день один стеллаж . 1 стеллаж = 250 Наименований
+
4. dag_ssa 16.02.14 21:11 Сейчас в теме
(2) Rothschild, Необходимо проводить ревизию одного стеллажа в день .
+
5. x_under 13 16.02.14 23:05 Сейчас в теме
В УТ 10.3 места хранения являются лишь информационными. то есть если ву вас в карточке номенклатуры указано место. это не показатель, что там товар действительно лежит. Возможно у вас доработана конфигурация, но тогда необходимо смотреть именно ваши доработки.
Rothschild; +1
6. Rothschild 17.02.14 06:21 Сейчас в теме
(5) x_under dag_ssa,

в разрезе складских ячеек остатки хранятся?
или фактически - нужен фильтр по номенклатуре,
у которой указано размещение в выбранных в фильтре ячейках???
+
8. Rothschild 17.02.14 08:02 Сейчас в теме
(6)
(7) x_under, пардонс, а щас нормально?
;))
+
9. dag_ssa 17.02.14 08:22 Сейчас в теме
(6) Rothschild, Да именно как вы указали . Никак не мог объяснить)).

нужен фильтр по номенклатуре,
у которой указано размещение в выбранных в фильтре ячейках
+
10. Rothschild 17.02.14 10:55 Сейчас в теме
(9) dag_ssa,
1. придется в запросики используемые для заполнения
добавить соединение с подзапросом для фильтрации по складским ячейкам (местам хранения).
2. добавить стандартные поля в формы для фильтра по местам хранения
+
11. Rothschild 17.02.14 10:57 Сейчас в теме
(10)
пример подзапроса по местам хранения:

ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад,
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.Качество,
ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
ТоварыНаСкладахОстатки.СерияНоменклатуры,
ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
{ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура,
СУММА(1) КАК ЧислоЯчеек
ИЗ
РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры
ГДЕ
МестаХраненияНоменклатуры.Склад = &Склад
{ГДЕ
МестаХраненияНоменклатуры.МестоХранения.*}

СГРУППИРОВАТЬ ПО
МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры
ПО ТоварыНаСкладахОстатки.Номенклатура = ЯчейкиНоменклатуры.Номенклатура}
ГДЕ
ТоварыНаСкладахОстатки.Склад = &Склад
Показать
+
12. Rothschild 17.02.14 10:59 Сейчас в теме
(11)
подчеркнутый фрагмент текста (расширение для построителя отчета)
должно обязательно присутствовать, чтобы построитель отчета
мог фильтровать по полю "МестоХранения"

PS
Само соединение - тоже в угловых скобках -
- чтобы добавлялось в запрос только при фильтрации по ячейкам склада
+
13. dag_ssa 17.02.14 14:49 Сейчас в теме
(12) Rothschild, Извините пожалуйста я в программировании не понимаю . я пользователь . Из конструктора я заходил в документ , в подсистемах Управление запасами отмечено . В Данных реквизиты : Организация , Комментарий , Склад , Ответственный ,Учитывать серии , Условия проведения инвентаризации .

Все вкладки наверное не буду описывать )) .

Вкладка Формы : Форма документа , Форма списка , Форма выбора .

Те (лекарства) которые вы выписали куда вписать ))?

И еще поле выбора куда добавить , как назвать и какой функционал выбрать "при изменении"?
+
14. dag_ssa 17.02.14 14:56 Сейчас в теме
(12) Rothschild, "ЯчейкиНоменклатуры.Номенклатура" - не знаю имеет ли это значение ,но у меня в справочниках имеется справочник "МестаХранения" в которую я добавил реквизиты (15-1-1,15-1-2,...) и в номенклатуре во вкладке Места Хранения добавил эти реквизиты .

Я к тому что я в системе не замечал фразу "Ячейка" которая присутствует в прошлом вашем сообщении .

Спасибо за оперативность !!
+
15. Rothschild 17.02.14 18:33 Сейчас в теме
(14) dag_ssa,
термин "Ячейка" - это у меня своего рода сленг,
доставшийся мне по практическому опыту.
Я учавствовал во внедрении и сопровождении
системы адресного хранения на складах еще в ТиС-7.7.

В том варианте "места хранения" на складе обзывались складскими "ячейками".
+
16. Rothschild 17.02.14 18:35 Сейчас в теме
(15)
пример запроса в (11) написан мной в демо базе УПП-1.3.
для УТ-10.3 тоже должен подойти - проверь в консоли запросов,
если что не так по структуре таблиц - подправь (хотя это мало вероятно).

имя подзапроса "ЯчейкиНоменклатуры", используемого для фильтрации номенклатуры
по ее "местам хранения" можешь заменить на более удобное.
+
18. dag_ssa 17.02.14 19:45 Сейчас в теме
(16) Rothschild, Куда именно надо вписать эту формулу ?

Как я понял вот это примерно то место в модуле документа ?

Процедура ЗаполнитьНачальныеНастройки(ПостроительОтчета) Экспорт
ПостроительОтчета.Текст =
"ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура,
| ОстаткиТоваров.ХарактеристикаНоменклатуры,"
+?(УчитыватьСерии, "
| ОстаткиТоваров.СерияНоменклатуры,","") + "
| ОстаткиТоваров.Качество,
| СУММА(ОстаткиТоваров.КоличествоОстаток) КАК Количество,
| ВЫБОР
| КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
| ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
| 0
| ИНАЧЕ
| СУММА(ОстаткиПартий.СтоимостьОстаток)*СУММА(ОстаткиТоваров.КоличествоОстаток)
| / СУММА(ОстаткиПартий.КоличествоОстаток)
| КОНЕЦ КАК Сумма
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад)
|КАК ОстаткиТоваров
|
|ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрНакопления.ПартииТоваровНаСкладах.Остатки(,
| Склад = &ПартионныйСклад) КАК ОстаткиПартий
|ПО
| ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура
| И ОстаткиТоваров.ХарактеристикаНоменклатуры = ОстаткиПартий.ХарактеристикаНоменклатуры
| И ОстаткиТоваров.Качество = ОстаткиПартий.Качество
|
|{ГДЕ ОстаткиТоваров.Номенклатура КАК Номенклатура,
| ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
| МестаХраненияНоменклатуры.МестоХранения КАК МестоХранения}
|
|СГРУППИРОВАТЬ ПО
| ОстаткиТоваров.Номенклатура,
| ОстаткиТоваров.ХарактеристикаНоменклатуры,"
+?(УчитыватьСерии, "
| ОстаткиТоваров.СерияНоменклатуры,", "") + "
| ОстаткиТоваров.Качество";

МассивОтбора = Новый Массив;
МассивОтбора.Добавить("Номенклатура");
МассивОтбора.Добавить("НоменклатурнаяГруппа");
УправлениеОтчетами.ЗаполнитьОтбор(МассивОтбора, ПостроительОтчета);


КонецПроцедуры









Я создал "ПолеВидаСравненияМесоХранения" и "ПолеНастройкиМестоХранения" в форме отбора .(17) Rothschild,
+
19. Rothschild 17.02.14 20:02 Сейчас в теме
(18) dag_ssa, думаю надо так вставить.

|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад)
|КАК ОстаткиТоваров

{ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура,
СУММА(1) КАК ЧислоЯчеек
ИЗ
РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры
ГДЕ
МестаХраненияНоменклатуры.Склад = &Склад
{ГДЕ
МестаХраненияНоменклатуры.МестоХранения.*}
СГРУППИРОВАТЬ ПО
МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры
ПО ОстаткиТоваров .Номенклатура = ЯчейкиНоменклатуры.Номенклатура}

|ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрНакопления.ПартииТоваровНаСкладах.Остатки(,
| Склад = &ПартионныйСклад) КАК ОстаткиПартий
Показать
+
20. Rothschild 17.02.14 20:05 Сейчас в теме
(19)
еще я в модуле объекта находил пару процедур используемых при заполнении табличной части.
можешь на них выйти поиском использования в модуле формы строки "ПостроительОтчета".
+
23. dag_ssa 17.02.14 20:29 Сейчас в теме
(19) Rothschild, Программа ругается говорит что ошибка в синтаксисе . Не понимает слово"ЛЕВОЕ" которое раньше прекрасно понимало((
+
21. Rothschild 17.02.14 20:12 Сейчас в теме
(18) dag_ssa,
Я создал "ПолеВидаСравненияМесоХранения" и "ПолеНастройкиМестоХранения" в форме отбора .

еще надо добавить флаг использования отбора.
***
можешь просто выделить соответствующие элементы другого отбора (три штуки), например для номенклатуры.
и скопировать их перетаскиванием мышью (с зажатой клавишей CTRL)
+
22. Rothschild 17.02.14 20:13 Сейчас в теме
(21)
***
кроме этого эти поля надо привязать к "ПостроителюОтчета" (или убедиться что они привязываются).
привязка осуществляеится вызовом процедур стандартных общих модулей.

надо поглядеть, что творится при открытии формы и где при этом используются имена
элементов управления отборов и имя реквизита ajhvs "ПостроительОтчета".
+
17. Rothschild 17.02.14 18:46 Сейчас в теме
(14) dag_ssa,

Те (лекарства) которые вы выписали куда вписать ))?


потребуются изменения в форме документа и модуле объекта документа.
при заполнении документа используется объект "ПостроительОтчета" и
основанный на нем функционал "Универсального отчета".

Если у вас совсем нет опыта программирования - это конечно будет затруднительно сделать.
Задача не из сложных, но нужно иметь понимание с чем имеешь дело.
Лутше найти человека, который в этом более менее разбирается.
+
7. x_under 13 17.02.14 08:00 Сейчас в теме
Это вопрос к dag_ssa =)
+
24. dag_ssa 17.02.14 22:24 Сейчас в теме
еле вернул в прежнее состояние ))
+
25. Rothschild 18.02.14 06:20 Сейчас в теме
(24) dag_ssa, вот тебе готовый текст запроса в качестве "гуманитарной" помощи:

"ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура,
| ОстаткиТоваров.ХарактеристикаНоменклатуры,"
+?(УчитыватьСерии, "
| ОстаткиТоваров.СерияНоменклатуры,","") + "
| ОстаткиТоваров.Качество,
| СУММА(ОстаткиТоваров.КоличествоОстаток) КАК Количество,
| ВЫБОР
| КОГДА СУММА(ОстаткиПартий.КоличествоОстаток) = 0
| ИЛИ СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ СУММА(ОстаткиПартий.СтоимостьОстаток) * СУММА(ОстаткиТоваров.КоличествоОстаток) / СУММА(ОстаткиПартий.КоличествоОстаток)
| КОНЕЦ КАК Сумма
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ОстаткиТоваров
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(, Склад = &ПартионныйСклад) КАК ОстаткиПартий
| ПО ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура
| И ОстаткиТоваров.ХарактеристикаНоменклатуры = ОстаткиПартий.ХарактеристикаНоменклатуры
| И ОстаткиТоваров.Качество = ОстаткиПартий.Качество
| {ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(1) КАК ЧислоЯчеек
| ИЗ
| РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры
| ГДЕ
| МестаХраненияНоменклатуры.Склад = &Склад
| {ГДЕ
| МестаХраненияНоменклатуры.МестоХранения.*}
|
| СГРУППИРОВАТЬ ПО
| МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры
| ПО ОстаткиТоваров.Номенклатура = ЯчейкиНоменклатуры.Номенклатура}
|{ГДЕ
| ОстаткиТоваров.Номенклатура КАК Номенклатура,
| ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}
|
|СГРУППИРОВАТЬ ПО
| ОстаткиТоваров.Номенклатура,
| ОстаткиТоваров.ХарактеристикаНоменклатуры,"
+?(УчитыватьСерии, "
| ОстаткиТоваров.СерияНоменклатуры,", "") + "
| ОстаткиТоваров.Качество";

Показать

;)))))
+
26. Rothschild 18.02.14 06:24 Сейчас в теме
(25)
запрос проверен в конструкторе запросов.
***
ЗЫ
я нашел еще две процедуры в модуле объекта,
где надо сделать аналогичные правки в запросах:
Процедура ЗаполнитьПоОстаткамНаСкладе(ПостроительОтчета, ТолькоУчетные = Ложь, УпрУчет=Истина) Экспорт
Процедура ПерезаполнитьУчетныеКоличества(ПостроительОтчета,УпрУчет=Истина) Экспорт
+
27. Rothschild 18.02.14 06:32 Сейчас в теме
(26)
В УПП-1.3 есть еще одна функция в модуле документа
(уж не знаю есть ли она в УТ-10.3):
Процедура ПерезаполнитьУчетныеКоличестваРасширеннаяАналитика(ДатаОстатков,ПостроительОтчета,УпрУчет) Экспорт

используется при использовании какой-то расширенной аналитики учета.
+
28. dag_ssa 18.02.14 22:35 Сейчас в теме
(27) Rothschild, Большое вам спасибо ! Но я еще не разобрался ))

Вот модуль с изменением , которые я внес по вашему совету:

Перем мВалютаРегламентированногоУчета Экспорт;

// Валюта курс и кратность для пересчета регламентированных сумм
Перем мВалютаУпрУчета Экспорт;
Перем мКурсУпрУчета Экспорт;
Перем мКратностьУпрУчета Экспорт;

Перем мРазрешитьНулевыеЦеныВРознице Экспорт;

 X 
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ДОКУМЕНТА

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

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

	Шапка = Запрос.Выполнить().Выбрать();
	Шапка.Следующий();
	ВыборкаСтрокТовары = Шапка.Товары.Выбрать();

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

	// Выводим данные об организации и складе
	ПараметрыПечати.Вставить("ПредставлениеОрганизации", ФормированиеПечатныхФорм.ОписаниеОрганизации(УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Организация, Шапка.Дата), "ПолноеНаименование,"));
	ПараметрыПечати.Вставить("ПредставлениеСклада", Шапка.ПредставлениеСклада);
	ПараметрыПечати.Вставить("ВалютаНаименование", СокрЛП(ВалютаПечати));
	ПараметрыПечати.Вставить("Валюта", ВалютаПечати);
	
	Позиции = Новый Массив;
	
	ИтогСуммы        = 0;
	ИтогСуммыПоУчету = 0;

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

		ПараметрыПозиции = Новый Структура;
		ПараметрыПозиции.Вставить("Номенклатура", ВыборкаСтрокТовары.Номенклатура);		
        ПараметрыПозиции.Вставить("НомерСтроки", ВыборкаСтрокТовары.НомерСтроки);		
		ПараметрыПозиции.Вставить("Товар", ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары));
		ПараметрыПозиции.Вставить("Количество", ВыборкаСтрокТовары.Количество);
		ПараметрыПозиции.Вставить("КоличествоПоУчету", ВыборкаСтрокТовары.КоличествоПоУчету);
		ПараметрыПозиции.Вставить("ЕдиницаИзмерения", ВыборкаСтрокТовары.ЕдиницаИзмерения);
		ПараметрыПозиции.Вставить("Цена", ВыборкаСтрокТовары.Цена);
		ПараметрыПозиции.Вставить("Сумма", ВыборкаСтрокТовары.Сумма);
		ПараметрыПозиции.Вставить("СуммаПоУчету", ВыборкаСтрокТовары.СуммаПоУчету);

		Если ПараметрыПечати.ВыводитьКоды Тогда
			ПараметрыПозиции.Вставить("КодАртикул", ВыборкаСтрокТовары.КодАртикул);
		КонецЕсли;

		ИтогСуммы        = ИтогСуммы        + ВыборкаСтрокТовары.Сумма;
		ИтогСуммыПоУчету = ИтогСуммыПоУчету + ВыборкаСтрокТовары.СуммаПоУчету;

		#Если ВнешнееСоединение Тогда
		WEBПриложения.ПодготовитьСтруктуруДляВнешнегоСоединения(ПараметрыПозиции);
		#КонецЕсли

		Позиции.Добавить(ПараметрыПозиции);

	КонецЦикла;
	
	ПараметрыПечати.Вставить("Позиции", Позиции);

	// Вывести Итого
	ПараметрыПечати.Вставить("Всего", ОбщегоНазначения.ФорматСумм(ИтогСуммы));
	ПараметрыПечати.Вставить("ВсегоПоУчету", ОбщегоНазначения.ФорматСумм(ИтогСуммыПоУчету));	

	#Если ВнешнееСоединение Тогда
	WEBПриложения.ПодготовитьСтруктуруДляВнешнегоСоединения(ПараметрыПечати);
	#КонецЕсли
	
	Возврат ПараметрыПечати;
	
КонецФункции //ПолучитьДанныеДляПечатиДокумента()	

#Если Клиент Тогда

// Функция осуществляет запуск обработки формирующей печатную форму "Бланк товарного наполнения".
//
// Параметры:
//  НаПринтер - Булево. Если Истина, тогда печать выполняется непосредственно на принтер.
//
// Возвращаемое значение:
//  Неопределено.
//
Функция ПечатьБланк(НаПринтер)

	Обработки.ПечатьРаскладкиНоменклатурыПоМестамХранения.Создать().НапечататьИзДокумента(Ссылка, , , НаПринтер);

	Возврат Неопределено;

КонецФункции // ПечатьБланк()

// Функция формирует табличный документ с печатной формой накладной,
// разработанной методистами
//
// Возвращаемое значение:
//  Табличный документ - печатная форма накладной
//
Функция ПечатьДокумента()

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

	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИнвентаризацияТоваровНаСкладе_Инвентаризац­ияТоваровНаСкладе";

	Макет = ПолучитьМакет("ИнвентаризацияТоваровНаСкладе");

	// Выводим шапку накладной
	ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
	ОбластьМакета.Параметры.Заполнить(ПараметрыПечати);
	ТабДокумент.Вывести(ОбластьМакета);

	// Выводим данные об организации и складе
	ОбластьМакета = Макет.ПолучитьОбласть("Поставщик");
	ОбластьМакета.Параметры.Заполнить(ПараметрыПечати);
	ТабДокумент.Вывести(ОбластьМакета);

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

	ТабДокумент.Вывести(ОбластьМакета);

	ОбластьМакета    = Макет.ПолучитьОбласть(ОбластьСтроки);

	Для каждого ПараметрыПозиции Из ПараметрыПечати.Позиции Цикл	

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

		ОбластьМакета.Параметры.Заполнить(ПараметрыПозиции);

		ТабДокумент.Вывести(ОбластьМакета);

	КонецЦикла;

	// Вывести Итого
	ОбластьМакета                        = Макет.ПолучитьОбласть("Итого");
	ОбластьМакета.Параметры.Заполнить(ПараметрыПечати);
	ТабДокумент.Вывести(ОбластьМакета);

	// Выводим подписи к документу
	ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
	ТабДокумент.Вывести(ОбластьМакета);

	Возврат ТабДокумент;

КонецФункции // ПечатьДокумента()

// ТекстОписания
//
// Параметры: 
//  Нет.
//
// Возвращаемое значение:
//  Нет.
//
Функция ПечатьИНВ3(БезФактическихДанных = Ложь)

	ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();
	Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
		ТоварКод = "Артикул";
	Иначе
		ТоварКод = "Код";
	КонецЕсли;

	Если Склад.ВидСклада = Перечисления.ВидыСкладов.НТТ Тогда
		ВалютаПересчета = мВалютаРегламентированногоУчета;
	Иначе
		ВалютаПересчета = мВалютаУпрУчета;
	КонецЕсли;

	ВалютаПечати = мВалютаРегламентированногоУчета;
	Параметры    = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаПересчета, Дата);
	Запрос       = Новый Запрос;

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

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

	Шапка = Запрос.Выполнить().Выбрать();
	Шапка.Следующий();
	ВыборкаСтрокТовары = Шапка.Товары.Выбрать();

	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИнвентаризацияТоваровНаСкладе_ИНВ3";
	Макет       = ПолучитьОбщийМакет("ИНВ3");

	// Выводим шапку накладной
	ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
	ОбластьМакета.Параметры.Заполнить(Шапка);
	СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Организация, Шапка.ДатаДокумента);
	ОбластьМакета.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации);
	ОбластьМакета.Параметры.ОрганизацияПоОКПО        = СведенияОбОрганизации.КодПоОКПО;
	ОбластьМакета.Параметры.ДатаДокумента            = Шапка.ДатаДокумента;
	ОбластьМакета.Параметры.ДатаСнятияОстатков       = Шапка.ДатаСнятияОстатков;
	ОбластьМакета.Параметры.НомерДокумента           = ОбщегоНазначения.ПолучитьНомерНаПечать(ЭтотОбъект);
	ТабДокумент.Вывести(ОбластьМакета);
	ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

	СтрокНаСтранице = 19;
	СтрокШапки      = 5;
	СтрокПодвала    = 5;
	НомерСтраницы   = 2;
	Ном             = 0;

	ИтогФактКоличество = 0;
	ИтогФактСумма      = 0;
	ИтогБухКоличество  = 0;
	ИтогБухСумма       = 0;

	КолвоСтрокПоСтранице = 0;
	КолвоПостранице      = 0;
	СуммаЛиста           = 0;
	ИтогоКолво           = 0;
	ИтогоСумма           = 0;

	// Выводим заголовок таблицы
	ЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
	ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы; 
	ТабДокумент.Вывести(ЗаголовокТаблицы);

	КоличествоСтрок = ВыборкаСтрокТовары.Количество();

	Если КоличествоСтрок = 1 Тогда
		ПереноситьПоследнююСтроку = 0;
	Иначе
		ЦелыхСтраницСПодвалом     = Цел((СтрокШапки + КоличествоСтрок + СтрокПодвала) / СтрокНаСтранице);
		ЦелыхСтраницБезПодвала    = Цел((СтрокШапки + КоличествоСтрок - 1) / СтрокНаСтранице);
		ПереноситьПоследнююСтроку = ЦелыхСтраницСПодвалом - ЦелыхСтраницБезПодвала;
	КонецЕсли;

	// Выводим многострочную часть докмента
	ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
	ОбластьМакета = Макет.ПолучитьОбласть("Строка");
	Пока ВыборкаСтрокТовары.Следующий() Цикл

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

		Ном = Ном + 1;
		//Начинаем новую страницу, если предыдущая строка была последней на странице
		//или пора переносить последнюю строку на последнюю страницу с подвалом.
		ЦелаяСтраница = (СтрокШапки + Ном - 1) / СтрокНаСтранице;

		Если (ЦелаяСтраница = Цел(ЦелаяСтраница))
		 или ((ПереноситьПоследнююСтроку = 1) и (Ном = КоличествоСтрок)) Тогда

			ОбластьИтоговПоСтранице                               = Макет.ПолучитьОбласть("ПодвалСтраницы");
			ОбластьИтоговПоСтранице.Параметры.ИтогоФактКоличество = ИтогФактКоличество;
			ОбластьИтоговПоСтранице.Параметры.ИтогоФактСумма      = ИтогФактСумма;
			ОбластьИтоговПоСтранице.Параметры.ИтогоБухКоличество  = ИтогБухКоличество;
			ОбластьИтоговПоСтранице.Параметры.ИтогоБухСумма       = ИтогБухСумма;

			ОбластьИтоговПоСтранице.Параметры.КоличествоПорядковыхНомеровНаСтраницеПрописью = ЧислоПрописью(КолвоСтрокПоСтранице, ,",,,,,,,,0");
			Если НЕ БезФактическихДанных Тогда
				ОбластьИтоговПоСтранице.Параметры.ОбщееКоличествоЕдиницФактическиНаСтраницеПрописью = ФормированиеПечатныхФорм.КоличествоПрописью(КолвоПостранице);
				ОбластьИтоговПоСтранице.Параметры.СуммаФактическиНаСтраницеПрописью                 = ОбщегоНазначения.СформироватьСуммуПрописью(СуммаЛиста, ВалютаПечати);
			КонецЕсли;
			ТабДокумент.Вывести(ОбластьИтоговПоСтранице);
			
			НомерСтраницы = НомерСтраницы + 1;
			ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

			ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
			ТабДокумент.Вывести(ЗаголовокТаблицы);

			ИтогФактКоличество = 0;
			ИтогФактСумма      = 0;
			ИтогБухКоличество  = 0;
			ИтогБухСумма       = 0;

			КолвоСтрокПоСтранице = 0;
			КолвоПостранице      = 0;
			СуммаЛиста           = 0;

		КонецЕсли;

		ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
		ОбластьМакета.Параметры.ТоварНаименование = ВыборкаСтрокТовары.ТоварНаименование + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары);
		ОбластьМакета.Параметры.Номер             = Ном;

		ТабДокумент.Вывести(ОбластьМакета);

		ИтогФактКоличество = ИтогФактКоличество + ВыборкаСтрокТовары.ФактКоличество;
		ИтогФактСумма      = ИтогФактСумма      + ВыборкаСтрокТовары.ФактСумма;
		ИтогБухКоличество  = ИтогБухКоличество  + ВыборкаСтрокТовары.БухКоличество;
		ИтогБухСумма       = ИтогБухСумма       + ВыборкаСтрокТовары.БухСумма;
		ИтогоКолво         = ИтогоКолво         + ВыборкаСтрокТовары.ФактКоличество;
		ИтогоСумма         = ИтогоСумма         + ВыборкаСтрокТовары.ФактСумма;

		КолвоСтрокПоСтранице = КолвоСтрокПоСтранице + 1;
		КолвоПостранице      = КолвоПостранице      + ВыборкаСтрокТовары.ФактКоличество;
		СуммаЛиста           = СуммаЛиста           + ВыборкаСтрокТовары.ФактСумма;

	КонецЦикла;

	// Выводим итоги по последней странице
	ОбластьИтоговПоСтранице = Макет.ПолучитьОбласть("ПодвалСтраницы");
	ОбластьИтоговПоСтранице.Параметры.ИтогоФактКоличество  = ИтогФактКоличество;
	ОбластьИтоговПоСтранице.Параметры.ИтогоФактСумма       = ИтогФактСумма;
	ОбластьИтоговПоСтранице.Параметры.ИтогоБухКоличество   = ИтогБухКоличество;
	ОбластьИтоговПоСтранице.Параметры.ИтогоБухСумма        = ИтогБухСумма;
	ОбластьИтоговПоСтранице.Параметры.КоличествоПорядковыхНомеровНаСтраницеПрописью = ЧислоПрописью(КолвоСтрокПоСтранице, ,",,,,,,,,0");
	Если НЕ БезФактическихДанных Тогда
		ОбластьИтоговПоСтранице.Параметры.ОбщееКоличествоЕдиницФактическиНаСтраницеПрописью = ФормированиеПечатныхФорм.КоличествоПрописью(КолвоПостранице);
		ОбластьИтоговПоСтранице.Параметры.СуммаФактическиНаСтраницеПрописью                 = ОбщегоНазначения.СформироватьСуммуПрописью(СуммаЛиста, ВалютаПечати);
	КонецЕсли;
	ТабДокумент.Вывести(ОбластьИтоговПоСтранице);

	// Выводим подвал документа
	ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
	ОбластьМакета = Макет.ПолучитьОбласть("ПодвалОписи");
	ОбластьМакета.Параметры.Заполнить(Шапка);
	ОбластьМакета.Параметры.НачальныйНомерПоПорядку = 1;
	ОбластьМакета.Параметры.НомерКонца              = ВыборкаСтрокТовары.Количество();
	ОбластьМакета.Параметры.КоличествоПорядковыхНомеровНаСтраницеПрописью = ЧислоПрописью(ВыборкаСтрокТовары.Количество(), ,",,,,,,,,0");
	Если НЕ БезФактическихДанных Тогда
		ОбластьМакета.Параметры.ОбщееКоличествоЕдиницФактическиНаСтраницеПрописью = ФормированиеПечатныхФорм.КоличествоПрописью(ИтогоКолво);
		ОбластьМакета.Параметры.СуммаФактическиНаСтраницеПрописью                 = ОбщегоНазначения.СформироватьСуммуПрописью(ИтогоСумма, ВалютаПечати);
	КонецЕсли;
	ТабДокумент.Вывести(ОбластьМакета);

	// Зададим параметры макета
	ТабДокумент.ПолеСверху = 0;
	ТабДокумент.ПолеСлева  = 0;
	ТабДокумент.ПолеСнизу  = 0;
	ТабДокумент.ПолеСправа = 0;
	ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

	Возврат ТабДокумент;

КонецФункции // ПечатьИНВ3()

// ТекстОписания
//
// Параметры: 
//  Нет.
//
// Возвращаемое значение:
//  Нет.
//
Функция ПечатьИНВ19()

	ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();
	Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
		ТоварКод = "Артикул";
	Иначе
		ТоварКод = "Код";
	КонецЕсли;

	Если Склад.ВидСклада = Перечисления.ВидыСкладов.НТТ Тогда
		ВалютаПересчета = мВалютаРегламентированногоУчета;
	Иначе
		ВалютаПересчета = мВалютаУпрУчета;
	КонецЕсли;

	ВалютаПечати = мВалютаРегламентированногоУчета;
	Параметры    = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаПересчета, Дата);
	Запрос       = Новый Запрос;

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

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

	Шапка = Запрос.Выполнить().Выбрать();
	Шапка.Следующий();
	ВыборкаСтрокТовары = Шапка.Товары.Выбрать();

	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИнвентаризацияТоваровНаСкладе_ИНВ19";
	Макет       = ПолучитьОбщийМакет("ИНВ19");

	// Выводим шапку накладной
	ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
	ОбластьМакета.Параметры.Заполнить(Шапка);
	СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Организация, Шапка.ДатаДокумента);
	ОбластьМакета.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации);
	ОбластьМакета.Параметры.ОрганизацияПоОКПО        = СведенияОбОрганизации.КодПоОКПО;
	ОбластьМакета.Параметры.ДатаДокумента            = Шапка.ДатаДокумента;
	ОбластьМакета.Параметры.ДатаНачалаИнвентаризации = Шапка.ДатаНачалаИнвентаризации;
	ОбластьМакета.Параметры.НомерДокумента           = ОбщегоНазначения.ПолучитьНомерНаПечать(ЭтотОбъект);

	Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизации(Шапка.Руководители, Шапка.ДатаДокумента,);
	Руководитель = Руководители.Руководитель;
	Бухгалтер    = Руководители.ГлавныйБухгалтер;

	ТабДокумент.Вывести(ОбластьМакета);
	ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

	Ном             = 0;
	НомерСтраницы   = 2;

	ИтогоРезультатИзлишекКолво   = 0;
	ИтогоРезультатИзлишекСумма   = 0;
	ИтогоРезультатНедостачаКолво = 0;
	ИтогоРезультатНедостачаСумма = 0;

	// Выводим заголовок таблицы
	ЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы1");
	ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы; 
	ТабДокумент.Вывести(ЗаголовокТаблицы);

	КоличествоСтрок = ВыборкаСтрокТовары.Количество();

	// Выводим многострочную часть докмента
	ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
	
	// Создаем массив для проверки вывода
	МассивВыводимыхОбластей = Новый Массив;
	
	// Выводим многострочную часть докмента
	ОбластьМакета           = Макет.ПолучитьОбласть("СтрокаТаблицы1");
	ОбластьИтоговПоСтранице = Макет.ПолучитьОбласть("ИтогоТаблицы1");
	ОбластьПодвала          = Макет.ПолучитьОбласть("Подвал");
	Пока ВыборкаСтрокТовары.Следующий() Цикл

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

		МассивВыводимыхОбластей.Очистить();
		МассивВыводимыхОбластей.Добавить(ОбластьМакета);
		МассивВыводимыхОбластей.Добавить(ОбластьИтоговПоСтранице);
		Если Ном = КоличествоСтрок Тогда
			МассивВыводимыхОбластей.Добавить(ОбластьПодвала);
		КонецЕсли;		
		
		Если НЕ ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей) Тогда

			ТабДокумент.Вывести(ОбластьИтоговПоСтранице);

			НомерСтраницы = НомерСтраницы + 1;
			ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

			ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
			ТабДокумент.Вывести(ЗаголовокТаблицы);

		КонецЕсли;

		ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
		ОбластьМакета.Параметры.ТоварНаименование = ВыборкаСтрокТовары.ТоварНаименование + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары);

		Разница     = 0;
		РазницаСумм = 0;

		Разница     = ВыборкаСтрокТовары.ФактКоличество - ВыборкаСтрокТовары.БухКоличество;
		РазницаСумм = ВыборкаСтрокТовары.ФактСумма      - ВыборкаСтрокТовары.БухСумма;
		Если Разница = 0 Тогда
			Продолжить;
		КонецЕсли;

		Если Разница < 0 И РазницаСумм < 0 Тогда
			ОбластьМакета.Параметры.РезультатНедостачаКолво = - Разница;
			ОбластьМакета.Параметры.РезультатНедостачаСумма = - РазницаСумм;
			ОбластьМакета.Параметры.РезультатИзлишекКолво   = 0;
			ОбластьМакета.Параметры.РезультатИзлишекСумма   = 0;

			ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + (- Разница);
			ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + (- РазницаСумм);
			ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво   + 0;
			ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма   + 0;
		ИначеЕсли Разница < 0 И РазницаСумм >= 0 Тогда
			ОбластьМакета.Параметры.РезультатНедостачаКолво = - Разница;
			ОбластьМакета.Параметры.РезультатНедостачаСумма = РазницаСумм;
			ОбластьМакета.Параметры.РезультатИзлишекКолво   = 0;
			ОбластьМакета.Параметры.РезультатИзлишекСумма   = 0;

			ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + (- Разница);
			ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + РазницаСумм;
			ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво   + 0;
			ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма   + 0;
		Иначе
			ОбластьМакета.Параметры.РезультатНедостачаКолво = 0;
			ОбластьМакета.Параметры.РезультатНедостачаСумма = 0;
			ОбластьМакета.Параметры.РезультатИзлишекКолво   = Разница;
			ОбластьМакета.Параметры.РезультатИзлишекСумма   = РазницаСумм;

			ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + 0;
			ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + 0;
			ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво   + Разница;
			ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма   + РазницаСумм;
		КонецЕсли;

		ТабДокумент.Вывести(ОбластьМакета);

		Ном = Ном + 1;

	КонецЦикла;

	ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво;
	ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма;
	ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво;
	ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма;
	ТабДокумент.Вывести(ОбластьИтоговПоСтранице);

	ОбластьМакета = Макет.ПолучитьОбласть("Подвал");
	ОбластьМакета.Параметры.ФИОБухгалтера =  Бухгалтер;
	ОбластьМакета.Параметры.Заполнить(Шапка);
	ТабДокумент.Вывести(ОбластьМакета);

	// Зададим параметры макета
	ТабДокумент.ПолеСверху = 0;
	ТабДокумент.ПолеСлева  = 0;
	ТабДокумент.ПолеСнизу  = 0;
	ТабДокумент.ПолеСправа = 0;
	ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

	Возврат ТабДокумент;

КонецФункции // ПечатьИНВ19()

// Процедура осуществляет печать документа. Можно направить печать на 
// экран или принтер, а также распечатать необходмое количество копий.
//
//  Название макета печати передается в качестве параметра,
// по переданному названию находим имя макета в соответствии.
//
// Параметры:
//  НазваниеМакета - строка, название макета.
//
Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь) Экспорт

	Если ЭтоНовый() Тогда
		Предупреждение("Документ можно распечатать только после его записи");
		Возврат;
	КонецЕсли;

	Если Не РаботаСДиалогами.ПроверитьМодифицированность(ЭтотОбъект) Тогда
		Возврат;
	КонецЕсли;

	// Получить экземпляр документа на печать
	Если ИмяМакета = "Ведомость" Тогда

		// Печать упр. формы документа
		ТабДокумент = ПечатьДокумента();
	ИначеЕсли ИмяМакета = "ИНВ3" тогда

		// Печать униф. формы ИНВ-3
		ТабДокумент = ПечатьИНВ3();
	ИначеЕсли ИмяМакета = "ИНВ3_БезФактДанных" тогда

		// Печать униф. формы ИНВ-3
		ТабДокумент = ПечатьИНВ3(Истина);
	ИначеЕсли ИмяМакета = "ИНВ19" тогда

		// Печать униф. формы ИНВ-19
		ТабДокумент = ПечатьИНВ19();
	ИначеЕсли ИмяМакета = "Бланк" Тогда
		ТабДокумент = ПечатьБланк(НаПринтер);
	ИначеЕсли ТипЗнч(ИмяМакета) = Тип("ДвоичныеДанные") Тогда

		ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(Ссылка, ИмяМакета);

		Если ТабДокумент = Неопределено Тогда
			Возврат
		КонецЕсли;
	КонецЕсли;

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

КонецПроцедуры // Печать

// Возвращает доступные варианты печати документа
//
// Вовращаемое значение:
//  Струткура, каждая строка которой соответствует одному из вариантов печати
//  
Функция ПолучитьСтруктуруПечатныхФорм() Экспорт

	СтруктураМакетов = Новый Структура;
	СтруктураМакетов.Вставить("Ведомость"         , "Инвентаризация товаров на складе");
	СтруктураМакетов.Вставить("ИНВ3"              , "ИНВ-3 (Инвентаризационная опись товаров)");
	СтруктураМакетов.Вставить("ИНВ3_БезФактДанных", "ИНВ-3 (Инвентаризационная опись с пустыми фактическими данными)");
	СтруктураМакетов.Вставить("ИНВ19"             , "ИНВ-19 (Сличительная ведомость)");
	СтруктураМакетов.Вставить("Бланк"             , "Бланк товарного наполнения");

	Возврат СтруктураМакетов;

КонецФункции // ПолучитьСтруктуруПечатныхФорм()

Процедура ЗаполнитьНачальныеНастройки(ПостроительОтчета) Экспорт
	ПостроительОтчета.Текст =
	"ВЫБРАТЬ 
 | ОстаткиТоваров.Номенклатура, 
 | ОстаткиТоваров.ХарактеристикаНоменклатуры," 
 +?(УчитыватьСерии, " 
 | ОстаткиТоваров.СерияНоменклатуры,","") + " 
 | ОстаткиТоваров.Качество, 
 | СУММА(ОстаткиТоваров.КоличествоОстаток) КАК Количество, 
 | ВЫБОР 
 | КОГДА СУММА(ОстаткиПартий.КоличествоОстаток) = 0 
 | ИЛИ СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL 
 | ТОГДА 0 
 | ИНАЧЕ СУММА(ОстаткиПартий.СтоимостьОстаток) * СУММА(ОстаткиТоваров.КоличествоОстаток) / СУММА(ОстаткиПартий.КоличествоОстаток) 
 | КОНЕЦ КАК Сумма 
 |ИЗ 
 | РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ОстаткиТоваров 
 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(, Склад = &ПартионныйСклад) КАК ОстаткиПартий 
 | ПО ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура 
 | И ОстаткиТоваров.ХарактеристикаНоменклатуры = ОстаткиПартий.ХарактеристикаНоменклатуры 
 | И ОстаткиТоваров.Качество = ОстаткиПартий.Качество 
 | {ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
 | МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура, 
 | СУММА(1) КАК ЧислоЯчеек 
 | ИЗ 
 | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры 
 | ГДЕ 
 | МестаХраненияНоменклатуры.Склад = &Склад 
 | {ГДЕ 
 | МестаХраненияНоменклатуры.МестоХранения.*} 
 | 
 | 
 | СГРУППИРОВАТЬ ПО 
 | МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры 
 | ПО ОстаткиТоваров.Номенклатура = ЯчейкиНоменклатуры.Номенклатура}
 |
 |{ГДЕ 
 | ОстаткиТоваров.Номенклатура КАК Номенклатура, 
 | ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа} 
 | 
 |СГРУППИРОВАТЬ ПО 
 | ОстаткиТоваров.Номенклатура, 
 | ОстаткиТоваров.ХарактеристикаНоменклатуры," 
 +?(УчитыватьСерии, " 
 | ОстаткиТоваров.СерияНоменклатуры,", "") + " 
 | ОстаткиТоваров.Качество";
	
	МассивОтбора = Новый Массив;
	МассивОтбора.Добавить("Номенклатура");
	МассивОтбора.Добавить("НоменклатурнаяГруппа");
	УправлениеОтчетами.ЗаполнитьОтбор(МассивОтбора, ПостроительОтчета);
КонецПроцедуры

#КонецЕсли

// Выполняет необходимые действия при изменении реквизита Организация
//
Процедура ПриИзмененииОрганизации(ПодменюДействияФормы = Неопределено, ЭлементыФормыНомер = Неопределено) Экспорт

	Если Не ПустаяСтрока(Номер) Тогда
		МеханизмНумерацииОбъектов.СброситьУстановленныйКодНомерОбъекта(ЭтотОбъект, "Номер", ПодменюДействияФормы, ЭлементыФормыНомер);
	КонецЕсли;

КонецПроцедуры // ПриИзмененииОрганизации()

// Заполняет реквизиты значениями по умолчанию
//
// Параметры: 
//  ПараметрОбъектКопирования	- содержкит ссылку на документ копирования в случае, 
//								  если новый документ создается копированием
//  ПараметрОснование			- содержкит ссылку на документ-основание в случае, 
//								  если новый документ создается на основании другого
//
Процедура ИнициализироватьНовыйДокумент(ПараметрОбъектКопирования, ПараметрОснование) Экспорт

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

КонецПроцедуры // ИнициализироватьНовыйДокумент()

// Заполняет документ по остаткам на складе
// 
Процедура ЗаполнитьПоОстаткамНаСкладе(ПостроительОтчета, ТолькоУчетные = Ложь) Экспорт

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

	ВалютаУпрУчета    = глЗначениеПеременной("ВалютаУправленческогоУчета");
	СтруктураКурса    = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаУпрУчета, Дата);
	КурсУпрУчета      = СтруктураКурса.Курс;
	КратностьУпрУчета = СтруктураКурса.Кратность;

	Если Склад.ВидСклада = Перечисления.ВидыСкладов.НТТ Тогда

		ПостроительОтчета.Текст =
		"ВЫБРАТЬ
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,", "") + "
		|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
		|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
		|	ОстаткиТоваров.ЦенаВРознице,
		|	ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			0 
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток)*СУММА(ОстаткиТоваров.КоличествоОстаток)
		|			/ СУММА(ОстаткиПартий.КоличествоОстаток)
		|	КОНЕЦ                                   КАК Сумма,
		|	СУММА(ОстаткиТоваров.КоличествоОстаток) КАК Количество
		|ИЗ
		|	РегистрНакопления.ТоварыВНТТ.Остатки(&МоментДокумента,
		|	                                                   Склад = &Склад
		|//	                                                 И ЦенаВРознице > 0
		|) КАК ОстаткиТоваров
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|	РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&МоментДокумента, 
		|	                                                  Склад = &ПартионныйСклад) КАК ОстаткиПартий
		|ПО
		|	ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура
		|	И ОстаткиТоваров.ХарактеристикаНоменклатуры = ОстаткиПартий.ХарактеристикаНоменклатуры"
		+?(УчитыватьСерии, "
		|	И (ОстаткиТоваров.СерияНоменклатуры          = ОстаткиПартий.СерияНоменклатуры
		|		ИЛИ НЕ ОстаткиТоваров.Номенклатура.ВестиПартионныйУчетПоСериям)", "") + "
		| {ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
        | МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура, 
        | СУММА(1) КАК ЧислоЯчеек 
        | ИЗ 
        | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры 
        | ГДЕ 
        | МестаХраненияНоменклатуры.Склад = &Склад 
        | {ГДЕ 
        | МестаХраненияНоменклатуры.МестоХранения.*}
		| 
        
        | СГРУППИРОВАТЬ ПО 
        | МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры 
        | ПО ОстаткиТоваров.Номенклатура = ЯчейкиНоменклатуры.Номенклатура}
        |  
        |
		|{ГДЕ ОстаткиТоваров.Номенклатура КАК Номенклатура, 
		|     ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}
		|
		|СГРУППИРОВАТЬ ПО
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,", "") + "
		|	ОстаткиТоваров.ЦенаВРознице";
	Иначе
		Если Склад.ВидСклада = Перечисления.ВидыСкладов.Оптовый Тогда
			РегОстатки = "ТоварыНаСкладах";
		Иначе
			РегОстатки = "ТоварыВРознице";
		КонецЕсли;

		ПостроительОтчета.Текст =
		"ВЫБРАТЬ
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,", "") + "
		|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
		|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
		|	ОстаткиТоваров.Качество,
		|	СУММА(ОстаткиТоваров.КоличествоОстаток) КАК Количество,
		|	ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			0 
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток)*СУММА(ОстаткиТоваров.КоличествоОстаток)
		|			/ СУММА(ОстаткиПартий.КоличествоОстаток)
		|	КОНЕЦ                                  КАК Сумма
		|ИЗ
		|	РегистрНакопления." + РегОстатки + ".Остатки(&МоментДокумента, Склад = &Склад)
		|КАК ОстаткиТоваров
		|
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|	РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&МоментДокумента, 
		|	                                                  Склад = &ПартионныйСклад) КАК ОстаткиПартий
		|ПО
		|	ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура
		|	И ОстаткиТоваров.ХарактеристикаНоменклатуры = ОстаткиПартий.ХарактеристикаНоменклатуры"
		+?(УчитыватьСерии, "
		|	И (ОстаткиТоваров.СерияНоменклатуры          = ОстаткиПартий.СерияНоменклатуры
		|		ИЛИ НЕ ОстаткиТоваров.Номенклатура.ВестиПартионныйУчетПоСериям)", "") + "
		|	И ОстаткиТоваров.Качество                   = ОстаткиПартий.Качество
		|		
        | {ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
        | МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура, 
        | СУММА(1) КАК ЧислоЯчеек 
        | ИЗ 
        | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры 
        | ГДЕ 
        | МестаХраненияНоменклатуры.Склад = &Склад 
        | {ГДЕ 
        | МестаХраненияНоменклатуры.МестоХранения.*} 
        | 
        | СГРУППИРОВАТЬ ПО 
        | МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры 
        | ПО ОстаткиТоваров.Номенклатура = ЯчейкиНоменклатуры.Номенклатура}
		|
		|{ГДЕ ОстаткиТоваров.Номенклатура КАК Номенклатура, 
		|     ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}
		|
		|СГРУППИРОВАТЬ ПО
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,", "") + "
		|	ОстаткиТоваров.Качество";

	КонецЕсли;

	Запрос = ПостроительОтчета.ПолучитьЗапрос();

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

	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл

		Если Выборка.Количество = 0 Тогда
			Продолжить;
		КонецЕсли;

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

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

		Если Склад.ВидСклада = Перечисления.ВидыСкладов.НТТ Тогда
			СтрокаТабличнойЧасти.ЦенаВРознице = Выборка.ЦенаВРознице;
		Иначе
			СтрокаТабличнойЧасти.Качество     = Выборка.Качество;
		КонецЕсли;

		СтрокаТабличнойЧасти.СуммаРегл        = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(СтрокаТабличнойЧасти.Сумма, ВалютаУпрУчета,
		                                        мВалютаРегламентированногоУчета, КурсУпрУчета, 1, КратностьУпрУчета, 1);

		СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры = Выборка.ХарактеристикаНоменклатуры;
		Если УчитыватьСерии Тогда
			СтрокаТабличнойЧасти.СерияНоменклатуры = Выборка.СерияНоменклатуры;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры // ЗаполнитьПоОстаткамНаСкладе()

// Процедура перезаполняет учетные количества в документе
//
// Возвращаемое значение:
//  Табличный документ - печатная форма накладной
//
Процедура ПерезаполнитьУчетныеКоличества(ПостроительОтчета) Экспорт

#Если Клиент Тогда
	Если Товары.Количество() > 0 Тогда
		ТекстВопроса = "Перезаполнить учетные количества и суммы?";
		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, Метаданные().Синоним);
		Если Ответ <> КодВозвратаДиалога.Да Тогда
			Возврат;
		КонецЕсли; 
	Иначе
		Возврат;
	КонецЕсли;

	// Документ должен быть записан, чтобы этот запрос сработал.
	Если Модифицированность() Тогда
		ТекстВопроса = "Перед заполнением следует записать документ.
		               |Продолжить?";
		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, Метаданные().Синоним);
		Если Ответ <> КодВозвратаДиалога.Да Тогда
			Возврат;
		КонецЕсли;
		Записать(РежимЗаписиДокумента.Запись);
	КонецЕсли;
#КонецЕсли

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

	Если Склад.ВидСклада <> Перечисления.ВидыСкладов.НТТ Тогда
		Если Склад.ВидСклада = Перечисления.ВидыСкладов.Оптовый Тогда
			РегОстатки = "ТоварыНаСкладах";
		Иначе
			РегОстатки = "ТоварыВРознице";
		КонецЕсли;

		ПостроительОтчета.Текст =
		"ВЫБРАТЬ
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,","") + "
		|	ОстаткиТоваров.Качество,
		|	СУММА(ОстаткиТоваров.КоличествоОстаток)                         КАК Количество,
		|	ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			0 
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток)*СУММА(ОстаткиТоваров.КоличествоОстаток)
		|			/ СУММА(ОстаткиПартий.КоличествоОстаток)
		|	КОНЕЦ                                                           КАК Сумма
		|ИЗ
		|	РегистрНакопления." + РегОстатки + ".Остатки(&МоментДокумента, 
		|	                Номенклатура в (ВЫБРАТЬ Номенклатура ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары
		|	                                ГДЕ Документ.ИнвентаризацияТоваровНаСкладе.Товары.Ссылка = &ДокументСсылка)
		|	              И Склад = &Склад)
		|КАК ОстаткиТоваров
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|	РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&МоментДокумента, 
		|	                Номенклатура в (Выбрать Номенклатура ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары
		|	                                ГДЕ Документ.ИнвентаризацияТоваровНаСкладе.Товары.Ссылка = &ДокументСсылка)
		|	              И Склад = &ПартионныйСклад) КАК ОстаткиПартий
		|ПО
		|	ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура
		|	И ОстаткиТоваров.ХарактеристикаНоменклатуры = ОстаткиПартий.ХарактеристикаНоменклатуры"
		+?(УчитыватьСерии, "
		|	И ОстаткиТоваров.СерияНоменклатуры          = ОстаткиПартий.СерияНоменклатуры", "") + "
		|	И ОстаткиТоваров.Качество = ОстаткиПартий.Качество
		|		
		| {ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
        | МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура, 
        | СУММА(1) КАК ЧислоЯчеек 
        | ИЗ 
        | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры 
        | ГДЕ 
        | МестаХраненияНоменклатуры.Склад = &Склад 
        | {ГДЕ 
        | МестаХраненияНоменклатуры.МестоХранения.*}
		|
        | СГРУППИРОВАТЬ ПО 
        | МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры 
        | ПО ОстаткиТоваров.Номенклатура = ЯчейкиНоменклатуры.Номенклатура}
		|
		|{ГДЕ ОстаткиТоваров.Номенклатура КАК Номенклатура, 
		|     ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}
		|
		|СГРУППИРОВАТЬ ПО
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,", "") + "
		|	ОстаткиТоваров.Качество";

	Иначе

		ПостроительОтчета.Текст =
		"ВЫБРАТЬ
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК КоэффициентЕдиницыХранения,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,", "") + "
		|	ОстаткиТоваров.ЦенаВРознице,
		|	СУММА(ОстаткиТоваров.КоличествоОстаток) КАК Количество,
		|	ВЫБОР
		|		КОГДА (СУММА(ОстаткиПартий.КоличествоОстаток) = 0)
		|		  ИЛИ (СУММА(ОстаткиПартий.КоличествоОстаток) ЕСТЬ NULL) ТОГДА
		|			0 
		|		ИНАЧЕ
		|			СУММА(ОстаткиПартий.СтоимостьОстаток)*СУММА(ОстаткиТоваров.КоличествоОстаток)
		|			/ СУММА(ОстаткиПартий.КоличествоОстаток)
		|	КОНЕЦ                                                           КАК Сумма
		|ИЗ
		|	РегистрНакопления.ТоварыВНТТ.Остатки(&МоментДокумента,
		|	                Номенклатура в (Выбрать Номенклатура ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары
		|	                                ГДЕ Документ.ИнвентаризацияТоваровНаСкладе.Товары.Ссылка = &ДокументСсылка)
		|	              И Склад = &Склад) КАК ОстаткиТоваров
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|	РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&МоментДокумента, 
		|	                Номенклатура в (Выбрать Номенклатура ИЗ Документ.ИнвентаризацияТоваровНаСкладе.Товары
		|	                                ГДЕ Документ.ИнвентаризацияТоваровНаСкладе.Товары.Ссылка = &ДокументСсылка)
		|	              И Склад = &ПартионныйСклад) КАК ОстаткиПартий
		|ПО
		|	ОстаткиТоваров.Номенклатура = ОстаткиПартий.Номенклатура
		|	И ОстаткиТоваров.ХарактеристикаНоменклатуры = ОстаткиПартий.ХарактеристикаНоменклатуры"
		+?(УчитыватьСерии, "
		|	И ОстаткиТоваров.СерияНоменклатуры          = ОстаткиПартий.СерияНоменклатуры", "") + "
		|		
		| {ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
        | МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура, 
        | СУММА(1) КАК ЧислоЯчеек 
        | ИЗ 
        | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры 
        | ГДЕ 
        | МестаХраненияНоменклатуры.Склад = &Склад 
        | {ГДЕ 
        | МестаХраненияНоменклатуры.МестоХранения.*}
		|
        | СГРУППИРОВАТЬ ПО 
        | МестаХраненияНоменклатуры.Номенклатура) КАК ЯчейкиНоменклатуры 
        | ПО ОстаткиТоваров.Номенклатура = ЯчейкиНоменклатуры.Номенклатура}
		|
		|{ГДЕ ОстаткиТоваров.Номенклатура КАК Номенклатура, 
		|     ОстаткиТоваров.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа}
		|
		|СГРУППИРОВАТЬ ПО
		|	ОстаткиТоваров.Номенклатура,
		|	ОстаткиТоваров.ХарактеристикаНоменклатуры,"
		+?(УчитыватьСерии, "
		|	ОстаткиТоваров.СерияНоменклатуры,", "") + "
		|	ОстаткиТоваров.ЦенаВРознице";

	КонецЕсли;

	Запрос = ПостроительОтчета.ПолучитьЗапрос();

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

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

	Для каждого СтрокаТабличнойЧасти ИЗ Товары Цикл

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

		МассивСтрок = ТаблицаОстатков.НайтиСтроки(СтруктураПоиска);

		Если МассивСтрок.Количество() = 0 Тогда
			СтрокаТабличнойЧасти.КоличествоУчет = 0;
			СтрокаТабличнойЧасти.СуммаУчет      = 0;
			Продолжить;
		КонецЕсли;

		СтрокаТабличнойЧасти.КоличествоУчет = ?(СтрокаТабличнойЧасти.Коэффициент = 0, 0,
		                                      МассивСтрок[0].Количество * МассивСтрок[0].КоэффициентЕдиницыХранения
		                                      / СтрокаТабличнойЧасти.Коэффициент);
		СтрокаТабличнойЧасти.СуммаУчет      = МассивСтрок[0].Сумма;
		СтрокаТабличнойЧасти.Цена           = ?(СтрокаТабличнойЧасти.КоличествоУчет = 0, 0,
		                                      СтрокаТабличнойЧасти.СуммаУчет / СтрокаТабличнойЧасти.КоличествоУчет);
											  
		ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
		СтрокаТабличнойЧасти.СуммаРегл        = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(СтрокаТабличнойЧасти.Сумма, мВалютаУпрУчета, 
								мВалютаРегламентированногоУчета, мКурсУпрУчета, 1, мКратностьУпрУчета, 1);
		
	КонецЦикла;
КонецПроцедуры  // ПерезаполнитьУчетныеКоличества()

// Процедура вызывается перед записью документа 
//
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

	Если ОбменДанными.Загрузка  Тогда
		Возврат;
	КонецЕсли;


	// Проверка заполнения единицы измерения мест и количества мест
	ОбработкаТабличныхЧастей.ПриЗаписиПроверитьЕдиницуИзмеренияМест(Товары);

	ОбработкаТабличныхЧастей.ЗаполнитьКачествоПоУмолчанию(Товары, Склад.ВидСклада = Перечисления.ВидыСкладов.НТТ);

КонецПроцедуры // ПередЗаписью()

мВалютаРегламентированногоУчета = глЗначениеПеременной("ВалютаРегламентированногоУчета");
мВалютаУпрУчета                 = глЗначениеПеременной("ВалютаУправленческогоУчета");

мРазрешитьНулевыеЦеныВРознице = УправлениеДопПравамиПользователей.РазрешитьНулевыеЦеныВРознице();
Показать
+
29. dag_ssa 18.02.14 22:37 Сейчас в теме
что добавить в форму и как его назвать ?
+
30. dag_ssa 19.02.14 19:40 Сейчас в теме
Помогите пож. люди ! Пока руководство меня не задушило !
+
31. dag_ssa 19.02.14 22:19 Сейчас в теме
32. philphil 3 19.04.18 12:37 Сейчас в теме
Внимание! Тема сдана в архив

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