Имя: Пароль:
1C
1С v8
Перестало работать ПродолжитьВызов
, ,
0 Гений 1С
 
гуру
17.01.23
12:51
Вот код:


&Вместо("ЗаполнитьПоПоступлению")
Процедура дор_ЗаполнитьПоПоступлению(ДанныеЗаполнения) Экспорт
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Массив") Тогда
        Для Каждого ТекДокумент из ДанныеЗаполнения Цикл
            Сообщить("Заполнение по документу: " + ТекДокумент);
            ПродолжитьВызов(ТекДокумент);
        КонецЦикла;
    Иначе
        ПродолжитьВызов(ДанныеЗаполнения);
    КонецЕсли;
КонецПроцедуры



Раньше работало, на платформе 8.3.21.1622 стало выдавать ошибку:
ДоработкиБП Документ.ПоступлениеДопРасходов.МодульОбъекта(7)}: Ошибка при вызове метода контекста (ПродолжитьВызов)
Вызов метода разрешен только в методах с аннотацией "Вместо"

Какого хуанхе?

В итоге пришлось копировать процедуру в расширение:



&Вместо("ЗаполнитьПоПоступлению")
Процедура дор_ЗаполнитьПоПоступлению(ДанныеЗаполнения) Экспорт
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Массив") Тогда
        Для Каждого ТекДокумент из ДанныеЗаполнения Цикл
            Сообщить("Заполнение по документу: " + ТекДокумент);
            //ПродолжитьВызов(ТекДокумент);  
            дор_Исх_ЗаполнитьПоПоступлению(ТекДокумент);
        КонецЦикла;
    Иначе
        дор_Исх_ЗаполнитьПоПоступлению(ДанныеЗаполнения);
        //ПродолжитьВызов(ДанныеЗаполнения);
    КонецЕсли;
КонецПроцедуры


//Копия процедуры ЗаполнитьПоПоступлению т.к. ПродолжитьВызов не работает
//Ошибки видимости игнорируем, добавляю реквизиты в расширение, чтобы не ругалось
Процедура дор_Исх_ЗаполнитьПоПоступлению(ДанныеЗаполнения) Экспорт

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

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




Почему так?
1 vicof
 
17.01.23
12:55
Описание:
Вызывает переопределенный метод или обработчик события из расширяемой конфигурации.
Функция предназначена только для однократного вызова. Использовать функцию можно только в расширениях и только с аннотацией &Вместо.
2 unenu
 
17.01.23
13:25
продолжитьвызов() в цикле это не про 1С
3 AAA
 
17.01.23
13:31
веселое применение ПродолжитьВызов
Хотя теоретически рекурсию никто не отменял ) думаю, что можно разрулить, но не так в лоб
4 H A D G E H O G s
 
17.01.23
13:38
Внутри цикла вместо ПродолжитьВызов вызывай исходную процедуру основной конфы
5 Гений 1С
 
гуру
17.01.23
15:01
(4) а она не зациклит? ведь по идее она опять заменит исходную процедуру расширением?
6 lodger
 
17.01.23
15:14
вынеси ПродолжитьВызов из Цикла и из Если. в конец 1 раз напиши.
7 H A D G E H O G s
 
17.01.23
15:30
(5) попробуй
8 Гений 1С
 
гуру
17.01.23
15:35
(6) Мне надо многократно вызывать прошлую версию по логике задачи.
9 Гений 1С
 
гуру
17.01.23
15:36
(7) Да ладно, я уже решил задачу, думаю, повторно не столкнусь.
10 H A D G E H O G s
 
17.01.23
16:05
(9) Соболезную твоим преемникам
11 НафНаф
 
17.01.23
17:23
Правильный ответ:

&Вместо("ЗаполнитьПоПоступлению")
Процедура дор_ЗаполнитьПоПоступлению(ДанныеЗаполнения) Экспорт
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Массив") Тогда
        Для Каждого ТекДокумент из ДанныеЗаполнения Цикл
            Сообщить("Заполнение по документу: " + ТекДокумент);
            ЗаполнитьПоПоступлению(ТекДокумент);
        КонецЦикла;
    Иначе
        ПродолжитьВызов(ДанныеЗаполнения);
    КонецЕсли;
КонецПроцедуры
12 Гений 1С
 
гуру
19.01.23
11:20
(11) неплохо
13 Гений 1С
 
гуру
19.01.23
11:20
(10) От гения к ремесленникам не уходят
14 НафНаф
 
19.01.23
11:28
(12) учись, падаван