Счет-фактура выданный / Форма списка по отчету комиссионера / Модуль формы

файл

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

	Параметры.Отбор.Свойство("ДокументОснование", ДокументОснование);
	Параметры.Отбор.Свойство("Организация",       Организация);
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокПродажи, "ДокументОснование", ДокументОснование, , , Истина);
	
	Если Параметры.Отбор.Свойство("КОформлению") И Параметры.Отбор.КОформлению Тогда
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаПродажи;
	КонецЕсли;
	
	ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтаФорма);
	
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// ИнтеграцияС1СДокументооборотом
	ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтаФорма, Элементы.СписокГруппаКоманднаяПанельГлобальныеКоманды);
	// Конец ИнтеграцияС1СДокументооборотом
	
	// СтандартныеПодсистемы.РаботаСКонтрагентами
	ПроверкаКонтрагентов.ПриСозданииНаСервереСписокДокументов(Список);
	
	Если ПроверкаКонтрагентовВызовСервера.ИспользованиеПроверкиВозможно() Тогда
		Элементы.СодержитНекорректныхКонтрагентов.Видимость = Истина;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.РаботаСКонтрагентами
	
	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
	
	СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект, "Список.Дата", Элементы.Дата.Имя);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтаФорма, "СканерШтрихкода");

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	ОповеститьОВыборе(ДокументОснование);
	
	МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтаФорма);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	// ПодключаемоеОборудование
	Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
		Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
			ОбработатьШтрихкоды(МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВСтруктуру(Параметр));
		КонецЕсли;
	КонецЕсли;
	// Конец ПодключаемоеОборудование
	
	// Подсистема "ЭлектронныеДокументы"
	Если ИмяСобытия = "ОбновитьСостояниеЭД" Тогда
		Элементы.Список.Обновить();
	КонецЕсли;

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Если ТекущаяСтраница = Элементы.СтраницаСписок Тогда
		Элементы.Список.Обновить();
	ИначеЕсли ТекущаяСтраница = Элементы.СтраницаПродажи Тогда
		Элементы.СписокПродажи.Обновить();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Отказ = Истина;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПродажиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Список.ТекущиеДанные;
	
	Если ТекущаяСтрока <> Неопределено Тогда
		
		МассивОснований = Новый СписокЗначений();
		МассивОснований.Добавить(ТекущаяСтрока.ДокументОснование);
		
		ПараметрОповещения = Новый Структура;
		ПараметрОповещения.Вставить("Ссылка", ТекущаяСтрока.Ссылка);
		ПараметрОповещения.Вставить("Организация", ТекущаяСтрока.Организация);
		ПараметрОповещения.Вставить("СписокОснований", МассивОснований);
		Если ТипЗнч(ВладелецФормы) = Тип("ФормаКлиентскогоПриложения") Тогда
			ПараметрОповещения.Вставить("ФормаВладелец", ВладелецФормы.УникальныйИдентификатор);
		КонецЕсли;
		
		Оповестить("Запись_СчетФактураВыданный", ПараметрОповещения, ТекущаяСтрока.Ссылка);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура СоздатьСчетаФактуры(Команда)
	
	СчетаФактурыКУдалению = СчетаФактурыКУдалению();
	
	Если СчетаФактурыКУдалению.Количество() > 0 Тогда
		Ответ = Неопределено;
		ПоказатьВопрос(Новый ОписаниеОповещения("СоздатьСчетаФактурыЗавершение", ЭтотОбъект, Новый Структура("СчетаФактурыКУдалению", СчетаФактурыКУдалению)), НСтр("ru = 'Обнаружены счета-фактуры, не соответствующие строкам отчета комиссионера. Пометить на удаление?'"),
			РежимДиалогаВопрос.ДаНетОтмена,
			,
			КодВозвратаДиалога.Отмена);
		Возврат;
	КонецЕсли;
	
	СоздатьСчетаФактурыКлиент(СчетаФактурыКУдалению);
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьСчетаФактурыЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	СчетаФактурыКУдалению = ДополнительныеПараметры.СчетаФактурыКУдалению;
	Ответ = РезультатВопроса;
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		СчетаФактурыКУдалению.Очистить()
	ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	СоздатьСчетаФактурыКлиент(СчетаФактурыКУдалению);
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьСчетаФактурыКлиент(Знач СчетаФактурыКУдалению)
	    
	Результат = СоздатьСчетаФактурыСервер(СчетаФактурыКУдалению);
	Оповестить("Запись_СчетФактураКомиссионера", , Результат);
	
	Элементы.Список.Обновить();
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаСписок;
	
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

// ИнтеграцияС1СДокументооборотом
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
	
	ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтаФорма, Элементы.Список);
	
КонецПроцедуры
// Конец ИнтеграцияС1СДокументооборотом

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ШтрихкодыИТорговоеОборудование

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

&НаКлиенте
Процедура ОбработатьШтрихкоды(Данные)
	
	Если Не ШтрихкодированиеНоменклатурыКлиент.ШтрихкодыВалидны(Данные) Тогда
		Возврат;
	КонецЕсли;
	
	МассивСсылок = СсылкаНаЭлементСпискаПоШтрихкоду(Данные.Штрихкод);
	Если МассивСсылок.Количество() > 0 Тогда
		Элементы.Список.ТекущаяСтрока = МассивСсылок[0];
		ПоказатьЗначение(,МассивСсылок[0]);
	Иначе
		ШтрихкодированиеПечатныхФормКлиент.ОбъектНеНайден(Данные.Штрихкод);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область Прочее

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

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

	Пока Выборка.Следующий() Цикл
		
		ЗаполнитьЗначенияСвойств(ДанныеЗаполнения, Выборка);
		
		НовыйСчетФактура = Документы.СчетФактураВыданный.СоздатьДокумент();
		
		Отбор = Новый Структура;
		Отбор.Вставить("ДатаСчетаФактуры");
		Если НЕ ФормироватьСводныеСФ Тогда
			Отбор.Вставить("Покупатель");
			Отбор.Вставить("НомерСчетаФактуры");
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(Отбор, Выборка);
		
		СтрокиПокупатели = Покупатели.НайтиСтроки(Отбор);
		Для каждого Строка Из СтрокиПокупатели Цикл
			НоваяСтрока = НовыйСчетФактура.Покупатели.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		КонецЦикла;
		
		ВыставляемыйСФ = Ложь;
		Для каждого Строка Из НовыйСчетФактура.Покупатели Цикл
			Если Строка.Покупатель <> Справочники.Контрагенты.РозничныйПокупатель ИЛИ Строка.НомерСчетаФактуры <> "" Тогда
				ВыставляемыйСФ = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если ВыставляемыйСФ Тогда 
			ДанныеЗаполнения.Вставить("ДатаВыставления", ДанныеЗаполнения.Дата);
		КонецЕсли;
		ДанныеЗаполнения.Вставить("РеализацияЧерезКомиссионера", Истина);
		
		НовыйСчетФактура.Заполнить(ДанныеЗаполнения);
		
		Попытка
			НовыйСчетФактура.Записать(РежимЗаписиДокумента.Проведение);
		Исключение
			ТекстОшибки = НСтр("ru = 'Не удалось записать %Документ%. %ОписаниеОшибки%'");
			ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Документ%",       НовыйСчетФактура);
			ТекстОшибки = СтрЗаменить(ТекстОшибки, "%ОписаниеОшибки%", КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			
			ОбщегоНазначения.СообщитьПользователю(
				ТекстОшибки, , ,);
		КонецПопытки;
		
		Результат.Добавить(НовыйСчетФактура.Ссылка);
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#КонецОбласти

Связанные материалы