Ну я бы для начала отрефакторил метод
ЗаполнитьРеквизиты() Процедура ЗаполнитьРеквизиты()
докОснование = Сам(Контекст).ДокументОснование;
ОС = Сам(Контекст).ОС;
докОснование.ВыбратьСтроки();
Пока докОснование.ПолучитьСтроку() = 1 Цикл
Если докОснование.ОС <> ОС Тогда Продолжить; КонецЕсли;
_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
КонецЦикла;
КонецПроцедуры
Потом убрал бы еще один неприятный запах, сделал один из следующих вариантов (хотя, возможно, приведенный вариант правильный).
_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
Прервать;
либо
_СуммаПоставки = _СуммаПоставки + Сам(Контекст).ДокументОснование.Всего;
_НДСПоставки = _НДСПоставки + Сам(Контекст).ДокументОснование.НДС;
Затем перенес бы еще один кусок:
Процедура ЗаполнитьРеквизиты()
докОснование = Сам(Контекст).ДокументОснование;
ОС = Сам(Контекст).ОС;
Если докОснование .Вид() <> "ПоступлениеОС" Тогда
База = Сам(Контекст).ПолучитьБазовыйКласс("Документы_КнигиПокупок");
_СуммаПоставки = База.СуммаПоставки();
_НДСПоставки = База.НДСПоставки();
Возврат;
КонецЕсли;
докОснование.ВыбратьСтроки();
Пока докОснование.ПолучитьСтроку() = 1 Цикл
Если докОснование.ОС <> ОС Тогда Продолжить; КонецЕсли;
_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
Прервать;
КонецЦикла;
КонецПроцедуры
Потом бы отметил, что сообщение одно и то же. Скорее всего, его можно генерировать по одному условию:
Процедура ЗаполнитьРеквизиты()
докОснование = Сам(Контекст).ДокументОснование;
ОС = Сам(Контекст).ОС;
Если докОснование .Вид() <> "ПоступлениеОС" Тогда
База = Сам(Контекст).ПолучитьБазовыйКласс("Документы_КнигиПокупок");
_СуммаПоставки = База.СуммаПоставки();
_НДСПоставки = База.НДСПоставки();
Возврат;
КонецЕсли;
докОснование.ВыбратьСтроки();
Пока докОснование.ПолучитьСтроку() = 1 Цикл
Если докОснование.ОС <> ОС Тогда Продолжить; КонецЕсли;
_СуммаПоставки = Сам(Контекст).ДокументОснование.Всего;
_НДСПоставки = Сам(Контекст).ДокументОснование.НДС;
Прервать;
КонецЦикла;
Если _СуммаПоставки = 0 Тогда
Сообщить("В документе поступления не найдено ОС "+Сам(Контекст).ОС+", принимаемое к учету.", "!");
КонецЕсли;
КонецПроцедуры
Либо заменить условие на какое-то, связанное с циклом.
Ну и что же у нас осталось от функций?
Функция СуммаПоставки() Экспорт
Если _СуммаПоставки = 0 Тогда
ЗаполнитьРеквизиты();
КонецЕсли;
Возврат _СуммаПоставки;
КонецФункции
Функция НДСПоставки() Экспорт
Если _НДСПоставки = 0 Тогда
ЗаполнитьРеквизиты();
КонецЕсли;
Возврат _НДСПоставки;
КонецФункции
Ну что, будем дальше устранять дублирование? Тогда вместо функций лучше использовать свойства(хотя можно было их использовать и раньше) и управлять считыванием свойств через
_ПриЧтенииСвойства
(стрИмяАтрибута). Но тогда понадобится реализовать обращение к переменным по имени.