/////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ ФОРМИРОВАНИЯ ДВИЖЕНИЙ // Процедура записи движений в регистр ТоварыНаСкладах. // Процедура ОтразитьТоварыНаСкладах(ДополнительныеСвойства, Движения, Отказ) Экспорт Таблица= ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаТоварыНаСкладах; Если Отказ ИЛИ Таблица.Количество() = 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 Тогда Возврат; КонецЕсли; Движения.ДвиженияСерийТоваров.Записывать = Истина; Движения.ДвиженияСерийТоваров.Загрузить(Таблица); КонецПроцедуры // Функция возвращает пустой шаблон структуры параметров для процедуры ЗаполнитьЦеныВыделенныхСтрокПоВидуЦен. // Функция СтруктураПараметровЗаполненияПоВидуЦен() Экспорт СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("Объект"); СтруктураПараметров.Вставить("ИмяТабличнойЧасти"); СтруктураПараметров.Вставить("ВидЦен"); СтруктураПараметров.Вставить("ВыделенныеСтроки"); СтруктураПараметров.Вставить("Дата"); СтруктураПараметров.Вставить("ЕстьНДС", Истина); СтруктураПараметров.Вставить("ЕстьСуммаСНДС", Ложь); СтруктураПараметров.Вставить("ВидЦеныВТабличнойЧасти", Ложь); Возврат СтруктураПараметров; КонецФункции // Функция возвращает пустой шаблон структуры параметров для процедуры ЗаполнитьЦеныВыделенныхСтрокПоРозничнымЦенам. // Функция СтруктураПараметровЗаполненияПоРозничнымЦенам() Экспорт СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("Объект"); СтруктураПараметров.Вставить("ИмяТабличнойЧасти"); СтруктураПараметров.Вставить("Магазин"); СтруктураПараметров.Вставить("ВыделенныеСтроки"); СтруктураПараметров.Вставить("Дата"); СтруктураПараметров.Вставить("ЕстьНДС", Истина); СтруктураПараметров.Вставить("ЕстьСуммаСНДС", Ложь); СтруктураПараметров.Вставить("ПриводитьКМинимальнойЦене", Ложь); Возврат СтруктураПараметров; КонецФункции