Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Бэк-офисы платформы 1С

Ошибка деления на 0 при расчете себестоимости : Бэк-офисы платформы 1С

19.03.2024 14:00


21.03.2017 12:37
Tigra_N
 
Цитата:
вопросы по форуму задаются в соответствующем разделе
прошу прощения

Код модуля ЗапасыСервер:

///////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ ФОРМИРОВАНИЯ ДВИЖЕНИЙ

// Процедура записи движений в регистр ТоварыНаСкладах.
//
Процедура ОтразитьТоварыНаСкладах(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыНаСкладах;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.Загрузить(Таблица);

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

// Процедура записи движений в регистр ТоварыОрганизаций.
//
Процедура ОтразитьТоварыОрганизаций(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыОрганизаций;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Движения.ТоварыОрганизаций.Записывать = Истина;
Движения.ТоварыОрганизаций.Загрузить(Таблица);

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

// Процедура записи движений в регистр ТоварыКПоступлению.
//
Процедура ОтразитьТоварыКПоступлению(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыКПоступлению;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Движения.ТоварыКПоступлению.Записывать = Истина;
Движения.ТоварыКПоступлению.Загрузить(Таблица);

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

// Процедура записи движений в регистр ТоварыКОтгрузке.
//
Процедура ОтразитьТоварыКОтгрузке(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыКОтгрузке;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Движения.ТоварыКОтгрузке.Записывать = Истина;
Движения.ТоварыКОтгрузке.Загрузить(Таблица);

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

// Процедура записи движений в регистр ТоварыКОформлениюИзлишковНедостач.
//
Процедура ОтразитьТоварыКОформлениюИзлишковНедостач(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыКОформлениюИзлишковНедостач;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Движения.ТоварыКОформлениюИзлишковНедостач.Записывать = Истина;
Движения.ТоварыКОформлениюИзлишковНедостач.Загрузить(Таблица);

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С СЕРИЙНЫМИ НОМЕРАМИ И ПОДАРОЧНЫМИ СЕРТИФИКАТАМИ

// Процедура записи движений в регистр ДвиженияСерийныхНомеров.
//
Процедура ОтразитьДвиженияСерийныхНомеров(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСерийныхНомеров;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Движения.ДвиженияСерийныхНомеров.Записывать = Истина;
Движения.ДвиженияСерийныхНомеров.Загрузить(Таблица);

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С СЕБЕСТОИМОСТЬЮ

// Процедура записи движений в регистр СебестоимостьНоменклатуры.
//
Процедура ОтразитьДвиженияСебестоимостьНоменклатуры(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСебестоимостьНоменклатуры;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Движения.СебестоимостьНоменклатуры.Записывать = Истина;
Движения.СебестоимостьНоменклатуры.Загрузить(Таблица);

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

// Процедура записи движений в регистр СебестоимостьНоменклатуры.
//
Процедура ОтразитьДвиженияСебестоимостьПоставкиТоваров(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСебестоимостьПоставкиТоваров;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Движения.СебестоимостьПоставкиТоваров.Записывать = Истина;
Движения.СебестоимостьПоставкиТоваров.Загрузить(Таблица);

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

// Получение способа учета себестоимости магазина на определенную дату.
// Параметры:
// Магазин - СправочникСсылка - Магазин
// Дата - Дата - дата среза получения способа учета.
//
Функция ПолучитьСпособУчетаСебестоимости(Дата = Неопределено) Экспорт

Результат = Новый Структура;
Результат.Вставить("СпособУчета", Неопределено);
Результат.Вставить("РаспределятьСтоимостьУслуг", Ложь);
Результат.Вставить("ПравилоРаспределения", Неопределено);
Результат.Вставить("РассчитыватьРегламентнымЗаданием", Ложь);


Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетСебестоимости") Тогда

Период = ?(Дата = Неопределено, ТекущаяДатаСеанса(), Дата);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| НастройкаСпособаУчетаСебестоимостиСрезПоследних.СпособУчета КАК СпособУчета,
| НастройкаСпособаУчетаСебестоимостиСрезПоследних.РаспределятьСтоимостьУслуг КАК РаспределятьСтоимостьУслуг,
| НастройкаСпособаУчетаСебестоимостиСрезПоследних.ПравилоРаспределения КАК ПравилоРаспределения,
| НастройкаСпособаУчетаСебестоимостиСрезПоследних.РассчитыватьСебестоимостьРегламентнымЗаданием КАК РассчитыватьРегламентнымЗаданием
|ИЗ
| РегистрСведений.НастройкаСпособаУчетаСебестоимости.СрезПоследних(&Период, ) КАК НастройкаСпособаУчетаСебестоимостиСрезПоследних";

Запрос.УстановитьПараметр("Период", Период);

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

ЗаполнитьЗначенияСвойств(Результат, Выборка);
КонецЕсли;

КонецЕсли;

Возврат Результат;

КонецФункции

// Процедуры обновления стоимости товаров.
//
Процедура РасчетСебестоимости() Экспорт

Документы.УстановкаСебестоимости.ВыполнитьРегламентноеЗаданиеРасчетСебестоимости();

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

// Процедура расчета себестоимости документа УстановкаСебестоимости.
// Параметры:
// Объект - ДокументОбъект.УстановкаСебестоимости - Документ расчета себестоимости.
Процедура РассчитатьСебестоимостьНаСервере(Объект)Экспорт

Объект.Товары.Очистить();

МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

// Формирование узлов стоимости.
КоличествоУзлов = СформироватьУзлыКорректировкиСписанияСтоимости(СтруктураПериод, НастройкаСпособаУчета, МенеджерВременныхТаблиц);

Если КоличествоУзлов <> 0 Тогда

РассчитатьСтоимость(СтруктураПериод, МенеджерВременныхТаблиц);
ЗарегистрироватьСтоимость(СтруктураПериод, МенеджерВременныхТаблиц, Объект);

КонецЕсли;

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

// Процедура распределения стоимости услуг на себестоимость товаров.
//
Процедура РаспределитьУслугиНаСебестоимость(УслугиНаРаспределение, ПравилоРаспределения, ТаблицаСебестоимостьНоменклатуры,
СпособУчета, ТаблицаСебестоимостьПоставкиТоваров = Неопределено, ИмяКолонкиБазыСумма = "Сумма") Экспорт

Если УслугиНаРаспределение.Количество() = 0
ИЛИ СпособУчета = Перечисления.СпособыУчетаСебестоимости.ПриниматьИзУправляющейСистемы Тогда

Возврат;
КонецЕсли;

Если СпособУчета = Перечисления.СпособыУчетаСебестоимости.АвтономныйУчет ИЛИ ТаблицаСебестоимостьПоставкиТоваров = Неопределено Тогда
ТаблицаНоменклатуры = ТаблицаСебестоимостьНоменклатуры;
Иначе
ТаблицаНоменклатуры = ТаблицаСебестоимостьПоставкиТоваров;
КонецЕсли;

Для Каждого Услуга Из УслугиНаРаспределение Цикл

Если ПравилоРаспределения = Перечисления.ПравилаРаспределенияНаСебестоимостьТоваров.ПропорциональноКоличеству Тогда
МассивКоэфф = ТаблицаНоменклатуры.ВыгрузитьКолонку("Количество");
Иначе
МассивКоэфф = ТаблицаНоменклатуры.ВыгрузитьКолонку(ИмяКолонкиБазыСумма);
КонецЕсли;

РаспределенныйМассив = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(Услуга.Сумма, МассивКоэфф);
Индекс = 0;

Если РаспределенныйМассив = Неопределено Тогда
Возврат;
КонецЕсли;

Для Каждого СтрокаТоваров Из ТаблицаНоменклатуры Цикл
СебестоимостьСтроки = РаспределенныйМассив[Индекс];
СтрокаТоваров.Сумма = СтрокаТоваров.Сумма + СебестоимостьСтроки;

СтрокаТоваров.Цена = СтрокаТоваров.Сумма / СтрокаТоваров.Количество;
Индекс = Индекс + 1;

КонецЦикла;
КонецЦикла;

Если СпособУчета = Перечисления.СпособыУчетаСебестоимости.АвтономныйУчет ИЛИ ТаблицаСебестоимостьПоставкиТоваров = Неопределено Тогда
ТаблицаСебестоимостьНоменклатуры = ТаблицаНоменклатуры;
Иначе
ТаблицаСебестоимостьПоставкиТоваров = ТаблицаНоменклатуры;
КонецЕсли;

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

Функция СформироватьУзлыКорректировкиСписанияСтоимости(СтруктураПериод, НастройкаСпособаУчета, МенеджерВременныхТаблиц)

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

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

Запрос.УстановитьПараметр("НачалоПериода", Новый Граница(НачалоДня(СтруктураПериод.НачалоПериода), ВидГраницы.Исключая));
Запрос.УстановитьПараметр("КонецПериода", СтруктураПериод.КонецПериода);
Результат = Запрос.Выполнить();

ТаблицаУзлов = ПоправкаПоСборкамТоваров(СтруктураПериод, МенеджерВременныхТаблиц, НастройкаСпособаУчета);

МассивУзлов = Новый Массив;
Для СчетчикУзлов = 1 По ТаблицаУзлов.Количество() Цикл
МассивУзлов.Добавить(СчетчикУзлов);
КонецЦикла;

ТаблицаУзлов.Колонки.Добавить("НомерУзла", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(25, 0));
ТаблицаУзлов.ЗагрузитьКолонку(МассивУзлов, "НомерУзла");

Запрос.Текст =
"
|ВЫБРАТЬ *
|
|ПОМЕСТИТЬ ВтУзлыКорректировки
|
|ИЗ
| &ТаблицаУзлов КАК ТаблицаУзлов
|
|ИНДЕКСИРОВАТЬ ПО НомерУзла;
|
|";
Запрос.УстановитьПараметр("ТаблицаУзлов", ТаблицаУзлов);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();

Возврат Выборка.Количество;

КонецФункции

Процедура РассчитатьСтоимость(СтруктураПериод, МенеджерВременныхТаблиц)

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

Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Текст = ТекстЗапросаДвиженияСтоимости();
Запрос.Выполнить();

РешитьСЛУ(МенеджерВременныхТаблиц);

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

Процедура РешитьСЛУ(МенеджерВременныхТаблиц)

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

ТребуемаяТочность = 0.000001;
МаксКоличествоИтераций = 200;

СчетчикИтераций = 1;
ТекущееОтклонение = 1;

Пока ТекущееОтклонение > ТребуемаяТочность И СчетчикИтераций <= МаксКоличествоИтераций Цикл

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

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

ТекущееОтклонение = Выборка.Отклонение;

Иначе

ТекущееОтклонение = 0;

КонецЕсли;

СчетчикИтераций = СчетчикИтераций + 1;

КонецЦикла;

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

Функция ТекстЗапросаДвиженияСтоимости()

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

Возврат ТекстЗапросаТаблицаРешений;

КонецФункции

Процедура ЗарегистрироватьСтоимость(СтруктураПериод, МенеджерВременныхТаблиц, Объект)

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

Запрос.УстановитьПараметр("КонецПериода", СтруктураПериод.КонецПериода);
Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
Запрос.УстановитьПараметр("НачалоПериода", СтруктураПериод.НачалоПериода);

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

Запрос.Выполнить();

Запрос.Текст = "ВЫБРАТЬ * ИЗ СебестоимостьПеремещений КАК СебестоимостьПеремещений";

РезультатЗапроса = Запрос.Выполнить();
Объект.Товары.Загрузить(РезультатЗапроса.Выгрузить());

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

Функция ПоправкаПоСборкамТоваров(СтруктураПериод, МенеджерВременныхТаблиц, НастройкаСпособаУчета)

ТаблицаПриемник = Новый ТаблицаЗначений;
ТаблицаПриемник.Колонки.Добавить("Магазин", Новый ОписаниеТипов("СправочникСсылка.Магазины"));
ТаблицаПриемник.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаПриемник.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
ТаблицаПриемник.Колонки.Добавить("КоличествоКомплектов", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 3));
ТаблицаПриемник.Колонки.Добавить("Сумма", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 2));

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СборкаТоваров.Ссылка,
| СборкаТоваров.ВидОперации,
| СборкаТоваров.Магазин,
| СборкаТоваров.Дата КАК Период
|ИЗ
| Документ.СборкаТоваров КАК СборкаТоваров
|ГДЕ
| СборкаТоваров.Проведен
| И СборкаТоваров.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|";

Запрос.УстановитьПараметр("КонецПериода", СтруктураПериод.КонецПериода);
Запрос.УстановитьПараметр("НачалоПериода", СтруктураПериод.НачалоПериода);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

// Сборка из комплектующих
Если Выборка.ВидОперации = Перечисления.ВидыОперацийКомплектацияНоменклатуры.Комплектация Тогда

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

Запрос.УстановитьПараметр("Ссылка", Выборка.Ссылка);
Запрос.УстановитьПараметр("Магазин", Выборка.Магазин);
Запрос.УстановитьПараметр("Период", Выборка.Период);
Запрос.УстановитьПараметр("НачалоПериода", СтруктураПериод.НачалоПериода);


РезультатЗапроса = Запрос.ВыполнитьПакет();
РезультатКомплект = РезультатЗапроса[2].Выгрузить();
РезультатУслуги = РезультатЗапроса[5];

Если НЕ РезультатУслуги.Пустой() И НастройкаСпособаУчета.РаспределятьСтоимостьУслуг Тогда

РаспределитьУслугиНаСебестоимость(РезультатУслуги.Выгрузить(), НастройкаСпособаУчета.ПравилоРаспределения, РезультатКомплект, Перечисления.СпособыУчетаСебестоимости.АвтономныйУчетСредняяВзвешенная);

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

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

КонецЕсли;

Иначе // Разборка на комплектующие

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

Запрос.УстановитьПараметр("Ссылка", Выборка.Ссылка);
Запрос.УстановитьПараметр("Магазин", Выборка.Магазин);
Запрос.УстановитьПараметр("Период", Выборка.Период);

РезультатЗапроса = Запрос.ВыполнитьПакет();

ТаблицаСтоимостьКомплекта = РезультатЗапроса[1].Выгрузить();
РезультатКомплект = РезультатЗапроса[2].Выгрузить();
РезультатУслуги = РезультатЗапроса[5];


РаспределитьСебестоимостьПоДолямСтоимости(ТаблицаСтоимостьКомплекта, РезультатКомплект);

Если НЕ РезультатУслуги.Пустой() И НастройкаСпособаУчета.РаспределятьСтоимостьУслуг Тогда

РаспределитьУслугиНаСебестоимость(РезультатУслуги.Выгрузить(), НастройкаСпособаУчета.ПравилоРаспределения,
РезультатКомплект, Перечисления.СпособыУчетаСебестоимости.АвтономныйУчетСредняяВзвешенная);
КонецЕсли;

ОбщегоНазначенияРТ.ЗагрузитьВТаблицуЗначений(РезультатКомплект, ТаблицаПриемник, Ложь);

КонецЕсли;

КонецЦикла;

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

Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат;

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

КонецФункции

// Процедура распределения стоимости комплекта на себестоимость комплектующих по долям стоимости.
//
Процедура РаспределитьСебестоимостьПоДолямСтоимости(ТаблицаСебестоимостьКомплекта, ТаблицаСебестоимостьКомплектующих) Экспорт

Если ТаблицаСебестоимостьКомплекта.Количество() = 0 Тогда
Возврат;
КонецЕсли;

СуммаКРаспределению = ТаблицаСебестоимостьКомплекта[0].Себестоимость * ТаблицаСебестоимостьКомплекта[0].Количество;
МассивКоэфф = ТаблицаСебестоимостьКомплектующих.ВыгрузитьКолонку("ДоляСтоимости");

РаспределенныйМассив = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(СуммаКРаспределению, МассивКоэфф);
Если НЕ РаспределенныйМассив = Неопределено Тогда
ТаблицаСебестоимостьКомплектующих.ЗагрузитьКолонку(РаспределенныйМассив, "Сумма");
КонецЕсли;

Для Каждого Строка Из ТаблицаСебестоимостьКомплектующих Цикл
Строка.Цена = Строка.Сумма/Строка.Количество;
КонецЦикла;

ТаблицаСебестоимостьКомплектующих.Колонки.Удалить("ДоляСтоимости");

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С НОМЕНКЛАТУРОЙ ПОСТАВЩИКОВ

// Процедура записи движений в регистр НоменклатураПоставщиков.
//
Процедура ОтразитьДвиженияНоменклатураПоставщиков(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаНоменклатураПоставщиков;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Для каждого СтрокаТЧ Из Таблица Цикл
Запись = РегистрыСведений.НоменклатураПоставщиков.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, СтрокаТЧ);
Запись.Записать();
КонецЦикла;

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

// Процедура записи движений в регистр СоответствиеНоменклатурыЕГАИС.
//
Процедура ОтразитьСоответствиеНоменклатурыЕГАИС(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСоответствиеНоменклатурыЕГАИС;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Для каждого СтрокаТЧ Из Таблица Цикл
Запись = РегистрыСведений.СоответствиеНоменклатурыЕГАИС.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, СтрокаТЧ);
Запись.Записать(Истина);
КонецЦикла;

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

// Процедура записи движений в регистр СоответствиеОрганизацийЕГАИС
//
Процедура ОтразитьСоответствиеОрганизацийЕГАИС(ДополнительныеСвойства, Движения, Отказ) Экспорт

Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСоответствиеОрганизацийЕГАИС;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Для каждого СтрокаТЧ Из Таблица Цикл
Запись = РегистрыСведений.СоответствиеОрганизацийЕГАИС.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, СтрокаТЧ);
Запись.Записать(Истина);
КонецЦикла;

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С ЗАКАЗАМИ ПОСТАВЩИКАМ И ЗАКАЗАМИ НА ПЕРЕМЕЩЕНИЕ

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

Перем Результат;

ТекстОграниченияПоМагазинам = "";
Если МассивМагазинов <> Неопределено Тогда
Если ТипЗнч(МассивМагазинов) = Тип("Массив")
И МассивМагазинов.Количество() > 0 Тогда
ТекстОграниченияПоМагазинам = "И ЗаказПоставщику.Магазин В(&МассивМагазинов)";
ИначеЕсли ТипЗнч(МассивМагазинов) = Тип("СправочникСсылка.Магазины")
И ЗначениеЗаполнено(МассивМагазинов) Тогда
ТекстОграниченияПоМагазинам = "И ЗаказПоставщику.Магазин = &МассивМагазинов";
КонецЕсли;
КонецЕсли;

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

Запрос.УстановитьПараметр("МассивМагазинов", МассивМагазинов);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
Результат = Запрос.Выполнить().Выгрузить();

Возврат Результат;

КонецФункции

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

Перем Результат;

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

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

Запрос.УстановитьПараметр("МассивМагазинов", МассивМагазинов);
Запрос.УстановитьПараметр("Поставщик", Поставщик);
Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
Результат = Запрос.Выполнить().Выгрузить();

Возврат Результат;

КонецФункции

// Функция формирует таблицу значений с документами для закрытия.
//
// Параметры:
// Дата - Дата - дата относительно которой будет рассчитываться просрочка поставки.
// Магазин - СправочникСсылка.Магазины - Магазин по которому необходимо закрыть заказы поставщикам.
// Поставщик - СправочникСсылка.Контрагенты или СправочникСсылка.Магазин - Контрагент или магазин по которому
// необходимо закрыть заказы поставщикам и/или заказы на перемещение.
// Возвращаемое значение - Таблица значений.
Функция ПолучитьЗаказыПоставщикамЗаказыНаПеремещениеДляЗакрытия(Дата, МассивМагазинов = Неопределено, Поставщик = Неопределено) Экспорт

Перем Результат;

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

ТекстОграниченияЗаказПоставщикуПоПоставщику = ?(ЗначениеЗаполнено(Поставщик), " И ЗаказПоставщику.Контрагент = &Поставщик", "");
ТекстОграниченияЗаказНаПеремещениеПоПоставщику = ?(ЗначениеЗаполнено(Поставщик), " И ЗаказНаПеремещение.МагазинОтправитель = &Поставщик", "");

Запрос = Новый Запрос;

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

ТекстЗапросаПоЗаказамПоставщику = СтрЗаменить(ТекстЗапросаПоЗаказамПоставщику, "%ТекстОграниченияЗаказПоставщикуПоМагазинам%", ТекстОграниченияЗаказПоставщикуПоМагазинам);
ТекстЗапросаПоЗаказамПоставщику = СтрЗаменить(ТекстЗапросаПоЗаказамПоставщику, "%ТекстОграниченияЗаказПоставщикуПоПоставщику%", ТекстОграниченияЗаказПоставщикуПоПоставщику);

ТекстЗапросаОбъединитьВсе = "
|
|ОБЪЕДИНИТЬ ВСЕ
|";

ТекстЗапросаПоЗаказамНаПеремещение = "
|ВЫБРАТЬ %РАЗРЕШЕННЫЕ%
| ЗаказНаПеремещение.Ссылка КАК Ссылка,
| ЗаказНаПеремещение.Дата КАК ДатаЗаказа,
| ЗаказНаПеремещение.ЖелаемаяДатаПоступления КАК ДатаПоступления,
| ЗаказНаПеремещение.МагазинПолучатель КАК Магазин,
| ЗаказНаПеремещение.МагазинОтправитель КАК Поставщик,
| 0 КАК ДнейПросрочкиПоставки
|ИЗ
| Документ.ЗаказНаПеремещение КАК ЗаказНаПеремещение
|ГДЕ
| ЗаказНаПеремещение.Проведен
| %ТекстОграниченияЗаказНаПеремещениеПоМагазинам%
| %ТекстОграниченияЗаказНаПеремещениеПоПоставщику%
| И ЗаказНаПеремещение.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыВнутреннихЗаказов.Закрыт)
| И ЗаказНаПеремещение.ЖелаемаяДатаПоступления < &Дата
| И НЕ ЗаказНаПеремещение.МагазинОтправитель.СкладУправляющейСистемы";

ТекстЗапросаПоЗаказамНаПеремещение = СтрЗаменить(ТекстЗапросаПоЗаказамНаПеремещение, "%ТекстОграниченияЗаказНаПеремещениеПоМагазинам%", ТекстОграниченияЗаказНаПеремещениеПоМагазинам);
ТекстЗапросаПоЗаказамНаПеремещение = СтрЗаменить(ТекстЗапросаПоЗаказамНаПеремещение, "%ТекстОграниченияЗаказНаПеремещениеПоПоставщику%", ТекстОграниченияЗаказНаПеремещениеПоПоставщику);

Если Поставщик = Неопределено Тогда
ТекстЗапросаПоЗаказамНаПеремещение = СтрЗаменить(ТекстЗапросаПоЗаказамНаПеремещение, "%РАЗРЕШЕННЫЕ%", "");
ТекстЗапроса = ТекстЗапросаПоЗаказамПоставщику + ТекстЗапросаОбъединитьВсе + ТекстЗапросаПоЗаказамНаПеремещение;
ИначеЕсли ТипЗнч(Поставщик) = Тип("СправочникСсылка.Контрагенты") Тогда
ТекстЗапроса = ТекстЗапросаПоЗаказамПоставщику;
ИначеЕсли ТипЗнч(Поставщик) = Тип("СправочникСсылка.Магазины") Тогда
ТекстЗапросаПоЗаказамНаПеремещение = СтрЗаменить(ТекстЗапросаПоЗаказамНаПеремещение, "%РАЗРЕШЕННЫЕ%", "РАЗРЕШЕННЫЕ");
ТекстЗапроса = ТекстЗапросаПоЗаказамНаПеремещение;
КонецЕсли;

Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("МассивМагазинов", МассивМагазинов);
Запрос.УстановитьПараметр("Поставщик", Поставщик);
Запрос.УстановитьПараметр("Дата", Дата);
Результат = Запрос.Выполнить().Выгрузить();

Результат.Сортировать("ДатаЗаказа Возр");

Возврат Результат;

КонецФункции

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ РЕГЛАМЕНТНЫХ ЗАДАНИЙ

// Процедура обновляет регистр сведений "ИнформативныеОстаткиТоваровПоМагазинам".
//
Процедура ОбновлениеРегистраСведенийИнформативныеОстаткиТоваровДляМагазинов() Экспорт

Если ПустаяСтрока(ИмяПользователя()) Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;

Если ПланыОбмена.ГлавныйУзел() = Неопределено Тогда
СравнениеОстатков = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗапросДанныхДляИзменения.Магазин,
| ЗапросДанныхДляИзменения.Номенклатура,
| ЗапросДанныхДляИзменения.Характеристика,
| СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета) КАК Количество,
| СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) КАК КоличествоТоваровДляМиграции,
| СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) КАК Резерв,
| СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета) КАК РезервТоваровПоДаннымУчета
|ИЗ
| (ВЫБРАТЬ
| ИнформативныеОстаткиТоваровПоМагазинам.Магазин КАК Магазин,
| ИнформативныеОстаткиТоваровПоМагазинам.Номенклатура КАК Номенклатура,
| ИнформативныеОстаткиТоваровПоМагазинам.Характеристика КАК Характеристика,
| ИнформативныеОстаткиТоваровПоМагазинам.Количество КАК КоличествоТоваровДляМиграции,
| 0 КАК КоличествоТоваровПоДаннымУчета,
| ИнформативныеОстаткиТоваровПоМагазинам.Резерв КАК РезервТоваровДляМиграции,
| 0 КАК РезервТоваровПоДаннымУчета
| ИЗ
| РегистрСведений.ИнформативныеОстаткиТоваровПоМагазинам КАК ИнформативныеОстаткиТоваровПоМагазинам
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад.Магазин,
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.Характеристика,
| 0,
| ТоварыНаСкладахОстатки.КоличествоОстаток,
| 0,
| ТоварыНаСкладахОстатки.РезервОстаток
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, ) КАК ТоварыНаСкладахОстатки) КАК ЗапросДанныхДляИзменения
|
|СГРУППИРОВАТЬ ПО
| ЗапросДанныхДляИзменения.Магазин,
| ЗапросДанныхДляИзменения.Номенклатура,
| ЗапросДанныхДляИзменения.Характеристика
|
|ИМЕЮЩИЕ
| (СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета)
| ИЛИ СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета))");

СравнениеОстатков.УстановитьПараметр("ДатаОстатков", КонецДня(ТекущаяДатаСеанса()));
Выборка = СравнениеОстатков.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл

НаборЗаписей = РегистрыСведений.ИнформативныеОстаткиТоваровПоМагазинам.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Магазин.Установить(Выборка.Магазин);
НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
НаборЗаписей.Отбор.Характеристика.Установить(Выборка.Характеристика);

НаборЗаписей.Прочитать();

НаборЗаписей.Очистить();

Если Выборка.Количество <> 0 Тогда
Запись = НаборЗаписей.Добавить();
Запись.Магазин = Выборка.Магазин;
Запись.Номенклатура = Выборка.Номенклатура;
Запись.Характеристика = Выборка.Характеристика;
Запись.Количество = Выборка.Количество;
Запись.Резерв = Выборка.Резерв;
КонецЕсли;

НаборЗаписей.Записать();

КонецЦикла;

КонецЕсли;

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

// Процедура обновляет регистр сведений "ИнформативныеОстаткиТоваровПоСкладам".
//
Процедура ОбновлениеРегистраСведенийИнформативныеОстаткиТоваровДляРабочихМест() Экспорт

Если ПустаяСтрока(ИмяПользователя()) Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;

Если ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоРабочемуМесту") <> Неопределено
И НЕ ПланыОбмена.ПоРабочемуМесту.ЭтоРабочееМесто() Тогда

СравнениеОстатков = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗапросДанныхДляИзменения.Склад,
| ЗапросДанныхДляИзменения.Номенклатура,
| ЗапросДанныхДляИзменения.Характеристика,
| СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета) КАК Количество,
| СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) КАК КоличествоТоваровДляМиграции,
| СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) КАК Резерв,
| СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета) КАК РезервТоваровПоДаннымУчета
|ИЗ
| (ВЫБРАТЬ
| ИнформативныеОстаткиТоваровПоСкладам.Склад КАК Склад,
| ИнформативныеОстаткиТоваровПоСкладам.Номенклатура КАК Номенклатура,
| ИнформативныеОстаткиТоваровПоСкладам.Характеристика КАК Характеристика,
| ИнформативныеОстаткиТоваровПоСкладам.Количество КАК КоличествоТоваровДляМиграции,
| 0 КАК КоличествоТоваровПоДаннымУчета,
| ИнформативныеОстаткиТоваровПоСкладам.Резерв КАК РезервТоваровДляМиграции,
| 0 КАК РезервТоваровПоДаннымУчета
| ИЗ
| РегистрСведений.ИнформативныеОстаткиТоваровПоСкладам КАК ИнформативныеОстаткиТоваровПоСкладам
| ГДЕ
| ИнформативныеОстаткиТоваровПоСкладам.Склад.Магазин В(&МассивОграниченийПоМагазинам)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад,
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.Характеристика,
| 0,
| ТоварыНаСкладахОстатки.КоличествоОстаток,
| 0,
| ТоварыНаСкладахОстатки.РезервОстаток
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад.Магазин В (&МассивОграниченийПоМагазинам)) КАК ТоварыНаСкладахОстатки) КАК ЗапросДанныхДляИзменения
|
|СГРУППИРОВАТЬ ПО
| ЗапросДанныхДляИзменения.Склад,
| ЗапросДанныхДляИзменения.Номенклатура,
| ЗапросДанныхДляИзменения.Характеристика
|
|ИМЕЮЩИЕ
| (СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета)
| ИЛИ СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета))");

СравнениеОстатков.УстановитьПараметр("ДатаОстатков", КонецДня(ТекущаяДатаСеанса()));

Если ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоМагазину") <> Неопределено
И ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
// В узле -магазине РИБ нас интересуют только склады магазинов, заданных для этого узла.
МассивОграниченийПоМагазинам = ПланыОбмена.ПоМагазину.ЭтотУзел().Магазины.ВыгрузитьКолонку("Магазин");

ИначеЕсли ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоМагазину") <> Неопределено Тогда
// Остатки по другим складам магазинов РИБ для рабочих мест этого магазина не нужны.
МассивОграниченийПоМагазинам = Новый Массив;

Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Магазины.Ссылка
|ИЗ
| Справочник.Магазины КАК Магазины
|ГДЕ
| (НЕ Магазины.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПоМагазинуМагазины.Магазин
| ИЗ
| ПланОбмена.ПоМагазину.Магазины КАК ПоМагазинуМагазины))");
ВыборкаМагазинов = Запрос.Выполнить().Выбрать();

Пока ВыборкаМагазинов.Следующий() Цикл

МассивОграниченийПоМагазинам.Добавить(ВыборкаМагазинов.Ссылка);

КонецЦикла;

Иначе

МассивОграниченийПоМагазинам = Новый Массив;
ВыборкаМагазинов = Справочники.Магазины.Выбрать();

Пока ВыборкаМагазинов.Следующий() Цикл

МассивОграниченийПоМагазинам.Добавить(ВыборкаМагазинов.Ссылка);

КонецЦикла;

КонецЕсли;

СравнениеОстатков.УстановитьПараметр("МассивОграниченийПоМагазинам",МассивОграниченийПоМагазинам);

Выборка = СравнениеОстатков.Выполнить().Выбрать();

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

НаборЗаписей = РегистрыСведений.ИнформативныеОстаткиТоваровПоСкладам.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Склад.Установить(Выборка.Склад);
НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
НаборЗаписей.Отбор.Характеристика.Установить(Выборка.Характеристика);

НаборЗаписей.Прочитать();

НаборЗаписей.Очистить();

Если Выборка.Количество <> 0 Тогда

Запись = НаборЗаписей.Добавить();
Запись.Склад = Выборка.Склад;
Запись.Номенклатура = Выборка.Номенклатура;
Запись.Характеристика = Выборка.Характеристика;
Запись.Количество = Выборка.Количество;
Запись.Резерв = Выборка.Резерв;
КонецЕсли;

НаборЗаписей.Записать();

КонецЦикла;

КонецЕсли;

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

// Процедура обновляет номенклатуру поставщиков в регистре сведений
// "Номенклатура поставщиков".
Процедура ОбновлениеНоменклатурыПоставщиков() Экспорт

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| МАКСИМУМ(НоменклатураКорректировки.НоменклатураРегистра) КАК НоменклатураРегистра,
| МАКСИМУМ(НоменклатураКорректировки.НоменклатураДокумента) КАК НоменклатураДокумента,
| НоменклатураКорректировки.Поставщик,
| НоменклатураКорректировки.Магазин,
| НоменклатураКорректировки.Номенклатура,
| НоменклатураКорректировки.Характеристика
|ПОМЕСТИТЬ НоменклатураКорректировки
|ИЗ
| (ВЫБРАТЬ
| ИСТИНА КАК НоменклатураРегистра,
| ЛОЖЬ КАК НоменклатураДокумента,
| НоменклатураПоставщиков.Поставщик КАК Поставщик,
| НоменклатураПоставщиков.Магазин КАК Магазин,
| НоменклатураПоставщиков.Номенклатура КАК Номенклатура,
| НоменклатураПоставщиков.Характеристика КАК Характеристика
| ИЗ
| РегистрСведений.НоменклатураПоставщиков КАК НоменклатураПоставщиков
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ЛОЖЬ,
| ИСТИНА,
| НоменклатураДокументов.Контрагент,
| НоменклатураДокументов.Магазин,
| НоменклатураДокументов.Номенклатура,
| НоменклатураДокументов.Характеристика
| ИЗ
| (ВЫБРАТЬ
| ПоступлениеТоваров.Контрагент КАК Контрагент,
| ПоступлениеТоваров.Магазин КАК Магазин,
| ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
| ПоступлениеТоваровТовары.Характеристика КАК Характеристика
| ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
| ПО ПоступлениеТоваров.Ссылка = ПоступлениеТоваровТовары.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоставщикиНоменклатуры КАК ПоставщикиНоменклатуры
| ПО ПоступлениеТоваров.Контрагент = ПоставщикиНоменклатуры.Поставщик
| ГДЕ
| ПоступлениеТоваров.Проведен
| И ПоступлениеТоваров.Дата >= &ПериодОбновления
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ЗаказПоставщику.Контрагент,
| ЗаказПоставщику.Магазин,
| ЗаказПоставщикуТовары.Номенклатура,
| ЗаказПоставщикуТовары.Характеристика
| ИЗ
| Документ.ЗаказПоставщику КАК ЗаказПоставщику
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
| ПО ЗаказПоставщику.Ссылка = ЗаказПоставщикуТовары.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоставщикиНоменклатуры КАК ПоставщикиНоменклатуры
| ПО ЗаказПоставщику.Контрагент = ПоставщикиНоменклатуры.Поставщик
| ГДЕ
| ЗаказПоставщику.Проведен
| И ЗаказПоставщику.Дата >= &ПериодОбновления
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ЗаказНаПеремещение.МагазинОтправитель,
| ЗаказНаПеремещение.МагазинПолучатель,
| ЗаказНаПеремещениеТовары.Номенклатура,
| ЗаказНаПеремещениеТовары.Характеристика
| ИЗ
| Документ.ЗаказНаПеремещение КАК ЗаказНаПеремещение
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказНаПеремещение.Товары КАК ЗаказНаПеремещениеТовары
| ПО ЗаказНаПеремещение.Ссылка = ЗаказНаПеремещениеТовары.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоставщикиНоменклатуры КАК ПоставщикиНоменклатуры
| ПО ЗаказНаПеремещение.МагазинОтправитель = ПоставщикиНоменклатуры.Поставщик
| ГДЕ
| ЗаказНаПеремещение.Проведен
| И ЗаказНаПеремещение.Дата >= &ПериодОбновления
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ПеремещениеТоваров.МагазинОтправитель,
| ПеремещениеТоваров.МагазинПолучатель,
| ПеремещениеТоваровТовары.Номенклатура,
| ПеремещениеТоваровТовары.Характеристика
| ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
| ПО ПеремещениеТоваров.Ссылка = ПеремещениеТоваровТовары.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоставщикиНоменклатуры КАК ПоставщикиНоменклатуры
| ПО ПеремещениеТоваров.МагазинОтправитель = ПоставщикиНоменклатуры.Поставщик
| ГДЕ
| ПеремещениеТоваров.Проведен
| И ПеремещениеТоваров.Дата >= &ПериодОбновления) КАК НоменклатураДокументов) КАК НоменклатураКорректировки
|
|СГРУППИРОВАТЬ ПО
| НоменклатураКорректировки.Поставщик,
| НоменклатураКорректировки.Магазин,
| НоменклатураКорректировки.Номенклатура,
| НоменклатураКорректировки.Характеристика
|
|ИНДЕКСИРОВАТЬ ПО
| НоменклатураРегистра,
| НоменклатураДокумента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| НоменклатураКорректировки.Поставщик,
| НоменклатураКорректировки.Магазин,
| НоменклатураКорректировки.Номенклатура,
| НоменклатураКорректировки.Характеристика
|ИЗ
| НоменклатураКорректировки КАК НоменклатураКорректировки
|ГДЕ
| НоменклатураКорректировки.НоменклатураРегистра <> НоменклатураКорректировки.НоменклатураДокумента
| И НоменклатураКорректировки.НоменклатураРегистра
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| НоменклатураКорректировки.Поставщик,
| НоменклатураКорректировки.Магазин,
| НоменклатураКорректировки.Номенклатура,
| НоменклатураКорректировки.Характеристика
|ИЗ
| НоменклатураКорректировки КАК НоменклатураКорректировки
|ГДЕ
| НоменклатураКорректировки.НоменклатураРегистра <> НоменклатураКорректировки.НоменклатураДокумента
| И НоменклатураКорректировки.НоменклатураДокумента");

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

МассивРезультатов = Запрос.ВыполнитьПакет();
РезультатУдаляемыхЗаписей = МассивРезультатов[1];
РезультатДобавляемыхЗаписей = МассивРезультатов[2];
ВыборкаУдаляемыхЗаписей = РезультатУдаляемыхЗаписей.Выбрать();
ВыборкаДобавляемыхЗаписей = РезультатДобавляемыхЗаписей.Выбрать();

НачатьТранзакцию();

Если НЕ РезультатУдаляемыхЗаписей.Пустой() Тогда

Пока ВыборкаУдаляемыхЗаписей.Следующий() Цикл

Запись = РегистрыСведений.НоменклатураПоставщиков.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, ВыборкаУдаляемыхЗаписей);
Запись.Удалить();

КонецЦикла;

КонецЕсли;

Если НЕ РезультатДобавляемыхЗаписей.Пустой() Тогда

Пока ВыборкаДобавляемыхЗаписей.Следующий() Цикл
Запись = РегистрыСведений.НоменклатураПоставщиков.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, ВыборкаДобавляемыхЗаписей);
Запись.Записать();
КонецЦикла;

КонецЕсли;

// Обновление цен и даты поступления.

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

Результат = Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();

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

Константы.ПризнакАктуальностиПоставляемойНоменклатуры.Установить(Истина);
ЗафиксироватьТранзакцию();

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

// Процедура закрывает документы заказы поставщикам, устанавливая флаг Закрыт в документе.
//
Процедура ЗакрытиеЗаказовПоставщикам() Экспорт

Если ПустаяСтрока(ИмяПользователя()) Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;

Если Константы.ИспользоватьСинхронизациюДанных.Получить() Тогда
Если ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоМагазину") <> Неопределено Тогда
Если ПланыОбмена.ГлавныйУзел() = Неопределено Тогда
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Магазины.Ссылка КАК Магазин
|ИЗ
| Справочник.Магазины КАК Магазины
| ЛЕВОЕ СОЕДИНЕНИЕ ПланОбмена.ПоМагазину.Магазины КАК ТЧМагазины
| ПО (ТЧМагазины.Магазин = Магазины.Ссылка)
|ГДЕ
| ТЧМагазины.Магазин ЕСТЬ NULL ");
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ПоМагазину.ЭтотУзел());
МассивМагазинов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Магазин");
Иначе
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТЧМагазины.Магазин КАК Магазин
|ИЗ
| ПланОбмена.ПоМагазину.Магазины КАК ТЧМагазины
|ГДЕ
| ТЧМагазины.Ссылка = &ЭтотУзел");
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ПоМагазину.ЭтотУзел());
МассивМагазинов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Магазин");
КонецЕсли;
Иначе
МассивМагазинов = Новый Массив;
КонецЕсли;
Иначе
МассивМагазинов = Новый Массив;
КонецЕсли;

Дата = ТекущаяДатаСеанса();
ТаблицаЗаказов = ПолучитьЗаказыПоставщикамДляЗакрытия(Дата, МассивМагазинов);

ЗаписьЖурналаРегистрации("Закрытие заказов поставщикам",
УровеньЖурналаРегистрации.Информация, , ,
НСтр("ru = 'Регламентное закрытие заказов поставщикам'"));

Для каждого ЗаказПоставщику Из ТаблицаЗаказов Цикл

ЗаказПоставщикуОбъект = ЗаказПоставщику.Ссылка.ПолучитьОбъект();
ЗаказПоставщикуОбъект.Закрыт = Истина;


Попытка

ЗаказПоставщикуОбъект.Записать();

ЗаписьЖурналаРегистрации("Закрытие заказов поставщикам",
УровеньЖурналаРегистрации.Информация, , ,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Регламентное закрытие заказа поставщику %1'"), ЗаказПоставщику.Ссылка));

Исключение

ЗаписьЖурналаРегистрации("Закрытие заказов поставщикам",
УровеньЖурналаРегистрации.Ошибка, , ,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Во время регламентного закрытия заказа поставщику %1, произошла ошибка:
|%2'"),ЗаказПоставщику.Ссылка, ОписаниеОшибки()));

КонецПопытки;

КонецЦикла;

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

// Процедура закрывает документы заказы на перемещение, устанавливая статус Закрыт в документе.
//
Процедура ЗакрытиеЗаказовНаПеремещение() Экспорт

Если ПустаяСтрока(ИмяПользователя()) Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;

Если Константы.ИспользоватьСинхронизациюДанных.Получить() Тогда
Если ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоМагазину") <> Неопределено Тогда
Если ПланыОбмена.ГлавныйУзел() = Неопределено Тогда
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Магазины.Ссылка КАК Магазин
|ИЗ
| Справочник.Магазины КАК Магазины
| ЛЕВОЕ СОЕДИНЕНИЕ ПланОбмена.ПоМагазину.Магазины КАК ТЧМагазины
| ПО (ТЧМагазины.Магазин = Магазины.Ссылка)
|ГДЕ
| ТЧМагазины.Магазин ЕСТЬ NULL ");
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ПоМагазину.ЭтотУзел());
МассивМагазинов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Магазин");
Иначе
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ТЧМагазины.Магазин КАК Магазин
|ИЗ
| ПланОбмена.ПоМагазину.Магазины КАК ТЧМагазины
|ГДЕ
| ТЧМагазины.Ссылка = &ЭтотУзел");
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ПоМагазину.ЭтотУзел());
МассивМагазинов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Магазин");
КонецЕсли;
Иначе
МассивМагазинов = Новый Массив;
КонецЕсли;
Иначе
МассивМагазинов = Новый Массив;
КонецЕсли;

Дата = ТекущаяДатаСеанса();
ТаблицаЗаказов = ПолучитьЗаказыНаПеремещениеДляЗакрытия(Дата, МассивМагазинов);

ЗаписьЖурналаРегистрации("Закрытие заказов на перемещение",
УровеньЖурналаРегистрации.Информация, , ,
НСтр("ru = 'Регламентное закрытие заказов на перемещение'"));

Для каждого ЗаказНаПеремещение Из ТаблицаЗаказов Цикл

ЗаказНаПеремещениеОбъект = ЗаказНаПеремещение.Ссылка.ПолучитьОбъект();
ЗаказНаПеремещениеОбъект.Статус = Перечисления.СтатусыВнутреннихЗаказов.Закрыт;
ЗаказНаПеремещениеОбъект.ЗакрытВручную = Истина;

Попытка

ЗаказНаПеремещениеОбъект.Записать();

ЗаписьЖурналаРегистрации("Закрытие заказов на перемещение",
УровеньЖурналаРегистрации.Информация, , ,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Регламентное закрытие заказа на перемещение %1'"), ЗаказНаПеремещение.Ссылка));

Исключение

ЗаписьЖурналаРегистрации("Закрытие заказов на перемещение",
УровеньЖурналаРегистрации.Ошибка, , ,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Во время регламентного закрытия заказа на перемещение %1, произошла ошибка:
|%2'"),ЗаказНаПеремещение.Ссылка, ОписаниеОшибки()));

КонецПопытки;

КонецЦикла;

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

////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ ЗАПОЛНЕНИЯ ЦЕН ПО ТЧ ДОКУМЕНТОВ ТОВАРОДВИЖЕНИЯ

// Функция заполнения колонки Цена по себестоимости.
//
Функция ЗаполнитьЦеныПоСебестоимости(Объект, ИмяТабличнойЧасти, Дата) Экспорт

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

// заполнение цен
Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросПоСебестоимости(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Магазин", Объект.Магазин);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если Не ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекущаяСтрока.Цена = НайденнаяСтрока.Цена;
ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.КоличествоУпаковок;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Функция заполнения колонки Цена по себестоимости в выделенных строках.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоСебестоимости(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, Дата) Экспорт

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

// заполнение цен
Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросПоСебестоимости(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Магазин", Объект.Магазин);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если Не ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекущаяСтрока.Цена = НайденнаяСтрока.Цена;
ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.КоличествоУпаковок;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Функция заполнения колонки Цена по себестоимости при пересортице.
//
Функция ЗаполнитьЦеныПоСебестоимостиПересортица(Объект, ИмяТабличнойЧасти, Дата) Экспорт

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

// заполнение цен
Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросПоСебестоимости(Запрос.Текст);

// Оприходование товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя = "Номенклатура";
ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";

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

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если Не ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекущаяСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

// Списание товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если Не ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекущаяСтрока.Цена = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Функция заполнения колонки Цена по себестоимости при пересортице.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоСебестоимостиПересортица(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, Дата) Экспорт

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

// заполнение цен
Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросПоСебестоимости(Запрос.Текст);

// Оприходование товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя = "Номенклатура";
ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";

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

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если Не ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекущаяСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

// Списание товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если Не ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекущаяСтрока.Цена = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

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

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоВидуЦен(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("ВидЦен", ВидЦен);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

Если ВидЦеныВТабличнойЧасти Тогда

ТекСтрока.ВидЦены = ВидЦен;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Осуществляет заполнение видов цен и цен в тч Товары по виду цен.
//
// Параметры:
// Документ - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти - Строка - имя табличной части, в которой необходимо заполнить цены.
// ВидЦен - СправочникСсылка.ВидыЦен - Вид цен, по которому необходимо заполнить цены.
// ВидЦеныВТабличнойЧасти - Булево - признак наличия колонки "ВидЦены" в ТЧ документа.
//
// Возвращаемое значение:
// Булево.
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныПоВидуЦенПересортица(Объект, ИмяТабличнойЧасти, ВидЦен, Дата) Экспорт

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоВидуЦен(Запрос.Текст);

// Оприходование товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя = "Номенклатура";
ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
Запрос.УстановитьПараметр("Дата" , ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("ВидЦен", ВидЦен);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

// Списание товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Осуществляет заполнение видов цен и цен в тч Товары по виду цен.
//
// Параметры:
// Документ - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти - Строка - имя табличной части, в которой необходимо заполнить цены.
// ВидЦен - СправочникСсылка.ВидыЦен - Вид цен, по которому необходимо заполнить цены.
// ВидЦеныВТабличнойЧасти - Булево - признак наличия колонки "ВидЦены" в ТЧ документа.
//
// Возвращаемое значение:
// Булево.
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоВидуЦенПересортица(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, ВидЦен, Дата) Экспорт

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоВидуЦен(Запрос.Текст);

// Оприходование товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя = "Номенклатура";
ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
Запрос.УстановитьПараметр("Дата" , ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("ВидЦен", ВидЦен);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

// Списание товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Осуществляет заполнение видов цен и цен в тч Товары по виду цен по выделенным строкам.
//
// Параметры:
// Объект - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти - Строка - имя табличной части, в которой необходимо заполнить цены.
// ВидЦен - СправочникСсылка.ВидыЦен - Вид цен, по которому необходимо заполнить цены.
// ВыделенныеСтроки - Массив строк, в которых необходимо заполнить цены.
// ВидЦеныВТабличнойЧасти - Булево - признак наличия колонки "ВидЦены" в ТЧ документа.
//
// Возвращаемое значение:
// Булево
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоВидуЦен(СтруктураПараметров) Экспорт

Объект = СтруктураПараметров.Объект;
ИмяТабличнойЧасти = СтруктураПараметров.ИмяТабличнойЧасти;
ВидЦен = СтруктураПараметров.ВидЦен;
ВыделенныеСтроки = СтруктураПараметров.ВыделенныеСтроки;
Дата = СтруктураПараметров.Дата;
ЕстьНДС = СтруктураПараметров.ЕстьНДС;
ЕстьСуммаСНДС = СтруктураПараметров.ЕстьСуммаСНДС;
ВидЦеныВТабличнойЧасти = СтруктураПараметров.ВидЦеныВТабличнойЧасти;

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоВидуЦен(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("ВидЦен", ВидЦен);
ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

Если ВидЦеныВТабличнойЧасти Тогда

ТекСтрока.ВидЦены = ВидЦен;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

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

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоРозничнымЦенам(Запрос.Текст, Магазин);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Магазин", Магазин);

СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить("ФорматМагазина");
СтруктураРеквизитов.Вставить("ПравилоЦенообразования");
СтруктураРеквизитов.Вставить("ИспользоватьПрименениеЦен");
СтруктураРеквизитов.Вставить("ВидМинимальныхЦенПродажи");
РеквизитыМагазина = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Магазин, СтруктураРеквизитов);

Запрос.УстановитьПараметр("ФорматОбъектаЦенообразования", РеквизитыМагазина.ФорматМагазина);
Запрос.УстановитьПараметр("ПравилоЦенообразования", РеквизитыМагазина.ПравилоЦенообразования);
Запрос.УстановитьПараметр("ИспользоватьПрименениеЦен", РеквизитыМагазина.ИспользоватьПрименениеЦен);
Запрос.УстановитьПараметр("ПриводитьКМинимальнойЦене", ПриводитьКМинимальнойЦене И ЗначениеЗаполнено(РеквизитыМагазина.ВидМинимальныхЦенПродажи));
Запрос.УстановитьПараметр("ВидМинимальныхЦенПродажи", РеквизитыМагазина.ВидМинимальныхЦенПродажи);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Осуществляет заполнение цен в тч Товары по магазину по выделенным строкам.
//
// Параметры:
// Объект - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти - Строка - имя табличной части, в которой необходимо заполнить цены.
// Магазин - СправочникСсылка.Магазины - магазин, по которому необходимо заполнить цены.
// ВыделенныеСтроки - Массив строк, в которых необходимо заполнить цены.
//
// Возвращаемое значение:
// Булево
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоРозничнымЦенам(СтруктураПараметров) Экспорт

Объект = СтруктураПараметров.Объект;
ИмяТабличнойЧасти = СтруктураПараметров.ИмяТабличнойЧасти;
Магазин = СтруктураПараметров.Магазин;
ВыделенныеСтроки = СтруктураПараметров.ВыделенныеСтроки;
Дата = СтруктураПараметров.Дата;
ЕстьНДС = СтруктураПараметров.ЕстьНДС;
ЕстьСуммаСНДС = СтруктураПараметров.ЕстьСуммаСНДС;
ПриводитьКМинимальнойЦене = СтруктураПараметров.ПриводитьКМинимальнойЦене;

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоРозничнымЦенам(Запрос.Текст, Магазин);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Магазин", Магазин);

СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить("ФорматМагазина");
СтруктураРеквизитов.Вставить("ПравилоЦенообразования");
СтруктураРеквизитов.Вставить("ИспользоватьПрименениеЦен");
СтруктураРеквизитов.Вставить("ВидМинимальныхЦенПродажи");
РеквизитыМагазина = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Магазин, СтруктураРеквизитов);

Запрос.УстановитьПараметр("ФорматОбъектаЦенообразования", РеквизитыМагазина.ФорматМагазина);
Запрос.УстановитьПараметр("ПравилоЦенообразования", РеквизитыМагазина.ПравилоЦенообразования);
Запрос.УстановитьПараметр("ИспользоватьПрименениеЦен", РеквизитыМагазина.ИспользоватьПрименениеЦен);
Запрос.УстановитьПараметр("ПриводитьКМинимальнойЦене", ПриводитьКМинимальнойЦене И ЗначениеЗаполнено(РеквизитыМагазина.ВидМинимальныхЦенПродажи));
Запрос.УстановитьПараметр("ВидМинимальныхЦенПродажи", РеквизитыМагазина.ВидМинимальныхЦенПродажи);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

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

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоРозничнымЦенам(Запрос.Текст, Магазин);

// Оприходование товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя = "Номенклатура";
ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Магазин", Магазин);

СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить("ФорматМагазина");
СтруктураРеквизитов.Вставить("ПравилоЦенообразования");
СтруктураРеквизитов.Вставить("ИспользоватьПрименениеЦен");
СтруктураРеквизитов.Вставить("ВидМинимальныхЦенПродажи");
РеквизитыМагазина = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Магазин, СтруктураРеквизитов);

Запрос.УстановитьПараметр("ФорматОбъектаЦенообразования", РеквизитыМагазина.ФорматМагазина);
Запрос.УстановитьПараметр("ПравилоЦенообразования", РеквизитыМагазина.ПравилоЦенообразования);
Запрос.УстановитьПараметр("ИспользоватьПрименениеЦен", РеквизитыМагазина.ИспользоватьПрименениеЦен);
Запрос.УстановитьПараметр("ПриводитьКМинимальнойЦене", ПриводитьКМинимальнойЦене И ЗначениеЗаполнено(РеквизитыМагазина.ВидМинимальныхЦенПродажи));
Запрос.УстановитьПараметр("ВидМинимальныхЦенПродажи", РеквизитыМагазина.ВидМинимальныхЦенПродажи);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

// Списание товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

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

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоРозничнымЦенам(Запрос.Текст, Магазин);

// Оприходование товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя = "Номенклатура";
ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Магазин", Магазин);

СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить("ФорматМагазина");
СтруктураРеквизитов.Вставить("ПравилоЦенообразования");
СтруктураРеквизитов.Вставить("ИспользоватьПрименениеЦен");
СтруктураРеквизитов.Вставить("ВидМинимальныхЦенПродажи");
РеквизитыМагазина = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Магазин, СтруктураРеквизитов);

Запрос.УстановитьПараметр("ФорматОбъектаЦенообразования", РеквизитыМагазина.ФорматМагазина);
Запрос.УстановитьПараметр("ПравилоЦенообразования", РеквизитыМагазина.ПравилоЦенообразования);
Запрос.УстановитьПараметр("ИспользоватьПрименениеЦен", РеквизитыМагазина.ИспользоватьПрименениеЦен);
Запрос.УстановитьПараметр("ПриводитьКМинимальнойЦене", ПриводитьКМинимальнойЦене И ЗначениеЗаполнено(РеквизитыМагазина.ВидМинимальныхЦенПродажи));
Запрос.УстановитьПараметр("ВидМинимальныхЦенПродажи", РеквизитыМагазина.ВидМинимальныхЦенПродажи);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

// Списание товаров
ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика");
ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Осуществляет заполнение цен в тч Товары по прошлым закупкам по выделенным строкам.
//
// Параметры:
// Объект - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти - Строка - имя табличной части, в которой необходимо заполнить цены.
// ВыделенныеСтроки - Массив строк, в которых необходимо заполнить цены.
//
// Возвращаемое значение:
// Булево
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоПрошлымЗакупкам(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, ЕстьНДС = Истина, ЕстьСуммаСНДС = Ложь) Экспорт

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоПрошлымЗакупкам(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Объект.Ссылка), Объект.Дата, ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
Запрос.УстановитьПараметр("Поставщик", Объект.Контрагент);
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

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

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;


Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоДаннымПоставщика(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("ТоварыПоДаннымПоставщика", Объект.ТоварыПоДаннымПоставщика.Выгрузить(, "Номенклатура,Характеристика,Упаковка,Цена"));

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

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

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоПроизвольнойТаблицеЦен(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("ТаблицаЦен", ТаблицаЦен);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

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

ЦеныРассчитаны = Ложь;

Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда

Возврат ЦеныРассчитаны;

КонецЕсли;

МассивСтрок = Новый Массив;

Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл

СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);

Если СтрокаТаблицы = Неопределено Тогда

Продолжить;

КонецЕсли;

МассивСтрок.Добавить(СтрокаТаблицы);

КонецЦикла;

Если МассивСтрок.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;


Запрос = Новый Запрос;
СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
СформироватьЗапросЦеныПоПроизвольнойТаблицеЦен(Запрос.Текст);
Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
Запрос.УстановитьПараметр("ТаблицаЦен", ТаблицаЦен);

ТаблицаЦен = Запрос.Выполнить().Выгрузить();
ТаблицаЦен.Индексы.Добавить("НомерСтроки");

Если ТаблицаЦен.Количество() = 0 Тогда

Возврат Ложь;

КонецЕсли;

Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл

ЦенаНайдена = Ложь;

НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
ЦенаНайдена = (НайденнаяСтрока <> Неопределено);

Если НЕ ЦенаНайдена Тогда

Продолжить;

КонецЕсли;

ТекСтрока.Цена = НайденнаяСтрока.Цена;
ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;

Если ЕстьНДС Тогда

ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);

КонецЕсли;

Если ЕстьНДС И ЕстьСуммаСНДС Тогда

ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);

КонецЕсли;

ЦеныРассчитаны = Истина;

КонецЦикла;

Возврат ЦеныРассчитаны;

КонецФункции

// Возвращает дату ценообразования для документа.
//
// Параметры:
// Объект - Объект документа
//
// Возвращаемое значение
// Дата
Функция ДатаДляЦенообразованияДляДокумента(Объект) Экспорт

Если ЗначениеЗаполнено(Объект.Ссылка)
И ЗначениеЗаполнено(Объект.Дата) Тогда
Возврат Объект.Дата;
Иначе
Возврат ТекущаяДатаСеанса();
КонецЕсли;

КонецФункции // ДатаДляЦенообразования()

////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ ПОЛУЧЕНИЯ ЦЕН

// Функция получения цены номенклатуры по виду цены.
//
Функция ПолучитьЦенуПоВидуЦен(ВидЦены, Дата, Номенклатура, Характеристика, Упаковка) Экспорт

Цена = 0;

Если Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.ПодарочныйСертификат Тогда

Цена = Номенклатура.Номинал;
Если ЗначениеЗаполнено(Упаковка) Тогда
Цена = Цена*Упаковка.Коэффициент;
КонецЕсли;

Иначе

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

Запрос.УстановитьПараметр("ВидЦены" , ВидЦены);
Запрос.УстановитьПараметр("Дата" , Дата);
Запрос.УстановитьПараметр("Номенклатура" , Номенклатура);
Запрос.УстановитьПараметр("Характеристика", Характеристика);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если ЗначениеЗаполнено(Выборка.Цена) Тогда
Цена = Выборка.Цена;
Если ЗначениеЗаполнено(Упаковка) Тогда
Цена = Цена*Упаковка.Коэффициент;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;

Возврат Цена;

КонецФункции

// Функция получения цены продажи номенклатуры (регистр ДействующиеЦеныНоменклатуры).
//
Функция ПолучитьЦенуПродажи(Магазин, Дата, Номенклатура, Характеристика, Упаковка, ПриводитьКМинимальнойЦене = Ложь) Экспорт

Цена = 0;
Если Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.ПодарочныйСертификат Тогда

Цена = Номенклатура.Номинал;
Если ЗначениеЗаполнено(Упаковка) Тогда
Цена = Цена*Упаковка.Коэффициент;
КонецЕсли;

ИначеЕсли Магазин.ИспользоватьПрименениеЦен
И ПолучитьФункциональнуюОпцию("ИспользоватьПрименениеЦен") Тогда

Запрос = Новый Запрос;
Если ПриводитьКМинимальнойЦене
И ЗначениеЗаполнено(Магазин.ВидМинимальныхЦенПродажи) Тогда

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

Запрос.УстановитьПараметр("ВидЦены", Магазин.ВидМинимальныхЦенПродажи);

Иначе

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

КонецЕсли;

Запрос.УстановитьПараметр("Дата" , Дата);
Запрос.УстановитьПараметр("Номенклатура" , Номенклатура);
Запрос.УстановитьПараметр("Характеристика" , Характеристика);
Запрос.УстановитьПараметр("ОбъектЦенообразования", Магазин);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда

Если ЗначениеЗаполнено(Выборка.Цена) Тогда

Цена = Выборка.Цена;
Если ЗначениеЗаполнено(Упаковка) Тогда
Цена = Цена*Упаковка.Коэффициент;
КонецЕсли;

КонецЕсли;

КонецЕсли;

Иначе

Цена = ПолучитьЦенуПродажиПоЦенамНоменклатуры(Магазин, Дата, Номенклатура, Характеристика, Упаковка, ПриводитьКМинимальнойЦене);

КонецЕсли;

Возврат Цена;

КонецФункции

// Функция получения назначенной цены продажи номенклатуры (регистр ЦеныНоменклатуры).
//
Функция ПолучитьЦенуПродажиПоЦенамНоменклатуры(Магазин, Дата, Номенклатура, Характеристика, Упаковка, ПриводитьКМинимальнойЦене = Ложь) Экспорт

Цена = 0;

ИспользоватьАссортимент = АссортиментСервер.ПолучитьФункциональнуюОпциюКонтроляАссортимента(Магазин);
Если ИспользоватьАссортимент Тогда

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

Иначе

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

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

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если ЗначениеЗаполнено(Выборка.Цена) Тогда
КоэффициентУпаковки1 = ?(ЗначениеЗаполнено(Выборка.Упаковка), Выборка.Упаковка.Коэффициент, 1);
КоэффициентУпаковки2 = ?(ЗначениеЗаполнено(Упаковка), Упаковка.Коэффициент, 1);
Цена = Выборка.Цена*КоэффициентУпаковки2/КоэффициентУпаковки1;
КонецЕсли;
КонецЕсли;

Возврат Цена;

КонецФункции

// Функция получения последней цены закупки номенклатуры.
//
Функция ПолучитьЦенуПоследнейЗакупки(Дата, Магазин, Контрагент, СсылкаНаПоступление, Номенклатура, Характеристика, Упаковка) Экспорт

Цена = 0;

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

Запрос.УстановитьПараметр("Дата" , Дата);
Запрос.УстановитьПараметр("Ссылка" , СсылкаНаПоступление);
Запрос.УстановитьПараметр("Контрагент" , Контрагент);
Запрос.УстановитьПараметр("Магазин" , Магазин);
Запрос.УстановитьПараметр("Номенклатура" , Номенклатура);
Запрос.УстановитьПараметр("Характеристика", Характеристика);

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

Если ЗначениеЗаполнено(Выборка.Цена) Тогда

КоэффициентУпаковки1 = ?(ЗначениеЗаполнено(Выборка.Упаковка), Выборка.Упаковка.Коэффициент, 1);
КоэффициентУпаковки2 = ?(ЗначениеЗаполнено(Упаковка), Упаковка.Коэффициент, 1);
Цена = Выборка.Цена*КоэффициентУпаковки2/КоэффициентУпаковки1;

КонецЕсли;

КонецЕсли;

Возврат Цена;

КонецФункции

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ ОБСЛУЖИВАНИЯ СХЕМ ИНВЕНТАРИЗАЦИЙ, ЗАПОЛНЯЕМЫХ ПО ДАННЫМ ИБ

// Возвращает имена и типы полей, которые должны обязательно присутствовать
// в СКД, используемой для заполнения цен по данным ИБ.
//
// Возвращаемое значение:
// Соответствие
// В ключах содержатся имена полей, в значениях - типы полей.
//
Функция ПолучитьОбязательныеПоляСхемыКомпоновкиДанных()

Поля = Новый Соответствие();

Поля.Вставить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

Если ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры") Тогда
Поля.Вставить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
КонецЕсли;

Поля.Вставить("Количество", Новый ОписаниеТипов("Число"));
Поля.Вставить("КоличествоУпаковок", Новый ОписаниеТипов("Число"));

Поля.Вставить("КоличествоФакт", Новый ОписаниеТипов("Число"));
Поля.Вставить("КоличествоУпаковокФакт", Новый ОписаниеТипов("Число"));

Возврат Поля;

КонецФункции

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

Поле = НаборДанных.Поля.Найти(ИмяПоля);

Если Поле = Неопределено Тогда
Результат = Ложь;
Иначе
ТипыПоля = Поле.ТипЗначения.Типы();
ДопустимыеТипы = ТипЗначения.Типы();

Результат = Истина;
Если ТипыПоля.Количество() = ДопустимыеТипы.Количество() Тогда

Для Каждого Тип Из ДопустимыеТипы Цикл
Если ТипыПоля.Найти(Тип) = Неопределено Тогда
Результат = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;

Иначе
Результат = Ложь;
КонецЕсли;
КонецЕсли;

Если Не Результат Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(?(ЗначениеЗаполнено(СообщениеОбОшибке), СообщениеОбОшибке + ": ", "")
+ СтрЗаменить(СтрЗаменить(НСтр("ru='Схема компоновки данных для заполнения инвентаризации должна содержать поле ""%ИмяПоля%"" с типом значения ""%ТипЗначения%"".'"), "%ИмяПоля%", ИмяПоля), "%ТипЗначения%", ТипЗначения));
КонецЕсли;

Возврат Результат;

КонецФункции

// Проверяет схему компоновки данных на соответствие ограничениям, необходимым
// для ее использования при расчете цен.
//
// Параметры:
// СхемаКомпоновкиДанных - СхемаКомпоновкиДанных, которую необходимо проверить.
// СообщениеОбОшибке - Строка, содержит вводную часть сообщения об ошибке.
//
// Возвращаемое значение:
// Булево
// Истина, если проверка пройдена успешно, в противном случае Ложь.
//
Функция ПроверитьСхемуКомпоновкиДанных(СхемаКомпоновкиДанных, СообщениеОбОшибке = Неопределено) Экспорт

Результат = Истина;

Если СхемаКомпоновкиДанных <> Неопределено И СхемаКомпоновкиДанных.НаборыДанных.Количество() = 1 Тогда

РабочийНаборДанных = СхемаКомпоновкиДанных.НаборыДанных[0];
Поля = ПолучитьОбязательныеПоляСхемыКомпоновкиДанных();

Для Каждого Поле Из Поля Цикл
Если Не ПроверитьПолеНабораДанныхСКД(РабочийНаборДанных, Поле.Ключ, Поле.Значение, СообщениеОбОшибке) Тогда
Результат = Ложь;
КонецЕсли;
КонецЦикла;

Иначе

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(?(ЗначениеЗаполнено(СообщениеОбОшибке), СообщениеОбОшибке + ": ", "")
+ НСтр("ru='Схема компоновки данных для заполнения инвентаризации должна содержать один набор данных.'"));
Результат = Ложь;

КонецЕсли;

Возврат Результат;

КонецФункции

// Проверяет завершение пересчета товаров.
//
// Параметры:
// ДокументОбъект - ДокументОбъект.ПриказНаПроведениеИнвентаризации
// Отказ - Переменная отвечающая за прерывание проведения.
//
Процедура ПроверитьВыполнениеПересчетаТоваров(ДокументОбъект, Отказ) Экспорт

Если НЕ ДокументОбъект.Статус = Перечисления.СтатусыПриказовНаПроведениеИнвентаризацийТоваров.Закрыт Тогда

Возврат;

КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПересчетТоваров.Ссылка,
| ПересчетТоваров.ДокументОснование
|ИЗ
| Документ.ПересчетТоваров КАК ПересчетТоваров
|ГДЕ
| НЕ ПересчетТоваров.ПометкаУдаления
| И ПересчетТоваров.ДокументОснование = &ДокументОснование
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПересчетТоваров.Ссылка,
| ПересчетТоваров.Статус,
| ПересчетТоваров.ДокументОснование
|ИЗ
| Документ.ПересчетТоваров КАК ПересчетТоваров
|ГДЕ
| НЕ ПересчетТоваров.ПометкаУдаления
| И ПересчетТоваров.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПересчетовТоваров.Выполнено)
| И ПересчетТоваров.ДокументОснование = &ДокументОснование";

Запрос.УстановитьПараметр("ДокументОснование", ДокументОбъект.Ссылка);

МассивРезультатов = Запрос.ВыполнитьПакет();
НаличиеДокументовПересчета = НЕ МассивРезультатов[0].Пустой();

Если НЕ НаличиеДокументовПересчета Тогда

Текст = НСтр("ru = 'Пересчет товаров не начинался'");

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
Текст,
ДокументОбъект,
"Статус" ,
,
Отказ
);
Иначе
РезультатСписокНеВыполненныхПересчетов = МассивРезультатов[1];

Если НЕ РезультатСписокНеВыполненныхПересчетов.Пустой() Тогда
Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'По документу %1 не выполнены пересчеты:'"),
ДокументОбъект.Ссылка
);

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

