Заводим в конфу новую подписку, указываем источник - СФВ, событие - Заполнение. и обработчик с простеньким запросом:
Процедура ВводСФВНаОснованииАктаОбработкаЗаполнения(Источник, Основание) Экспорт Счет = Основание.Сделка.Ссылка; Если ЗначениеЗаполнено(Счет) Тогда Запрос = Новый Запрос; Текст = "ВЫБРАТЬ | ЕСТЬ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
Не забыть бы это, когда придется обновлять конфу.