#Если Клиент Тогда
// Процедура заполняет построитель отчета.
//
Процедура ЗаполнитьПостроительОтчета() Экспорт
ПостроительОтчета.Параметры.Вставить("ПустаяХарактеристика", Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
ТекстЗапроса = "
|ВЫБРАТЬ
| ИСТИНА КАК Печать,
| СпрНоменклатура.Номенклатура КАК Номенклатура,
| СпрНоменклатура.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| СпрНоменклатура.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
| 0 КАК Цена,
| 1 КАК Количество
|ИЗ
| (ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Номенклатура,
| &ПустаяХарактеристика КАК ХарактеристикаНоменклатуры
| ИЗ
| Справочник.Номенклатура КАК СпрНоменклатура
| ГДЕ НЕ СпрНоменклатура.ЭтоГруппа
| {ГДЕ
| СпрНоменклатура.Ссылка.* КАК Номенклатура}
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| СпрХарактеристики.Владелец,
| СпрХарактеристики.Ссылка
| ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
| {ГДЕ
| СпрХарактеристики.Владелец.* КАК Номенклатура,
| СпрХарактеристики.Ссылка.* КАК ХарактеристикаНоменклатуры}
| ) КАК СпрНоменклатура
|";
Если ТолькоИмеющиесяВНаличии Тогда
ТекстЗапроса = ТекстЗапроса + "
|ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры,
| СУММА(НаСкладе.Количество) КАК Количество
| ИЗ
| (ВЫБРАТЬ
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры,
| НаСкладе.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК НаСкладе
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ВРознице.Номенклатура,
| ВРознице.ХарактеристикаНоменклатуры,
| ВРознице.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыВРознице.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК ВРознице
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ВНТТ.Номенклатура,
| ВНТТ.ХарактеристикаНоменклатуры,
| ВНТТ.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыВНТТ.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК ВНТТ
| ) КАК НаСкладе
| СГРУППИРОВАТЬ ПО
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры
| ) КАК НаСкладе
|ПО
| СпрНоменклатура.Номенклатура = НаСкладе.Номенклатура
| И СпрНоменклатура.ХарактеристикаНоменклатуры = НаСкладе.ХарактеристикаНоменклатуры
|ГДЕ
| ЕСТЬNULL(НаСкладе.Количество, 0) > 0
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|УПОРЯДОЧИТЬ ПО
| СпрНоменклатура.Номенклатура.Наименование,
| СпрНоменклатура.ХарактеристикаНоменклатуры.Наименование
|";
// Соответствие имен полей в запросе и их представлений в отчете.
СтруктураПредставлениеПолей = Новый Структура(
"Номенклатура, ХарактеристикаНоменклатуры, Склад",
"Номенклатура", "Характеристика номенклатуры", "Склад");
ПостроительОтчета.Текст = ТекстЗапроса;
ПостроительОтчета.ЗаполнитьНастройки();
// Создадим список доступных отборов.
СоответствиеДоступныхОтборов = Новый Соответствие;
СоответствиеДоступныхОтборов.Вставить("Номенклатура", 0);
СоответствиеДоступныхОтборов.Вставить("ХарактеристикаНоменклатуры", 0);
СоответствиеДоступныхОтборов.Вставить("Склад", 0);
Для Каждого ДоступноеПоле Из ПостроительОтчета.ДоступныеПоля Цикл
Если СоответствиеДоступныхОтборов[ДоступноеПоле.Имя] =Неопределено Тогда
ДоступноеПоле.Отбор = Ложь;
Иначе
ДоступноеПоле.Отбор = Истина;
КонецЕсли;
КонецЦикла;
// Создадим массив отборов.
МассивОтбора = Новый Массив;
МассивОтбора.Добавить("Номенклатура");
МассивОтбора.Добавить("ХарактеристикаНоменклатуры");
Если ТолькоИмеющиесяВНаличии Тогда
МассивОтбора.Добавить("Склад");
КонецЕсли;
Для Каждого ЭлементОтбора Из МассивОтбора Цикл
Если ПостроительОтчета.Отбор.Найти(ЭлементОтбора) = Неопределено Тогда
ПостроительОтчета.Отбор.Добавить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
// Вызовем стандартную процедуру заполнения представлений.
УправлениеОтчетами.ЗаполнитьПредставленияПолей(СтруктураПредставлениеПолей, ПостроительОтчета);
КонецПроцедуры // ЗаполнитьПостроительОтчета()
// Процедура перезаполняет цены в табличной части.
//
Процедура ПерезаполнитьЦены() Экспорт
СтруктураЗначений = Новый Структура;
СтруктураЗначений.Вставить("НовыйТипЦен", ТипЦен);
ЗапросПоЦенам = Ценообразование.СформироватьЗапросПоЦенам(СтруктураЗначений,
Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры,
Товары.ВыгрузитьКолонку("Номенклатура"),
РабочаяДата,
Неопределено).Выгрузить();
ПустаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
ТипЦенРассчитывается = ТипЦен.Рассчитывается;
СтруктураКурса = МодульВалютногоУчета.ПолучитьКурсВалюты(Валюта, РабочаяДата);
Курс = СтруктураКурса.Курс;
Кратность = СтруктураКурса.Кратность;
Для Каждого СтрокаТовара Из Товары Цикл
ХарактеристикаНоменклатуры = СтрокаТовара.ХарактеристикаНоменклатуры;
СтруктураПоиска = Новый Структура("Номенклатура", СтрокаТовара.Номенклатура);
СтрокиЦен = ЗапросПоЦенам.НайтиСтроки(СтруктураПоиска);
СтрокаБезХарактеристики = Неопределено;
СтрокаСХарактеристикой = Неопределено;
Для Каждого СтрокаЦен Из СтрокиЦен Цикл
Если СтрокаЦен.ХарактеристикаНоменклатуры = ПустаяХарактеристика Тогда
СтрокаБезХарактеристики = СтрокаЦен;
ИначеЕсли СтрокаЦен.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры Тогда
СтрокаСХарактеристикой = СтрокаЦен;
КонецЕсли;
КонецЦикла;
Если СтрокаСХарактеристикой <> Неопределено Тогда
НайденнаяСтрока = СтрокаСХарактеристикой;
ИначеЕсли СтрокаБезХарактеристики <> Неопределено Тогда
НайденнаяСтрока = СтрокаБезХарактеристики;
Иначе
НайденнаяСтрока = Неопределено;
КонецЕсли;
Если (НайденнаяСтрока <> Неопределено) И (НайденнаяСтрока.Цена <> 0) Тогда
Цена = НайденнаяСтрока.Цена * (1 + ?(ТипЦенРассчитывается, НайденнаяСтрока.ПроцентСкидкиНаценки / 100, 0));
Цена = Ценообразование.ОкруглитьЦену(Цена, ТипЦен.ПорядокОкругления, ТипЦен.ОкруглятьВБольшуюСторону);
Цена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(Цена, НайденнаяСтрока.ВалютаЦены, Валюта, Курс, Кратность);
СтрокаТовара.ЕдиницаИзмерения = НайденнаяСтрока.ЕдиницаИзмеренияЦены;
Иначе
Цена = 0;
КонецЕсли;
СтрокаТовара.Цена = Цена;
КонецЦикла;
КонецПроцедуры // ПерезаполнитьЦены()
// Функция формирует табличный документ - печатная форма ценника.
//
// Возвращаемое значение:
// ТабличныйДокумент - сформированный табличный документ или Неопределено, если есть ошибки.
//
Функция ПечатьЦенника() Экспорт
Если НЕ ЗначениеЗаполнено(Организация) Тогда
Предупреждение("Не выбрана организация!");
Возврат Неопределено;
КонецЕсли;
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Ценник";
Макет = ПолучитьМакет("Ценник");
КодЯзыкаПечать = ЛокализацияПовтИсп.ПолучитьЯзыкФормированияПечатныхФормДокументов();
Макет.КодЯзыкаМакета = КодЯзыкаПечать;
ОбластьЦенника = Макет.ПолучитьОбласть("Строка|Столбец");
ДатаПечати = РабочаяДата;
ТекСтолбец = 0;
ТекСтрока = 0;
ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();
Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
ТоварКод = "Артикул";
ИначеЕсли ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Код Тогда
ТоварКод = "Код";
Иначе
ТоварКод = "";
КонецЕсли;
Для Каждого СтрокаТаблицы Из Товары Цикл
Если СтрокаТаблицы.Печать Тогда
Для Тмп = 1 По СтрокаТаблицы.Количество Цикл
ОбластьЦенника.Параметры.Заполнить(СтрокаТаблицы);
ОбластьЦенника.Параметры.НоменклатураНаименование = СтрокаТаблицы.Номенклатура.НаименованиеПолное + ?(ТоварКод <> "", " " + СокрЛП(СтрокаТаблицы.Номенклатура[ТоварКод]), "");
ОбластьЦенника.Параметры.ХарактеристикаНаименование = СтрокаТаблицы.ХарактеристикаНоменклатуры;
ОбластьЦенника.Параметры.ЕдиницаНаименование = СтрокаТаблицы.ЕдиницаИзмерения;
ОбластьЦенника.Параметры.Цена = ОбщегоНазначения.ФорматСумм(СтрокаТаблицы.Цена, Валюта, "00");
ОбластьЦенника.Параметры.ДатаПечати = ДатаПечати;
ОбластьЦенника.Параметры.Организация = Организация;
ОбластьЦенника.Параметры.ОрганизацияНаименование = Организация;
Если ТекСтолбец = 0 Тогда
ТабДокумент.Вывести(ОбластьЦенника);
Иначе
ТабДокумент.Присоединить(ОбластьЦенника);
КонецЕсли;
ТекСтолбец = ТекСтолбец + 1;
Если ТекСтолбец = 5 Тогда
ТекСтрока = ТекСтрока + 1;
ТекСтолбец = 0;
КонецЕсли;
Если ТекСтрока = 3 Тогда
ТекСтрока = 0;
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТабДокумент.ТолькоПросмотр = Истина;
Возврат ТабДокумент;
КонецФункции // ПечатьЦенника()
// Функция выполняет проверку параметров для заполнения цен.
//
// Возвращаемое значение:
// Булево - Истина, если все параметры заданы.
//
Функция ПроверитьПараметрыЗаполненияЦен() Экспорт
Если НЕ ЗначениеЗаполнено(ТипЦен) Тогда
ОбщегоНазначения.СообщитьОбОшибке("Не выбран тип цен! Укажите тип цен и повторите перезаполнение цен.");
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Валюта) Тогда
ОбщегоНазначения.СообщитьОбОшибке("Не выбрана валюта! Укажите валюту и повторите перезаполнение цен.");
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции // ПроверитьПараметрыЗаполненияЦен()
#КонецЕсли