Текст = Текст + Символы.ПС +
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = ' %1'"),
Выборка.Ссылка
);
КонецЦикла;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
Текст,
ДокументОбъект,
"Статус" ,
,
Отказ
);
КонецЕсли;
КонецЕсли;

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


////////////////////////////////////////////////////////////////////////////////
// ПРОЧИЕ ПРОЦЕДУРЫ И ФУНКЦИИ

// Получение данных отчета ТОРГ29 для построения отчета и формирования печатных форм переоценки склада.
//
Процедура ПолучитьДанныеТОРГ29(СтруктураПараметров, ТаблицаРезультат) Экспорт

УстановитьПривилегированныйРежим(Истина);

СхемаКомпоновкиДанных = Отчеты.ТоварныйОтчетТОРГ29.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

ИспользоватьАссортимент = АссортиментСервер.ПолучитьФункциональнуюОпциюКонтроляАссортимента(СтруктураПараметров.Магазин);

Если СтруктураПараметров.Свойство("Регистратор") Тогда

ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос;

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


Если Найти(ТекстЗапроса, ЗаменяемыйТекст) = 0 Тогда
ВызватьИсключение НСтр("ru = 'Некорректный текст запроса'");
КонецЕсли;

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

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЗаменяемыйТекст, ТекстЗамены);
СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапроса;

КонецЕсли;

Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры") Тогда

ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос;

ЗаменяемыйТекст =
" ВЫБОР
| КОГДА ЦеныНоменклатурыА.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
| ИЛИ ЕСТЬNULL(ЦеныНоменклатурыА.Упаковка.Коэффициент, 0) = 0
| ТОГДА ЦеныНоменклатурыА.Цена
| ИНАЧЕ ЦеныНоменклатурыА.Цена / ЦеныНоменклатурыА.Упаковка.Коэффициент
| КОНЕЦ КАК Цена,
| ВЫБОР
| КОГДА ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
| ТОГДА 0
| КОГДА ЦеныНоменклатурыБ.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
| ИЛИ ЕСТЬNULL(ЦеныНоменклатурыБ.Упаковка.Коэффициент, 0) = 0
| ТОГДА ЦеныНоменклатурыБ.Цена
| ИНАЧЕ ЦеныНоменклатурыБ.Цена / ЦеныНоменклатурыБ.Упаковка.Коэффициент
| КОНЕЦ КАК СтараяЦена,
| ВЫБОР
| КОГДА ЦеныНоменклатурыА.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
| ИЛИ ЕСТЬNULL(ЦеныНоменклатурыА.Упаковка.Коэффициент, 0) = 0
| ТОГДА ЦеныНоменклатурыА.Цена
| ИНАЧЕ ЦеныНоменклатурыА.Цена / ЦеныНоменклатурыА.Упаковка.Коэффициент
| КОНЕЦ - ВЫБОР
| КОГДА ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
| ТОГДА 0
| КОГДА ЦеныНоменклатурыБ.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
| ИЛИ ЕСТЬNULL(ЦеныНоменклатурыБ.Упаковка.Коэффициент, 0) = 0
| ТОГДА ЦеныНоменклатурыБ.Цена
| ИНАЧЕ ЦеныНоменклатурыБ.Цена / ЦеныНоменклатурыБ.Упаковка.Коэффициент
| КОНЕЦ КАК Дельта";

Если Найти(ТекстЗапроса, ЗаменяемыйТекст) = 0 Тогда
ВызватьИсключение НСтр("ru = 'Некорректный текст запроса'");
КонецЕсли;

ТекстЗамены =
" ЦеныНоменклатурыА.Цена КАК Цена,
| ВЫБОР
| КОГДА
| ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
| ТОГДА
| 0
| ИНАЧЕ
| ЦеныНоменклатурыБ.Цена
| КОНЕЦ КАК СтараяЦена,
| ЦеныНоменклатурыА.Цена
| - ВЫБОР
| КОГДА
| ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
| ТОГДА
| 0
| ИНАЧЕ
| ЦеныНоменклатурыБ.Цена
| КОНЕЦ
| КАК Дельта";

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЗаменяемыйТекст, ТекстЗамены);
СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапроса;

КонецЕсли;

// Подготовка компоновщика макета компоновки данных.
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

// Выбранные поля.
ОбязательныеПоля = Новый Массив;

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

Компоновщик.Настройки.Выбор.Элементы.Очистить();
Для Каждого ОбязательноеПоле Из ОбязательныеПоля Цикл
ПолеСКД = КомпоновкаДанныхСервер.НайтиПолеСКДПоПолномуИмени(Компоновщик.Настройки.Выбор.ДоступныеПоляВыбора.Элементы, ОбязательноеПоле);
Если ПолеСКД <> Неопределено Тогда
ВыбранноеПоле = Компоновщик.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = ПолеСКД.Поле;
КонецЕсли;
КонецЦикла;

// Добавление группировок.
Компоновщик.Настройки.Структура.Очистить();

Если СтруктураПараметров.Свойство("Регистратор") Тогда
ОбщегоНазначенияРТКлиентСервер.ДобавитьГруппировку(Компоновщик);
Иначе
ОбщегоНазначенияРТКлиентСервер.ДобавитьГруппировку(Компоновщик, "Регистратор");
КонецЕсли;


// Отключение итогов.
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметрВывода(Компоновщик,"ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметрВывода(Компоновщик,"ГоризонтальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);

Период = Новый СтандартныйПериод;

Если СтруктураПараметров.Свойство("ДатаНачала") Тогда
Период.ДатаНачала = НачалоДня(СтруктураПараметров.ДатаНачала);
КонецЕсли;

Если СтруктураПараметров.Свойство("ДатаОкончания") Тогда
Период.ДатаОкончания = КонецДня(СтруктураПараметров.ДатаОкончания);
КонецЕсли;

// Установка отборов.
ОбщегоНазначенияРТКлиентСервер.ДобавитьОтбор(Компоновщик, "Организация", СтруктураПараметров.Организация);
ОбщегоНазначенияРТКлиентСервер.ДобавитьОтбор(Компоновщик, "Склад", СтруктураПараметров.Склад, ,ЗначениеЗаполнено(СтруктураПараметров.Склад));

// Параметры:
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "ПериодОтчета", Период);
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "Магазин", СтруктураПараметров.Магазин);
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "ОбъектПланирования", СтруктураПараметров.Магазин.ФорматМагазина);
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "ИспользоватьАссортимент", ИспользоватьАссортимент И СтруктураПараметров.Магазин.КонтролироватьАссортимент);
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "ИспользоватьПрименениеЦен", СтруктураПараметров.Магазин.ИспользоватьПрименениеЦен
И ПолучитьФункциональнуюОпцию("ИспользоватьПрименениеЦен"));
ОбщегоНазначенияРТКлиентСервер.УстановитьПараметр(Компоновщик.Настройки, "ПравилоЦенообразования", СтруктураПараметров.Магазин.ПравилоЦенообразования);

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

// Компоновка макета компоновки данных.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Компоновщик.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

// Построение таблицы значений.
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновкиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений();
ИсходныеДанные = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ИсходныеДанные);
ПроцессорВывода.Вывести(Процессор);

ТаблицаРезультат = ИсходныеДанные;
УстановитьПривилегированныйРежим(Ложь);

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

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

ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ
| Товары.НомерСтроки КАК НомерСтроки,
| Товары.Номенклатура КАК Номенклатура,
| Товары.Характеристика КАК Характеристика,
| Товары.Упаковка КАК Упаковка
|ПОМЕСТИТЬ ВременнаяТаблицаТовары
|ИЗ
| &Товары КАК Товары
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика
|;";

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

Процедура СформироватьЗапросПоСебестоимости(ТекстЗапроса)

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

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

// Формирует текст запроса к регистру ЦеныНоменклатуры.
//
// Параметры:
// ТекстЗапроса - Строка - текстовая строка, к которой необходимо добавить текст запроса.
//
Процедура СформироватьЗапросЦеныПоВидуЦен(ТекстЗапроса)

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

КонецПроцедуры // СформироватьЗапросЦеныПрайсЛиста()

// Формирует текст запроса по ценам прошлых закупок.
//
// Параметры:
// ТекстЗапроса - Строка - текстовая строка, к которой необходимо добавить текст запроса.
//
Процедура СформироватьЗапросЦеныПоПрошлымЗакупкам(ТекстЗапроса)

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

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

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

ТекстЗапроса = ТекстЗапроса + "
|/////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыПоДаннымПоставщика.Номенклатура,
| ТоварыПоДаннымПоставщика.Характеристика,
| ТоварыПоДаннымПоставщика.Упаковка,
| ТоварыПоДаннымПоставщика.Цена
|ПОМЕСТИТЬ ТоварыПоДаннымПоставщика
|ИЗ
| &ТоварыПоДаннымПоставщика КАК ТоварыПоДаннымПоставщика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВременнаяТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ВременнаяТаблицаТовары.Номенклатура КАК Номенклатура,
| ВременнаяТаблицаТовары.Характеристика КАК Характеристика,
| ВременнаяТаблицаТовары.Упаковка КАК Упаковка,
| ВременнаяТаблицаТовары.Упаковка.Коэффициент КАК КоэффициентУпаковки,
| ВЫБОР
| КОГДА ВременнаяТаблицаТовары.Упаковка <> ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
| ТОГДА ВременнаяТаблицаТовары.Упаковка.Коэффициент
| ИНАЧЕ 1
| КОНЕЦ * ТоварыПоДаннымПоставщика.Цена / ЕСТЬNULL(ТоварыПоДаннымПоставщика.Упаковка.Коэффициент, 1) КАК Цена
|ИЗ
| ВременнаяТаблицаТовары КАК ВременнаяТаблицаТовары
| ЛЕВОЕ СОЕДИНЕНИЕ ТоварыПоДаннымПоставщика КАК ТоварыПоДаннымПоставщика
| ПО ВременнаяТаблицаТовары.Номенклатура = ТоварыПоДаннымПоставщика.Номенклатура
| И ВременнаяТаблицаТовары.Характеристика = ТоварыПоДаннымПоставщика.Характеристика";

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

// Формирует текст запроса по ценам произвольной таблицы цен.
//
// Параметры:
// ТекстЗапроса - Строка - текстовая строка, к которой необходимо добавить текст запроса.
//
Процедура СформироватьЗапросЦеныПоПроизвольнойТаблицеЦен(ТекстЗапроса)

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

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

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

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

// Удаляет подарочные сертификаты.
//
// Параметры:
// ТабличнаяЧасть - табличная часть документа.
//
Процедура УдалитьПодарочныеСертификаты(ТабличнаяЧасть) Экспорт

КолвоЭлементовКоллекции = ТабличнаяЧасть.Количество();
Для ОбратныйИндекс = 1 По КолвоЭлементовКоллекции Цикл
ЭлементКоллекции = ТабличнаяЧасть[КолвоЭлементовКоллекции - ОбратныйИндекс];

Если ЭлементКоллекции.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.ПодарочныйСертификат Тогда
ТабличнаяЧасть.Удалить(ЭлементКоллекции);
КонецЕсли;
КонецЦикла;


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

// По табличной части объекта получает массив остатков.
// Параметры:
// Объект - объект документа или обработки
// ИмяТабличнойЧасти = имя табличной части.
//
// Возвращаемое значение
// Массив
//
Функция ПолучитьОстаткиНоменклатуры(Объект, ИмяТабличнойЧасти) Экспорт

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаНоменклатуры.Номенклатура,
| ТаблицаНоменклатуры.Характеристика,
| ТаблицаНоменклатуры.Склад
|ПОМЕСТИТЬ ТаблицаВЗапрос
|ИЗ
| &ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад,
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.Характеристика,
| ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| (Номенклатура, Характеристика, Склад) В
| (ВЫБРАТЬ
| ТаблицаВЗапрос.Номенклатура,
| ТаблицаВЗапрос.Характеристика,
| ТаблицаВЗапрос.Склад
| ИЗ
| ТаблицаВЗапрос КАК ТаблицаВЗапрос)) КАК ТоварыНаСкладахОстатки";

ТаблицаНоменклатуры = Объект[ИмяТабличнойЧасти].Выгрузить();

Запрос.УстановитьПараметр("ТаблицаНоменклатуры", ТаблицаНоменклатуры);

Результат = Запрос.Выполнить();
ТаблицаОстатков = Результат.Выгрузить();

СтруктураПоиска = Новый Структура;
МассивОстатков = Новый Массив;

Для каждого СтрокаТаблицыНоменклатуры Из ТаблицаНоменклатуры Цикл

СтруктураПоиска.Вставить("Номенклатура" , СтрокаТаблицыНоменклатуры.Номенклатура);
СтруктураПоиска.Вставить("Характеристика", СтрокаТаблицыНоменклатуры.Характеристика);
СтруктураПоиска.Вставить("Склад" , СтрокаТаблицыНоменклатуры.Склад);

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

Если МассивСтрок.Количество() > 0 Тогда

МассивОстатков.Добавить(МассивСтрок[0].КоличествоОстаток)

Иначе

МассивОстатков.Добавить(0)

КонецЕсли;

КонецЦикла;

Возврат МассивОстатков;
КонецФункции

// По табличной части объекта получает массив остатков.
// Параметры:
// Объект - объект документа или обработки
// ИмяТабличнойЧасти = имя табличной части.
//
//
Процедура ЗаполнитьОстаткиНоменклатуры(Объект, ИмяТабличнойЧасти) Экспорт

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаНоменклатуры.Номенклатура,
| ТаблицаНоменклатуры.Характеристика,
| ТаблицаНоменклатуры.Склад
|ПОМЕСТИТЬ ТаблицаВЗапрос
|ИЗ
| &ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад,
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.Характеристика,
| ТоварыНаСкладахОстатки.КоличествоОстаток - ТоварыНаСкладахОстатки.РезервОстаток КАК ОстатокБезРезерва
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| (Номенклатура, Характеристика, Склад) В
| (ВЫБРАТЬ
| ТаблицаВЗапрос.Номенклатура,
| ТаблицаВЗапрос.Характеристика,
| ТаблицаВЗапрос.Склад
| ИЗ
| ТаблицаВЗапрос КАК ТаблицаВЗапрос)) КАК ТоварыНаСкладахОстатки";

ТаблицаНоменклатуры = Объект[ИмяТабличнойЧасти].Выгрузить();

Запрос.УстановитьПараметр("ТаблицаНоменклатуры", ТаблицаНоменклатуры);

Результат = Запрос.Выполнить();
ТаблицаОстатков = Результат.Выгрузить();

СтруктураПоиска = Новый Структура;
МассивОстатков = Новый Массив;

Для каждого СтрокаТаблицыНоменклатуры Из Объект[ИмяТабличнойЧасти] Цикл

СтруктураПоиска.Вставить("Номенклатура" , СтрокаТаблицыНоменклатуры.Номенклатура);
СтруктураПоиска.Вставить("Характеристика", СтрокаТаблицыНоменклатуры.Характеристика);
СтруктураПоиска.Вставить("Склад" , СтрокаТаблицыНоменклатуры.Склад);

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

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

КонецЦикла;

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

// Процедура формирования движений по регистру "Движения серий товаров".
//
// Параметры:
// ДокументОбъект - Текущий документ.
// Отказ - Булево - Признак отказа от проведения документа.
//
Процедура ОтразитьДвиженияСерийТоваров(ДополнительныеСвойства, Движения, Отказ) Экспорт
Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаДвиженияСерийТоваров;

Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Движения.ДвиженияСерийТоваров.Записывать = Истина;
Движения.ДвиженияСерийТоваров.Загрузить(Таблица);
КонецПроцедуры

// Функция возвращает пустой шаблон структуры параметров для процедуры ЗаполнитьЦеныВыделенныхСтрокПоВидуЦен.
//
Функция СтруктураПараметровЗаполненияПоВидуЦен() Экспорт

СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("Объект");
СтруктураПараметров.Вставить("ИмяТабличнойЧасти");
СтруктураПараметров.Вставить("ВидЦен");
СтруктураПараметров.Вставить("ВыделенныеСтроки");
СтруктураПараметров.Вставить("Дата");
СтруктураПараметров.Вставить("ЕстьНДС", Истина);
СтруктураПараметров.Вставить("ЕстьСуммаСНДС", Ложь);
СтруктураПараметров.Вставить("ВидЦеныВТабличнойЧасти", Ложь);

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

КонецФункции

// Функция возвращает пустой шаблон структуры параметров для процедуры ЗаполнитьЦеныВыделенныхСтрокПоРозничнымЦенам.
//
Функция СтруктураПараметровЗаполненияПоРозничнымЦенам() Экспорт

СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("Объект");
СтруктураПараметров.Вставить("ИмяТабличнойЧасти");
СтруктураПараметров.Вставить("Магазин");
СтруктураПараметров.Вставить("ВыделенныеСтроки");
СтруктураПараметров.Вставить("Дата");
СтруктураПараметров.Вставить("ЕстьНДС", Истина);
СтруктураПараметров.Вставить("ЕстьСуммаСНДС", Ложь);
СтруктураПараметров.Вставить("ПриводитьКМинимальнойЦене", Ложь);

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

КонецФункции
21.03.2017 14:40
KirillHome
 
Цитата:
Tigra_N
Для читаемости - переделаю.
На будующее - не забывай обрамлять тексты программ тегами [code]текст модуля[/code]
Код модуля ЗапасыСервер:

Код:
///////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ ФОРМИРОВАНИЯ ДВИЖЕНИЙ

// Процедура записи движений в регистр ТоварыНаСкладах.
//
Процедура ОтразитьТоварыНаСкладах(ДополнительныеСвойства, Движения, Отказ) Экспорт

	Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыНаСкладах;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Движения.ТоварыНаСкладах.Записывать = Истина;
	Движения.ТоварыНаСкладах.Загрузить(Таблица);
	
КонецПроцедуры

// Процедура записи движений в регистр ТоварыОрганизаций.
//
Процедура ОтразитьТоварыОрганизаций(ДополнительныеСвойства, Движения, Отказ) Экспорт

	Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыОрганизаций;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Движения.ТоварыОрганизаций.Записывать = Истина;
	Движения.ТоварыОрганизаций.Загрузить(Таблица);
	
КонецПроцедуры

// Процедура записи движений в регистр ТоварыКПоступлению.
//
Процедура ОтразитьТоварыКПоступлению(ДополнительныеСвойства, Движения, Отказ) Экспорт

	Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыКПоступлению;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Движения.ТоварыКПоступлению.Записывать = Истина;
	Движения.ТоварыКПоступлению.Загрузить(Таблица);
	
КонецПроцедуры

// Процедура записи движений в регистр ТоварыКОтгрузке.
//
Процедура ОтразитьТоварыКОтгрузке(ДополнительныеСвойства, Движения, Отказ) Экспорт

	Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыКОтгрузке;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Движения.ТоварыКОтгрузке.Записывать = Истина;
	Движения.ТоварыКОтгрузке.Загрузить(Таблица);
	
КонецПроцедуры

// Процедура записи движений в регистр ТоварыКОформлениюИзлишковНедостач.
//
Процедура ОтразитьТоварыКОформлениюИзлишковНедостач(ДополнительныеСвойства, Движения, Отказ) Экспорт

	Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыКОформлениюИзлишковНедостач;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Движения.ТоварыКОформлениюИзлишковНедостач.Записывать = Истина;
	Движения.ТоварыКОформлениюИзлишковНедостач.Загрузить(Таблица);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С СЕРИЙНЫМИ НОМЕРАМИ И ПОДАРОЧНЫМИ СЕРТИФИКАТАМИ

// Процедура записи движений в регистр ДвиженияСерийныхНомеров.
//
Процедура ОтразитьДвиженияСерийныхНомеров(ДополнительныеСвойства, Движения, Отказ) Экспорт

	Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСерийныхНомеров;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Движения.ДвиженияСерийныхНомеров.Записывать = Истина;
	Движения.ДвиженияСерийныхНомеров.Загрузить(Таблица);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С СЕБЕСТОИМОСТЬЮ

// Процедура записи движений в регистр СебестоимостьНоменклатуры.
//
Процедура ОтразитьДвиженияСебестоимостьНоменклатуры(ДополнительныеСвойства, Движения, Отказ) Экспорт

	Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСебестоимостьНоменклатуры;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		
		Возврат;
		
	КонецЕсли;

	Движения.СебестоимостьНоменклатуры.Записывать = Истина;
	Движения.СебестоимостьНоменклатуры.Загрузить(Таблица);
	
КонецПроцедуры

// Процедура записи движений в регистр СебестоимостьНоменклатуры.
//
Процедура ОтразитьДвиженияСебестоимостьПоставкиТоваров(ДополнительныеСвойства, Движения, Отказ) Экспорт

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

	Движения.СебестоимостьПоставкиТоваров.Записывать = Истина;
	Движения.СебестоимостьПоставкиТоваров.Загрузить(Таблица);
	
КонецПроцедуры

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

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

// Процедуры обновления стоимости товаров.
//
Процедура РасчетСебестоимости() Экспорт
	
	Документы.УстановкаСебестоимости.ВыполнитьРегламентноеЗаданиеРасчетСебестоимости();
	
КонецПроцедуры

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

// Процедура распределения стоимости услуг на себестоимость товаров.
//
Процедура РаспределитьУслугиНаСебестоимость(УслугиНаРаспределение, ПравилоРаспределения, ТаблицаСебестоимостьНоменклатуры,
											СпособУчета, ТаблицаСебестоимостьПоставкиТоваров = Неопределено, ИмяКолонкиБазыСумма = "Сумма") Экспорт
	
	Если УслугиНаРаспределение.Количество() = 0
		ИЛИ СпособУчета = Перечисления.СпособыУчетаСебестоимости.ПриниматьИзУправляющейСистемы Тогда
		
		Возврат;
	КонецЕсли;
	
	Если СпособУчета = Перечисления.СпособыУчетаСебестоимости.АвтономныйУчет ИЛИ ТаблицаСебестоимостьПоставкиТоваров = Неопределено Тогда
		ТаблицаНоменклатуры = ТаблицаСебестоимостьНоменклатуры;
	Иначе
		ТаблицаНоменклатуры = ТаблицаСебестоимостьПоставкиТоваров;
	КонецЕсли;
	
	Для Каждого Услуга Из УслугиНаРаспределение Цикл
		
		Если ПравилоРаспределения = Перечисления.ПравилаРаспределенияНаСебестоимостьТоваров.ПропорциональноКоличеству Тогда
			МассивКоэфф = ТаблицаНоменклатуры.ВыгрузитьКолонку("Количество");
		Иначе
			МассивКоэфф = ТаблицаНоменклатуры.ВыгрузитьКолонку(ИмяКолонкиБазыСумма);
		КонецЕсли;
		
		РаспределенныйМассив = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(Услуга.Сумма, МассивКоэфф);
		Индекс = 0;
		
		Если РаспределенныйМассив = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		Для Каждого СтрокаТоваров Из ТаблицаНоменклатуры Цикл
			СебестоимостьСтроки = РаспределенныйМассив[Индекс];
			СтрокаТоваров.Сумма = СтрокаТоваров.Сумма + СебестоимостьСтроки;
			
			СтрокаТоваров.Цена = СтрокаТоваров.Сумма / СтрокаТоваров.Количество;
			Индекс = Индекс + 1;
			
		КонецЦикла;
	КонецЦикла;
	
	Если СпособУчета = Перечисления.СпособыУчетаСебестоимости.АвтономныйУчет ИЛИ ТаблицаСебестоимостьПоставкиТоваров = Неопределено Тогда
		ТаблицаСебестоимостьНоменклатуры = ТаблицаНоменклатуры;
	Иначе
		ТаблицаСебестоимостьПоставкиТоваров = ТаблицаНоменклатуры;
	КонецЕсли;
	
КонецПроцедуры

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

	ТаблицаУзлов.Колонки.Добавить("НомерУзла", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(25, 0));
	ТаблицаУзлов.ЗагрузитьКолонку(МассивУзлов, "НомерУзла");

	Запрос.Текст =
	"
	|ВЫБРАТЬ *
	|
	|ПОМЕСТИТЬ ВтУзлыКорректировки
	|
	|ИЗ
	|	&ТаблицаУзлов КАК ТаблицаУзлов
	|
	|ИНДЕКСИРОВАТЬ ПО НомерУзла;
	|
	|";
	Запрос.УстановитьПараметр("ТаблицаУзлов", ТаблицаУзлов);
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	Выборка.Следующий();
	
	Возврат Выборка.Количество;
	
КонецФункции

Процедура РассчитатьСтоимость(СтруктураПериод, МенеджерВременныхТаблиц)
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("КонецПериода",      СтруктураПериод.КонецПериода);
	Запрос.УстановитьПараметр("НачалоПериода",     СтруктураПериод.НачалоПериода);
	
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.Текст = ТекстЗапросаДвиженияСтоимости();
	Запрос.Выполнить();
	
	РешитьСЛУ(МенеджерВременныхТаблиц);
	
КонецПроцедуры

Процедура РешитьСЛУ(МенеджерВременныхТаблиц)
	
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	ТребуемаяТочность      = 0.000001;
	МаксКоличествоИтераций = 200;
	
	СчетчикИтераций        = 1;
	ТекущееОтклонение      = 1;
	
	Пока ТекущееОтклонение > ТребуемаяТочность И СчетчикИтераций <= МаксКоличествоИтераций Цикл
		
		Запрос.Текст = 
		"
		// 0 Расчет коэффициентов (количество перехода из состояния в состояние) уравнения.
		|ВЫБРАТЬ
		|	УзлыКорректировки.НомерУзла                                     КАК НомерУзла,
		|	ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.Стоимость)                  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициент,
		|	СУММА(ВЫРАЗИТЬ(
		|			ВЫБОР
		|				КОГДА УзлыКорректировки.Количество = 0
		|					ИЛИ ПеремещенияСписания.НомерУзлаПриемник ЕСТЬ NULL
		|					ИЛИ ПеремещенияСписания.НомерУзлаИсточник ЕСТЬ NULL ТОГДА
		|					0
		|				ИНАЧЕ
		|					ВтТаблицаРешений.Стоимость * ПеремещенияСписания.Количество / УзлыКорректировки.Количество
		|			КОНЕЦ КАК ЧИСЛО(23,10))) КАК Стоимость
		|
		|ПОМЕСТИТЬ ВременнаяТаблицаРешений
		|ИЗ
		|	ВтУзлыКорректировки КАК УзлыКорректировки
		|
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВтПеремещенияСписания КАК ПеремещенияСписания
		|		ПО УзлыКорректировки.НомерУзла = ПеремещенияСписания.НомерУзлаПриемник
		|
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ВтТаблицаРешений
		|		ПО ПеремещенияСписания.НомерУзлаИсточник = ВтТаблицаРешений.НомерУзла
		|
		|СГРУППИРОВАТЬ ПО
		|	УзлыКорректировки.НомерУзла
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	НомерУзла
		|;
		|/////////////////////////////////////////////////////////////////////////////
		// 1 Расчет ошибки расчета.
		|ВЫБРАТЬ
		|	ЕСТЬNULL(
		|		МАКСИМУМ(
		|			ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.Стоимость,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициент
		|			 + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))) > 0 ТОГДА
		|
		|					ЕСТЬNULL(ТаблицаРешений.Стоимость,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициент
		|				 	+ ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))
		|			ИНАЧЕ
		|				-(
		|					ЕСТЬNULL(ТаблицаРешений.Стоимость,0) - (ВременнаяТаблицаРешений.СвободныйКоэффициент
		|					 + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))
		|					)
		|			КОНЕЦ
		|			)
		|		,0) КАК Отклонение
		|ИЗ
		|	ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
		|
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ТаблицаРешений
		|		ПО ВременнаяТаблицаРешений.НомерУзла = ТаблицаРешений.НомерУзла
		|;
		|//////////////////////////////////////////////////////////////
		|УНИЧТОЖИТЬ ВтТаблицаРешений
		|;
		// 3 Суммирование коэффициентов.
		|//////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ВременнаяТаблицаРешений.НомерУзла  КАК НомерУзла,
		|	ВЫРАЗИТЬ(
		|		ВременнаяТаблицаРешений.СвободныйКоэффициент
		|			+ ВременнаяТаблицаРешений.Стоимость
		|		КАК ЧИСЛО(23,10))              КАК Стоимость
		|
		|ПОМЕСТИТЬ ВтТаблицаРешений
		|
		|ИЗ
		|	ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	НомерУзла
		|;
		|//////////////////////////////////////////////////////////////
		|	УНИЧТОЖИТЬ ВременнаяТаблицаРешений
		|";
		
		Выборка = Запрос.ВыполнитьПакет()[1].Выбрать();
		Если Выборка.Следующий() Тогда
			
			ТекущееОтклонение = Выборка.Отклонение;
			
		Иначе
			
			ТекущееОтклонение = 0;
			
		КонецЕсли;
		
		СчетчикИтераций = СчетчикИтераций + 1;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

Функция ПоправкаПоСборкамТоваров(СтруктураПериод, МенеджерВременныхТаблиц, НастройкаСпособаУчета)
	
	ТаблицаПриемник = Новый ТаблицаЗначений;
	ТаблицаПриемник.Колонки.Добавить("Магазин", Новый ОписаниеТипов("СправочникСсылка.Магазины"));
	ТаблицаПриемник.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	ТаблицаПриемник.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
	ТаблицаПриемник.Колонки.Добавить("КоличествоКомплектов", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 3));
	ТаблицаПриемник.Колонки.Добавить("Сумма", ОбщегоНазначенияРТКлиентСервер.ПолучитьОписаниеТиповЧисла(15, 2));
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	СборкаТоваров.Ссылка,
	|	СборкаТоваров.ВидОперации,
	|	СборкаТоваров.Магазин,
	|	СборкаТоваров.Дата КАК Период
	|ИЗ
	|	Документ.СборкаТоваров КАК СборкаТоваров
	|ГДЕ
	|	СборкаТоваров.Проведен
	|	И СборкаТоваров.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	|";
	
	Запрос.УстановитьПараметр("КонецПериода", СтруктураПериод.КонецПериода);
	Запрос.УстановитьПараметр("НачалоПериода", СтруктураПериод.НачалоПериода);
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		// Сборка из комплектующих
		Если Выборка.ВидОперации = Перечисления.ВидыОперацийКомплектацияНоменклатуры.Комплектация Тогда
			
			Запрос = Новый Запрос;
			Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
			Запрос.Текст = 
			"ВЫБРАТЬ
			|	СборкаТоваровТовары.Ссылка.Магазин,
			|	СборкаТоваровТовары.Ссылка.Номенклатура КАК Номенклатура,
			|	СборкаТоваровТовары.Ссылка.Характеристика КАК Характеристика,
			|	СборкаТоваровТовары.Ссылка.Количество КАК КоличествоКомплектов,
			|	СборкаТоваровТовары.Номенклатура КАК НоменклатураКомплектующая,
			|	СборкаТоваровТовары.Характеристика КАК ХарактеристикаКомплектующая,
			|	СборкаТоваровТовары.Количество
			|ПОМЕСТИТЬ Комплектующие
			|ИЗ
			|	Документ.СборкаТоваров.Товары КАК СборкаТоваровТовары
			|ГДЕ
			|	СборкаТоваровТовары.Ссылка = &Ссылка
			|	И НЕ СборкаТоваровТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	Комплектующие.Магазин,
			|	Комплектующие.Номенклатура,
			|	Комплектующие.Характеристика,
			|	Комплектующие.КоличествоКомплектов,
			|	Комплектующие.НоменклатураКомплектующая,
			|	Комплектующие.ХарактеристикаКомплектующая,
			|	Комплектующие.Количество,
			|	0 КАК Цена,
			|	Комплектующие.Количество * ЕСТЬNULL(СебестоимостьПоступлений.Стоимость, 0) КАК Сумма,
			|	ВЫБОР
			|		КОГДА Себестоимость.Период ЕСТЬ НЕ NULL 
			|				И СебестоимостьПустойМагазин.Период ЕСТЬ НЕ NULL 
			|			ТОГДА ВЫБОР
			|					КОГДА Себестоимость.Период >= СебестоимостьПустойМагазин.Период
			|						ТОГДА Себестоимость.Цена
			|					ИНАЧЕ СебестоимостьПустойМагазин.Цена
			|				КОНЕЦ
			|		ИНАЧЕ ВЫБОР
			|				КОГДА Себестоимость.Период ЕСТЬ НЕ NULL 
			|					ТОГДА Себестоимость.Цена
			|				ИНАЧЕ СебестоимостьПустойМагазин.Цена
			|			КОНЕЦ
			|	КОНЕЦ КАК СебестоимостьИзРегистра
			|ПОМЕСТИТЬ Результат
			|ИЗ
			|	Комплектующие КАК Комплектующие
			|		ЛЕВОЕ СОЕДИНЕНИЕ СебестоимостьПоступлений КАК СебестоимостьПоступлений
			|		ПО Комплектующие.Магазин = СебестоимостьПоступлений.Магазин
			|			И Комплектующие.НоменклатураКомплектующая = СебестоимостьПоступлений.Номенклатура
			|			И Комплектующие.ХарактеристикаКомплектующая = СебестоимостьПоступлений.Характеристика
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СебестоимостьНоменклатуры.СрезПоследних(&НачалоПериода, Магазин <> ЗНАЧЕНИЕ(Справочник.Магазины.ПустаяСсылка)) КАК Себестоимость
			|		ПО Комплектующие.Магазин = Себестоимость.Магазин
			|			И Комплектующие.НоменклатураКомплектующая = Себестоимость.Номенклатура
			|			И Комплектующие.ХарактеристикаКомплектующая = Себестоимость.Характеристика
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СебестоимостьНоменклатуры.СрезПоследних(&НачалоПериода, Магазин = ЗНАЧЕНИЕ(Справочник.Магазины.ПустаяСсылка)) КАК СебестоимостьПустойМагазин
			|		ПО Комплектующие.НоменклатураКомплектующая = СебестоимостьПустойМагазин.Номенклатура
			|			И Комплектующие.ХарактеристикаКомплектующая = СебестоимостьПустойМагазин.Характеристика
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	Результат.Магазин,
			|	Результат.Номенклатура,
			|	Результат.Характеристика,
			|	Результат.КоличествоКомплектов,
			|	Результат.НоменклатураКомплектующая,
			|	Результат.ХарактеристикаКомплектующая,
			|	Результат.Количество,
			|	Результат.Цена,
			|	ВЫБОР
			|		КОГДА Результат.Сумма = 0
			|			ТОГДА Результат.Количество * Результат.СебестоимостьИзРегистра
			|		ИНАЧЕ Результат.Сумма
			|	КОНЕЦ КАК Сумма
			|ИЗ
			|	Результат КАК Результат
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ТаблицаТовары.Номенклатура КАК Номенклатура,
			|	ТаблицаТовары.Характеристика КАК Характеристика,
			|	ТаблицаТовары.Количество КАК Количество
			|ПОМЕСТИТЬ Услуги
			|ИЗ
			|	Документ.СборкаТоваров.Товары КАК ТаблицаТовары
			|ГДЕ
			|	ТаблицаТовары.Ссылка = &Ссылка
			|	И ТаблицаТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ЕСТЬNULL(Себестоимость.Номенклатура, СебестоимостьПустойМагазин.Номенклатура) КАК Номенклатура,
			|	ЕСТЬNULL(Себестоимость.Характеристика, СебестоимостьПустойМагазин.Характеристика) КАК Характеристика,
			|	ВЫБОР
			|		КОГДА Себестоимость.Период ЕСТЬ НЕ NULL 
			|				И СебестоимостьПустойМагазин.Период ЕСТЬ НЕ NULL 
			|			ТОГДА ВЫБОР
			|					КОГДА Себестоимость.Период >= СебестоимостьПустойМагазин.Период
			|						ТОГДА Себестоимость.Цена
			|					ИНАЧЕ СебестоимостьПустойМагазин.Цена
			|				КОНЕЦ
			|		ИНАЧЕ ВЫБОР
			|				КОГДА Себестоимость.Период ЕСТЬ НЕ NULL 
			|					ТОГДА Себестоимость.Цена
			|				ИНАЧЕ СебестоимостьПустойМагазин.Цена
			|			КОНЕЦ
			|	КОНЕЦ КАК Себестоимость
			|ПОМЕСТИТЬ СтоимостьУслуг
			|ИЗ
			|	РегистрСведений.СебестоимостьНоменклатуры.СрезПоследних(
			|			&Период,
			|			Магазин = &Магазин
			|				И НЕ Регистратор = &Ссылка
			|				И (Номенклатура, Характеристика) В
			|					(ВЫБРАТЬ РАЗЛИЧНЫЕ
			|						Услуги.Номенклатура,
			|						Услуги.Характеристика
			|					ИЗ
			|						Услуги КАК Услуги)) КАК Себестоимость
			|		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.СебестоимостьНоменклатуры.СрезПоследних(
			|				&Период,
			|				Магазин = ЗНАЧЕНИЕ(Справочник.Магазины.ПустаяСсылка)
			|					И НЕ Регистратор = &Ссылка
			|					И (Номенклатура, Характеристика) В
			|						(ВЫБРАТЬ РАЗЛИЧНЫЕ
			|							Услуги.Номенклатура,
			|							Услуги.Характеристика
			|						ИЗ
			|							Услуги КАК Услуги)) КАК СебестоимостьПустойМагазин
			|		ПО Себестоимость.Номенклатура = СебестоимостьПустойМагазин.Номенклатура
			|			И Себестоимость.Характеристика = СебестоимостьПустойМагазин.Характеристика
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	Услуги.Номенклатура КАК Услуга,
			|	ЕСТЬNULL(Услуги.Количество, 0) * СтоимостьУслуг.Себестоимость КАК Сумма
			|ИЗ
			|	Услуги КАК Услуги
			|		ЛЕВОЕ СОЕДИНЕНИЕ СтоимостьУслуг КАК СтоимостьУслуг
			|		ПО Услуги.Номенклатура = СтоимостьУслуг.Номенклатура
			|			И Услуги.Характеристика = СтоимостьУслуг.Характеристика
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|УНИЧТОЖИТЬ Комплектующие
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|УНИЧТОЖИТЬ Результат
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|УНИЧТОЖИТЬ СтоимостьУслуг
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|УНИЧТОЖИТЬ Услуги";
			
			Запрос.УстановитьПараметр("Ссылка", Выборка.Ссылка);
			Запрос.УстановитьПараметр("Магазин", Выборка.Магазин);
			Запрос.УстановитьПараметр("Период", Выборка.Период);
			Запрос.УстановитьПараметр("НачалоПериода", СтруктураПериод.НачалоПериода); 
			
			
			РезультатЗапроса = Запрос.ВыполнитьПакет();
			РезультатКомплект = РезультатЗапроса[2].Выгрузить();
			РезультатУслуги = РезультатЗапроса[5];
			
			Если НЕ РезультатУслуги.Пустой() И НастройкаСпособаУчета.РаспределятьСтоимостьУслуг Тогда
				
				РаспределитьУслугиНаСебестоимость(РезультатУслуги.Выгрузить(), НастройкаСпособаУчета.ПравилоРаспределения, РезультатКомплект, Перечисления.СпособыУчетаСебестоимости.АвтономныйУчетСредняяВзвешенная);
				
				Если ТаблицаПриемник = Неопределено Тогда
					ТаблицаПриемник = РезультатКомплект;
				Иначе
					ОбщегоНазначенияРТ.ЗагрузитьВТаблицуЗначений(РезультатКомплект, ТаблицаПриемник, Ложь);
				КонецЕсли;
			Иначе
				
				Если ТаблицаПриемник = Неопределено Тогда
					ТаблицаПриемник = РезультатКомплект;
				Иначе
					ОбщегоНазначенияРТ.ЗагрузитьВТаблицуЗначений(РезультатКомплект, ТаблицаПриемник, Ложь);
				КонецЕсли;
				
			КонецЕсли;
			
		Иначе // Разборка на комплектующие
			
			Запрос = Новый Запрос;
			Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
			Запрос.Текст = 
			"ВЫБРАТЬ
			|	СборкаТоваров.Магазин,
			|	СборкаТоваров.Номенклатура,
			|	СборкаТоваров.Характеристика,
			|	СборкаТоваров.Количество
			|ПОМЕСТИТЬ Шапка
			|ИЗ
			|	Документ.СборкаТоваров КАК СборкаТоваров
			|ГДЕ
			|	СборкаТоваров.Ссылка = &Ссылка
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	Шапка.Номенклатура,
			|	Шапка.Характеристика,
			|	Шапка.Количество,
			|	ЕСТЬNULL(СебестоимостьПоступлений.Стоимость, 0) КАК Себестоимость
			|ИЗ
			|	Шапка КАК Шапка
			|		ЛЕВОЕ СОЕДИНЕНИЕ СебестоимостьПоступлений КАК СебестоимостьПоступлений
			|		ПО Шапка.Магазин = СебестоимостьПоступлений.Магазин
			|			И Шапка.Номенклатура = СебестоимостьПоступлений.Номенклатура
			|			И Шапка.Характеристика = СебестоимостьПоступлений.Характеристика
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	СборкаТоваровТовары.Ссылка.Магазин КАК Магазин,
			|	СборкаТоваровТовары.Номенклатура КАК Номенклатура,
			|	СборкаТоваровТовары.Характеристика КАК Характеристика,
			|	СборкаТоваровТовары.ДоляСтоимости,
			|	СборкаТоваровТовары.Количество КАК Количество,
			|	0 КАК Цена,
			|	0 КАК Сумма,
			|	СборкаТоваровТовары.Ссылка.Номенклатура КАК НоменклатураКомплектующая,
			|	СборкаТоваровТовары.Ссылка.Характеристика КАК ХарактеристикаКомплектующая,
			|	СборкаТоваровТовары.Количество КАК КоличествоКомплектов
			|ИЗ
			|	Документ.СборкаТоваров.Товары КАК СборкаТоваровТовары
			|ГДЕ
			|	СборкаТоваровТовары.Ссылка = &Ссылка
			|	И НЕ СборкаТоваровТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ТаблицаТовары.Номенклатура КАК Номенклатура,
			|	ТаблицаТовары.Характеристика КАК Характеристика,
			|	ТаблицаТовары.Количество КАК Количество
			|ПОМЕСТИТЬ Услуги
			|ИЗ
			|	Документ.СборкаТоваров.Товары КАК ТаблицаТовары
			|ГДЕ
			|	ТаблицаТовары.Ссылка = &Ссылка
			|	И ТаблицаТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	ЕСТЬNULL(Себестоимость.Номенклатура, СебестоимостьПустойМагазин.Номенклатура) КАК Номенклатура,
			|	ЕСТЬNULL(Себестоимость.Характеристика, СебестоимостьПустойМагазин.Характеристика) КАК Характеристика,
			|	ВЫБОР
			|		КОГДА Себестоимость.Период ЕСТЬ НЕ NULL 
			|				И СебестоимостьПустойМагазин.Период ЕСТЬ НЕ NULL 
			|			ТОГДА ВЫБОР
			|					КОГДА Себестоимость.Период >= СебестоимостьПустойМагазин.Период
			|						ТОГДА Себестоимость.Цена
			|					ИНАЧЕ СебестоимостьПустойМагазин.Цена
			|				КОНЕЦ
			|		ИНАЧЕ ВЫБОР
			|				КОГДА Себестоимость.Период ЕСТЬ НЕ NULL 
			|					ТОГДА Себестоимость.Цена
			|				ИНАЧЕ СебестоимостьПустойМагазин.Цена
			|			КОНЕЦ
			|	КОНЕЦ КАК Себестоимость
			|ПОМЕСТИТЬ СтоимостьУслуг
			|ИЗ
			|	РегистрСведений.СебестоимостьНоменклатуры.СрезПоследних(
			|			&Период,
			|			Магазин = &Магазин
			|				И НЕ Регистратор = &Ссылка
			|				И (Номенклатура, Характеристика) В
			|					(ВЫБРАТЬ РАЗЛИЧНЫЕ
			|						Услуги.Номенклатура,
			|						Услуги.Характеристика
			|					ИЗ
			|						Услуги КАК Услуги)) КАК Себестоимость
			|		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.СебестоимостьНоменклатуры.СрезПоследних(
			|				&Период,
			|				Магазин = ЗНАЧЕНИЕ(Справочник.Магазины.ПустаяСсылка)
			|					И НЕ Регистратор = &Ссылка
			|					И (Номенклатура, Характеристика) В
			|						(ВЫБРАТЬ РАЗЛИЧНЫЕ
			|							Услуги.Номенклатура,
			|							Услуги.Характеристика
			|						ИЗ
			|							Услуги КАК Услуги)) КАК СебестоимостьПустойМагазин
			|		ПО Себестоимость.Номенклатура = СебестоимостьПустойМагазин.Номенклатура
			|			И Себестоимость.Характеристика = СебестоимостьПустойМагазин.Характеристика
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	Услуги.Номенклатура КАК Услуга,
			|	ЕСТЬNULL(Услуги.Количество, 0) * СтоимостьУслуг.Себестоимость КАК Сумма
			|ИЗ
			|	Услуги КАК Услуги
			|		ЛЕВОЕ СОЕДИНЕНИЕ СтоимостьУслуг КАК СтоимостьУслуг
			|		ПО Услуги.Номенклатура = СтоимостьУслуг.Номенклатура
			|			И Услуги.Характеристика = СтоимостьУслуг.Характеристика
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|УНИЧТОЖИТЬ Шапка
			|;
			|////////////////////////////////////////////////////////////////////////////////
			|УНИЧТОЖИТЬ СтоимостьУслуг
			|;
			|////////////////////////////////////////////////////////////////////////////////
			|УНИЧТОЖИТЬ Услуги";

			Запрос.УстановитьПараметр("Ссылка", Выборка.Ссылка);
			Запрос.УстановитьПараметр("Магазин", Выборка.Магазин);
			Запрос.УстановитьПараметр("Период", Выборка.Период);

			РезультатЗапроса = Запрос.ВыполнитьПакет();
			
			ТаблицаСтоимостьКомплекта = РезультатЗапроса[1].Выгрузить();
			РезультатКомплект = РезультатЗапроса[2].Выгрузить();
			РезультатУслуги = РезультатЗапроса[5];
			
			
			РаспределитьСебестоимостьПоДолямСтоимости(ТаблицаСтоимостьКомплекта, РезультатКомплект);
			
			Если НЕ РезультатУслуги.Пустой() И НастройкаСпособаУчета.РаспределятьСтоимостьУслуг Тогда
				
				РаспределитьУслугиНаСебестоимость(РезультатУслуги.Выгрузить(), НастройкаСпособаУчета.ПравилоРаспределения,
													РезультатКомплект, Перечисления.СпособыУчетаСебестоимости.АвтономныйУчетСредняяВзвешенная);
			КонецЕсли;
			
			ОбщегоНазначенияРТ.ЗагрузитьВТаблицуЗначений(РезультатКомплект, ТаблицаПриемник, Ложь);
				
		КонецЕсли;
		
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("ТаблицаПриемник", ТаблицаПриемник);
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	РезультатКомплект.Магазин,
	|	РезультатКомплект.Номенклатура,
	|	РезультатКомплект.Характеристика,
	|	РезультатКомплект.КоличествоКомплектов КАК КоличествоКомплектов,
	|	РезультатКомплект.Сумма
	|ПОМЕСТИТЬ РезультатКомплект
	|ИЗ
	|	&ТаблицаПриемник КАК РезультатКомплект
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СебестоимостьСоСборкой.Магазин,
	|	СебестоимостьСоСборкой.Номенклатура,
	|	СебестоимостьСоСборкой.Характеристика,
	|	СУММА(СебестоимостьСоСборкой.КоличествоПеремещение) КАК КоличествоПеремещение,
	|	СУММА(СебестоимостьСоСборкой.Количество) КАК Количество,
	|	СУММА(СебестоимостьСоСборкой.СуммаОборот) КАК СуммаОборот,
	|	ВЫБОР КОГДА СУММА(СебестоимостьСоСборкой.Количество) <> 0 ТОГДА
	|		СУММА(СебестоимостьСоСборкой.СуммаОборот) / СУММА(СебестоимостьСоСборкой.Количество)
	|	ИНАЧЕ 0 КОНЕЦ КАК Стоимость
	|ИЗ
	|	(ВЫБРАТЬ
	|		СебестоимостьПоступлений.Магазин КАК Магазин,
	|		СебестоимостьПоступлений.Номенклатура КАК Номенклатура,
	|		СебестоимостьПоступлений.Характеристика КАК Характеристика,
	|		СебестоимостьПоступлений.КоличествоПеремещение КАК КоличествоПеремещение,
	|		СебестоимостьПоступлений.Количество КАК Количество,
	|		СебестоимостьПоступлений.СуммаОборот КАК СуммаОборот
	|	ИЗ
	|		СебестоимостьПоступлений КАК СебестоимостьПоступлений
	|	
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ
	|		РезультатКомплект.Магазин,
	|		РезультатКомплект.Номенклатура,
	|		РезультатКомплект.Характеристика,
	|		0,
	|		МАКСИМУМ(РезультатКомплект.КоличествоКомплектов),
	|		СУММА(РезультатКомплект.Сумма)
	|	ИЗ
	|		РезультатКомплект КАК РезультатКомплект
	|	
	|	СГРУППИРОВАТЬ ПО
	|		РезультатКомплект.Номенклатура,
	|		РезультатКомплект.Характеристика,
	|		РезультатКомплект.Магазин
	|) КАК СебестоимостьСоСборкой
	|
	|СГРУППИРОВАТЬ ПО
	|	СебестоимостьСоСборкой.Магазин,
	|	СебестоимостьСоСборкой.Характеристика,
	|	СебестоимостьСоСборкой.Номенклатура";
	
	Результат = Запрос.Выполнить().Выгрузить();
	Возврат Результат;
	
	// ---------------------------------------- Старый запрос ---------------------------------------- //
	//Запрос = Новый Запрос;
	//Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	//Запрос.УстановитьПараметр("ТаблицаПриемник", ТаблицаПриемник);
	//Запрос.Текст = 
	//"ВЫБРАТЬ
	//|	РезультатКомплект.Магазин,
	//|	РезультатКомплект.Номенклатура,
	//|	РезультатКомплект.Характеристика,
	//|	РезультатКомплект.КоличествоКомплектов КАК КоличествоКомплектов,
	//|	РезультатКомплект.Сумма
	//|ПОМЕСТИТЬ РезультатКомплект
	//|ИЗ
	//|	&ТаблицаПриемник КАК РезультатКомплект
	//|;
	//|
	//|////////////////////////////////////////////////////////////////////////////////
	//|ВЫБРАТЬ
	//|	СебестоимостьСоСборкой.Магазин,
	//|	СебестоимостьСоСборкой.Номенклатура,
	//|	СебестоимостьСоСборкой.Характеристика,
	//|	СУММА(СебестоимостьСоСборкой.КоличествоПеремещение) КАК КоличествоПеремещение,
	//|	СУММА(СебестоимостьСоСборкой.Количество) КАК Количество,
	//|	СУММА(СебестоимостьСоСборкой.СуммаОборот) КАК СуммаОборот,
	//|	СУММА(СебестоимостьСоСборкой.СуммаОборот) / СУММА(СебестоимостьСоСборкой.Количество) КАК Стоимость
	//|ИЗ
	//|	(ВЫБРАТЬ
	//|		СебестоимостьПоступлений.Магазин КАК Магазин,
	//|		СебестоимостьПоступлений.Номенклатура КАК Номенклатура,
	//|		СебестоимостьПоступлений.Характеристика КАК Характеристика,
	//|		СебестоимостьПоступлений.КоличествоПеремещение КАК КоличествоПеремещение,
	//|		СебестоимостьПоступлений.Количество КАК Количество,
	//|		СебестоимостьПоступлений.СуммаОборот КАК СуммаОборот
	//|	ИЗ
	//|		СебестоимостьПоступлений КАК СебестоимостьПоступлений
	//|	
	//|	ОБЪЕДИНИТЬ ВСЕ
	//|	
	//|	ВЫБРАТЬ
	//|		РезультатКомплект.Магазин,
	//|		РезультатКомплект.Номенклатура,
	//|		РезультатКомплект.Характеристика,
	//|		0,
	//|		МАКСИМУМ(РезультатКомплект.КоличествоКомплектов),
	//|		СУММА(РезультатКомплект.Сумма)
	//|	ИЗ
	//|		РезультатКомплект КАК РезультатКомплект
	//|	
	//|	СГРУППИРОВАТЬ ПО
	//|		РезультатКомплект.Номенклатура,
	//|		РезультатКомплект.Характеристика,
	//|		РезультатКомплект.Магазин
	//|) КАК СебестоимостьСоСборкой
	//|
	//|СГРУППИРОВАТЬ ПО
	//|	СебестоимостьСоСборкой.Магазин,
	//|	СебестоимостьСоСборкой.Характеристика,
	//|	СебестоимостьСоСборкой.Номенклатура";
	//
	//Результат = Запрос.Выполнить().Выгрузить();
	//Возврат Результат;
	
КонецФункции

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С НОМЕНКЛАТУРОЙ ПОСТАВЩИКОВ

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

// Процедура записи движений в регистр СоответствиеНоменклатурыЕГАИС.
//
Процедура ОтразитьСоответствиеНоменклатурыЕГАИС(ДополнительныеСвойства, Движения, Отказ) Экспорт
	
	Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСоответствиеНоменклатурыЕГАИС;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		
		Возврат;
		
	КонецЕсли;
	
	Для каждого СтрокаТЧ Из Таблица Цикл
		Запись = РегистрыСведений.СоответствиеНоменклатурыЕГАИС.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(Запись, СтрокаТЧ);
		Запись.Записать(Истина);
	КонецЦикла;
	
КонецПроцедуры

// Процедура записи движений в регистр СоответствиеОрганизацийЕГАИС
//
Процедура ОтразитьСоответствиеОрганизацийЕГАИС(ДополнительныеСвойства, Движения, Отказ) Экспорт
	
	Таблица = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаСоответствиеОрганизацийЕГАИС;
	
	Если Отказ ИЛИ Таблица.Количество() = 0 Тогда
		
		Возврат;
		
	КонецЕсли;
	
	Для каждого СтрокаТЧ Из Таблица Цикл
		Запись = РегистрыСведений.СоответствиеОрганизацийЕГАИС.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(Запись, СтрокаТЧ);
		Запись.Записать(Истина);
	КонецЦикла;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ РАБОТЫ С ЗАКАЗАМИ ПОСТАВЩИКАМ И ЗАКАЗАМИ НА ПЕРЕМЕЩЕНИЕ

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

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

