sava1 @ Вчера, 17:08
![*](https://pro1c.org.ua/style_images/pro1c/post_snapback.gif)
,для меня это пока тёмный лес.
На данный момент разобрался вот с чем. Есть такая последовательность процедур
Процедура ПриОткрытии()
Перем ЗаполнитьЦены;
Перем НастройкиПостроителя;
Валюта = Справочники.Валюты.НайтиПоКоду("980");
//Организация = Справочники.Организации.НайтиПоКоду("000000001");
ПечатьУзкихЦенников = Ложь;
ОрганизацияПриИзменении(ЭлементыФормы.Организация);
Если Не Константы.ИспользоватьХарактеристикиНоменклатуры.Получить() Тогда
Колонка = ЭлементыФормы.Товары.Колонки.ХарактеристикаНоменклатуры;
Колонка.Видимость = Ложь;
Колонка.ИзменятьВидимость = Ложь;
КонецЕсли;
СтруктураНастроек = ВосстановитьЗначение("Обработка.ПечатьЦенников.Настройки");
Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
//СтруктураНастроек.Свойство("Организация", Организация);
СтруктураНастроек.Свойство("ТипЦен", ТипЦен);
СтруктураНастроек.Свойство("Валюта", Валюта);
СтруктураНастроек.Свойство("ТолькоИмеющиесяВНаличии", ТолькоИмеющиесяВНаличии);
СтруктураНастроек.Свойство("НастройкиПостроителя", НастройкиПостроителя);
КонецЕсли;
//Организация = Справочники.Организации.ПустаяСсылка();
ЗаполнитьПостроительОтчета();
Если НастройкиПостроителя <> Неопределено Тогда
ПостроительОтчета.УстановитьНастройки(НастройкиПостроителя);
КонецЕсли;
Если ТипЗнч(Параметр) = Тип("Структура") Тогда
Параметр.Свойство("ЗаполнитьЦены", ЗаполнитьЦены);
Если ЗаполнитьЦены = Истина Тогда
Если ПроверитьПараметрыЗаполненияЦен() Тогда
ПерезаполнитьЦены();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ПриОткрытии()
Процедура ЗаполнитьПостроительОтчета() Экспорт
ТекстЗапроса = "
|ВЫБРАТЬ
| ИСТИНА КАК Печать,
| СпрНоменклатура.Номенклатура КАК Номенклатура,
| СпрНоменклатура.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| СпрНоменклатура.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
| 0 КАК Цена,
| 1 КАК Количество
|ИЗ
| (ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры
| ИЗ
| Справочник.Номенклатура КАК СпрНоменклатура
| ГДЕ НЕ СпрНоменклатура.ЭтоГруппа
| {ГДЕ
| СпрНоменклатура.Ссылка.* КАК Номенклатура}
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| СпрХарактеристики.Владелец,
| СпрХарактеристики.Ссылка
| ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
| {ГДЕ
| СпрХарактеристики.Владелец.* КАК Номенклатура,
| СпрХарактеристики.Ссылка.* КАК ХарактеристикаНоменклатуры}
| ) КАК СпрНоменклатура
|";
Если ТолькоИмеющиесяВНаличии Тогда
ТекстЗапроса = ТекстЗапроса + "
|ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры,
| СУММА(НаСкладе.Количество) КАК Количество
| ИЗ
| (ВЫБРАТЬ
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры,
| НаСкладе.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК НаСкладе
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ВРознице.Номенклатура,
| ВРознице.ХарактеристикаНоменклатуры,
| ВРознице.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыВРознице.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК ВРознице
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ВНТТ.Номенклатура,
| ВНТТ.ХарактеристикаНоменклатуры,
| ВНТТ.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыВНТТ.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК ВНТТ
| ) КАК НаСкладе
| СГРУППИРОВАТЬ ПО
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры
| ) КАК НаСкладе
|ПО
| СпрНоменклатура.Номенклатура = НаСкладе.Номенклатура
| И СпрНоменклатура.ХарактеристикаНоменклатуры = НаСкладе.ХарактеристикаНоменклатуры
|ГДЕ
| ЕСТЬNULL(НаСкладе.Количество, 0) > 0
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|УПОРЯДОЧИТЬ ПО
| СпрНоменклатура.Номенклатура.Наименование,
| СпрНоменклатура.ХарактеристикаНоменклатуры.Наименование
|";
// Соответствие имен полей в запросе и их представлений в отчете.
СтруктураПредставлениеПолей = Новый Структура(
"Номенклатура, ХарактеристикаНоменклатуры, Склад",
"Номенклатура", "Характеристика номенклатуры", "Склад");
ПостроительОтчета.Текст = ТекстЗапроса;
ПостроительОтчета.ЗаполнитьНастройки();
// Создадим список доступных отборов.
СоответствиеДоступныхОтборов = Новый Соответствие;
СоответствиеДоступныхОтборов.Вставить("Номенклатура", 0);
СоответствиеДоступныхОтборов.Вставить("ХарактеристикаНоменклатуры", 0);
СоответствиеДоступныхОтборов.Вставить("Склад", 0);
Для Каждого ДоступноеПоле Из ПостроительОтчета.ДоступныеПоля Цикл
Если СоответствиеДоступныхОтборов[ДоступноеПоле.Имя] =Неопределено Тогда
ДоступноеПоле.Отбор = Ложь;
Иначе
ДоступноеПоле.Отбор = Истина;
КонецЕсли;
КонецЦикла;
// Создадим массив отборов.
МассивОтбора = Новый Массив;
МассивОтбора.Добавить("Номенклатура");
МассивОтбора.Добавить("ХарактеристикаНоменклатуры");
Если ТолькоИмеющиесяВНаличии Тогда
МассивОтбора.Добавить("Склад");
КонецЕсли;
Для Каждого ЭлементОтбора Из МассивОтбора Цикл
Если ПостроительОтчета.Отбор.Найти(ЭлементОтбора) = Неопределено Тогда
ПостроительОтчета.Отбор.Добавить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
// Вызовем стандартную процедуру заполнения представлений.
УправлениеОтчетами.ЗаполнитьПредставленияПолей(СтруктураПредставлениеПолей, ПостроительОтчета);
КонецПроцедуры // ЗаполнитьПостроительОтчета()
Ну и собственно вывод в таблицу.
Процедура ПерезаполнитьЦены() Экспорт
СтруктураЗначений = Новый Структура;
СтруктураЗначений.Вставить("НовыйТипЦен", ТипЦен);
ЗапросПоЦенам = Ценообразование.СформироватьЗапросПоЦенам(СтруктураЗначений,
Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры,
Товары.ВыгрузитьКолонку("Номенклатура"),
РабочаяДата,
Неопределено).Выгрузить();
ЗапросПоЦенам.Индексы.Добавить("Номенклатура");
ПустаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
ТипЦенРассчитывается = ТипЦен.Рассчитывается;
СтруктураКурса = МодульВалютногоУчета.ПолучитьКурсВалюты(Валюта, РабочаяДата);
Курс = СтруктураКурса.Курс;
Кратность = СтруктураКурса.Кратность;
Для Каждого СтрокаТовара Из Товары Цикл
ХарактеристикаНоменклатуры = СтрокаТовара.ХарактеристикаНоменклатуры;
СтруктураПоиска = Новый Структура("Номенклатура", СтрокаТовара.Номенклатура);
СтрокиЦен = ЗапросПоЦенам.НайтиСтроки(СтруктураПоиска);
СтрокаБезХарактеристики = Неопределено;
СтрокаСХарактеристикой = Неопределено;
Для Каждого СтрокаЦен Из СтрокиЦен Цикл
Если СтрокаЦен.ХарактеристикаНоменклатуры = ПустаяХарактеристика Тогда
СтрокаБезХарактеристики = СтрокаЦен;
ИначеЕсли СтрокаЦен.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры Тогда
СтрокаСХарактеристикой = СтрокаЦен;
КонецЕсли;
КонецЦикла;
Если СтрокаСХарактеристикой <> Неопределено Тогда
НайденнаяСтрока = СтрокаСХарактеристикой;
ИначеЕсли СтрокаБезХарактеристики <> Неопределено Тогда
НайденнаяСтрока = СтрокаБезХарактеристики;
Иначе
НайденнаяСтрока = Неопределено;
КонецЕсли;
Если (НайденнаяСтрока <> Неопределено) И (НайденнаяСтрока.Цена <> 0) Тогда
Цена = НайденнаяСтрока.Цена * (1 + ?(ТипЦенРассчитывается, НайденнаяСтрока.ПроцентСкидкиНаценки / 100, 0));
Цена = Ценообразование.ОкруглитьЦену(Цена, ТипЦен.ПорядокОкругления, ТипЦен.ОкруглятьВБольшуюСторону);
Цена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(Цена, НайденнаяСтрока.ВалютаЦены, Валюта, Курс, Кратность);
СтрокаТовара.ЕдиницаИзмерения = НайденнаяСтрока.ЕдиницаИзмеренияЦены;
Иначе
Цена = 0;
КонецЕсли;
СтрокаТовара.Цена = Цена;
КонецЦикла;
КонецПроцедуры // ПерезаполнитьЦены()
А вот куда прикрепить вам написанный запрос, ума не приложу.