Каталог решений - К вопросу об использовании подписок на события в типовых конфигурациях.

К вопросу об использовании подписок на события в типовых конфигурациях.

К вопросу об использовании подписок на события в типовых конфигурациях.

В наличии

Пришла вот такая хотелка {для УПП 1.2.17.3}:
"При вводе счет/фактуры выданной (если ранее уже была оплата) не подтягивается платежное поручение (его № и дата)."
Расшифровка: при вводе СФВ на основании Акта услуг, в котором указан счет (сделка), если по этому счету была платежка покупателя, ее дата/номер должна проставляться в СФВ.

Категория:

Описание

Нет, проблем, ведь подписки придуманы именно для таких случаев, верно?
Заводим в конфу новую подписку, указываем источник — СФВ, событие — Заполнение. и обработчик с простеньким запросом:

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

Запускаем, работает. Только почему-то в табличке появляется лишняя пустая строчка… Ёклмн!

Разбираемся. Оказывается, в СФВ в ПриОткрытии() уважаемая фирма вставила вот такую фигню:

Процедура ПриОткрытии()
...	
	Если ЭтоНовый() Тогда
...
		Если ДокументОснование <> Неопределено Тогда
			ЗаполнитьДатуИНомерВходящегоДокумента();
		КонецЕсли;
	КонецЕсли;
...
КонецПроцедуры

Сама вызываемая процедура

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

представляет собой маленький шедевр:

Ну, во-первых, то, что из трех колонок запроса используются только две,
факт, хоть и говорящий о качестве кода уважаемой, но прямо к теме не относится.
Во-вторых, то, что перед вызовом — единственном в конфигурации — проверяется условие

ДокументОснование <> 

,
а потом в теле процедуры предлагается

Если ОбрабатываемыйДокументОснование = 

— это уже не только о качестве кода, но и о наличии целостного представления у разработчика
о собственной разработке. Но, опять таки прямо к теме не относится.

В-третьих. Почему же эта процедура, предназначенная как раз для удовлетворения означенной хотелки,
выдает пустую строку?

Вот пример набора записей регистра по одному Акту:
1.
Формирование записей книги продаж 00000000001 от 31.01.2008 12:00:00
31.01.2008 12:00:00
Акт об оказании производственных услуг 00000000001 от 31.01.2008 9:22:15
<null>
288 693,23
2.
Регистрация оплаты от покупателей для НДС 00000000002 от 29.02.2008 12:00:00
07.02.2008 12:00:00
Акт об оказании производственных услуг 00000000001 от 31.01.2008 9:22:15
Платежное поручение входящее 00000000066 от 07.02.2008 12:00:00
288 693,23

Дата СФВ устанавливается не текущая, а дата Акта-основания. Наверное, это правильно,
но из регистра при этом выхватывается только первая запись, и в таблице запроса
получим строку с пустыми значениями даты и номера.

Ну, не знаю. Мне не хочется объяснять бухгалтерии, что платежка «не подтягивается»
потому, что хотя оплата и уже была, но ее еще не было, когда сформировали Акт.
Не потому, что это сложно. А потому, что это — отмазка. Потому, что бухгалтерии работать надо,
а не восхищаться изяществом методологической мысли уважаемой фирмы.
Да и какого фига? Какое нафиг изящество?
Вот мой запрос — он работает. Вот типовой — он дает пустую строку. КонецДискуссии.
Но и это — не отностся к теме статьи.

Темой статьи является замечательная особенность платформы —
используя механизм подписки на события, можно что-то изменить в алгоритме типовой конфигурации,
не ИЗМЕНЯЯ объектов. Так вот, оказывается, что можно, но с оглядкой. Потому, что
разработчики типовой кофигурации могут разместить первоначальное заполнение
в ПриОткрытии. И каждый раз(!), открывая форму, проверять, не в первый ли раз она открывается.
Я — оглянулся (не собирался, пустая строчка бросилась в глаза).
И ИЗМЕНИЛ модуль формы выданной фактуры:

//+ comment tango
// ЗаполнитьДатуИНомерВходящегоДокумента();
//- comment tango

Не забыть бы это, когда придется обновлять конфу.

has been added to your cart:
Оформление заказа