// Функция формирует таблицу значений с документами для закрытия.
//
// Параметры:
//  Дата    - Дата                      - дата относительно которой будет рассчитываться просрочка поставки.
//  Магазин - СправочникСсылка.Магазины - Магазин по которому необходимо закрыть заказы поставщикам.
//  Поставщик - СправочникСсылка.Контрагенты или СправочникСсылка.Магазин - Контрагент или магазин по которому
//              необходимо закрыть заказы поставщикам и/или заказы на перемещение.
// Возвращаемое значение - Таблица значений.
Функция ПолучитьЗаказыПоставщикамЗаказыНаПеремещениеДляЗакрытия(Дата, МассивМагазинов = Неопределено, Поставщик = Неопределено) Экспорт
	
	Перем Результат;
	
	ТекстОграниченияЗаказПоставщикуПоМагазинам = "";
	ТекстОграниченияЗаказНаПеремещениеПоМагазинам = "";
	Если МассивМагазинов <> Неопределено Тогда
		Если ТипЗнч(МассивМагазинов) = Тип("Массив") 
			И МассивМагазинов.Количество() > 0 Тогда
			ТекстОграниченияЗаказПоставщикуПоМагазинам = "И ЗаказПоставщику.Магазин В(&МассивМагазинов)";
			ТекстОграниченияЗаказНаПеремещениеПоМагазинам = "И ЗаказНаПеремещение.МагазинПолучатель В(&МассивМагазинов)";
		ИначеЕсли ТипЗнч(МассивМагазинов) = Тип("СправочникСсылка.Магазины")
			И ЗначениеЗаполнено(МассивМагазинов) Тогда
			ТекстОграниченияЗаказПоставщикуПоМагазинам = "И ЗаказПоставщику.Магазин = &МассивМагазинов";
			ТекстОграниченияЗаказНаПеремещениеПоМагазинам = "И ЗаказНаПеремещение.МагазинПолучатель = &МассивМагазинов";
		КонецЕсли;
	КонецЕсли;
	
	ТекстОграниченияЗаказПоставщикуПоПоставщику = ?(ЗначениеЗаполнено(Поставщик), " И ЗаказПоставщику.Контрагент = &Поставщик", "");
	ТекстОграниченияЗаказНаПеремещениеПоПоставщику = ?(ЗначениеЗаполнено(Поставщик), " И ЗаказНаПеремещение.МагазинОтправитель = &Поставщик", "");
	
	Запрос = Новый Запрос;
	
	ТекстЗапросаПоЗаказамПоставщику = "
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ 
	|	ЗаказПоставщику.Ссылка КАК Ссылка,
	|	ЗаказПоставщику.Дата КАК ДатаЗаказа,
	|	ЗаказПоставщику.ДатаПоступления КАК ДатаПоступления,
	|	ЗаказПоставщику.Магазин КАК Магазин,
	|	ЗаказПоставщику.Контрагент КАК Поставщик,
	|	ЗаказПоставщику.ДнейПросрочкиПоставки КАК ДнейПросрочкиПоставки
	|ИЗ
	|	Документ.ЗаказПоставщику КАК ЗаказПоставщику
	|ГДЕ
	|	ЗаказПоставщику.Проведен
	|	%ТекстОграниченияЗаказПоставщикуПоМагазинам%
	|	%ТекстОграниченияЗаказПоставщикуПоПоставщику%
	|	И НЕ ЗаказПоставщику.Бессрочный
	|	И ДОБАВИТЬКДАТЕ(ЗаказПоставщику.ДатаПоступления, ДЕНЬ, ЗаказПоставщику.ДнейПросрочкиПоставки) <= &Дата
	|	И НЕ ЗаказПоставщику.Закрыт";
	
	ТекстЗапросаПоЗаказамПоставщику = СтрЗаменить(ТекстЗапросаПоЗаказамПоставщику, "%ТекстОграниченияЗаказПоставщикуПоМагазинам%", ТекстОграниченияЗаказПоставщикуПоМагазинам);
	ТекстЗапросаПоЗаказамПоставщику = СтрЗаменить(ТекстЗапросаПоЗаказамПоставщику, "%ТекстОграниченияЗаказПоставщикуПоПоставщику%", ТекстОграниченияЗаказПоставщикуПоПоставщику);
	
	ТекстЗапросаОбъединитьВсе = "
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|";
	
	ТекстЗапросаПоЗаказамНаПеремещение = "
	|ВЫБРАТЬ %РАЗРЕШЕННЫЕ%
	|	ЗаказНаПеремещение.Ссылка КАК Ссылка,
	|	ЗаказНаПеремещение.Дата КАК ДатаЗаказа,
	|	ЗаказНаПеремещение.ЖелаемаяДатаПоступления КАК ДатаПоступления,
	|	ЗаказНаПеремещение.МагазинПолучатель КАК Магазин,
	|	ЗаказНаПеремещение.МагазинОтправитель КАК Поставщик,
	|	0 КАК ДнейПросрочкиПоставки
	|ИЗ
	|	Документ.ЗаказНаПеремещение КАК ЗаказНаПеремещение
	|ГДЕ
	|	ЗаказНаПеремещение.Проведен
	|	%ТекстОграниченияЗаказНаПеремещениеПоМагазинам%
	|	%ТекстОграниченияЗаказНаПеремещениеПоПоставщику%
	|	И ЗаказНаПеремещение.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыВнутреннихЗаказов.Закрыт)
	|	И ЗаказНаПеремещение.ЖелаемаяДатаПоступления < &Дата
	|	И НЕ ЗаказНаПеремещение.МагазинОтправитель.СкладУправляющейСистемы";

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ РЕГЛАМЕНТНЫХ ЗАДАНИЙ

// Процедура обновляет регистр сведений "ИнформативныеОстаткиТоваровПоМагазинам".
//
Процедура ОбновлениеРегистраСведенийИнформативныеОстаткиТоваровДляМагазинов() Экспорт
	
	Если ПустаяСтрока(ИмяПользователя()) Тогда
		УстановитьПривилегированныйРежим(Истина);
	КонецЕсли;
	
	Если  ПланыОбмена.ГлавныйУзел() = Неопределено Тогда 
		СравнениеОстатков = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ЗапросДанныхДляИзменения.Магазин,
		|	ЗапросДанныхДляИзменения.Номенклатура,
		|	ЗапросДанныхДляИзменения.Характеристика,
		|	СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета) КАК Количество,
		|	СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) КАК КоличествоТоваровДляМиграции,
		|	СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) КАК Резерв,
		|	СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета) КАК РезервТоваровПоДаннымУчета
		|ИЗ
		|	(ВЫБРАТЬ
		|		ИнформативныеОстаткиТоваровПоМагазинам.Магазин КАК Магазин,
		|		ИнформативныеОстаткиТоваровПоМагазинам.Номенклатура КАК Номенклатура,
		|		ИнформативныеОстаткиТоваровПоМагазинам.Характеристика КАК Характеристика,
		|		ИнформативныеОстаткиТоваровПоМагазинам.Количество КАК КоличествоТоваровДляМиграции,
		|		0 КАК КоличествоТоваровПоДаннымУчета,
		|		ИнформативныеОстаткиТоваровПоМагазинам.Резерв КАК РезервТоваровДляМиграции,
		|		0 КАК РезервТоваровПоДаннымУчета
		|	ИЗ
		|		РегистрСведений.ИнформативныеОстаткиТоваровПоМагазинам КАК ИнформативныеОстаткиТоваровПоМагазинам
		|	
		|	ОБЪЕДИНИТЬ ВСЕ
		|	
		|	ВЫБРАТЬ
		|		ТоварыНаСкладахОстатки.Склад.Магазин,
		|		ТоварыНаСкладахОстатки.Номенклатура,
		|		ТоварыНаСкладахОстатки.Характеристика,
		|		0,
		|		ТоварыНаСкладахОстатки.КоличествоОстаток,
		|		0,
		|		ТоварыНаСкладахОстатки.РезервОстаток
		|	ИЗ
		|		РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, ) КАК ТоварыНаСкладахОстатки) КАК ЗапросДанныхДляИзменения
		|
		|СГРУППИРОВАТЬ ПО
		|	ЗапросДанныхДляИзменения.Магазин,
		|	ЗапросДанныхДляИзменения.Номенклатура,
		|	ЗапросДанныхДляИзменения.Характеристика
		|
		|ИМЕЮЩИЕ
		|	(СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета)
		|		ИЛИ СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета))");
		
		СравнениеОстатков.УстановитьПараметр("ДатаОстатков", КонецДня(ТекущаяДатаСеанса()));
		Выборка = СравнениеОстатков.Выполнить().Выбрать();
		Пока Выборка.Следующий() Цикл
			
			НаборЗаписей = РегистрыСведений.ИнформативныеОстаткиТоваровПоМагазинам.СоздатьНаборЗаписей();
			
			НаборЗаписей.Отбор.Магазин.Установить(Выборка.Магазин);
			НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
			НаборЗаписей.Отбор.Характеристика.Установить(Выборка.Характеристика);
			
			НаборЗаписей.Прочитать();
			
			НаборЗаписей.Очистить();
			
			Если Выборка.Количество <> 0 Тогда
				Запись = НаборЗаписей.Добавить();
				Запись.Магазин                    = Выборка.Магазин;
				Запись.Номенклатура               = Выборка.Номенклатура;
				Запись.Характеристика             = Выборка.Характеристика;
				Запись.Количество                 = Выборка.Количество;
				Запись.Резерв                     = Выборка.Резерв;
			КонецЕсли;
			
			НаборЗаписей.Записать();
			
		КонецЦикла;
		
	КонецЕсли;	
	
КонецПроцедуры

// Процедура обновляет регистр сведений "ИнформативныеОстаткиТоваровПоСкладам".
//
Процедура ОбновлениеРегистраСведенийИнформативныеОстаткиТоваровДляРабочихМест() Экспорт
	
	Если ПустаяСтрока(ИмяПользователя()) Тогда
		УстановитьПривилегированныйРежим(Истина);
	КонецЕсли;
	
	Если ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоРабочемуМесту") <> Неопределено  
		И НЕ ПланыОбмена.ПоРабочемуМесту.ЭтоРабочееМесто() Тогда 
		
		СравнениеОстатков = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ЗапросДанныхДляИзменения.Склад,
		|	ЗапросДанныхДляИзменения.Номенклатура,
		|	ЗапросДанныхДляИзменения.Характеристика,
		|	СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета) КАК Количество,
		|	СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) КАК КоличествоТоваровДляМиграции,
		|	СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) КАК Резерв,
		|	СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета) КАК РезервТоваровПоДаннымУчета
		|ИЗ
		|	(ВЫБРАТЬ
		|		ИнформативныеОстаткиТоваровПоСкладам.Склад КАК Склад,
		|		ИнформативныеОстаткиТоваровПоСкладам.Номенклатура КАК Номенклатура,
		|		ИнформативныеОстаткиТоваровПоСкладам.Характеристика КАК Характеристика,
		|		ИнформативныеОстаткиТоваровПоСкладам.Количество КАК КоличествоТоваровДляМиграции,
		|		0 КАК КоличествоТоваровПоДаннымУчета,
		|		ИнформативныеОстаткиТоваровПоСкладам.Резерв КАК РезервТоваровДляМиграции,
		|		0 КАК РезервТоваровПоДаннымУчета
		|	ИЗ
		|		РегистрСведений.ИнформативныеОстаткиТоваровПоСкладам КАК ИнформативныеОстаткиТоваровПоСкладам
		|	ГДЕ
		|		ИнформативныеОстаткиТоваровПоСкладам.Склад.Магазин В(&МассивОграниченийПоМагазинам)
		|	
		|	ОБЪЕДИНИТЬ ВСЕ
		|	
		|	ВЫБРАТЬ
		|		ТоварыНаСкладахОстатки.Склад,
		|		ТоварыНаСкладахОстатки.Номенклатура,
		|		ТоварыНаСкладахОстатки.Характеристика,
		|		0,
		|		ТоварыНаСкладахОстатки.КоличествоОстаток,
		|		0,
		|		ТоварыНаСкладахОстатки.РезервОстаток
		|	ИЗ
		|		РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад.Магазин В (&МассивОграниченийПоМагазинам)) КАК ТоварыНаСкладахОстатки) КАК ЗапросДанныхДляИзменения
		|
		|СГРУППИРОВАТЬ ПО
		|	ЗапросДанныхДляИзменения.Склад,
		|	ЗапросДанныхДляИзменения.Номенклатура,
		|	ЗапросДанныхДляИзменения.Характеристика
		|
		|ИМЕЮЩИЕ
		|	(СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.КоличествоТоваровПоДаннымУчета)
		|		ИЛИ СУММА(ЗапросДанныхДляИзменения.РезервТоваровДляМиграции) <> СУММА(ЗапросДанныхДляИзменения.РезервТоваровПоДаннымУчета))");
		
		СравнениеОстатков.УстановитьПараметр("ДатаОстатков", КонецДня(ТекущаяДатаСеанса()));
		
		Если ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоМагазину") <> Неопределено
			И ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
			// В узле -магазине РИБ нас интересуют только склады  магазинов, заданных для этого узла.
			МассивОграниченийПоМагазинам = ПланыОбмена.ПоМагазину.ЭтотУзел().Магазины.ВыгрузитьКолонку("Магазин");	
			
		ИначеЕсли ПараметрыСеанса.ИспользуемыеПланыОбмена.Найти("ПоМагазину") <> Неопределено Тогда
			// Остатки по другим складам магазинов РИБ для рабочих мест этого магазина не нужны.
			МассивОграниченийПоМагазинам = Новый Массив;
			
			Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ 
			|	Магазины.Ссылка
			|ИЗ
			|	Справочник.Магазины КАК Магазины
			|ГДЕ
			|	(НЕ Магазины.Ссылка В
			|				(ВЫБРАТЬ РАЗЛИЧНЫЕ
			|					ПоМагазинуМагазины.Магазин
			|				ИЗ
			|					ПланОбмена.ПоМагазину.Магазины КАК ПоМагазинуМагазины))");
			ВыборкаМагазинов = Запрос.Выполнить().Выбрать();					  
			
			Пока ВыборкаМагазинов.Следующий() Цикл
								
				МассивОграниченийПоМагазинам.Добавить(ВыборкаМагазинов.Ссылка);
							
			КонецЦикла;	
					
		Иначе	
			
			МассивОграниченийПоМагазинам = Новый Массив;
			ВыборкаМагазинов = Справочники.Магазины.Выбрать();
			
			Пока ВыборкаМагазинов.Следующий() Цикл
				
				МассивОграниченийПоМагазинам.Добавить(ВыборкаМагазинов.Ссылка);
				
			КонецЦикла;	
			
		КонецЕсли;
		
		СравнениеОстатков.УстановитьПараметр("МассивОграниченийПоМагазинам",МассивОграниченийПоМагазинам);	
		
		Выборка = СравнениеОстатков.Выполнить().Выбрать();
		
		Пока Выборка.Следующий() Цикл
			
			НаборЗаписей = РегистрыСведений.ИнформативныеОстаткиТоваровПоСкладам.СоздатьНаборЗаписей();
			
			НаборЗаписей.Отбор.Склад.Установить(Выборка.Склад);
			НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
			НаборЗаписей.Отбор.Характеристика.Установить(Выборка.Характеристика);
			
			НаборЗаписей.Прочитать();
			
			НаборЗаписей.Очистить();
			
			Если Выборка.Количество <> 0 Тогда
				
				Запись = НаборЗаписей.Добавить();
				Запись.Склад                      = Выборка.Склад;
				Запись.Номенклатура               = Выборка.Номенклатура;
				Запись.Характеристика             = Выборка.Характеристика;
				Запись.Количество                 = Выборка.Количество;
				Запись.Резерв                     = Выборка.Резерв;
			КонецЕсли;
			
			НаборЗаписей.Записать();
			
		КонецЦикла;
		
	КонецЕсли;	
	
КонецПроцедуры

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

	Результат = Запрос.Выполнить();

	Если НЕ Результат.Пустой() Тогда
		Выборка = Результат.Выбрать();
		
		Пока Выборка.Следующий() Цикл
			Запись = РегистрыСведений.НоменклатураПоставщиков.СоздатьМенеджерЗаписи();
			ЗаполнитьЗначенияСвойств(Запись, Выборка);
			Запись.Записать();
		КонецЦикла;
	КонецЕсли;
	
	Константы.ПризнакАктуальностиПоставляемойНоменклатуры.Установить(Истина);
	ЗафиксироватьТранзакцию();

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

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

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

////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ ЗАПОЛНЕНИЯ ЦЕН ПО ТЧ ДОКУМЕНТОВ ТОВАРОДВИЖЕНИЯ

// Функция заполнения колонки Цена по себестоимости.
//
Функция ЗаполнитьЦеныПоСебестоимости(Объект, ИмяТабличнойЧасти, Дата) Экспорт
	
	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;

	// заполнение цен
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросПоСебестоимости(Запрос.Текст);
	Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
	Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена     = (НайденнаяСтрока <> Неопределено);
		
		Если Не ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекущаяСтрока.Цена  = НайденнаяСтрока.Цена;
		ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.КоличествоУпаковок;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
	
КонецФункции

// Функция заполнения колонки Цена по себестоимости в выделенных строках.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоСебестоимости(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, Дата) Экспорт

	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;
	
	МассивСтрок = Новый Массив;
	
	Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл
		
		СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);
		
		Если СтрокаТаблицы = Неопределено Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		МассивСтрок.Добавить(СтрокаТаблицы);
			
	КонецЦикла;
	
	Если МассивСтрок.Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;
	
	// заполнение цен
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросПоСебестоимости(Запрос.Текст);
	Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
	Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена     = (НайденнаяСтрока <> Неопределено);
		
		Если Не ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекущаяСтрока.Цена  = НайденнаяСтрока.Цена;
		ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.КоличествоУпаковок;
			
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;

КонецФункции

// Функция заполнения колонки Цена по себестоимости при пересортице.
//
Функция ЗаполнитьЦеныПоСебестоимостиПересортица(Объект, ИмяТабличнойЧасти, Дата) Экспорт
	
	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;

	// заполнение цен
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросПоСебестоимости(Запрос.Текст);
	
	// Оприходование товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя   = "Номенклатура";
	ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена     = (НайденнаяСтрока <> Неопределено);
		
		Если Не ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекущаяСтрока.ЦенаОприходование  = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	// Списание товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена     = (НайденнаяСтрока <> Неопределено);
		
		Если Не ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекущаяСтрока.Цена  = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
	
КонецФункции

// Функция заполнения колонки Цена по себестоимости при пересортице.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоСебестоимостиПересортица(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, Дата) Экспорт
	
	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;
	
	МассивСтрок = Новый Массив;
	
	Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл
		
		СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);
		
		Если СтрокаТаблицы = Неопределено Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		МассивСтрок.Добавить(СтрокаТаблицы);
		
	КонецЦикла;
	
	Если МассивСтрок.Количество() = 0 Тогда
		
		Возврат Ложь;
		
	КонецЕсли;
	
	// заполнение цен
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросПоСебестоимости(Запрос.Текст);
	
	// Оприходование товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя   = "Номенклатура";
	ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	Запрос.УстановитьПараметр("Дата", ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена     = (НайденнаяСтрока <> Неопределено);
		
		Если Не ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекущаяСтрока.ЦенаОприходование  = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	// Списание товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекущаяСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекущаяСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена     = (НайденнаяСтрока <> Неопределено);
		
		Если Не ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекущаяСтрока.Цена  = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
	
КонецФункции

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

	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросЦеныПоВидуЦен(Запрос.Текст);
	Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
	Запрос.УстановитьПараметр("Дата",   ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("ВидЦен", ВидЦен);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Если ТаблицаЦен.Количество() = 0 Тогда
		
		Возврат Ложь;
		
	КонецЕсли;
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		Если ВидЦеныВТабличнойЧасти Тогда
			
			ТекСтрока.ВидЦены = ВидЦен;
			
		КонецЕсли;
		
		ТекСтрока.Цена     = НайденнаяСтрока.Цена;
		ТекСтрока.Сумма    = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;
		
		Если ЕстьНДС Тогда
			
			ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);
			
		КонецЕсли;
		
		Если ЕстьНДС И ЕстьСуммаСНДС Тогда
			
			ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);
			
		КонецЕсли;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
	
КонецФункции

// Осуществляет заполнение видов цен и цен в тч Товары по виду цен.
//
// Параметры:
// Документ                          - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти                 - Строка - имя табличной части, в которой необходимо заполнить цены.
// ВидЦен                            - СправочникСсылка.ВидыЦен - Вид цен, по которому необходимо заполнить цены.
// ВидЦеныВТабличнойЧасти            - Булево - признак наличия колонки "ВидЦены" в ТЧ документа.
//
// Возвращаемое значение:
// Булево.
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныПоВидуЦенПересортица(Объект, ИмяТабличнойЧасти, ВидЦен, Дата) Экспорт

	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросЦеныПоВидуЦен(Запрос.Текст);
	
	// Оприходование товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя   = "Номенклатура";
	ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	Запрос.УстановитьПараметр("Дата"  , ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("ВидЦен", ВидЦен);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	// Списание товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(, "НомерСтроки,Номенклатура,Характеристика");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекСтрока.Цена = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
	
КонецФункции

// Осуществляет заполнение видов цен и цен в тч Товары по виду цен.
//
// Параметры:
// Документ                          - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти                 - Строка - имя табличной части, в которой необходимо заполнить цены.
// ВидЦен                            - СправочникСсылка.ВидыЦен - Вид цен, по которому необходимо заполнить цены.
// ВидЦеныВТабличнойЧасти            - Булево - признак наличия колонки "ВидЦены" в ТЧ документа.
//
// Возвращаемое значение:
// Булево.
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоВидуЦенПересортица(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, ВидЦен, Дата) Экспорт

	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;
	
	МассивСтрок = Новый Массив;
	
	Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл
		
		СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);
		
		Если СтрокаТаблицы = Неопределено Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		МассивСтрок.Добавить(СтрокаТаблицы);
		
	КонецЦикла;
	
	Если МассивСтрок.Количество() = 0 Тогда
		
		Возврат Ложь;
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросЦеныПоВидуЦен(Запрос.Текст);
	
	// Оприходование товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя   = "Номенклатура";
	ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	Запрос.УстановитьПараметр("Дата"  , ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("ВидЦен", ВидЦен);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	// Списание товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекСтрока.Цена = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
	
КонецФункции

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

	Возврат ЦеныРассчитаны;
	
КонецФункции

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

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

	Возврат ЦеныРассчитаны;
	
КонецФункции

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

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

	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросЦеныПоРозничнымЦенам(Запрос.Текст, Магазин);
	
	// Оприходование товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,НоменклатураОприходование,ХарактеристикаОприходование");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	ТаблицаТоваров.Колонки.НоменклатураОприходование.Имя   = "Номенклатура";
	ТаблицаТоваров.Колонки.ХарактеристикаОприходование.Имя = "Характеристика";
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	Запрос.УстановитьПараметр("Дата",   ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("Магазин", Магазин);
	
	СтруктураРеквизитов = Новый Структура;
	СтруктураРеквизитов.Вставить("ФорматМагазина");
	СтруктураРеквизитов.Вставить("ПравилоЦенообразования");
	СтруктураРеквизитов.Вставить("ИспользоватьПрименениеЦен");
	СтруктураРеквизитов.Вставить("ВидМинимальныхЦенПродажи");
	РеквизитыМагазина = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Магазин, СтруктураРеквизитов);
	
	Запрос.УстановитьПараметр("ФорматОбъектаЦенообразования", РеквизитыМагазина.ФорматМагазина);
	Запрос.УстановитьПараметр("ПравилоЦенообразования", РеквизитыМагазина.ПравилоЦенообразования);
	Запрос.УстановитьПараметр("ИспользоватьПрименениеЦен", РеквизитыМагазина.ИспользоватьПрименениеЦен);
	Запрос.УстановитьПараметр("ПриводитьКМинимальнойЦене", ПриводитьКМинимальнойЦене И ЗначениеЗаполнено(РеквизитыМагазина.ВидМинимальныхЦенПродажи));
	Запрос.УстановитьПараметр("ВидМинимальныхЦенПродажи", РеквизитыМагазина.ВидМинимальныхЦенПродажи);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекСтрока.ЦенаОприходование = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	// Списание товаров
	ТаблицаТоваров = Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика");
	ТаблицаТоваров.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.ЗаполнитьЗначения(Справочники.УпаковкиНоменклатуры.ПустаяСсылка(), "Упаковка");
	
	Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		ТекСтрока.Цена = НайденнаяСтрока.Цена;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
		
КонецФункции

// Осуществляет заполнение цен в тч Товары по прошлым закупкам по выделенным строкам.
//
// Параметры:
// Объект                            - ДокументОбъект, для которого необходимо заполнить цены.
// ИмяТабличнойЧасти                 - Строка - имя табличной части, в которой необходимо заполнить цены.
// ВыделенныеСтроки                  - Массив строк, в которых необходимо заполнить цены.
//
// Возвращаемое значение:
// Булево
// Истина, если цены заполнены, ложь в противном случае.
//
Функция ЗаполнитьЦеныВыделенныхСтрокПоПрошлымЗакупкам(Объект, ИмяТабличнойЧасти, ВыделенныеСтроки, ЕстьНДС = Истина, ЕстьСуммаСНДС = Ложь) Экспорт
	
	ЦеныРассчитаны = Ложь;
	
	Если Объект[ИмяТабличнойЧасти].Количество() = 0 Тогда
		
		Возврат ЦеныРассчитаны;
		
	КонецЕсли;
	
	МассивСтрок = Новый Массив;
	
	Для Каждого ТекущаяСтрока Из ВыделенныеСтроки Цикл
		
		СтрокаТаблицы = Объект[ИмяТабличнойЧасти].НайтиПоИдентификатору(ТекущаяСтрока);
		
		Если СтрокаТаблицы = Неопределено Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		МассивСтрок.Добавить(СтрокаТаблицы);
		
	КонецЦикла;
	
	Если МассивСтрок.Количество() = 0 Тогда
		
		Возврат Ложь;
		
	КонецЕсли;
	
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросЦеныПоПрошлымЗакупкам(Запрос.Текст);
	Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
	Запрос.УстановитьПараметр("Дата",   ?(ЗначениеЗаполнено(Объект.Ссылка), Объект.Дата, ТекущаяДатаСеанса()));
	Запрос.УстановитьПараметр("Магазин", Объект.Магазин);
	Запрос.УстановитьПараметр("Поставщик", Объект.Контрагент);
	Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
		
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Если ТаблицаЦен.Количество() = 0 Тогда
		
		Возврат Ложь;
		
	КонецЕсли;
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
			
		ТекСтрока.Цена     = НайденнаяСтрока.Цена;
		ТекСтрока.Сумма    = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;
		
		Если ЕстьНДС Тогда
			
			ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);
			
		КонецЕсли;
		
		Если ЕстьНДС И ЕстьСуммаСНДС Тогда
			
			ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);
			
		КонецЕсли;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;

	Возврат ЦеныРассчитаны;
	
КонецФункции

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

	
	Запрос = Новый Запрос;
	СформироватьЗапросВременнаяТаблицаТовары(Запрос.Текст);
	СформироватьЗапросЦеныПоДаннымПоставщика(Запрос.Текст);
	Запрос.УстановитьПараметр("Товары", Объект[ИмяТабличнойЧасти].Выгрузить(МассивСтрок, "НомерСтроки,Номенклатура,Характеристика,Упаковка"));
	Запрос.УстановитьПараметр("ТоварыПоДаннымПоставщика", Объект.ТоварыПоДаннымПоставщика.Выгрузить(, "Номенклатура,Характеристика,Упаковка,Цена"));
	
	ТаблицаЦен = Запрос.Выполнить().Выгрузить();
	ТаблицаЦен.Индексы.Добавить("НомерСтроки");
	
	Если ТаблицаЦен.Количество() = 0 Тогда
		
		Возврат Ложь;
		
	КонецЕсли;
	
	Для Каждого ТекСтрока Из Объект[ИмяТабличнойЧасти] Цикл
	
		ЦенаНайдена = Ложь;
		
		НайденнаяСтрока = ТаблицаЦен.Найти(ТекСтрока.НомерСтроки,"НомерСтроки");
		ЦенаНайдена = (НайденнаяСтрока <> Неопределено);
		
		Если НЕ ЦенаНайдена Тогда
			
			Продолжить;
			
		КонецЕсли;
			
		ТекСтрока.Цена 	= НайденнаяСтрока.Цена;
		ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.КоличествоУпаковок;
		
		Если ЕстьНДС Тогда
			
			ТекСтрока.СуммаНДС = ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДС(ТекСтрока.Сумма, ТекСтрока.СтавкаНДС, Объект.ЦенаВключаетНДС);
			
		КонецЕсли;
		
		Если ЕстьНДС И ЕстьСуммаСНДС Тогда
			
			ТекСтрока.СуммаСНДС = ТекСтрока.Сумма + ?(Объект.ЦенаВключаетНДС, 0, ТекСтрока.СуммаНДС);
			
		КонецЕсли;
		
		ЦеныРассчитаны = Истина;
		
	КонецЦикла;
	
	Возврат ЦеныРассчитаны;
	
КонецФункции

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

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

// Возвращает дату ценообразования для документа.
//
// Параметры:
//  Объект - Объект документа
//
// Возвращаемое значение
//  Дата
Функция ДатаДляЦенообразованияДляДокумента(Объект) Экспорт
	
	Если ЗначениеЗаполнено(Объект.Ссылка) 
		И ЗначениеЗаполнено(Объект.Дата) Тогда
		Возврат Объект.Дата;
	Иначе
		Возврат ТекущаяДатаСеанса();
	КонецЕсли;
	
КонецФункции // ДатаДляЦенообразования()

////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ ПОЛУЧЕНИЯ ЦЕН

// Функция получения цены номенклатуры по виду цены.
//
Функция ПолучитьЦенуПоВидуЦен(ВидЦены, Дата, Номенклатура, Характеристика, Упаковка) Экспорт

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

	Возврат Цена;
	
КонецФункции

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

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

КонецФункции

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

	Возврат Цена;

КонецФункции

// Функция получения последней цены закупки номенклатуры.
//
Функция ПолучитьЦенуПоследнейЗакупки(Дата, Магазин, Контрагент, СсылкаНаПоступление, Номенклатура, Характеристика, Упаковка) Экспорт

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

	Возврат Цена;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ ОБСЛУЖИВАНИЯ СХЕМ ИНВЕНТАРИЗАЦИЙ, ЗАПОЛНЯЕМЫХ ПО ДАННЫМ ИБ

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

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

// Проверяет схему компоновки данных на соответствие ограничениям, необходимым
// для ее использования при расчете цен.
//
// Параметры:
// СхемаКомпоновкиДанных - СхемаКомпоновкиДанных, которую необходимо проверить.
// СообщениеОбОшибке     - Строка, содержит вводную часть сообщения об ошибке.
//
// Возвращаемое значение:
// Булево
// Истина, если проверка пройдена успешно, в противном случае Ложь.
//
Функция ПроверитьСхемуКомпоновкиДанных(СхемаКомпоновкиДанных, СообщениеОбОшибке = Неопределено) Экспорт
	
	Результат = Истина;
	
	Если СхемаКомпоновкиДанных <> Неопределено И СхемаКомпоновкиДанных.НаборыДанных.Количество() = 1 Тогда
		
		РабочийНаборДанных = СхемаКомпоновкиДанных.НаборыДанных[0];
		Поля = ПолучитьОбязательныеПоляСхемыКомпоновкиДанных();
		
		Для Каждого Поле Из Поля Цикл
			Если Не ПроверитьПолеНабораДанныхСКД(РабочийНаборДанных, Поле.Ключ, Поле.Значение, СообщениеОбОшибке) Тогда
				Результат = Ложь;
			КонецЕсли;
		КонецЦикла;
		
	Иначе
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(?(ЗначениеЗаполнено(СообщениеОбОшибке), СообщениеОбОшибке + ": ", "") 
			+ НСтр("ru='Схема компоновки данных для заполнения инвентаризации должна содержать один набор данных.'"));
		Результат = Ложь;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Проверяет завершение пересчета товаров.
//
// Параметры:
//  ДокументОбъект - ДокументОбъект.ПриказНаПроведениеИнвентаризации
//  Отказ - Переменная отвечающая за прерывание проведения.
//
Процедура ПроверитьВыполнениеПересчетаТоваров(ДокументОбъект, Отказ) Экспорт
	
	Если НЕ ДокументОбъект.Статус = Перечисления.СтатусыПриказовНаПроведениеИнвентаризацийТоваров.Закрыт Тогда
	
		Возврат;
	
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ПересчетТоваров.Ссылка,
	|	ПересчетТоваров.ДокументОснование
	|ИЗ
	|	Документ.ПересчетТоваров КАК ПересчетТоваров
	|ГДЕ
	|	НЕ ПересчетТоваров.ПометкаУдаления
	|	И ПересчетТоваров.ДокументОснование = &ДокументОснование
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПересчетТоваров.Ссылка,
	|	ПересчетТоваров.Статус,
	|	ПересчетТоваров.ДокументОснование
	|ИЗ
	|	Документ.ПересчетТоваров КАК ПересчетТоваров
	|ГДЕ
	|	НЕ ПересчетТоваров.ПометкаУдаления
	|	И ПересчетТоваров.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПересчетовТоваров.Выполнено)
	|	И ПересчетТоваров.ДокументОснование = &ДокументОснование";
	
	Запрос.УстановитьПараметр("ДокументОснование", ДокументОбъект.Ссылка);
	
	МассивРезультатов = Запрос.ВыполнитьПакет();
	НаличиеДокументовПересчета = НЕ МассивРезультатов[0].Пустой();
	
	Если НЕ НаличиеДокументовПересчета Тогда
	
		Текст = НСтр("ru = 'Пересчет товаров не начинался'"); 
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			Текст,
			ДокументОбъект,
			"Статус" ,
			,
			Отказ
		);
	Иначе
		РезультатСписокНеВыполненныхПересчетов = МассивРезультатов[1];
		
		Если НЕ РезультатСписокНеВыполненныхПересчетов.Пустой() Тогда
			Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'По документу %1 не выполнены пересчеты:'"),
				ДокументОбъект.Ссылка
			);
			
			Выборка = РезультатСписокНеВыполненныхПересчетов.Выбрать();
			Пока Выборка.Следующий() Цикл
			
				Текст = Текст  + Символы.ПС +
						СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
									НСтр("ru = '    %1'"),
									Выборка.Ссылка
								);
			КонецЦикла;
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
				Текст,
				ДокументОбъект,
				"Статус" ,
				,
				Отказ
			);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ПРОЧИЕ ПРОЦЕДУРЫ И ФУНКЦИИ

// Получение данных отчета ТОРГ29 для построения отчета и формирования печатных форм переоценки склада.
//
Процедура ПолучитьДанныеТОРГ29(СтруктураПараметров, ТаблицаРезультат) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);

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

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

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

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

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

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

КонецПроцедуры // СформироватьЗапросЦеныПрайсЛиста()

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

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

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

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

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

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

// Удаляет подарочные сертификаты.
//
// Параметры:
//  ТабличнаяЧасть - табличная часть документа.
//
Процедура УдалитьПодарочныеСертификаты(ТабличнаяЧасть) Экспорт

	КолвоЭлементовКоллекции = ТабличнаяЧасть.Количество();
	Для ОбратныйИндекс = 1 По КолвоЭлементовКоллекции Цикл
		ЭлементКоллекции = ТабличнаяЧасть[КолвоЭлементовКоллекции - ОбратныйИндекс];

		Если ЭлементКоллекции.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.ПодарочныйСертификат Тогда			
			ТабличнаяЧасть.Удалить(ЭлементКоллекции);
		КонецЕсли;
	КонецЦикла;
	

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

// По табличной части объекта получает массив остатков.
// Параметры:
//  Объект - объект документа или обработки
//  ИмяТабличнойЧасти = имя табличной части.
//  
// Возвращаемое значение
//  Массив
//
Функция ПолучитьОстаткиНоменклатуры(Объект, ИмяТабличнойЧасти) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ТаблицаНоменклатуры.Номенклатура,
	|	ТаблицаНоменклатуры.Характеристика,
	|	ТаблицаНоменклатуры.Склад
	|ПОМЕСТИТЬ ТаблицаВЗапрос
	|ИЗ
	|	&ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыНаСкладахОстатки.Склад,
	|	ТоварыНаСкладахОстатки.Номенклатура,
	|	ТоварыНаСкладахОстатки.Характеристика,
	|	ТоварыНаСкладахОстатки.КоличествоОстаток
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(
	|			,
	|			(Номенклатура, Характеристика, Склад) В
	|				(ВЫБРАТЬ
	|					ТаблицаВЗапрос.Номенклатура,
	|					ТаблицаВЗапрос.Характеристика,
	|					ТаблицаВЗапрос.Склад
	|				ИЗ
	|					ТаблицаВЗапрос КАК ТаблицаВЗапрос)) КАК ТоварыНаСкладахОстатки";
	
	ТаблицаНоменклатуры = Объект[ИмяТабличнойЧасти].Выгрузить();
	
	Запрос.УстановитьПараметр("ТаблицаНоменклатуры", ТаблицаНоменклатуры);
	
	Результат = Запрос.Выполнить();
	ТаблицаОстатков = Результат.Выгрузить();
	
	СтруктураПоиска = Новый Структура;
	МассивОстатков = Новый Массив;
	
	Для каждого СтрокаТаблицыНоменклатуры Из ТаблицаНоменклатуры Цикл
	
		СтруктураПоиска.Вставить("Номенклатура"  , СтрокаТаблицыНоменклатуры.Номенклатура);
		СтруктураПоиска.Вставить("Характеристика", СтрокаТаблицыНоменклатуры.Характеристика);
		СтруктураПоиска.Вставить("Склад"         , СтрокаТаблицыНоменклатуры.Склад);
		
		МассивСтрок = ТаблицаОстатков.НайтиСтроки(СтруктураПоиска);
		
		Если МассивСтрок.Количество() > 0  Тогда
			
			МассивОстатков.Добавить(МассивСтрок[0].КоличествоОстаток)
			
		Иначе
			
			МассивОстатков.Добавить(0)
			
		КонецЕсли;
	
	КонецЦикла;
	
	Возврат МассивОстатков;
КонецФункции

// По табличной части объекта получает массив остатков.
// Параметры:
//  Объект - объект документа или обработки
//  ИмяТабличнойЧасти = имя табличной части.
//  
//
Процедура ЗаполнитьОстаткиНоменклатуры(Объект, ИмяТабличнойЧасти) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ТаблицаНоменклатуры.Номенклатура,
	|	ТаблицаНоменклатуры.Характеристика,
	|	ТаблицаНоменклатуры.Склад
	|ПОМЕСТИТЬ ТаблицаВЗапрос
	|ИЗ
	|	&ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыНаСкладахОстатки.Склад,
	|	ТоварыНаСкладахОстатки.Номенклатура,
	|	ТоварыНаСкладахОстатки.Характеристика,
	|	ТоварыНаСкладахОстатки.КоличествоОстаток - ТоварыНаСкладахОстатки.РезервОстаток КАК ОстатокБезРезерва
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(
	|			,
	|			(Номенклатура, Характеристика, Склад) В
	|				(ВЫБРАТЬ
	|					ТаблицаВЗапрос.Номенклатура,
	|					ТаблицаВЗапрос.Характеристика,
	|					ТаблицаВЗапрос.Склад
	|				ИЗ
	|					ТаблицаВЗапрос КАК ТаблицаВЗапрос)) КАК ТоварыНаСкладахОстатки";
	
	ТаблицаНоменклатуры = Объект[ИмяТабличнойЧасти].Выгрузить();
	
	Запрос.УстановитьПараметр("ТаблицаНоменклатуры", ТаблицаНоменклатуры);
	
	Результат = Запрос.Выполнить();
	ТаблицаОстатков = Результат.Выгрузить();
	
	СтруктураПоиска = Новый Структура;
	МассивОстатков = Новый Массив;
	
	Для каждого СтрокаТаблицыНоменклатуры Из Объект[ИмяТабличнойЧасти] Цикл
	
		СтруктураПоиска.Вставить("Номенклатура"  , СтрокаТаблицыНоменклатуры.Номенклатура);
		СтруктураПоиска.Вставить("Характеристика", СтрокаТаблицыНоменклатуры.Характеристика);
		СтруктураПоиска.Вставить("Склад"         , СтрокаТаблицыНоменклатуры.Склад);
		
		МассивСтрок = ТаблицаОстатков.НайтиСтроки(СтруктураПоиска);
		
		Если МассивСтрок.Количество() > 0  Тогда
			СтрокаТаблицыНоменклатуры.Остаток = МассивСтрок[0].ОстатокБезРезерва;
		Иначе
			СтрокаТаблицыНоменклатуры.Остаток = 0;
		КонецЕсли;
	
	КонецЦикла;
	
КонецПроцедуры

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

	Движения.ДвиженияСерийТоваров.Записывать = Истина;
	Движения.ДвиженияСерийТоваров.Загрузить(Таблица);
КонецПроцедуры

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

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

Посмотрю - можно ли что-то понять в этой портянке уже вечером.
21.03.2017 17:52
KirillHome
 
Цитата:
KirillHome Посмотрю - можно ли что-то понять в этой портянке уже вечером.
Посмотрел.
Заполнение СебестоимостьПоступлений увидел.
Что дальше делать с 5'600 строк кода - я не знаю.

Снова и снова и снова.
Есть ошибка деления на ноль в запросе.
Запрос обращается к двум таблицам - ТаблицаПриемник и СебестоимостьПоступлений.
Мы должны проанализировать - в какой таблице (как в результате объединения?) у нас данные дают в результате деление на 0.
Для этого нужно отладчиком остановиться перед запросом и получить содержимое этих двух таблиц.
Далее - смотрим на эти таблицы, смотрим на запрос, используем консоль запросов и разбираемся - что не так.
Часовой пояс GMT +3, время: 14:00.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.