Простановка номеров ГТД в документах реализации

Клиент обратился с проблемой, что в счет-фактуре выданной на основании реализации не все номера ГТД проставлены.

По первоначальному анализу показалось, что номера ГТД в печатной форме берутся из движений реализации регистра накопления «Товары организаций». Потом оказалось, что это не так и номера берутся из табличной части «Виды запасов реализации».

Для некоторых товаров не хватило номеров ГТД и виды запасов по этим товарам прошли по пустым номерам ГТД.

Я написал заплатку, которая подбирает последний номер ГТД, по которому приходил этот товар и подставляет его в табличную часть «Виды запасов» реализации, расширяю модуль документа реализации:


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

В процессе проведения выдаются сообщения о подобранных и не подобранных номерах ГТД.

После перепроведения реализации счет-фактуру не нужно проводить, т.к. счет-фактура актуализируется при проведении реализации, после чего в ее печатной форме нужные номера ГТД появятся.

Подобную заплатку 1С никогда не реализует, т.к. она противоречит логике учета ГТД. Но всё же на практике ее использование оправдано, когда требуется оперативно выписать реализацию в более-менее нормальном виде (с проставленными номерами ГТД).

Эта задача интересна еще тем, что сначала я пошел не по тому пути и думал, что счет-фактура берет данные из регистра «Товары организаций», написал код по замене ГТД, потом, когда увидел, что не работает и проблема все же в таблице «Виды запасов», попробовал добавить перезапись документа, но в итоге убрал этот код и сделал по нормальному, как написал выше:

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

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

Среда: УТ 11.5.7.402 Объем: 2 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *