#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Функция ПолучитьСуммуЗаказанныхСтрок(ТолькоЗалогЗаТару = Ложь) Экспорт
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.СуммаСНДС КАК СуммаСНДС,
| Товары.Отменено КАК Отменено
|ПОМЕСТИТЬ
| Товары
|ИЗ
| &Товары КАК Товары
|;
|ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Товары.СуммаСНДС),0) КАК СуммаСНДС
|ИЗ
| Товары КАК Товары
|ГДЕ
| НЕ Товары.Отменено
| И ((Товары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
| ИЛИ (НЕ &ВернутьМногооборотнуюТару) ИЛИ &ТребуетсяЗалогЗаТару)
| И НЕ &ТолькоЗалогЗаТару)
| ИЛИ (Товары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
| И &ВернутьМногооборотнуюТару
| И &ТребуетсяЗалогЗаТару
| И &ТолькоЗалогЗаТару)
|");
Запрос.УстановитьПараметр("Товары", Товары.Выгрузить(,"Номенклатура,СуммаСНДС,Отменено"));
Запрос.УстановитьПараметр("ВернутьМногооборотнуюТару", ВернутьМногооборотнуюТару);
Запрос.УстановитьПараметр("ТребуетсяЗалогЗаТару", ТребуетсяЗалогЗаТару);
Запрос.УстановитьПараметр("ТолькоЗалогЗаТару", ТолькоЗалогЗаТару);
Выгрузка = Запрос.Выполнить().Выгрузить();
СуммаЗаказанныхСтрок = Выгрузка[0].СуммаСНДС;
Возврат СуммаЗаказанныхСтрок;
КонецФункции
Функция ПолучитьСуммуВозвратнойТары() Экспорт
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.СуммаСНДС КАК СуммаСНДС,
| Товары.Отменено КАК Отменено
|ПОМЕСТИТЬ
| Товары
|ИЗ
| &Товары КАК Товары
|;
|ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Товары.СуммаСНДС),0) КАК СуммаСНДС
|ИЗ
| Товары КАК Товары
|ГДЕ
| НЕ Товары.Отменено
| И Товары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
| И &ВернутьМногооборотнуюТару
| И НЕ &ТребуетсяЗалогЗаТару
|");
Запрос.УстановитьПараметр("Товары", Товары.Выгрузить(,"Номенклатура,СуммаСНДС,Отменено"));
Запрос.УстановитьПараметр("ВернутьМногооборотнуюТару", ВернутьМногооборотнуюТару);
Запрос.УстановитьПараметр("ТребуетсяЗалогЗаТару", ТребуетсяЗалогЗаТару);
Выгрузка = Запрос.Выполнить().Выгрузить();
СуммаВозвратнойТарыЗаказанныхСтрок = Выгрузка[0].СуммаСНДС;
Возврат СуммаВозвратнойТарыЗаказанныхСтрок;
КонецФункции
Функция ПолучитьКоличествоЗаказанныхСтрок() Экспорт
НайденныеСтроки = Товары.НайтиСтроки(Новый Структура("Отменено", Ложь));
Возврат НайденныеСтроки.Количество();
КонецФункции
Процедура ЗаполнитьУсловияЗакупок(Знач УсловияЗакупок) Экспорт
Если УсловияЗакупок = Неопределено Тогда
Возврат;
КонецЕсли;
Валюта = УсловияЗакупок.Валюта;
Если ЗначениеЗаполнено(УсловияЗакупок.ФормаОплаты) Тогда
ФормаОплаты = УсловияЗакупок.ФормаОплаты;
КонецЕсли;
Если ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоНакладным
Или ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоДоговорамНакладным Тогда
НаправлениеДеятельности = Справочники.НаправленияДеятельности.ПустаяСсылка();
Иначе
НаправлениеДеятельности = УсловияЗакупок.НаправлениеДеятельности;
КонецЕсли;
Если ЗначениеЗаполнено(УсловияЗакупок.Организация) И УсловияЗакупок.Организация<>Организация Тогда
Организация = УсловияЗакупок.Организация;
СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();
СтруктураПараметров.Организация = Организация;
СтруктураПараметров.ФормаОплаты = ФормаОплаты;
СтруктураПараметров.НаправлениеДеятельности = НаправлениеДеятельности;
БанковскийСчет = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтруктураПараметров);
СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияКассыОрганизацииПоУмолчанию();
СтруктураПараметров.Организация = Организация;
СтруктураПараметров.ФормаОплаты = ФормаОплаты;
СтруктураПараметров.НаправлениеДеятельности = НаправлениеДеятельности;
Касса = ЗначениеНастроекПовтИсп.ПолучитьКассуОрганизацииПоУмолчанию(СтруктураПараметров);
КонецЕсли;
Если ЗначениеЗаполнено(УсловияЗакупок.Склад) Тогда
Склад = УсловияЗакупок.Склад;
КонецЕсли;
Если ЗначениеЗаполнено(УсловияЗакупок.Контрагент) Тогда
Контрагент = УсловияЗакупок.Контрагент;
КонецЕсли;
ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);
Если ЗначениеЗаполнено(УсловияЗакупок.ХозяйственнаяОперация) Тогда
ОперацияПоСоглашению = ХозяйственнаяОперация;
ОперацииРаздельнойЗакупки = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(УсловияЗакупок.ХозяйственнаяОперация);
Если ОперацииРаздельнойЗакупки.Найти(ХозяйственнаяОперация) = Неопределено
И Не (ОперацияПоСоглашению = Перечисления.ХозяйственныеОперации.ЗакупкаЧерезПодотчетноеЛицо
И УсловияЗакупок.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика) Тогда
ОперацияПоСоглашению = УсловияЗакупок.ХозяйственнаяОперация;
КонецЕсли;
ХозяйственнаяОперация = ОперацияПоСоглашению;
КонецЕсли;
ХозяйственнаяОперацияДоговора = ?(ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщикаРеглУчет
Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаЧерезПодотчетноеЛицо,
Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика,
ХозяйственнаяОперация);
ХозяйственнаяОперацияДоговора = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(ХозяйственнаяОперацияДоговора);
Если УсловияЗакупок.ИспользуютсяДоговорыКонтрагентов <> Неопределено
И УсловияЗакупок.ИспользуютсяДоговорыКонтрагентов Тогда
ДопПараметры = ЗакупкиСервер.ДополнительныеПараметрыОтбораДоговоров();
ДопПараметры.ВалютаВзаиморасчетов = Валюта;
Договор = ЗакупкиСервер.ПолучитьДоговорПоУмолчанию(ЭтотОбъект, ХозяйственнаяОперацияДоговора, ДопПараметры);
ЗакупкиВызовСервера.ЗаполнитьБанковскиеСчетаПоДоговору(Договор, БанковскийСчет);
Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетЗатратПоНаправлениямДеятельности")
Или ПолучитьФункциональнуюОпцию("ИспользоватьУчетРасчетовСПоставщикамиПоНаправлениямДеятельности") Тогда
Если ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоНакладным
Или ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоДоговорамНакладным Тогда
НаправлениеДеятельности = Справочники.НаправленияДеятельности.ПустаяСсылка();
Иначе
НаправленияДеятельностиСервер.ЗаполнитьНаправлениеПоУмолчанию(НаправлениеДеятельности, Соглашение, Договор);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.ПриемНаХранениеСПравомПродажи Тогда
ЦенаВключаетНДС = УсловияЗакупок.ЦенаВключаетНДС;
КонецЕсли;
Если Не ЗначениеЗаполнено(УсловияЗакупок.ИспользуютсяДоговорыКонтрагентов)
Или Не УсловияЗакупок.ИспользуютсяДоговорыКонтрагентов Тогда
ОплатаВВалюте = УсловияЗакупок.ОплатаВВалюте;
Если ЗначениеЗаполнено(УсловияЗакупок.ГруппаФинансовогоУчета) Тогда
ГруппаФинансовогоУчета = УсловияЗакупок.ГруппаФинансовогоУчета;
КонецЕсли;
Иначе
РеквизытыДоговора = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Договор, "ОплатаВВалюте, ГруппаФинансовогоУчета");
ОплатаВВалюте = РеквизытыДоговора.ОплатаВВалюте;
ГруппаФинансовогоУчета = РеквизытыДоговора.ГруппаФинансовогоУчета;
КонецЕсли;
Если ЗначениеЗаполнено(УсловияЗакупок.СрокПоставки) Тогда
ДатаДокумента = ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса());
ЖелаемаяДатаПоступления = ОбщегоНазначенияУТКлиентСервер.РассчитатьДатуОкончанияПериода(ДатаДокумента, Перечисления.Периодичность.День, УсловияЗакупок.СрокПоставки) + 1;
КонецЕсли;
РегистрироватьЦеныПоставщика = УсловияЗакупок.РегистрироватьЦеныПоставщика;
ВернутьМногооборотнуюТару = УсловияЗакупок.ВозвращатьМногооборотнуюТару;
СрокВозвратаМногооборотнойТары = УсловияЗакупок.СрокВозвратаМногооборотнойТары;
ТребуетсяЗалогЗаТару = УсловияЗакупок.ТребуетсяЗалогЗаТару;
ДлительностьДоставки = УсловияЗакупок.ДлительностьДоставки;
Если ЗначениеЗаполнено(ДатаПоступления) Тогда
ДатаОтгрузки = ДатаПоступления - ДлительностьДоставки*86400;
Для Каждого Стр Из Товары Цикл
Стр.ДатаОтгрузки = Стр.ДатаПоступления - ДлительностьДоставки*86400;
КонецЦикла;
ИначеЕсли ЗначениеЗаполнено(ДатаОтгрузки) Тогда
ДатаПоступления = ДатаОтгрузки + ДлительностьДоставки*86400;
Для Каждого Стр Из Товары Цикл
Стр.ДатаПоступления = Стр.ДатаОтгрузки + ДлительностьДоставки*86400;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьУсловияЗакупокПоУмолчанию(ПересчитатьЦены = Истина) Экспорт
Если ЗначениеЗаполнено(Партнер) Тогда
ОтборУсловийЗакупок = Новый Структура("УчитыватьГруппыСкладов, ВыбранноеСоглашение", Истина, Соглашение);
Если ЗначениеЗаполнено(ХозяйственнаяОперация) Тогда
ХозяйственныеОперации = ЗакупкиСервер.ОсновнаяХозяйственнаяОперацияРаздельнойЗакупки(ХозяйственнаяОперация);
ОтборУсловийЗакупок.Вставить("ХозяйственныеОперации", ХозяйственныеОперации);
КонецЕсли;
УсловияЗакупокПоУмолчанию = ЗакупкиСервер.ПолучитьУсловияЗакупокПоУмолчанию(Партнер, ОтборУсловийЗакупок);
Если УсловияЗакупокПоУмолчанию <> Неопределено Тогда
Если Соглашение <> УсловияЗакупокПоУмолчанию.Соглашение
И ЗначениеЗаполнено(УсловияЗакупокПоУмолчанию.Соглашение) Тогда
Соглашение = УсловияЗакупокПоУмолчанию.Соглашение;
ЗаполнитьУсловияЗакупок(УсловияЗакупокПоУмолчанию);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
Если ПересчитатьЦены
И ЗначениеЗаполнено(Соглашение) Тогда
ЗаполнитьЦеныПоСоглашению();
КонецЕсли;
Иначе
Соглашение = УсловияЗакупокПоУмолчанию.Соглашение;
ЗаполнитьУсловияЗакупок(УсловияЗакупокПоУмолчанию);
КонецЕсли;
Иначе
ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);
Соглашение = Неопределено;
ХозяйственнаяОперацияДоговора = ?(ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщикаРеглУчет
Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаЧерезПодотчетноеЛицо,
Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика,
ХозяйственнаяОперация);
ХозяйственнаяОперацияДоговора = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(ХозяйственнаяОперацияДоговора);
ДопПараметры = ЗакупкиСервер.ДополнительныеПараметрыОтбораДоговоров();
ДопПараметры.ВалютаВзаиморасчетов = Валюта;
Договор = ЗакупкиСервер.ПолучитьДоговорПоУмолчанию(ЭтотОбъект, ХозяйственнаяОперацияДоговора, ДопПараметры);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
ЗакупкиВызовСервера.ЗаполнитьБанковскиеСчетаПоДоговору(Договор, БанковскийСчет);
КонецЕсли;
КонецЕсли;
ПартнерыИКонтрагенты.ЗаполнитьКонтактноеЛицоПартнераПоУмолчанию(Партнер, КонтактноеЛицо);
КонецПроцедуры
Процедура ЗаполнитьУсловияЗакупокПоСоглашению(ПересчитатьЦены = Истина) Экспорт
УсловияЗакупок = ЗакупкиСервер.ПолучитьУсловияЗакупок(Соглашение, Истина);
ЗаполнитьУсловияЗакупок(УсловияЗакупок);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
Если ПересчитатьЦены Тогда
СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
ПересчитатьСуммуСУчетомРучнойСкидки = Новый Структура("Очищать", Ложь);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС",СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуНДС",СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуРучнойСкидки", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", ПересчитатьСуммуСУчетомРучнойСкидки);
ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены();
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦеныПоставщика");
ПараметрыЗаполнения.Вставить("Дата", Дата);
ПараметрыЗаполнения.Вставить("Организация", Организация);
ПараметрыЗаполнения.Вставить("Валюта", Валюта);
ПараметрыЗаполнения.Вставить("Соглашение", Соглашение);
ПараметрыЗаполнения.Вставить("НалогообложениеНДС", НалогообложениеНДС);
ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены(
Товары,
Неопределено,
ПараметрыЗаполнения,
СтруктураДействий);
КонецЕсли;
КонецПроцедуры
Функция УстановитьСтатус(НовыйСтатус, ДополнительныеПараметры) Экспорт
ЗначениеНовогоСтатуса = Перечисления.СтатусыЗаказовПоставщикам[НовыйСтатус];
Если Согласован И
ЗначениеНовогоСтатуса <> Перечисления.СтатусыЗаказовПоставщикам.Согласован
И ЗначениеНовогоСтатуса <> Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
И ЗначениеНовогоСтатуса <> Перечисления.СтатусыЗаказовПоставщикам.Закрыт Тогда
Согласован = Ложь;
КонецЕсли;
Если Товары.Количество() > 0 Тогда
Если Статус <> Перечисления.СтатусыЗаказовПоставщикам.Закрыт
И Статус <> Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
И (ЗначениеНовогоСтатуса = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
ИЛИ ЗначениеНовогоСтатуса = Перечисления.СтатусыЗаказовПоставщикам.Закрыт) Тогда
ЗаполнитьПустуюДатуПоступления();
КонецЕсли;
КонецЕсли;
Если ДополнительныеПараметры <> Неопределено Тогда
ЗаказыСервер.СкорректироватьСтрокиЗаказа(ЭтотОбъект, ДополнительныеПараметры);
КонецЕсли;
Статус = ЗначениеНовогоСтатуса;
Возврат ПроверитьЗаполнение();
КонецФункции
Функция ПроверитьЗавершениеРасчетов() Экспорт
КонтрольЗавершенияРасчетов = ПолучитьФункциональнуюОпцию("НеЗакрыватьЗаказыПоставщикамБезПолнойОплаты");
Если Не КонтрольЗавершенияРасчетов Тогда
Возврат Истина
КонецЕсли;
ТекстОшибки = НСтр("ru = 'Расчеты по заказу не завершены.
|Для закрытия заказа требуется оплата %СуммаКОплате% %Валюта%.
|Закрытие заказа возможно только с полностью оплаченными/отмененными строками'");
СуммаЗаказанныхСтрок = ПолучитьСуммуЗаказанныхСтрок();
Запрос = Новый Запрос(
"ВЫБРАТЬ
| РасчетыСПоставщикамиОстатки.Валюта КАК Валюта,
| РасчетыСПоставщикамиОстатки.КОплатеПриход КАК Оплачено
|ИЗ
| РегистрНакопления.РасчетыСПоставщиками.ОстаткиИОбороты(, , , , ОбъектРасчетов.Объект = &Ссылка) КАК РасчетыСПоставщикамиОстатки
|");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.Оплачено < СуммаЗаказанныхСтрок Тогда
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%СуммаКОплате%", Строка(СуммаЗаказанныхСтрок - Выборка.Оплачено));
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Валюта%", Строка(Выборка.Валюта));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,,,,);
Возврат Ложь
КонецЕсли;
КонецЕсли;
Возврат Истина
КонецФункции
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Автор = Пользователи.ТекущийПользователь();
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
НеобходимаИнициализация = Истина;
ПараметрыВыбораСтатейИАналитик = Документы.ЗаказПоставщику.ПараметрыВыбораСтатейИАналитик(ХозяйственнаяОперация);
ДоходыИРасходыСервер.ОбработкаЗаполнения(ЭтотОбъект, ПараметрыВыбораСтатейИАналитик);
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
Если ДанныеЗаполнения.Свойство("Основание") Тогда
ТипОснования = ТипЗнч(ДанныеЗаполнения.Основание);
Если ТипОснования = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ЗаполнитьДокументНаОснованииЗаказаКлиента(ДанныеЗаполнения);
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента") Тогда
ЗаполнитьДокументНаОснованииЗаявкиНаВозврат(ДанныеЗаполнения);
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказНаПеремещение") Тогда
ЗаполнитьДокументНаОснованииЗаказаНаПеремещение(ДанныеЗаполнения);
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказНаВнутреннееПотребление") Тогда
ЗаполнитьДокументНаОснованииЗаказаНаВнутреннееПотребление(ДанныеЗаполнения);
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказМатериаловВПроизводство") Тогда
ЗаполнитьДокументНаОснованииЗаказаМатериаловВПроизводство(ДанныеЗаполнения);
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказПереработчику") Тогда
ЗаполнитьДокументНаОснованииЗаказаПереработчику(ДанныеЗаполнения);
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказПереработчику2_5") Тогда
ЗаполнитьДокументНаОснованииЗаказаПереработчику2_5(ДанныеЗаполнения);
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ЗаказНаСборку") Тогда
ЗаполнитьДокументНаОснованииЗаказаНаСборку(ДанныеЗаполнения);
КонецЕсли;
Иначе
ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
КонецЕсли;
ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.Партнеры") Тогда
ЗаполнитьДокументНаОснованииПартнера(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.СоглашенияСПоставщиками") Тогда
ЗаполнитьДокументНаОснованииСоглашенияСПоставщиком(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
ЗаполнитьДокументНаОснованииДоговора(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.СделкиСКлиентами") Тогда
ЗаполнитьДокументНаОснованииСделки(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ИзменениеАссортимента") Тогда
ИнициализироватьДокумент(ДанныеЗаполнения);
НеобходимаИнициализация = Ложь;
ЗаполнитьДокументНаОснованииИзмененияАссортимента(ДанныеЗаполнения);
КонецЕсли;
ДополнительныеСвойства.Вставить("НеобходимостьЗаполненияКассыПриФОИспользоватьНесколькоКассЛожь", Ложь);
ДополнительныеСвойства.Вставить("НеобходимостьЗаполненияСчетаПриФОИспользоватьНесколькоСчетовЛожь", Ложь);
ЗаказПоставщикуЛокализация.ОбработкаЗаполнения(ЭтотОбъект, ДанныеЗаполнения, СтандартнаяОбработка);
ЗначениеСклада = Склад;
ЗаполнениеОбъектовПоСтатистике.ЗаполнитьРеквизитыОбъекта(ЭтотОбъект, ДанныеЗаполнения);
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Основание") Тогда
Склад = ЗначениеСклада;
КонецЕсли;
ОтветственныеЛицаСервер.УстановитьМенеджера(ЭтотОбъект);
ЗаполнениеОбъектовПоСтатистике.ЗаполнитьПодчиненныеРеквизитыОбъекта(ЭтотОбъект, "Менеджер",, Истина);
Если НеобходимаИнициализация Тогда
ИнициализироватьДокумент(ДанныеЗаполнения);
КонецЕсли;
ВзаиморасчетыСервер.ОбработкаЗаполнения(ЭтотОбъект, ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Или
ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента") Тогда
Если ЗакупкаПодДеятельность <> НалогообложениеНДС Тогда
СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(ЭтотОбъект, Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Товары, СтруктураДействий, Неопределено);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
ПараметрыВыбораСтатейИАналитик = Документы.ЗаказПоставщику.ПараметрыВыбораСтатейИАналитик(ХозяйственнаяОперация);
ДоходыИРасходыСервер.ПередЗаписью(ЭтотОбъект, ПараметрыВыбораСтатейИАналитик);
НоменклатураСервер.ОкруглитьКоличествоШтучныхТоваров(ЭтотОбъект, РежимЗаписи);
ЗаказыСервер.УстановитьКлючВСтрокахТабличнойЧасти(ЭтотОбъект, "Товары");
МассивВсехРеквизитов = Новый Массив;
МассивРеквизитовОперации = Новый Массив;
Документы.ЗаказПоставщику.ЗаполнитьИменаРеквизитовПоХозяйственнойОперации(
ХозяйственнаяОперация,
МассивВсехРеквизитов,
МассивРеквизитовОперации);
ДенежныеСредстваСервер.ОчиститьНеиспользуемыеРеквизиты(
ЭтотОбъект,
МассивВсехРеквизитов,
МассивРеквизитовОперации);
Если (ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаКомиссию
Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаХранениеСПравомПродажи
Или Не ВернутьМногооборотнуюТару)
И ТребуетсяЗалогЗаТару Тогда
ТребуетсяЗалогЗаТару = Ложь;
КонецЕсли;
СуммаДокумента = ПолучитьСуммуЗаказанныхСтрок();
СуммаВозвратнойТары = ПолучитьСуммуВозвратнойТары();
ГрафикИсполненияВДоговоре = Ложь;
Если ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоДоговорамКонтрагентов
И ЗначениеЗаполнено(Договор) Тогда
ГрафикИсполненияВДоговоре = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Договор, "ЗаданГрафикИсполнения");
КонецЕсли;
Если Не ЗначениеЗаполнено(Номер) Тогда
УстановитьНовыйНомер();
КонецЕсли;
ДокументСогласован = Согласован;
ОбщегоНазначенияУТ.ИзменитьПризнакСогласованностиДокумента(
ЭтотОбъект,
РежимЗаписи,
Перечисления.СтатусыЗаказовПоставщикам.НеСогласован);
Если Не ДокументСогласован И Согласован Тогда
ДатаСогласования = ТекущаяДатаСеанса();
ВзаиморасчетыСервер.ПриИзмененииДатыСогласования(ЭтотОбъект);
КонецЕсли;
ВзаиморасчетыСервер.ПередЗаписью(ЭтотОбъект, Отказ, РежимЗаписи);
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаКомиссию
Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаХранениеСПравомПродажи
Или ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоНакладным
Или ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоДоговорамНакладным
Или ГрафикИсполненияВДоговоре Тогда
СуммаАвансаДоПодтверждения = 0;
СуммаПредоплатыДоПоступления = 0;
Иначе
Если Не ТребуетсяЗалогЗаТару Тогда
Для Каждого ЭтапОплаты Из ЭтапыГрафикаОплаты Цикл
ЭтапОплаты.СуммаЗалогаЗаТару = 0;
КонецЦикла;
КонецЕсли;
ТаблицаЭтапов = ЭтапыГрафикаОплаты.Выгрузить(, "ВариантОплаты, СуммаПлатежа, СуммаЗалогаЗаТару");
ТаблицаЭтапов.Свернуть("ВариантОплаты", "СуммаПлатежа,СуммаЗалогаЗаТару");
СтрокаАвансаДоПодтверждения = ТаблицаЭтапов.Найти(Перечисления.ВариантыКонтроляОплатыПоставщику.АвансДоПодтверждения,"ВариантОплаты");
Если СтрокаАвансаДоПодтверждения = Неопределено Тогда
СуммаАвансаДоПодтверждения = 0;
Иначе
СуммаАвансаДоПодтверждения = СтрокаАвансаДоПодтверждения.СуммаПлатежа + СтрокаАвансаДоПодтверждения.СуммаЗалогаЗаТару;
КонецЕсли;
СтрокаПредоплатыДоПоступления = ТаблицаЭтапов.Найти(Перечисления.ВариантыКонтроляОплатыПоставщику.ПредоплатаДоПоступления,"ВариантОплаты");
Если СтрокаПредоплатыДоПоступления = Неопределено Тогда
СуммаПредоплатыДоПоступления = 0;
Иначе
СуммаПредоплатыДоПоступления = СтрокаПредоплатыДоПоступления.СуммаПлатежа + СтрокаПредоплатыДоПоступления.СуммаЗалогаЗаТару;
КонецЕсли;
КонецЕсли;
НоваяДатаПоступления = Дата(1,1,1);
Если Товары.Количество() > 0 Тогда
Если Статус = Перечисления.СтатусыЗаказовПоставщикам.Согласован
ИЛИ Статус = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
ИЛИ Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт Тогда
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Отменено", Ложь);
ПодтвержденныеСтроки = Товары.НайтиСтроки(ПараметрыОтбора);
Если ПодтвержденныеСтроки.Количество() > 0 Тогда
ТаблицаПодтвержденныхСтрок = Товары.Выгрузить(ПодтвержденныеСтроки, "ДатаПоступления");
ТаблицаПодтвержденныхСтрок.Сортировать("ДатаПоступления Возр");
НоваяДатаПоступления = ТаблицаПодтвержденныхСтрок[0].ДатаПоступления;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ДатаПервогоПоступления = НоваяДатаПоступления;
ДенежныеСредстваСервер.ОчиститьНеиспользуемыеРеквизитыФормыОплаты(ЭтотОбъект, ФормаОплаты);
ОперацииИмпорта = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(Перечисления.ХозяйственныеОперации.ЗакупкаПоИмпорту);
ОперацииВСтранахЕАЭС = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(Перечисления.ХозяйственныеОперации.ЗакупкаВСтранахЕАЭС);
ОперацияНеОблагаетсяНДС = (ОперацииИмпорта.Найти(ХозяйственнаяОперация) <> Неопределено
Или ОперацииВСтранахЕАЭС.Найти(ХозяйственнаяОперация) <> Неопределено);
Если ОперацияНеОблагаетсяНДС Тогда
НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаНеОблагаетсяНДС;
КонецЕсли;
НоменклатураПартнеровСервер.ЗаполнитьНоменклатуруПартнераПоНоменклатуреВТаблице(Товары, Партнер);
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
НоменклатураПартнеровСервер.ЗаполнитьПустоеСопоставлениеВНоменклатуреПартнераПоНоменклатуреИБ(Товары, Отказ);
КонецЕсли;
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(ЭтотОбъект, Метаданные.Документы.ЗаказПоставщику.ТабличныеЧасти.Товары.Имя);
КонецЕсли;
ЗаказПоставщикуЛокализация.ПередЗаписью(ЭтотОбъект, Отказ, РежимЗаписи, РежимПроведения);
Если Не ЗначениеЗаполнено(Автор) И ЭтоНовый() Тогда
Автор = Пользователи.ТекущийПользователь();
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
Если (ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.ПриемНаХранениеСПравомПродажи)
И Не ЗакупкиСервер.ЭтоХозяйственнаяОперацияРаздельнойЗакупки(ХозяйственнаяОперация)
И (Не ЗначениеЗаполнено(Соглашение)
Или Не ОбщегоНазначенияУТ.ЗначениеРеквизитаОбъектаТипаБулево(Соглашение, "ИспользуютсяДоговорыКонтрагентов")) Тогда
МассивНепроверяемыхРеквизитов.Добавить("Договор");
КонецЕсли;
НоменклатураСервер.ПроверитьЗаполнениеКоличества(ЭтотОбъект, ПроверяемыеРеквизиты, Отказ);
НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект,МассивНепроверяемыхРеквизитов,Отказ);
Если Статус = Перечисления.СтатусыЗаказовПоставщикам.НеСогласован И
ЗначениеЗаполнено(ДатаСогласования) И ДатаСогласования < НачалоДня(Дата) Тогда
ТекстОшибки = НСтр("ru = 'Дата согласования должна быть не меньше даты документа %Дата%'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата, "ДЛФ=DD"));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
"ДатаСогласования",
,
Отказ);
КонецЕсли;
ВсеСтрокиОтменены = ОбщегоНазначенияУТ.ВсеСтрокиОтменены(ЭтотОбъект, "Товары", "Отменено");
Если Не ПоступлениеОднойДатой ИЛИ
ПоступлениеОднойДатой И
НЕ(Статус = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден Или
Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт)
ИЛИ ПоступлениеОднойДатой И ВсеСтрокиОтменены Тогда
МассивНепроверяемыхРеквизитов.Добавить("ДатаОтгрузки");
МассивНепроверяемыхРеквизитов.Добавить("ДатаПоступления");
КонецЕсли;
Если ДлительностьДоставки = 0 Тогда
МассивНепроверяемыхРеквизитов.Добавить("ДатаПоступления");
КонецЕсли;
Если ЗначениеЗаполнено(ЖелаемаяДатаПоступления) И ЖелаемаяДатаПоступления < НачалоДня(Дата) Тогда
ТекстОшибки = НСтр("ru = 'Желаемая дата поступления должна быть не меньше даты документа %Дата%'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
"ЖелаемаяДатаПоступления",
,
Отказ);
КонецЕсли;
Если ПоступлениеОднойДатой
И ЗначениеЗаполнено(ДатаПоступления)
И ДатаПоступления < НачалоДня(Дата)
И НЕ ВсеСтрокиОтменены
И ДлительностьДоставки <> 0 Тогда
ТекстОшибки = НСтр("ru = 'Дата поступления должна быть не меньше даты документа %Дата%'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
"ДатаПоступления",
,
Отказ);
КонецЕсли;
Если ПоступлениеОднойДатой
И ЗначениеЗаполнено(ДатаОтгрузки)
И ДатаОтгрузки < НачалоДня(Дата)
И НЕ ВсеСтрокиОтменены Тогда
ТекстОшибки = НСтр("ru = 'Дата отгрузки должна быть не меньше даты документа %Дата%'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
"ДатаОтгрузки",
,
Отказ);
КонецЕсли;
Если ПоступлениеОднойДатой
И ДатаПоступления < ДатаОтгрузки
И НЕ ВсеСтрокиОтменены Тогда
ТекстОшибки = НСтр("ru = 'Дата поступления должна быть не меньше даты отгрузки %Дата%'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(ДатаОтгрузки, "ДЛФ=DD"));
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
"ДатаПоступления",
,
Отказ);
КонецЕсли;
НакладнаяЯвляетсяРаспоряжением = ЗакупкиСервер.РаспоряжениеНаПриемкуТовараНакладная(ВариантПриемкиТоваров);
ИспользуетсяНеотфактурованнаяПоставка = ПолучитьФункциональнуюОпцию("ИспользоватьНеотфактурованныеПоставки");
ИспользуетсяНеотфактурованнаяПоставка = ИспользуетсяНеотфактурованнаяПоставка
И ?(ЗначениеЗаполнено(Договор),
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Договор, "ВариантОформленияЗакупок") = Перечисления.ВариантыОформленияЗакупок.НеотфактурованныеПоставкиТоваров,
Ложь);
ОперацииНеотфактурованнойПоставки = Новый Массив;
ОперацииНеотфактурованнойПоставки.Добавить(Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщикаФактуровкаПоставки);
ОперацииНеотфактурованнойПоставки.Добавить(Перечисления.ХозяйственныеОперации.ЗакупкаВСтранахЕАЭСФактуровкаПоставки);
Если НакладнаяЯвляетсяРаспоряжением
И ИспользуетсяНеотфактурованнаяПоставка Тогда
Если ОперацииНеотфактурованнойПоставки.Найти(ХозяйственнаяОперация) <> Неопределено Тогда
ТекстОшибки = НСтр("ru = 'Использование варианта приемки ""по накладным"" не поддерживается для операций неотфактурованной поставки.
|Рекомендуется использовать вариант приемки по договорам или по заказам.'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, , , Отказ);
КонецЕсли;
КонецЕсли;
МассивНепроверяемыхРеквизитов.Добавить("Товары.ПричинаОтмены");
МассивНепроверяемыхРеквизитов.Добавить("Товары.ДатаПоступления");
МассивНепроверяемыхРеквизитов.Добавить("Товары.ДатаОтгрузки");
ПоФактИспользованию = (ЗакупкаПодДеятельность = Перечисления.ТипыНалогообложенияНДС.ПоФактическомуИспользованию);
ИзДокумента = Перечисления.ВариантыРаздельногоУчетаНДС.ИзДокумента;
НаНаправленияДеятельности = Перечисления.ВариантыРаспределенияРасходов.НаНаправленияДеятельности;
НаПроизводственныеЗатраты = Перечисления.ВариантыРаспределенияРасходов.НаПроизводственныеЗатраты;
ПартионныйУчетВключен = РасчетСебестоимостиПовтИсп.ПартионныйУчетВключен(НачалоМесяца(Дата));
ИспользоватьДоходыРасходы = ПолучитьФункциональнуюОпцию("ИспользоватьУчетПрочихДоходовРасходов");
СоответствиеКодовСтрок = Новый Соответствие;
ИспользоватьАгентскуюЗакупку = ПолучитьФункциональнуюОпцию("ИспользоватьОказаниеАгентскихУслугПриЗакупке");
Для ТекИндекс = 0 По Товары.Количество()-1 Цикл
СтрокаТовары = Товары[ТекИндекс];
Если Не ПоступлениеОднойДатой
И (Статус = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
Или Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт)
И Не СтрокаТовары.Отменено
И Не ЗначениеЗаполнено(СтрокаТовары.ДатаПоступления)
И ДлительностьДоставки <> 0 Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не заполнена колонка ""Дата поступления"" в строке %1'"),
СтрокаТовары.НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТовары.НомерСтроки, "ДатаПоступления"),
,
Отказ);
КонецЕсли;
Если Не ПоступлениеОднойДатой
И (Статус = Перечисления.СтатусыЗаказовПоставщикам.Подтвержден
Или Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт)
И Не СтрокаТовары.Отменено
И Не ЗначениеЗаполнено(СтрокаТовары.ДатаОтгрузки) Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не заполнена колонка ""Дата отгрузки"" в строке %1'"),
СтрокаТовары.НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТовары.НомерСтроки, "ДатаОтгрузки"),
,
Отказ);
КонецЕсли;
Если Не ПоступлениеОднойДатой
И ЗначениеЗаполнено(СтрокаТовары.ДатаПоступления)
И СтрокаТовары.ДатаПоступления < НачалоДня(Дата)
И ДлительностьДоставки <> 0 Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Дата поступления должна быть не меньше даты документа %1 в строке %2'"),
Формат(Дата,"ДЛФ=DD"), СтрокаТовары.НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТовары.НомерСтроки, "ДатаПоступления"),
,
Отказ);
КонецЕсли;
Если Не ПоступлениеОднойДатой
И ЗначениеЗаполнено(СтрокаТовары.ДатаПоступления)
И СтрокаТовары.ДатаПоступления < СтрокаТовары.ДатаОтгрузки Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Дата поступления должна быть не меньше даты отгрузки %1 в строке %2'"),
Формат(СтрокаТовары.ДатаОтгрузки,"ДЛФ=DD"), СтрокаТовары.НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТовары.НомерСтроки, "ДатаПоступления"),
,
Отказ);
КонецЕсли;
Если Не ПоступлениеОднойДатой И ЗначениеЗаполнено(СтрокаТовары.ДатаОтгрузки) И СтрокаТовары.ДатаОтгрузки < НачалоДня(Дата) Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Дата отгрузки должна быть не меньше даты документа %1 в строке %2'"),
Формат(Дата,"ДЛФ=DD"), СтрокаТовары.НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТовары.НомерСтроки, "ДатаОтгрузки"),
,
Отказ);
КонецЕсли;
Если ПолучитьФункциональнуюОпцию("ИспользоватьПричиныОтменыЗаказовПоставщикам")
И СтрокаТовары.Отменено
И Не ЗначениеЗаполнено(СтрокаТовары.ПричинаОтмены) Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Необходимо указать причину отмены в строке %1'"),
СтрокаТовары.НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТовары.НомерСтроки, "ПричинаОтмены"),
,
Отказ);
КонецЕсли;
Если ПартионныйУчетВключен
И ПоФактИспользованию
И Не СтрокаТовары.Отменено
И ЗначениеЗаполнено(СтрокаТовары.СтатьяРасходов) Тогда
Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
СтрокаТовары.СтатьяРасходов,
"ВариантРаздельногоУчетаНДС, ВариантРаспределенияРасходовРегл");
Если (Реквизиты.ВариантРаспределенияРасходовРегл = НаНаправленияДеятельности
ИЛИ Реквизиты.ВариантРаспределенияРасходовРегл = НаПроизводственныеЗатраты
)
И Реквизиты.ВариантРаздельногоУчетаНДС = ИзДокумента Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'При использовании учета НДС по фактическому использованию, у статьи расходов должен быть выбран раздельный учет НДС по расходам: ""НДС распределяется по видам налогообложения пропорционально выручке"" в строке %1'"),
СтрокаТовары.НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрокаТовары.НомерСтроки, "СтатьяРасходов"),
,
Отказ);
КонецЕсли;
КонецЕсли;
Если ИспользоватьАгентскуюЗакупку
И ЗначениеЗаполнено(СтрокаТовары.Назначение) Тогда
ТипНазначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТовары.Назначение, "ТипНазначения");
Если ТипНазначения = Перечисления.ТипыНазначений.ПоставкаПодПринципала Тогда
ПроверитьПараметрыЗаписиДляЗакупкиПодПринципала(СтрокаТовары.НомерСтроки,
СтрокаТовары.Назначение, Отказ);
КонецЕсли;
КонецЕсли;
ЗаказыСервер.ПроверитьДублиКодовСтрокВТаблице(ЭтотОбъект,
СтрокаТовары.КодСтроки,
СтрокаТовары.НомерСтроки,
СоответствиеКодовСтрок,
Отказ);
КонецЦикла;
МассивНепроверяемыхРеквизитов.Добавить("Товары.Подразделение");
ТипыНоменклатуры = Новый Массив;
ТипыНоменклатуры.Добавить(Перечисления.ТипыНоменклатуры.Услуга);
ТекстОшибки = НСтр("ru = 'Не указан получатель услуг в строке %1 списка Товары'");
СписокХозяйственныхОперацийИсключающихУслуги = НоменклатураСервер.СписокХозяйственныхОперацийИсключающихУслуги();
Если СписокХозяйственныхОперацийИсключающихУслуги.НайтиПоЗначению(ХозяйственнаяОперация) = Неопределено Тогда
ЗапасыСервер.ПроверитьЗаполнениеПодразделенияВТабличнойЧасти(ЭтотОбъект, ТипыНоменклатуры, ТекстОшибки, Отказ);
КонецЕсли;
ТипыНоменклатуры = Новый Массив;
ТипыНоменклатуры.Добавить(Перечисления.ТипыНоменклатуры.Работа);
ТекстОшибки = НСтр("ru = 'Не указан получатель работ в строке %1 списка Товары'");
СписокХозяйственныхОперацийИсключающихРаботы = НоменклатураСервер.СписокХозяйственныхОперацийИсключающихРаботы();
Если СписокХозяйственныхОперацийИсключающихРаботы.НайтиПоЗначению(ХозяйственнаяОперация) = Неопределено Тогда
ЗапасыСервер.ПроверитьЗаполнениеПодразделенияВТабличнойЧасти(ЭтотОбъект, ТипыНоменклатуры, ТекстОшибки, Отказ);
КонецЕсли;
ТипыНоменклатуры = Новый Массив;
ТипыНоменклатуры.Добавить(Перечисления.ТипыНоменклатуры.Товар);
ТипыНоменклатуры.Добавить(Перечисления.ТипыНоменклатуры.МногооборотнаяТара);
ТекстОшибки = НСтр("ru = 'Не указан получатель товаров в строке %1 списка Товары'");
ЗапасыСервер.ПроверитьЗаполнениеПодразделенияВТабличнойЧасти(ЭтотОбъект, ТипыНоменклатуры, ТекстОшибки, Отказ);
МассивВсехРеквизитов = Новый Массив;
МассивРеквизитовОперации = Новый Массив;
Документы.ЗаказПоставщику.ЗаполнитьИменаРеквизитовПоХозяйственнойОперации(
ХозяйственнаяОперация,
МассивВсехРеквизитов,
МассивРеквизитовОперации);
ОбщегоНазначенияУТКлиентСервер.ЗаполнитьМассивНепроверяемыхРеквизитов(
МассивВсехРеквизитов,
МассивРеквизитовОперации,
МассивНепроверяемыхРеквизитов);
ДоставкаТоваров.ПроверитьЗаполнениеРеквизитовДоставки(ЭтотОбъект, МассивНепроверяемыхРеквизитов, Отказ);
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
ПроверитьИзменениеХозяйственнойОперации(Отказ);
ЗакупкиСервер.ПроверитьКорректностьЗаполненияДокументаЗакупки(ЭтотОбъект, Отказ);
ПараметрыВыбораСтатейИАналитик = Документы.ЗаказПоставщику.ПараметрыВыбораСтатейИАналитик(ХозяйственнаяОперация);
ДоходыИРасходыСервер.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты, ПараметрыВыбораСтатейИАналитик);
ПараметрыПроверки = УчетНДСУП.ПараметрыПроверкиЗаполнениеДокументаПоНалогообложениюНДСЗакупки();
ПараметрыПроверки.ИмяТабличнойЧасти = "Товары";
ПараметрыПроверки.ИмяРеквизитаСтатьяРасходов = "СтатьяРасходов";
ПараметрыПроверки.ИмяРеквизитаАналитикаРасходов = "АналитикаРасходов";
УчетНДСУП.ПроверитьЗаполнениеДокументаЗакупкиПоНалогообложениюНДС(ЭтотОбъект, НалогообложениеНДС, ПараметрыПроверки, Отказ);
ПараметрыПроверки = УчетНДСУП.ПараметрыПроверкиЗаполненияДокументаПоВидуДеятельностиНДС();
ПараметрыПроверки.ИмяТабличнойЧасти = "Товары";
ПараметрыПроверки.ИмяРеквизитаСтатьяРасходов = "СтатьяРасходов";
ПараметрыПроверки.ИмяРеквизитаАналитикаРасходов = "АналитикаРасходов";
УчетНДСУП.ПроверитьЗаполнениеДокументаПоВидуДеятельностиНДС(ЭтотОбъект, ЗакупкаПодДеятельность, ПараметрыПроверки, Отказ);
Если Не Отказ И ОбщегоНазначенияУТ.ПроверитьЗаполнениеРеквизитовОбъекта(ЭтотОбъект, ПроверяемыеРеквизиты) Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
ДоставкаТоваров.ОтразитьСостояниеДоставки(Ссылка, Отказ);
ЗакупкиСервер.ВыполнитьКонтрольЗаказаПослеПроведения(Ссылка, Отказ);
КонецПроцедуры
Процедура ОбработкаУдаленияПроведения(Отказ)
ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
ДоставкаТоваров.ОтразитьСостояниеДоставки(Ссылка, Отказ, Истина);
КонецПроцедуры
Процедура ПриКопировании(ОбъектКопирования)
Статус = Перечисления.СтатусыЗаказовПоставщикам.ПустаяСсылка();
ЖелаемаяДатаПоступления = Дата(1,1,1);
ДатаПоступления = Дата(1,1,1);
ДатаОтгрузки = Дата(1,1,1);
ДатаСогласования = Дата(1,1,1);
МаксимальныйКодСтроки = 0;
Согласован = Ложь;
НомерПоДаннымПоставщика = "";
ДатаПоДаннымПоставщика = Дата(1,1,1);
ДокументОснование = Неопределено;
СостояниеЗаполненияМногооборотнойТары = Перечисления.СостоянияЗаполненияМногооборотнойТары.ПустаяСсылка();
Если ЗначениеЗаполнено(Соглашение) Тогда
СтатусСоглашения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Статус");
Если СтатусСоглашения = Перечисления.СтатусыСоглашенийСПоставщиками.Действует Тогда
УсловияЗакупок = ЗакупкиСервер.ПолучитьУсловияЗакупок(Соглашение, Истина);
Если ЗначениеЗаполнено(УсловияЗакупок.СрокПоставки) Тогда
ДатаДокумента = ?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса());
ЖелаемаяДатаПоступления = ОбщегоНазначенияУТКлиентСервер.РассчитатьДатуОкончанияПериода(ДатаДокумента, Перечисления.Периодичность.День, УсловияЗакупок.СрокПоставки) + 1;
КонецЕсли;
ДлительностьДоставки = УсловияЗакупок.ДлительностьДоставки;
Иначе
Соглашение = Справочники.СоглашенияСПоставщиками.ПустаяСсылка();
КонецЕсли;
КонецЕсли;
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьВыплатыСамозанятым") Тогда
ОперацияССамозанятым = Ложь;
КонецЕсли;
Для Каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.КодСтроки = 0;
СтрокаТЧ.ДатаПоступления = Дата(1,1,1);
СтрокаТЧ.ДатаОтгрузки = Дата(1,1,1);
СтрокаТЧ.Отменено = Ложь;
СтрокаТЧ.ПричинаОтмены = Справочники.ПричиныОтменыЗаказовПоставщикам.ПустаяСсылка();
КонецЦикла;
ВзаиморасчетыСервер.ПриКопировании(ЭтотОбъект);
ИнициализироватьДокумент();
Автор = Пользователи.ТекущийПользователь();
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ПроверитьПараметрыЗаписиДляЗакупкиПодПринципала(НомерСтроки, Назначение, Отказ)
УстановитьПривилегированныйРежим(Истина);
Если Не ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Для номенклатуры в строке %1, закупаемой по агентской схеме, можно использовать только операцию ""Закупка у поставщика""'"),
НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки ,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары",НомерСтроки, "Назначение"),
,
Отказ);
КонецЕсли;
ВалютаДоговораНазначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Назначение, "Договор.ВалютаВзаиморасчетов");
Если ВалютаДоговораНазначения <> Валюта Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Для номенклатуры в строке %1, закупаемой по агентской схеме, валюта, указанная в договоре назначения, должна совпадать с валютой документа'"),
НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки ,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", НомерСтроки, "Назначение"),
,
Отказ);
КонецЕсли;
ОрганизацияДоговораНазначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Назначение, "Договор.Организация");
Если ОрганизацияДоговораНазначения <> Организация Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Для номенклатуры в строке %1, закупаемой по агентской схеме, организация, указанная в договоре назначения, должна совпадать с организацией документа'"),
НомерСтроки);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки ,
ЭтотОбъект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", НомерСтроки, "Назначение"),
,
Отказ);
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ИнициализацияИЗаполнение
Процедура ЗаполнитьДокументНаОснованииПартнера(Знач Основание)
Партнер = Основание;
ЗакупкиСервер.ПроверитьВозможностьВводаНаОснованииПартнераПоставщикаКонкурента(Партнер);
ЗаполнитьУсловияЗакупокПоУмолчанию();
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииСоглашенияСПоставщиком(Знач СправочникОснование)
Запрос = Новый Запрос("
|ВЫБРАТЬ
| СоглашениеСПоставщиком.Ссылка КАК Соглашение,
| СоглашениеСПоставщиком.Партнер КАК Партнер,
|
| СоглашениеСПоставщиком.Статус КАК СтатусДокумента,
| ВЫБОР
| КОГДА
| СоглашениеСПоставщиком.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСПоставщиками.Действует)
| ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК ЕстьОшибкиСтатус,
| ВЫБОР
| КОГДА СоглашениеСПоставщиком.ХозяйственнаяОперация
| = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ОказаниеАгентскихУслуг)
| ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК ЭтоАгентскиеУслуги,
| СоглашениеСПоставщиком.НаправлениеДеятельности КАК НаправлениеДеятельности
|ИЗ
| Справочник.СоглашенияСПоставщиками КАК СоглашениеСПоставщиком
|ГДЕ
| СоглашениеСПоставщиком.Ссылка = &СправочникОснование
|");
Запрос.УстановитьПараметр("СправочникОснование", СправочникОснование);
МассивРезультатовЗапроса = Запрос.ВыполнитьПакет();
РезультатЗапроса = МассивРезультатовЗапроса[0];
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
МассивДопустимыхСтатусов = Новый Массив();
МассивДопустимыхСтатусов.Добавить(Перечисления.СтатусыСоглашенийСПоставщиками.Действует);
ОбщегоНазначенияУТ.ПроверитьВозможностьВводаНаОсновании(
Выборка.Соглашение,
Выборка.СтатусДокумента,
,
Выборка.ЕстьОшибкиСтатус,
МассивДопустимыхСтатусов);
ОбщегоНазначенияУТ.ПроверитьВозможностьВводаНаОснованииСоглашения(,Выборка.ЭтоАгентскиеУслуги);
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Выборка);
ЗаполнитьУсловияЗакупокПоСоглашению();
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииСделки(СделкаСКлиентом)
Если Документы.ЗаказКлиента.ЕстьОбособленныеЗаказыПоСделке(СделкаСКлиентом) Тогда
ЗаполнитьДокументНаОснованииСделкиПоОбособленныемЗаказам(СделкаСКлиентом);
Иначе
ЗаполнитьДокументНаОснованииСделкиСводно(СделкаСКлиентом);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДокументПоОтбору(Знач ДанныеЗаполнения)
Если ДанныеЗаполнения.Свойство("Менеджер") Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения,,"Менеджер");
Иначе
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
КонецЕсли;
ЗаполнениеОбъектовПоСтатистике.ЗаполнитьРеквизитыОбъекта(ЭтотОбъект, ДанныеЗаполнения);
Если ДанныеЗаполнения.Свойство("Товары") Тогда
ЭтотОбъект.Товары.Загрузить(ДанныеЗаполнения.Товары);
ИспользоватьУчетПрочихДоходовРасходов = ПолучитьФункциональнуюОпцию("ИспользоватьУчетПрочихДоходовРасходов");
Если ИспользоватьУчетПрочихДоходовРасходов Тогда
Для Каждого СтрокаТовара Из Товары Цикл
Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТовара.Номенклатура, "ТипНоменклатуры") = Перечисления.ТипыНоменклатуры.Услуга Тогда
СтрокаТовара.СписатьНаРасходы = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
ЗакупкиСервер.ПроверитьВозможностьВводаНаОснованииПартнераПоставщикаКонкурента(Партнер);
ПроверитьЗаполнитьПоступлениеОднойДатой();
Если ДанныеЗаполнения.Свойство("НаправлениеДеятельности")
И ЗначениеЗаполнено(ДанныеЗаполнения.НаправлениеДеятельности) Тогда
Если НЕ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеЗаполнения.НаправлениеДеятельности,"УчетЗатрат") Тогда
Если ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоНакладным
Или ПорядокРасчетов = Перечисления.ПорядокРасчетов.ПоДоговорамНакладным Тогда
НаправлениеДеятельности = Справочники.НаправленияДеятельности.ПустаяСсылка();
Иначе
НаправленияДеятельностиСервер.ЗаполнитьНаправлениеПоУмолчанию(НаправлениеДеятельности, Соглашение, Договор);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДанныеЗаполнения.Свойство("Товары") Тогда
Если ЗначениеЗаполнено(Партнер) И Не ЗначениеЗаполнено(Соглашение) Тогда
ЗаполнитьУсловияЗакупокПоУмолчанию(Ложь);
КонецЕсли;
Если ЗначениеЗаполнено(Соглашение) Тогда
НаправлениеДеятельностиДоИзменения = НаправлениеДеятельности;
ЗаполнитьУсловияЗакупокПоСоглашению(Ложь);
Если НаправлениеДеятельностиДоИзменения <> НаправлениеДеятельности И ЗначениеЗаполнено(НаправлениеДеятельности) Тогда
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Назначения", Товары.Выгрузить(, "Назначение").ВыгрузитьКолонку("Назначение"));
Запрос.УстановитьПараметр("НаправлениеДеятельности", НаправлениеДеятельности);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЕстьОшибка
|ИЗ
| Справочник.Назначения КАК ВсеНазначения
|ГДЕ
| ВсеНазначения.Ссылка В(&Назначения)
| И ВсеНазначения.НаправлениеДеятельности <> ЗНАЧЕНИЕ(Справочник.НаправленияДеятельности.ПустаяСсылка)
| И ВсеНазначения.НаправлениеДеятельности <> &НаправлениеДеятельности";
Если Не Запрос.Выполнить().Пустой() Тогда
НаправлениеДеятельности = НаправлениеДеятельностиДоИзменения;
Соглашение = Неопределено;
Договор = Неопределено;
ЗаполнитьУсловияЗакупокПоСоглашению(Ложь);
КонецЕсли;
КонецЕсли;
Иначе
ХозяйственнаяОперация = Метаданные.Документы.ЗаказПоставщику.Реквизиты.ХозяйственнаяОперация.ЗначениеЗаполнения;
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
КонецЕсли;
Если ДанныеЗаполнения.Свойство("Склад") Тогда
ЭтотОбъект.Склад = ДанныеЗаполнения.Склад;
КонецЕсли;
Если Не ЗначениеЗаполнено(Валюта) Тогда
Валюта = ДоходыИРасходыСервер.ПолучитьВалютуУправленческогоУчета(Валюта);
КонецЕсли;
ЗаполнитьЦеныПоВидамЦен();
ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);
ИначеЕсли ЗначениеЗаполнено(Соглашение) Тогда
Если Не ЗначениеЗаполнено(Договор) Тогда
ХозяйственнаяОперацияДоговора = ?(ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщикаРеглУчет
Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаЧерезПодотчетноеЛицо,
Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика,
ХозяйственнаяОперация);
ХозяйственнаяОперацияДоговора = ЗакупкиСервер.ХозяйственныеОперацииПоОсновной(ХозяйственнаяОперацияДоговора);
ДопПараметры = ЗакупкиСервер.ДополнительныеПараметрыОтбораДоговоров();
ДопПараметры.ВалютаВзаиморасчетов = Валюта;
Договор = ЗакупкиСервер.ПолучитьДоговорПоУмолчанию(ЭтотОбъект, ХозяйственнаяОперацияДоговора, ДопПараметры);
КонецЕсли;
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
ЗаполнитьЦеныПоСоглашению();
ПартнерыИКонтрагенты.ЗаполнитьКонтрагентаПартнераПоУмолчанию(Партнер, Контрагент);
Иначе
ЗаполнитьУсловияЗакупокПоУмолчанию();
КонецЕсли;
НоменклатураПартнеровСервер.ЗаполнитьНоменклатуруПартнераПоНоменклатуреПриИзмененииПартнера(Товары, Партнер);
Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ДокументОснованиеРеквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументОснование, "ХозяйственнаяОперация, ЦенаВключаетНДС");
Если ДокументОснованиеРеквизиты.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоставкаПодПринципала Тогда
ЦенаВключаетНДС = ДокументОснованиеРеквизиты.ЦенаВключаетНДС;
ЗаполнитьЦеныПоЗаказуПринципала();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьЦеныПоВидамЦен()
КэшированныеЗначения = Неопределено;
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Дата", Дата);
ПараметрыЗаполнения.Вставить("Валюта", Валюта);
ПараметрыЗаполнения.Вставить("Соглашение", Соглашение);
ПересчитатьСуммуСУчетомРучнойСкидки = Новый Структура("Очищать", Ложь);
СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуРучнойСкидки", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", ПересчитатьСуммуСУчетомРучнойСкидки);
Параметры = Новый Структура;
Параметры.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС");
Параметры.Вставить("КолонкиПоЗначению", Новый Структура);
Параметры.Вставить("ДругиеИменаКолонок", Новый Структура);
ОбщегоНазначенияУТКлиентСервер.ДополнитьСтруктуру(Параметры, ПараметрыЗаполнения, Истина);
Таблица = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
Товары,
Неопределено,
"НомерСтроки, Номенклатура, Характеристика, Упаковка, ВидЦеныПоставщика",
Параметры.КолонкиПоЗначению,
Параметры.ДругиеИменаКолонок);
ПараметрыПолученияЦен = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыПолученияЦенНоменклатурыПартнера();
ПараметрыПолученияЦен.Дата = ?(ЗначениеЗаполнено(Параметры.Дата), Параметры.Дата, ТекущаяДатаСеанса());
ПараметрыПолученияЦен.Валюта = Параметры.Валюта;
ПараметрыПолученияЦен.НалогообложениеНДС = НалогообложениеНДС;
ПараметрыПолученияЦен.ВозвращатьМногооборотнуюТару = ВернутьМногооборотнуюТару;
РезультатЗапроса = ЦеныПартнеровЗаполнениеСервер.ЦеныНоменклатурыПартнера(Таблица, ПараметрыПолученияЦен);
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
ОбрабатываемыеСтроки = Новый Массив();
СтруктураЗаполнения = Новый Структура(Параметры.ПоляЗаполнения);
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(СтруктураЗаполнения, Выборка);
СтрокаТЧ = Товары[Выборка.НомерСтроки - 1];
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.ВидЦеныПоставщика) Тогда
Продолжить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтруктураЗаполнения);
ОбрабатываемыеСтроки.Добавить(СтрокаТЧ);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Товары,
КэшированныеЗначения);
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаказаКлиента(Знач ДанныеЗаполнения)
ЗаказКлиента = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЗаказКлиента.Приоритет КАК Приоритет,
| ЗаказКлиента.Организация КАК Организация,
| ЗаказКлиента.Сделка КАК Сделка,
| ЗаказКлиента.Склад КАК СкладДокумента,
| ЕСТЬNULL(ЗаказКлиента.Склад.ЭтоГруппа, ЛОЖЬ) КАК ЭтоГруппа,
| ЗаказКлиента.НалогообложениеНДС КАК ЗакупкаПодДеятельность,
| ВЫБОР
| КОГДА ЗаказКлиента.НаправлениеДеятельности.УчетЗатрат
| ИЛИ ЗаказКлиента.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА ЗаказКлиента.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Ссылка = &ЗаказКлиента");
Запрос.УстановитьПараметр("ЗаказКлиента", ЗаказКлиента);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
Сделка = Реквизиты.Сделка;
ДокументОснование = ЗаказКлиента;
Приоритет = Реквизиты.Приоритет;
ЗакупкаПодДеятельность = Реквизиты.ЗакупкаПодДеятельность;
НаправлениеДеятельности= Реквизиты.НаправлениеДеятельности;
Склад = ДанныеЗаполнения.Склад;
Если Не ЗначениеЗаполнено(Склад)
И Реквизиты.ЭтоГруппа
И ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовЗакупки") Тогда
Склад = Реквизиты.СкладДокумента;
КонецЕсли;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
ДанныеДокументаОснования = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументОснование,
"ХозяйственнаяОперация, ЦенаВключаетНДС, Валюта, НалогообложениеНДС");
Если ДанныеДокументаОснования.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоставкаПодПринципала Тогда
ЦенаВключаетНДС = ДанныеДокументаОснования.ЦенаВключаетНДС;
Валюта = ДанныеДокументаОснования.Валюта;
НалогообложениеНДС = ДанныеДокументаОснования.НалогообложениеНДС;
ЗаполнитьЦеныПоЗаказуПринципала();
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаявкиНаВозврат(Знач ДанныеЗаполнения)
ЗаявкаНаВозврат = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЗаказКлиента.Приоритет КАК Приоритет,
| ЗаказКлиента.Организация КАК Организация,
| ЗаказКлиента.Сделка КАК Сделка,
| ЗаказКлиента.НалогообложениеНДС КАК ЗакупкаПодДеятельность,
| ВЫБОР
| КОГДА ЗаказКлиента.НаправлениеДеятельности.УчетЗатрат
| ИЛИ ЗаказКлиента.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА ЗаказКлиента.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности
|ИЗ
| Документ.ЗаявкаНаВозвратТоваровОтКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Ссылка = &ЗаявкаНаВозврат");
Запрос.УстановитьПараметр("ЗаявкаНаВозврат", ЗаявкаНаВозврат);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
Приоритет = Реквизиты.Приоритет;
Сделка = Реквизиты.Сделка;
ДокументОснование = ЗаявкаНаВозврат;
ЗакупкаПодДеятельность = Реквизиты.ЗакупкаПодДеятельность;
НаправлениеДеятельности= Реквизиты.НаправлениеДеятельности;
Склад = ДанныеЗаполнения.Склад;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаказаНаПеремещение(Знач ДанныеЗаполнения)
ЗаказНаПеремещение = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Заказ.Приоритет КАК Приоритет,
| Заказ.Организация КАК Организация,
| Заказ.Сделка КАК Сделка,
| Заказ.Подразделение КАК Подразделение,
| ВЫБОР
| КОГДА Заказ.НаправлениеДеятельности.УчетЗатрат
| ИЛИ Заказ.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА Заказ.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности,
| Заказ.ПеремещениеПодДеятельность КАК ЗакупкаПодДеятельность
|ИЗ
| Документ.ЗаказНаПеремещение КАК Заказ
|ГДЕ
| Заказ.Ссылка = &ЗаказНаПеремещение");
Запрос.УстановитьПараметр("ЗаказНаПеремещение", ЗаказНаПеремещение);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
Приоритет = Реквизиты.Приоритет;
Сделка = Реквизиты.Сделка;
ДокументОснование = ЗаказНаПеремещение;
Подразделение = Реквизиты.Подразделение;
НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
ЗакупкаПодДеятельность = Реквизиты.ЗакупкаПодДеятельность;
Склад = ДанныеЗаполнения.Склад;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
ПроверитьКорректностьНаправленияДеятельности();
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаказаНаВнутреннееПотребление(Знач ДанныеЗаполнения)
ЗаказНаПотребление = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Заказ.Приоритет КАК Приоритет,
| Заказ.Организация КАК Организация,
| Заказ.Сделка КАК Сделка,
| Заказ.Подразделение КАК Подразделение,
| ВЫБОР
| КОГДА Заказ.НаправлениеДеятельности.УчетЗатрат
| ИЛИ Заказ.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА Заказ.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности
|ИЗ
| Документ.ЗаказНаВнутреннееПотребление КАК Заказ
|ГДЕ
| Заказ.Ссылка = &ЗаказНаПотребление");
Запрос.УстановитьПараметр("ЗаказНаПотребление", ЗаказНаПотребление);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
Приоритет = Реквизиты.Приоритет;
Сделка = Реквизиты.Сделка;
ДокументОснование = ЗаказНаПотребление;
Подразделение = Реквизиты.Подразделение;
НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
Склад = ДанныеЗаполнения.Склад;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаказаНаСборку(Знач ДанныеЗаполнения)
ЗаказНаСборку = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Заказ.Приоритет КАК Приоритет,
| Заказ.Организация КАК Организация,
| Заказ.Сделка КАК Сделка,
| Заказ.Подразделение КАК Подразделение,
| ВЫБОР
| КОГДА Заказ.НаправлениеДеятельности.УчетЗатрат
| ИЛИ Заказ.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА Заказ.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности
|ИЗ
| Документ.ЗаказНаСборку КАК Заказ
|ГДЕ
| Заказ.Ссылка = &ЗаказНаСборку");
Запрос.УстановитьПараметр("ЗаказНаСборку", ЗаказНаСборку);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
Сделка = Реквизиты.Сделка;
Приоритет = Реквизиты.Приоритет;
ДокументОснование = ЗаказНаСборку;
Подразделение = Реквизиты.Подразделение;
НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
Склад = ДанныеЗаполнения.Склад;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаказаМатериаловВПроизводство(Знач ДанныеЗаполнения)
ЗаказМатериалов = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Заказ.Приоритет КАК Приоритет,
| Заказ.Организация КАК Организация,
| Заказ.Подразделение КАК Подразделение,
| ВЫБОР
| КОГДА Заказ.НаправлениеДеятельности.УчетЗатрат
| ИЛИ Заказ.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА Заказ.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности
|ИЗ
| Документ.ЗаказМатериаловВПроизводство КАК Заказ
|ГДЕ
| Заказ.Ссылка = &ЗаказМатериалов");
Запрос.УстановитьПараметр("ЗаказМатериалов", ЗаказМатериалов);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
Приоритет = Реквизиты.Приоритет;
ДокументОснование = ЗаказМатериалов;
Подразделение = Реквизиты.Подразделение;
НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
Склад = ДанныеЗаполнения.Склад;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
ПроверитьКорректностьНаправленияДеятельности();
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаказаПереработчику(Знач ДанныеЗаполнения)
ЗаказПереработчику = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Таблица.Приоритет КАК Приоритет,
| Таблица.Организация КАК Организация,
| Таблица.Подразделение КАК Подразделение,
| ВЫБОР
| КОГДА Таблица.НаправлениеДеятельности.УчетЗатрат
| ИЛИ Таблица.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА Таблица.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности
|ИЗ
| Документ.ЗаказПереработчику КАК Таблица
|ГДЕ
| Таблица.Ссылка = &Заказ");
Запрос.УстановитьПараметр("Заказ", ЗаказПереработчику);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
ДокументОснование = ЗаказПереработчику;
Подразделение = Реквизиты.Подразделение;
Приоритет = Реквизиты.Приоритет;
НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
Склад = ДанныеЗаполнения.Склад;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииЗаказаПереработчику2_5(Знач ДанныеЗаполнения)
ЗаказПереработчику = ДанныеЗаполнения.Основание;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Таблица.Приоритет КАК Приоритет,
| Таблица.Организация КАК Организация,
| Таблица.Подразделение КАК Подразделение,
| Таблица.СкладМатериалов КАК СкладДокумента,
| ЕСТЬNULL(Таблица.СкладМатериалов.ЭтоГруппа, ЛОЖЬ) КАК ЭтоГруппа,
| ВЫБОР
| КОГДА Таблица.НаправлениеДеятельности.УчетЗатрат
| ИЛИ Таблица.НаправлениеДеятельности.УчетРасчетовСПоставщиками
| ТОГДА Таблица.НаправлениеДеятельности
| КОНЕЦ КАК НаправлениеДеятельности
|ИЗ
| Документ.ЗаказПереработчику2_5 КАК Таблица
|ГДЕ
| Таблица.Ссылка = &Заказ");
Запрос.УстановитьПараметр("Заказ", ЗаказПереработчику);
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Организация = Реквизиты.Организация;
ДокументОснование = ЗаказПереработчику;
Подразделение = Реквизиты.Подразделение;
Приоритет = Реквизиты.Приоритет;
НаправлениеДеятельности = Реквизиты.НаправлениеДеятельности;
Склад = ДанныеЗаполнения.Склад;
Если Не ЗначениеЗаполнено(Склад)
И Реквизиты.ЭтоГруппа
И ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовЗакупки") Тогда
Склад = Реквизиты.СкладДокумента;
КонецЕсли;
ЗаполнитьТоварыИзОснования(ДанныеЗаполнения.АдресТовары);
КонецПроцедуры
Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
Организация = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию(Организация);
Если Не ЗначениеЗаполнено(Валюта) Тогда
Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
КонецЕсли;
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПользователя(Менеджер, Подразделение);
Если НЕ ЗначениеЗаполнено(ХозяйственнаяОперация) Тогда
ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
КонецЕсли;
СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();
СтруктураПараметров.Организация = Организация;
СтруктураПараметров.ФормаОплаты = ФормаОплаты;
СтруктураПараметров.БанковскийСчет = БанковскийСчет;
БанковскийСчет = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтруктураПараметров);
СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияКассыОрганизацииПоУмолчанию();
СтруктураПараметров.Организация = Организация;
СтруктураПараметров.ФормаОплаты = ФормаОплаты;
СтруктураПараметров.Касса = Касса;
Касса = ЗначениеНастроекПовтИсп.ПолучитьКассуОрганизацииПоУмолчанию(СтруктураПараметров);
Склад = ЗначениеНастроекПовтИсп.ПолучитьСкладПоУмолчанию(
Склад,
ПолучитьФункциональнуюОпцию("ИспользоватьСкладыВТабличнойЧастиДокументовЗакупки"));
Приоритет = ЗначениеНастроекПовтИсп.ПолучитьПриоритетПоУмолчанию(Приоритет);
Если Не (ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Товары")) Тогда
ПоступлениеОднойДатой = Истина;
КонецЕсли;
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПоставщикам") Тогда
Статус = Перечисления.СтатусыЗаказовПоставщикам.Закрыт;
Иначе
Статус = Перечисления.СтатусыЗаказовПоставщикам.Согласован;
КонецЕсли;
ВариантПриемкиТоваров = ЗакупкиСервер.ПолучитьВариантПриемкиТоваров(Неопределено, Договор);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияНалогообложенияНДСЗакупки(ЭтотОбъект);
УчетНДСУП.ЗаполнитьНалогообложениеНДСЗакупки(НалогообложениеНДС, ПараметрыЗаполнения);
ПараметрыЗаполнения = Документы.ЗаказПоставщику.ПараметрыЗаполненияВидаДеятельностиНДС(ЭтотОбъект);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(ЗакупкаПодДеятельность, ПараметрыЗаполнения);
СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВТЧ(ЭтотОбъект);
СтруктураЗаполненияСтавкиНДС = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(ЭтотОбъект, Истина);
СтруктураЗаполненияСтавкиНДС.ИнициализацияВходящегоДокумента = Истина;
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("СкорректироватьСтавкуНДС", СтруктураЗаполненияСтавкиНДС);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Товары, СтруктураДействий, КэшированныеЗначения);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
КэшированныеЗначения.ОбработанныеСтроки,
СтруктураДействий,
Товары,
КэшированныеЗначения);
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
СкладГруппа = Справочники.Склады.ЭтоГруппаИСкладыИспользуютсяВТЧДокументовПродажи(Склад);
СкладыСервер.ЗаполнитьСкладыВТабличнойЧасти(Склад, СкладГруппа, Товары, Ложь, "СписатьНаРасходы");
КонецЕсли;
Если Не ЗначениеЗаполнено(АдресДоставкиДляПоставщика)
И (СпособДоставки = Перечисления.СпособыДоставки.ПустаяСсылка()
Или СпособДоставки = Перечисления.СпособыДоставки.СиламиПоставщикаДоНашегоСклада)
И ЗначениеЗаполнено(Склад) Тогда
Если Не Справочники.Склады.ЭтоГруппа(Склад) Тогда
ДоступныеСклады = Новый Массив;
ДоступныеСклады.Добавить(Склад);
Иначе
ДоступныеСклады = Товары.ВыгрузитьКолонку("Склад");
КонецЕсли;
Документы.ЗаказПоставщику.ЗаполнитьАдресДоставкиДляПоставщика(АдресДоставкиДляПоставщика, ДоступныеСклады, Дата);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииДоговора(Знач СправочникОснование)
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Договор.Ссылка КАК Договор,
| Договор.Партнер КАК Партнер,
|
| Договор.Статус КАК СтатусДокумента,
| ВЫБОР
| КОГДА
| Договор.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыДоговоровКонтрагентов.Действует)
| ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК ЕстьОшибкиСтатус,
| Договор.НаправлениеДеятельности КАК НаправлениеДеятельности
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК Договор
|ГДЕ
| Договор.Ссылка = &СправочникОснование
|");
Запрос.УстановитьПараметр("ДоговорОснование", СправочникОснование);
МассивРезультатовЗапроса = Запрос.ВыполнитьПакет();
РезультатЗапроса = МассивРезультатовЗапроса[0];
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
МассивДопустимыхСтатусов = Новый Массив();
МассивДопустимыхСтатусов.Добавить(Перечисления.СтатусыДоговоровКонтрагентов.Действует);
ОбщегоНазначенияУТ.ПроверитьВозможностьВводаНаОсновании(
Выборка.Договор,
Выборка.СтатусДокумента,
Ложь,
Выборка.ЕстьОшибкиСтатус,
МассивДопустимыхСтатусов);
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Выборка);
ЗаполнитьУсловияЗакупокПоСоглашению();
КонецПроцедуры
#КонецОбласти
#Область Прочее
Процедура ПроверитьИзменениеХозяйственнойОперации(Отказ)
ЗаказНеОплачивается = ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаКомиссию
Или ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПриемНаХранениеСПравомПродажи;
Если Не ЭтоНовый() И ЗаказНеОплачивается Тогда
Запрос = Новый Запрос("
|ВЫБРАТЬ
| РасчетыСПоставщиками.СуммаПриход КАК СуммаОплаты
|ИЗ
| РегистрНакопления.РасчетыСПоставщиками.Обороты(,,Период,
| ОбъектРасчетов.Объект = &Ссылка
| ) КАК РасчетыСПоставщиками
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Документ.ЗаказПоставщику КАК ДанныеДокумента
| ПО
| ДанныеДокумента.Ссылка = &Ссылка
| И ДанныеДокумента.ХозяйственнаяОперация <> &ХозяйственнаяОперация
|ГДЕ
| РасчетыСПоставщиками.СуммаПриход > 0
|");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("ХозяйственнаяОперация", ХозяйственнаяОперация);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Заказ поставщику оплачен. Нельзя устанавливать операцию %1'"),
ХозяйственнаяОперация);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
Текст,
ЭтотОбъект,
"ХозяйственнаяОперация",
,
Отказ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииСделкиПоОбособленныемЗаказам(Знач СправочникОснование)
ПараметрыФормированияТаблицы = РегистрыНакопления.РаспоряженияНаОтгрузкуИВозврат.НовыйПараметрыФормированияРазвернутойТаблицы();
ПараметрыФормированияТаблицы.ТекстУсловия =
"Распоряжение В
| (ВЫБРАТЬ
| Т.ЗаказКлиента
| ИЗ
| ВтЗаказыПоСделке КАК Т)";
ПараметрыФормированияТаблицы.Группировка = "Распоряжение, Номенклатура, Характеристика, КодСтроки, Склад";
ПараметрыФормированияТаблицы.Показатели = "Заказано, Отгружено";
ПараметрыФормированияТаблицы.Ресурсы = "Количество";
ПараметрыФормированияТаблицы.Индексы = ПараметрыФормированияТаблицы.Группировка;
ПараметрыФормированияТаблицы.ИмяВременнойТаблицы = "ВТ_РаспоряженияНаОтгрузкуОборотыРазвернутая";
ВТ_РаспоряженияНаОтгрузкуОборотыРазвернутая =
РегистрыНакопления.РаспоряженияНаОтгрузкуИВозврат.ТекстЗапросаРазвернутаяТаблица(
ПараметрыФормированияТаблицы);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Ссылка КАК ЗаказКлиента
|
|ПОМЕСТИТЬ ВтЗаказыПоСделке
|
|ИЗ
| Документ.ЗаказКлиента КАК Т
|ГДЕ
| Т.Сделка = &Сделка
| И Т.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке))
|" +
ОбщегоНазначения.РазделительПакетаЗапросов() +
ВТ_РаспоряженияНаОтгрузкуОборотыРазвернутая +
ОбщегоНазначения.РазделительПакетаЗапросов() +
"ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| Т.Назначение КАК Назначение,
| МАКСИМУМ(Т.НомерСтроки) КАК НомерСтроки,
| МИНИМУМ(Т.ДатаЗаказа) КАК ДатаЗаказа,
| СУММА(Т.Заказано) КАК Заказано
|
|ПОМЕСТИТЬ НоменклатураЗаказа
|
|ИЗ
| (ВЫБРАТЬ
| Распоряжения.Распоряжение.Дата КАК ДатаЗаказа,
| Распоряжения.Номенклатура КАК Номенклатура,
| Распоряжения.Характеристика КАК Характеристика,
| Распоряжения.Склад КАК Склад,
| ВЫБОР
| КОГДА НЕ ТоварыЗаказа.Ссылка ЕСТЬ NULL ТОГДА
| ТоварыЗаказа.НомерСтроки
| ИНАЧЕ
| ТоварыЗаявки.НомерСтроки
| КОНЕЦ КАК НомерСтроки,
| (Распоряжения.ЗаказаноКоличествоОборот
| - Распоряжения.ОтгруженоКоличествоОборот) КАК Заказано,
| ВЫБОР
| КОГДА НЕ ТоварыЗаказа.Ссылка ЕСТЬ NULL ТОГДА
| ТоварыЗаказа.Ссылка.Назначение
| ИНАЧЕ
| ТоварыЗаявки.Ссылка.Назначение
| КОНЕЦ КАК Назначение
| ИЗ
| ВТ_РаспоряженияНаОтгрузкуОборотыРазвернутая КАК Распоряжения
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ТоварыЗаказа
| ПО Распоряжения.Распоряжение = ТоварыЗаказа.Ссылка
| И Распоряжения.Номенклатура = ТоварыЗаказа.Номенклатура
| И Распоряжения.Характеристика = ТоварыЗаказа.Характеристика
| И Распоряжения.КодСтроки = ТоварыЗаказа.КодСтроки
|
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаВозвратТоваровОтКлиента.ЗаменяющиеТовары КАК ТоварыЗаявки
| ПО Распоряжения.Распоряжение = ТоварыЗаявки.Ссылка
| И Распоряжения.Номенклатура = ТоварыЗаявки.Номенклатура
| И Распоряжения.Характеристика = ТоварыЗаявки.Характеристика
| И Распоряжения.КодСтроки = ТоварыЗаявки.КодСтроки
| И (ТоварыЗаказа.Ссылка ЕСТЬ NULL )
| ГДЕ
| ВЫБОР
| КОГДА НЕ ТоварыЗаказа.Ссылка ЕСТЬ NULL ТОГДА
| ТоварыЗаказа.ВариантОбеспечения В(
| ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.КОбеспечению))
| И ТоварыЗаказа.Обособленно
| ИНАЧЕ
| ТоварыЗаявки.ВариантОбеспечения В(
| ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.РезервироватьПоМереПоступления),
| ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.КОбеспечению))
| И ТоварыЗаявки.Обособленно
| КОНЕЦ
| И (Распоряжения.ЗаказаноКоличествоОборот
| - Распоряжения.ОтгруженоКоличествоОборот) > 0) КАК Т
|
|СГРУППИРОВАТЬ ПО
| Т.Номенклатура,
| Т.Характеристика,
| Т.Склад,
| Т.Назначение
|;
|
|
|ВЫБРАТЬ
| РаспределениеЗапасов.Номенклатура КАК Номенклатура,
| РаспределениеЗапасов.Характеристика КАК Характеристика,
| РаспределениеЗапасов.Склад КАК Склад,
| РаспределениеЗапасов.Назначение КАК Назначение,
| СУММА(РаспределениеЗапасов.НеОбеспечено) КАК КЗаказу
|ПОМЕСТИТЬ Потребность
|ИЗ
| НоменклатураЗаказа КАК Фильтр
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК РаспределениеЗапасов
| ПО РаспределениеЗапасов.Номенклатура = Фильтр.Номенклатура
| И РаспределениеЗапасов.Характеристика = Фильтр.Характеристика
| И РаспределениеЗапасов.Склад = Фильтр.Склад
| И РаспределениеЗапасов.Назначение = Фильтр.Назначение
| И РаспределениеЗапасов.Номенклатура.ТипНоменклатуры В(
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар),
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
|ГДЕ
| РаспределениеЗапасов.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.Обеспечить)
|СГРУППИРОВАТЬ ПО
| РаспределениеЗапасов.Характеристика,
| РаспределениеЗапасов.Номенклатура,
| РаспределениеЗапасов.Склад,
| РаспределениеЗапасов.Назначение
|
|ИНДЕКСИРОВАТЬ ПО
| Назначение, Номенклатура, Характеристика, Склад
|;
|
|
|ВЫБРАТЬ
| ВтТоварыЗаказов.ДатаЗаказа КАК ДатаЗаказа,
| ВтТоварыЗаказов.НомерСтроки КАК НомерСтроки,
| ВтТоварыЗаказов.Номенклатура КАК Номенклатура,
| ВтТоварыЗаказов.Характеристика КАК Характеристика,
| ВтТоварыЗаказов.Склад КАК Склад,
| ВтТоварыЗаказов.Назначение КАК Назначение,
| ВЫБОР
| КОГДА ВтТоварыЗаказов.Заказано > ВтКЗаказу.КЗаказу ТОГДА
| ВтКЗаказу.КЗаказу
| ИНАЧЕ
| ВтТоварыЗаказов.Заказано
| КОНЕЦ КАК Количество
|
|ПОМЕСТИТЬ НоменклатураКЗаказу
|
|ИЗ
| НоменклатураЗаказа КАК ВтТоварыЗаказов
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Потребность КАК ВтКЗаказу
| ПО ВтТоварыЗаказов.Номенклатура = ВтКЗаказу.Номенклатура
| И ВтТоварыЗаказов.Характеристика = ВтКЗаказу.Характеристика
| И ВтТоварыЗаказов.Склад = ВтКЗаказу.Склад
| И ВтТоварыЗаказов.Назначение = ВтКЗаказу.Назначение
|;
|
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| Т.Склад КАК Склад
|
|ПОМЕСТИТЬ ВТСклады
|
|ИЗ
| НоменклатураКЗаказу КАК Т
|
|УПОРЯДОЧИТЬ ПО
| ДатаЗаказа
|
|;
|
|
|ВЫБРАТЬ
| Т.Номенклатура КАК Номенклатура,
| ЕСТЬNULL(СтавкиНДСНоменклатуры.СтавкаНДС, ЕСТЬNULL(ОсновныеСтавкиНДС.СтавкаНДС,
| ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка))) КАК СтавкаНДС,
| Т.Характеристика КАК Характеристика,
| Т.Склад КАК Склад,
| Т.Назначение КАК Назначение,
| Т.Количество КАК Количество,
| Т.Количество КАК КоличествоУпаковок
|
|ИЗ
| НоменклатураКЗаказу КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиНДСНоменклатуры.СрезПоследних(&Дата,
| Страна = &СтранаРегистрации ИЛИ Страна = ЗНАЧЕНИЕ(Справочник.СтраныМира.ПустаяСсылка)) КАК СтавкиНДСНоменклатуры
| ПО Т.Номенклатура = СтавкиНДСНоменклатуры.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСтавкиНДС.СрезПоследних(&Дата, Страна = &СтранаРегистрации) КАК ОсновныеСтавкиНДС
| ПО (ИСТИНА)
|ГДЕ
| Т.Склад В (ВЫБРАТЬ Таб.Склад ИЗ ВТСклады КАК Таб)
|
|УПОРЯДОЧИТЬ ПО Т.Назначение, Т.НомерСтроки";
Запрос.УстановитьПараметр("Сделка", СправочникОснование);
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("СтранаРегистрации", ЗначениеНастроекКлиентСерверПовтИсп.СтранаРегистрацииОрганизации(Организация));
Сделка = СправочникОснование;
УстановитьПривилегированныйРежим(Истина);
ТаблицаТовары = Запрос.Выполнить().Выгрузить();
УстановитьПривилегированныйРежим(Ложь);
Если ТаблицаТовары.Количество() > 0 Тогда
Товары.Загрузить(ТаблицаТовары);
Склад = Товары[0].Склад;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииСделкиСводно(Знач СправочникОснование)
Запрос = Новый Запрос("
|ВЫБРАТЬ
| СделкиСКлиентами.Ссылка КАК Сделка
|ИЗ
| Справочник.СделкиСКлиентами КАК СделкиСКлиентами
|ГДЕ
| СделкиСКлиентами.Ссылка = &Сделка
| И СделкиСКлиентами.ОбособленныйУчетТоваровПоСделке
|;
|
|ВЫБРАТЬ
| РаспоряженияНаОтгрузку.Номенклатура КАК Номенклатура,
| РаспоряженияНаОтгрузку.Характеристика КАК Характеристика,
| (РаспоряженияНаОтгрузку.ЗаказаноКоличествоОборот
| - РаспоряженияНаОтгрузку.ОформленоКоличествоОборот) КАК Количество
|ПОМЕСТИТЬ ЗаказыКлиентов
|ИЗ
| #РаспоряженияНаОтгрузкуОборотыРазвернутая КАК РаспоряженияНаОтгрузку
|ГДЕ
| (РаспоряженияНаОтгрузку.ЗаказаноКоличествоОборот
| - РаспоряженияНаОтгрузку.ОформленоКоличествоОборот) <> 0
|;
|
|ВЫБРАТЬ
| ЗаказыПоставщикам.Номенклатура КАК Номенклатура,
| ЗаказыПоставщикам.Характеристика КАК Характеристика,
| ЗаказыПоставщикам.ЗаказаноПриход КАК Количество
|ПОМЕСТИТЬ ЗаказыПоставщикам
|ИЗ
| РегистрНакопления.ЗаказыПоставщикам.Обороты(,, Период,
| ЗаказПоставщику.Сделка = &Сделка
| ) КАК ЗаказыПоставщикам
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Характеристика
|;
|
|ВЫБРАТЬ
| ЗаказыКлиентов.Номенклатура КАК Номенклатура,
| ЗаказыКлиентов.Характеристика КАК Характеристика,
| ЗаказыКлиентов.Количество
| - ЕСТЬNULL(ЗаказыПоставщикам.Количество, 0) КАК Количество,
|
| ЗаказыКлиентов.Количество
| - ЕСТЬNULL(ЗаказыПоставщикам.Количество, 0) КАК КоличествоУпаковок
|ИЗ
| ЗаказыКлиентов КАК ЗаказыКлиентов
|
| ЛЕВОЕ СОЕДИНЕНИЕ
| ЗаказыПоставщикам КАК ЗаказыПоставщикам
| ПО
| ЗаказыКлиентов.Номенклатура = ЗаказыПоставщикам.Номенклатура
| И ЗаказыКлиентов.Характеристика = ЗаказыПоставщикам.Характеристика
|ГДЕ
| (ЗаказыКлиентов.Количество - ЕСТЬNULL(ЗаказыПоставщикам.Количество, 0)) > 0
|");
ПараметрыФормированияТаблицы = РегистрыНакопления.РаспоряженияНаОтгрузкуИВозврат.НовыйПараметрыФормированияРазвернутойТаблицы();
ПараметрыФормированияТаблицы.ТекстУсловия =
"Распоряжение.Сделка = &Сделка
| И Распоряжение.Статус В
| (ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке))";
ПараметрыФормированияТаблицы.Группировка = "Номенклатура, Характеристика";
ПараметрыФормированияТаблицы.Показатели = "Заказано, Оформлено";
ПараметрыФормированияТаблицы.Ресурсы = "Количество";
РаспоряженияНаОтгрузкуОборотыРазвернутая =
РегистрыНакопления.РаспоряженияНаОтгрузкуИВозврат.ТекстЗапросаРазвернутаяТаблица(
ПараметрыФормированияТаблицы);
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"#РаспоряженияНаОтгрузкуОборотыРазвернутая",
РаспоряженияНаОтгрузкуОборотыРазвернутая);
Запрос.УстановитьПараметр("Сделка", СправочникОснование);
УстановитьПривилегированныйРежим(Истина);
МассивРезультатов = Запрос.ВыполнитьПакет();
УстановитьПривилегированныйРежим(Ложь);
РезультатПоСделке = МассивРезультатов[0];
РезультатПоТоварам = МассивРезультатов[3];
ВыборкаПоСделке = РезультатПоСделке.Выбрать();
ВыборкаПоТоварам = РезультатПоТоварам.Выбрать();
Если ВыборкаПоСделке.Следующий() Тогда
Сделка = ВыборкаПоСделке.Сделка;
КонецЕсли;
Пока ВыборкаПоТоварам.Следующий() Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаПоТоварам);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьДокументНаОснованииИзмененияАссортимента(Знач ИзменениеАссортимента)
ОснованиеПроведен = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ИзменениеАссортимента, "Проведен");
Если НЕ ОснованиеПроведен Тогда
ТекстИсключения = Нстр("ru = 'Документ-основание %1 не проведен. Заполнение документа не возможно.'");
ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИсключения, ИзменениеАссортимента);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ДокументОснование = ИзменениеАссортимента;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ИзменениеАссортиментаТовары.Номенклатура
|ИЗ
| Документ.ИзменениеАссортимента.Товары КАК ИзменениеАссортиментаТовары
|ГДЕ
| ИзменениеАссортиментаТовары.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| ИзменениеАссортиментаТовары.НомерСтроки";
Запрос.УстановитьПараметр("Ссылка", ИзменениеАссортимента);
ВыборкаТоварыОснования = Запрос.Выполнить().Выбрать();
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(ЭтотОбъект, Истина));
ОбрабатываемыеСтроки = Новый Массив();
Пока ВыборкаТоварыОснования.Следующий() Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаТоварыОснования);
ОбрабатываемыеСтроки.Добавить(НоваяСтрока);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Товары,
КэшированныеЗначения);
КонецПроцедуры
Функция ЗаполнитьЦеныПоСоглашению()
ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены();
ПараметрыЗаполнения.Вставить("Дата", Дата);
ПараметрыЗаполнения.Вставить("Валюта", Валюта);
ПараметрыЗаполнения.Вставить("Организация", Организация);
ПараметрыЗаполнения.Вставить("Соглашение", Соглашение);
ПараметрыЗаполнения.Вставить("НалогообложениеНДС", НалогообложениеНДС);
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦеныПоставщика");
ПересчитатьСуммуСУчетомРучнойСкидки = Новый Структура("Очищать", Ложь);
СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуРучнойСкидки", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", ПересчитатьСуммуСУчетомРучнойСкидки);
ЦеныЗаполнены = ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены(
Товары,
Неопределено,
ПараметрыЗаполнения,
СтруктураДействий);
Возврат ЦеныЗаполнены;
КонецФункции
Процедура ПроверитьЗаполнитьПоступлениеОднойДатой()
ПоступлениеОднойДатой = Истина;
Если Товары.Количество() > 0 Тогда
ДатаПоступления = Товары[0].ДатаПоступления;
ДатаОтгрузки = Товары[0].ДатаПоступления;
Для Каждого Строка Из Товары Цикл
Если Строка.ДатаПоступления <> ДатаПоступления Тогда
ПоступлениеОднойДатой = Ложь;
КонецЕсли;
Строка.ДатаОтгрузки = Строка.ДатаПоступления;
КонецЦикла;
Если ПоступлениеОднойДатой Тогда
ЖелаемаяДатаПоступления = ДатаПоступления;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт
СтрокаТаб = Таблица.Добавить();
Если ЗначениеЗаполнено(Партнер) Тогда
СтрокаТаб.ЗначениеДоступа = Партнер;
Иначе
СтрокаТаб.ЗначениеДоступа = Перечисления.ДополнительныеЗначенияДоступа.ДоступРазрешен;
КонецЕсли;
КонецПроцедуры
Функция СкорректироватьСтрокиЗаказа(СтруктураПараметров) Экспорт
КоличествоОтмененныхСтрок = 0;
СуммаОтклоненияМерныхТоваров = 0;
СтруктураВозврата = Новый Структура("КоличествоСтрок, СуммаОтклонения",0,0);
ПричинаОтмены = СтруктураПараметров.ПричинаОтмены;
ОтменитьНеотработанныеСтроки = СтруктураПараметров.ОтменитьНеотработанныеСтроки;
СкорректироватьМерныеТовары = СтруктураПараметров.СкорректироватьМерныеТоварыПоПриемке;
ПроверятьОстатки = СтруктураПараметров.ПроверятьОстатки;
ТаблицаТовары = ЭтотОбъект[СтруктураПараметров.ИмяТабличнойЧасти];
Если НЕ ОтменитьНеотработанныеСтроки И НЕ СкорректироватьМерныеТовары Тогда
Возврат СтруктураВозврата;
КонецЕсли;
СвойстваОтмененнойСтроки = Новый Структура(
"Отменено, ПричинаОтмены",
Истина, ПричинаОтмены);
Если Не ПроверятьОстатки Тогда
Для н = 0 По ТаблицаТовары.Количество() - 1 Цикл
Если Не ТаблицаТовары[н].Отменено Тогда
ЗаполнитьЗначенияСвойств(Товары[н], СвойстваОтмененнойСтроки);
КоличествоОтмененныхСтрок = КоличествоОтмененныхСтрок + 1;
КонецЕсли;
КонецЦикла;
СтруктураВозврата.КоличествоСтрок = КоличествоОтмененныхСтрок;
Возврат СтруктураВозврата;
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ТаблицаТовары.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
| ВЫРАЗИТЬ(ТаблицаТовары.Характеристика КАК Справочник.ХарактеристикиНоменклатуры) КАК Характеристика,
| ВЫРАЗИТЬ(ТаблицаТовары.Склад КАК Справочник.Склады) КАК Склад,
| ВЫРАЗИТЬ(ТаблицаТовары.Количество КАК ЧИСЛО) КАК Количество,
| ВЫРАЗИТЬ(ТаблицаТовары.Отменено КАК БУЛЕВО) КАК Отменено,
| ВЫРАЗИТЬ(ТаблицаТовары.КодСтроки КАК ЧИСЛО) КАК КодСтроки,
| &ЗаказПоставщику КАК ЗаказПоставщику
|ПОМЕСТИТЬ ТаблицаТовары
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|ГДЕ
| ТаблицаТовары.Отменено = ЛОЖЬ
|
|;
|
|
|ВЫБРАТЬ
| ТоварыКПоступлению.Номенклатура КАК Номенклатура,
| ТоварыКПоступлению.Характеристика КАК Характеристика,
| ТоварыКПоступлению.Склад КАК Склад,
| СУММА(ТоварыКПоступлению.КОформлениюПриход
| * (&ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров / 100)) КАК ДопустимоеОтклонение
|ИЗ
| РегистрНакопления.ЗаказыПоставщикам.Обороты(&НачПериод,&КонПериод,, ЗаказПоставщику = &ЗаказПоставщику) КАК ТоварыКПоступлению
|ГДЕ
| ТоварыКПоступлению.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины В (&МерныеТипыЕдиницИзмерений)
|СГРУППИРОВАТЬ ПО
| ТоварыКПоступлению.Номенклатура,
| ТоварыКПоступлению.Характеристика,
| ТоварыКПоступлению.Склад
|;
|
|
|ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Характеристика КАК Характеристика,
| Остатки.Склад КАК Склад,
| Остатки.КодСтроки КАК КодСтроки,
| ВЫБОР
| КОГДА ВЫРАЗИТЬ(Остатки.ЗаказПоставщику КАК Документ.ЗаказПоставщику).Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПоставщикам.Подтвержден)
| ТОГДА Остатки.КОформлениюОстаток
| ИНАЧЕ Остатки.ЗаказаноОстаток
| КОНЕЦ КАК КОформлениюОстаток
|ПОМЕСТИТЬ ВтОстатки
|ИЗ
| РегистрНакопления.ЗаказыПоставщикам.Остатки(, ЗаказПоставщику = &ЗаказПоставщику) КАК Остатки
|ГДЕ
| Остатки.КОформлениюОстаток <> 0
| ИЛИ Остатки.ЗаказаноОстаток <> 0
|;
|
|
|ВЫБРАТЬ
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.Количество КАК Количество,
| ТаблицаТовары.КодСтроки КАК КодСтроки,
| Остатки.КОформлениюОстаток КАК КОформлениюОстаток
|ИЗ
| ТаблицаТовары КАК ТаблицаТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтОстатки КАК Остатки
| ПО ТаблицаТовары.Номенклатура = Остатки.Номенклатура
| И ТаблицаТовары.Характеристика = Остатки.Характеристика
| И ТаблицаТовары.Склад = Остатки.Склад
| И ТаблицаТовары.КодСтроки = Остатки.КодСтроки
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.Количество КАК Количество,
| ТаблицаТовары.КодСтроки КАК КодСтроки,
| 0
|ИЗ
| ТаблицаТовары КАК ТаблицаТовары
|ГДЕ
| ТаблицаТовары.ЗаказПоставщику.Статус НЕ В (ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПоставщикам.Подтвержден),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПоставщикам.Закрыт))");
Таблица = ТаблицаТовары.Выгрузить(,"Номенклатура, Характеристика, Склад, Количество, Отменено, КодСтроки");
Таблица.Свернуть("Номенклатура, Характеристика, Склад, Отменено, КодСтроки", "Количество");
Запрос.УстановитьПараметр("ТаблицаТовары", Таблица);
Запрос.УстановитьПараметр("ЗаказПоставщику", Ссылка);
Запрос.УстановитьПараметр("МерныеТипыЕдиницИзмерений",
Справочники.УпаковкиЕдиницыИзмерения.МерныеТипыЕдиницИзмерений());
Запрос.УстановитьПараметр("ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров",
Константы.ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров.Получить());
ГраницыОборотов = ОбщегоНазначенияУТ.ГраницыОборотовРегистра("ЗаказыПоставщикам",
"ЗаказПоставщику = &ЗаказПоставщику",
Запрос.Параметры);
Запрос.УстановитьПараметр("НачПериод", ГраницыОборотов.МинимальнаяДата);
Запрос.УстановитьПараметр("КонПериод", ГраницыОборотов.МаксимальнаяДата);
Результат = Запрос.ВыполнитьПакет();
ДопустимыеОтклонения = Результат[1].Выгрузить();
Выборка = Результат[3].Выбрать();
Если Выборка.Количество() = 0 Тогда
Возврат СтруктураВозврата;
КонецЕсли;
ДопустимыеОтклонения.Индексы.Добавить("Номенклатура, Характеристика, Склад");
ПричинаОтменыМерныхТоваров = Справочники.ПричиныОтменыЗаказовПоставщикам.ОтклонениеПриПриемкеМерныхТоваров;
ОбрабатываемыеСтроки = Новый Массив;
Если ТаблицаТовары = Товары Тогда
ОбрабатываемыеСтрокиНовые = ОбрабатываемыеСтроки;
Иначе
ОбрабатываемыеСтрокиНовые = Новый Массив;
КонецЕсли;
Пока Выборка.Следующий() Цикл
Если Выборка.КОформлениюОстаток > 0 Тогда
ЭтоДопустимоеОтклонение = Ложь;
СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить("Номенклатура", Выборка.Номенклатура);
СтруктураПоиска.Вставить("Характеристика", Выборка.Характеристика);
СтруктураПоиска.Вставить("Склад", Выборка.Склад);
СтрокиДопустимыхОтклонений = ДопустимыеОтклонения.НайтиСтроки(СтруктураПоиска);
Если СтрокиДопустимыхОтклонений.Количество() > 0 Тогда
СтрокаДопустимогоОтклонения = СтрокиДопустимыхОтклонений[0];
Если Выборка.КОформлениюОстаток <= СтрокаДопустимогоОтклонения.ДопустимоеОтклонение Тогда
ЭтоДопустимоеОтклонение = Истина;
СтрокаДопустимогоОтклонения.ДопустимоеОтклонение =
СтрокаДопустимогоОтклонения.ДопустимоеОтклонение - Выборка.КОформлениюОстаток;
КонецЕсли;
КонецЕсли;
Если НЕ ЭтоДопустимоеОтклонение И НЕ ОтменитьНеотработанныеСтроки Тогда
Продолжить;
КонецЕсли;
СтруктураПоиска.Вставить("Отменено", Ложь);
СтруктураПоиска.Вставить("КодСтроки", Выборка.КодСтроки);
СтрокиТоваров = Товары.НайтиСтроки(СтруктураПоиска);
Если СтрокиТоваров.Количество() > 0 Тогда
КоличествоОтменить = Выборка.КОформлениюОстаток;
Для каждого Строка Из СтрокиТоваров Цикл
Если КоличествоОтменить = 0 Тогда
Прервать;
КонецЕсли;
Если Строка.Количество <= КоличествоОтменить Тогда
ЗаполнитьЗначенияСвойств(Строка, СвойстваОтмененнойСтроки);
КоличествоОтменить = КоличествоОтменить-Строка.Количество;
Иначе
НоваяСтрока = ТаблицаТовары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
ЗаполнитьЗначенияСвойств(НоваяСтрока, СвойстваОтмененнойСтроки);
НоваяСтрока.КодСтроки = 0;
Строка.Количество = Строка.Количество - КоличествоОтменить;
НоваяСтрока.Количество = КоличествоОтменить;
Если ЭтоДопустимоеОтклонение Тогда
НоваяСтрока.ПричинаОтмены = ПричинаОтменыМерныхТоваров;
КонецЕсли;
ОбрабатываемыеСтроки.Добавить(Строка);
ОбрабатываемыеСтрокиНовые.Добавить(НоваяСтрока);
КоличествоОтменить = 0;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИначеЕсли Выборка.КОформлениюОстаток < 0 И СкорректироватьМерныеТовары Тогда
СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить("Номенклатура", Выборка.Номенклатура);
СтруктураПоиска.Вставить("Характеристика", Выборка.Характеристика);
СтруктураПоиска.Вставить("Склад", Выборка.Склад);
СтрокиДопустимыхОтклонений = ДопустимыеОтклонения.НайтиСтроки(СтруктураПоиска);
КоличествоРаспределить = Выборка.КОформлениюОстаток*(-1);
Если СтрокиДопустимыхОтклонений.Количество() > 0 Тогда
СтрокаДопустимогоОтклонения = СтрокиДопустимыхОтклонений[0];
СтрокиТоваров = ТаблицаТовары.НайтиСтроки(СтруктураПоиска);
СтрокаТоваров = СтрокиТоваров[0];
СтрокаТоваров.КоличествоУпаковок = СтрокаТоваров.КоличествоУпаковок
+ КоличествоРаспределить / (СтрокаТоваров.Количество / СтрокаТоваров.КоличествоУпаковок);
СтрокаТоваров.Количество = СтрокаТоваров.Количество + КоличествоРаспределить;
Ценообразование.ПересчитатьСуммыВСтроке(СтрокаТоваров, Ложь, Ложь, Истина, ЦенаВключаетНДС);
СтрокаДопустимогоОтклонения.ДопустимоеОтклонение =
СтрокаДопустимогоОтклонения.ДопустимоеОтклонение - КоличествоРаспределить;
КонецЕсли;
КонецЕсли;
КоличествоОтмененныхСтрок = КоличествоОтмененныхСтрок + 1;
КонецЦикла;
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Товары,
КэшированныеЗначения);
Для Каждого СтрокаТоваров Из ОбрабатываемыеСтроки Цикл
Ценообразование.ПересчитатьСуммыВСтроке(СтрокаТоваров, Ложь, Ложь, Истина, ЦенаВключаетНДС);
КонецЦикла;
Если ТаблицаТовары <> Товары Тогда
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтрокиНовые,
СтруктураДействий,
ТаблицаТовары,
КэшированныеЗначения);
Для Каждого СтрокаТоваров Из ОбрабатываемыеСтрокиНовые Цикл
Ценообразование.ПересчитатьСуммыВСтроке(СтрокаТоваров, Ложь, Ложь, Истина, ЦенаВключаетНДС);
КонецЦикла;
КонецЕсли;
СтруктураВозврата.КоличествоСтрок = КоличествоОтмененныхСтрок;
Возврат СтруктураВозврата;
КонецФункции
Процедура СкорректироватьЦеныЗаказа(ЗаказОбъект,ОтклоненияЦен) Экспорт
СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЗаказОбъект);
ПересчитатьСуммуСУчетомРучнойСкидки = Новый Структура("Очищать", Ложь);
СтруктураДействийИзмененияЦен = Новый Структура;
СтруктураДействийИзмененияЦен.Вставить("ПересчитатьСумму");
СтруктураДействийИзмененияЦен.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействийИзмененияЦен.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействийИзмененияЦен.Вставить("ПересчитатьСуммуРучнойСкидки");
СтруктураДействийИзмененияЦен.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", ПересчитатьСуммуСУчетомРучнойСкидки);
СтруктураДействийИзмененияСумм = Новый Структура;
СтруктураДействийИзмененияСумм.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействийИзмененияСумм.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействийИзмененияСумм.Вставить("ПересчитатьСуммуРучнойСкидки");
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
ОбрабатываемыеСтрокиСуммы = Новый Массив();
ОбрабатываемыеСтрокиЦены = Новый Массив();
Для Каждого СтрокаОтклонений Из ОтклоненияЦен Цикл
НайденнаяСтрока = ЗаказОбъект.Товары.Найти(СтрокаОтклонений.КодСтроки, "КодСтроки");
Если НЕ СтрокаОтклонений.ЦенаИзменилась И СтрокаОтклонений.СуммаИзменилась Тогда
Если НайденнаяСтрока <> Неопределено Тогда
НайденнаяСтрока.Сумма = СтрокаОтклонений.СуммаПоступления;
Если СтрокаОтклонений.СуммаРучнойСкидкиПоступления <> 0 Тогда
СтруктураДействийИзмененияСумм.Удалить("ПересчитатьСуммуРучнойСкидки");
НайденнаяСтрока.СуммаРучнойСкидки = СтрокаОтклонений.СуммаРучнойСкидкиПоступления;
НайденнаяСтрока.ПроцентРучнойСкидки = -(СтрокаОтклонений.СуммаПоступления * 100
/ (НайденнаяСтрока.КоличествоУпаковок*НайденнаяСтрока.Цена)-100);
Иначе
СтруктураДействийИзмененияСумм.Удалить("ПересчитатьСуммуРучнойСкидки");
НайденнаяСтрока.ПроцентРучнойСкидки = 0;
КонецЕсли;
ОбрабатываемыеСтрокиСуммы.Добавить(НайденнаяСтрока);
КонецЕсли;
Иначе
Если НайденнаяСтрока <> Неопределено Тогда
НайденнаяСтрока.Цена = СтрокаОтклонений.ЦенаПоступления;
Если СтрокаОтклонений.СуммаРучнойСкидкиПоступления <> 0 Тогда
СтруктураДействийИзмененияЦен.Удалить("ПересчитатьСуммуРучнойСкидки");
СтруктураДействийИзмененияЦен.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки",
Новый Структура("Очищать,ПересчитыватьСуммуРучнойСкидки", Ложь, Ложь));
НайденнаяСтрока.СуммаРучнойСкидки = СтрокаОтклонений.СуммаРучнойСкидкиПоступления;
НайденнаяСтрока.ПроцентРучнойСкидки = 0;
Иначе
СтруктураДействийИзмененияЦен.Удалить("ПересчитатьСуммуРучнойСкидки");
СтруктураДействийИзмененияЦен.Удалить("ПересчитатьСуммуСУчетомРучнойСкидки");
НайденнаяСтрока.ПроцентРучнойСкидки = 0;
КонецЕсли;
ОбрабатываемыеСтрокиЦены.Добавить(НайденнаяСтрока);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтрокиСуммы,
СтруктураДействийИзмененияСумм,
ЗаказОбъект.Товары,
КэшированныеЗначения);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтрокиЦены,
СтруктураДействийИзмененияЦен,
ЗаказОбъект.Товары,
КэшированныеЗначения);
КонецПроцедуры
Функция ОтменитьНепоставленныеСтроки(ПричинаОтмены, Знач ПроверятьОстатки = Ложь) Экспорт
КоличествоОтмененныхСтрок = 0;
СвойстваОтмененнойСтроки = Новый Структура(
"Отменено, ПричинаОтмены",
Истина, ПричинаОтмены);
Если Не ПроверятьОстатки Тогда
Для Сч = 0 По Товары.Количество() - 1 Цикл
Если Не Товары[Сч].Отменено Тогда
ЗаполнитьЗначенияСвойств(Товары[Сч], СвойстваОтмененнойСтроки);
КоличествоОтмененныхСтрок = КоличествоОтмененныхСтрок + 1;
КонецЕсли;
КонецЦикла;
Возврат КоличествоОтмененныхСтрок;
КонецЕсли;
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ТаблицаТовары.НомерСтроки КАК ЧИСЛО) КАК НомерСтроки,
| ВЫРАЗИТЬ(ТаблицаТовары.КодСтроки КАК ЧИСЛО) КАК КодСтроки,
| ВЫРАЗИТЬ(ТаблицаТовары.Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения) КАК Упаковка,
| ВЫРАЗИТЬ(ТаблицаТовары.Количество КАК ЧИСЛО) КАК Количество,
| ВЫРАЗИТЬ(ТаблицаТовары.Отменено КАК БУЛЕВО) КАК Отменено,
| &ЗаказПоставщику КАК ЗаказПоставщику
|ПОМЕСТИТЬ ТаблицаТовары
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|ГДЕ
| ТаблицаТовары.Отменено = ЛОЖЬ
|
|ИНДЕКСИРОВАТЬ ПО
| КодСтроки
|;
|
|
|ВЫБРАТЬ
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ТаблицаТовары.КодСтроки КАК КодСтроки,
| ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки, 1) КАК КоэффициентУпаковки,
| ВЫБОР КОГДА ТаблицаТовары.Количество > Остатки.КОформлениюПриход ТОГДА
| ТаблицаТовары.Количество - Остатки.КОформлениюРасход
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоСверхОформленного,
| ТаблицаТовары.Количество КАК Количество,
| Остатки.КОформлениюКонечныйОстаток КАК КОформлениюОстаток,
| ВЫБОР
| КОГДА ТаблицаТовары.Количество = Остатки.КОформлениюКонечныйОстаток
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК РазбитьСтроку
|ИЗ
| ТаблицаТовары КАК ТаблицаТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.ОстаткиИОбороты(,,,, ЗаказПоставщику = &ЗаказПоставщику) КАК Остатки
| ПО ТаблицаТовары.КодСтроки = Остатки.КодСтроки
| И (Остатки.КОформлениюКонечныйОстаток > 0)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ТаблицаТовары.КодСтроки КАК КодСтроки,
| ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки, 1) КАК КоэффициентУпаковки,
| 0,
| ТаблицаТовары.Количество КАК Количество,
| 0,
| ЛОЖЬ
|ИЗ
| ТаблицаТовары КАК ТаблицаТовары
|ГДЕ
| ВЫРАЗИТЬ(ТаблицаТовары.ЗаказПоставщику КАК Документ.ЗаказПоставщику).Статус НЕ В (ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПоставщикам.Подтвержден),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПоставщикам.Закрыт))
|УПОРЯДОЧИТЬ ПО
| НомерСтроки;
|
|
|ВЫБРАТЬ
| ТоварыКПоступлениюОстатки.Номенклатура КАК Номенклатура,
| ТоварыКПоступлениюОстатки.Характеристика КАК Характеристика,
| ТоварыКПоступлениюОстатки.Назначение КАК Назначение,
| ТоварыКПоступлениюОстатки.Склад КАК Склад,
| ТоварыКПоступлениюОстатки.КОформлениюОрдеровРасход + ТоварыКПоступлениюОстатки.ПринимаетсяПриход КАК Количество
|ИЗ
| РегистрНакопления.ТоварыКПоступлению.ОстаткиИОбороты(
| ,,,,
| ДокументПоступления = &ЗаказПоставщику) КАК ТоварыКПоступлениюОстатки");
Запрос.Текст = СтрЗаменить(Запрос.Текст,
"&ТекстЗапросаКоэффициентУпаковки",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
"ТаблицаТовары.Упаковка", Неопределено));
Запрос.УстановитьПараметр(
"ТаблицаТовары",
Товары.Выгрузить(
,
"НомерСтроки, КодСтроки, Упаковка, Количество, Отменено"));
Запрос.УстановитьПараметр("ЗаказПоставщику", Ссылка);
Результат = Запрос.ВыполнитьПакет();
Выборка = Результат[1].Выбрать();
РаспоряжениеЗаказ = Документы.ЗаказПоставщику.ЗаказЯвляетсяРаспоряжениемНаПриемкуТоваров(Ссылка);
ПоступившиеТовары = Результат[2].Выгрузить();
Если РаспоряжениеЗаказ Тогда
Пока Выборка.Следующий() Цикл
Строка = Товары[Выборка.НомерСтроки-1];
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("Номенклатура", Строка.Номенклатура);
ПараметрыПоиска.Вставить("Характеристика", Строка.Характеристика);
ПараметрыПоиска.Вставить("Склад", Строка.Склад);
ПараметрыПоиска.Вставить("Назначение", Строка.Назначение);
ПринятоеКоличество = 0;
ПринятаяСтрока = Неопределено;
НайденныеСтроки = ПоступившиеТовары.НайтиСтроки(ПараметрыПоиска);
Если НайденныеСтроки.Количество() > 0 Тогда
ПринятаяСтрока = НайденныеСтроки[0];
ПринятоеКоличество = ПринятаяСтрока.Количество;
КонецЕсли;
ОтменитьКоличество = 0;
Если Выборка.КОформлениюОстаток = 0 И ПринятоеКоличество = 0 Тогда
ОтменитьКоличество = Выборка.Количество;
ИначеЕсли Выборка.Количество >= ПринятоеКоличество Тогда
ОтменитьКоличество = Мин(Выборка.КОформлениюОстаток, Выборка.Количество - ПринятоеКоличество);
Если ПринятаяСтрока <> Неопределено Тогда
Если ПринятоеКоличество > (Выборка.Количество - Выборка.КоличествоСверхОформленного - Выборка.КОформлениюОстаток) Тогда
ПринятаяСтрока.Количество = ПринятоеКоличество - (Выборка.Количество - Выборка.КоличествоСверхОформленного - Выборка.КОформлениюОстаток);
Иначе
ПринятаяСтрока.Количество = 0;
КонецЕсли;
КонецЕсли;
Иначе
ПринятаяСтрока.Количество = ПринятаяСтрока.Количество - Выборка.Количество;
КонецЕсли;
Если ОтменитьКоличество = Выборка.Количество Тогда
ЗаполнитьЗначенияСвойств(Строка, СвойстваОтмененнойСтроки);
ИначеЕсли ОтменитьКоличество > 0 Тогда
ОтменитьКоличество = ОтменитьКоличество + Выборка.КоличествоСверхОформленного;
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
ЗаполнитьЗначенияСвойств(НоваяСтрока, СвойстваОтмененнойСтроки);
НоваяСтрока.КодСтроки = 0;
Строка.Количество = Выборка.Количество - ОтменитьКоличество;
Строка.КоличествоУпаковок = (Выборка.Количество - ОтменитьКоличество) / Выборка.КоэффициентУпаковки;
НоваяСтрока.Количество = ОтменитьКоличество;
НоваяСтрока.КоличествоУпаковок = ОтменитьКоличество / Выборка.КоэффициентУпаковки;
НоваяСтрока.СуммаСНДС = Строка.СуммаСНДС * ОтменитьКоличество/Выборка.Количество;
Ценообразование.ПересчитатьСуммыВСтроке(Строка, Ложь, Ложь, Истина, ЦенаВключаетНДС);
Ценообразование.ПересчитатьСуммыВСтроке(НоваяСтрока, Ложь, Ложь, Истина, ЦенаВключаетНДС);
Иначе
Продолжить;
КонецЕсли;
КоличествоОтмененныхСтрок = КоличествоОтмененныхСтрок + 1;
КонецЦикла;
Иначе
Если Результат[1].Пустой() Тогда
Возврат КоличествоОтмененныхСтрок;
КонецЕсли;
Пока Выборка.Следующий() Цикл
Строка = Товары[Выборка.НомерСтроки-1];
Если Выборка.РазбитьСтроку Тогда
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
ЗаполнитьЗначенияСвойств(НоваяСтрока, СвойстваОтмененнойСтроки);
НоваяСтрока.КодСтроки = 0;
Строка.Количество = Выборка.Количество - Выборка.КОформлениюОстаток;
Строка.КоличествоУпаковок = (Выборка.Количество - Выборка.КОформлениюОстаток) / Выборка.КоэффициентУпаковки;
НоваяСтрока.Количество = Выборка.КОформлениюОстаток;
НоваяСтрока.КоличествоУпаковок = Выборка.КОформлениюОстаток / Выборка.КоэффициентУпаковки;
Ценообразование.ПересчитатьСуммыВСтроке(Строка, Ложь, Ложь, Истина, ЦенаВключаетНДС);
Ценообразование.ПересчитатьСуммыВСтроке(НоваяСтрока, Ложь, Ложь, Истина, ЦенаВключаетНДС);
Иначе
ЗаполнитьЗначенияСвойств(Строка, СвойстваОтмененнойСтроки);
КонецЕсли;
КоличествоОтмененныхСтрок = КоличествоОтмененныхСтрок + 1;
КонецЦикла;
КонецЕсли;
Возврат КоличествоОтмененныхСтрок;
КонецФункции
Процедура ПроверитьКорректностьНаправленияДеятельности()
Если ЗначениеЗаполнено(НаправлениеДеятельности) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Назначения.НаправлениеДеятельности КАК НаправлениеДеятельности
|ИЗ
| Справочник.Назначения КАК Назначения
|ГДЕ
| Назначения.Ссылка В(&Назначения)
| И Назначения.НаправлениеДеятельности <> &НаправлениеДеятельности";
Запрос.УстановитьПараметр("Назначения", Товары.ВыгрузитьКолонку("Назначение"));
Запрос.УстановитьПараметр("НаправлениеДеятельности", НаправлениеДеятельности);
Если Не Запрос.Выполнить().Пустой() Тогда
НаправлениеДеятельности = Справочники.НаправленияДеятельности.ПустаяСсылка();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьПустуюДатуПоступления()
Если Товары.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если ПроверитьПустуюДатуПоступления() Тогда
Если ЗначениеЗаполнено(ЖелаемаяДатаПоступления) И ЖелаемаяДатаПоступления >= Дата Тогда
ДатаПоступления = ЖелаемаяДатаПоступления;
Иначе
ДатаПоступления = ТекущаяДатаСеанса();
КонецЕсли;
Если ПоступлениеОднойДатой Тогда
ЗаполнитьДатыПоступленияДляТовара();
Иначе
ЗаполнитьПустыеДатыПоступленияДляТовара();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ПроверитьПустуюДатуПоступления()
Для Каждого СтрокаТЧ Из Товары Цикл
Если Не СтрокаТЧ.Отменено
И Не ЗначениеЗаполнено(СтрокаТЧ.ДатаПоступления) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ЗаполнитьПустыеДатыПоступленияДляТовара()
Для Каждого СтрокаТЧ Из Товары Цикл
Если Не ЗначениеЗаполнено(СтрокаТЧ.ДатаПоступления) Тогда
СтрокаТЧ.ДатаПоступления = ДатаПоступления;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьДатыПоступленияДляТовара()
Для Каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.ДатаПоступления = ДатаПоступления;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьЦеныПоЗаказуПринципала()
СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ЭтотОбъект);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействийПоПересчетуРучнойСкидки = Новый Структура;
СтруктураДействийПоПересчетуРучнойСкидки.Вставить("ПересчитатьЦенуСкидкуПоСуммеВЗакупках",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруПересчетаЦеныСкидкиВЗакупкахВТЧ(
Товары,
ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ПриемНаКомиссию")));
КэшированныеЗначения = Неопределено;
ТоварыДокументаОснования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументОснование, "Товары");
ТоварыДокументаОснования = ?(ТипЗнч(ТоварыДокументаОснования) = Тип("РезультатЗапроса"), ТоварыДокументаОснования.Выгрузить(), ТоварыДокументаОснования);
ОбрабатываемыеСтроки = Новый Массив();
ОбрабатываемыеСтрокиПересчетРучнойСкидки = Новый Массив();
Для каждого СтрокаТовара Из Товары Цикл
ОтборПоТовару = Новый Структура();
ОтборПоТовару.Вставить("Номенклатура", СтрокаТовара.Номенклатура);
СтрокиЗаказа = ТоварыДокументаОснования.НайтиСтроки(ОтборПоТовару);
ЦенаТовара = 0;
СуммаТовара = 0;
СуммаТовараСНДС = 0;
СуммаТовараНДС = 0;
КоличествоТовара = 0;
ИзмененаСтавкаНДС = Ложь;
СтавкаНДС = Неопределено;
Если СтрокиЗаказа.Количество() > 0 Тогда
Для каждого СтрокаЗаказа Из СтрокиЗаказа Цикл
ЦенаТовара = ЦенаТовара + СтрокаЗаказа.Цена;
КонецЦикла;
СуммаТовара = СуммаТовара + СтрокаЗаказа.Сумма;
СуммаТовараСНДС = СуммаТовараСНДС + СтрокаЗаказа.СуммаСНДС;
СуммаТовараНДС = СуммаТовараНДС + СтрокаЗаказа.СуммаНДС;
ЦенаТовара = ЦенаТовара / СтрокиЗаказа.Количество();
КоличествоТовара = КоличествоТовара + СтрокаЗаказа.Количество;
Если СтавкаНДС = Неопределено Тогда
СтавкаНДС = СтрокаЗаказа.СтавкаНДС;
ИначеЕсли НЕ СтавкаНДС = СтрокаЗаказа.СтавкаНДС Тогда
ИзмененаСтавкаНДС = Истина;
КонецЕсли;
КонецЕсли;
СтрокаТовара.Цена = ЦенаТовара;
СтрокаТовара.СтавкаНДС = СтавкаНДС;
ПересчитатьСуммы = (КоличествоТовара <> СтрокаТовара.Количество) Или ИзмененаСтавкаНДС;
Если ПересчитатьСуммы Тогда
ОбрабатываемыеСтроки.Добавить(СтрокаТовара);
Иначе
СтрокаТовара.Сумма = СуммаТовара;
СтрокаТовара.СуммаСНДС = СуммаТовараСНДС;
СтрокаТовара.СуммаНДС = СуммаТовараНДС;
ОбрабатываемыеСтрокиПересчетРучнойСкидки.Добавить(СтрокаТовара);
КонецЕсли;
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Товары,
КэшированныеЗначения);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтрокиПересчетРучнойСкидки,
СтруктураДействийПоПересчетуРучнойСкидки,
Товары,
КэшированныеЗначения);
КонецПроцедуры
Процедура ЗаполнитьТоварыИзОснования(АдресТоварыОснования)
ТоварыОснования = ПолучитьИзВременногоХранилища(АдресТоварыОснования);
КолонкаДатаОтгрузки = ТоварыОснования.Колонки.Найти("ДатаОтгрузки");
Если КолонкаДатаОтгрузки <> Неопределено Тогда
ТоварыОснования.Колонки.Удалить(КолонкаДатаОтгрузки);
КонецЕсли;
Товары.Загрузить(ТоварыОснования);
УдалитьИзВременногоХранилища(АдресТоварыОснования);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли