Имя: Пароль:
1C
1С v8
Ошибка в расширении
0 Lucifer09
 
08.04.20
21:57
Добрый день, дорогие форумчане. Нужна Ваша помощь.
разрабатываю расширение для УНФ 1.6 автоматического создания и проведения СФ вместе с расходной накладной (РТУ).
Не могу дать ума в чем ошибка.
Привязал процедуру к кнопке провести и закрыть выполняется после:
&НаСервере
Процедура СА_АФСФ_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)
    Если Не ЗначениеЗаполнено(Объект.Ссылка)
        Или Не Объект.Проведен Тогда
       Возврат;
    
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РасходнаяНакладная.Ссылка КАК Ссылка
        |ИЗ
        |    Документ.РасходнаяНакладная КАК РасходнаяНакладная
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактура КАК СчетФактура
        |        ПО РасходнаяНакладная.Ссылка = СчетФактура.ДокументыОснования.Ссылка
        |ГДЕ
        |    РасходнаяНакладная.Проведен = &Проведен
        |    И СчетФактура.Ссылка ЕСТЬ NULL
        |    И РасходнаяНакладная.Ссылка = &Ссылка";
            
    
    Запрос.УстановитьПараметр("Ссылка", объект.Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.пустой() Тогда
    
        Возврат;
    
    КонецЕсли;
    
    СФ = Документы.СчетФактура.СоздатьДокумент();
    ДанныеСчетаФактуры = Новый Структура;
    ДанныеСчетаФактуры.Вставить("ДокументОснование", Объект.Ссылка);
    ДанныеСчетаФактуры.Вставить("Организация",       Объект.Организация);
    СФ.Заполнить(ДанныеСчетаФактуры);
    СФ.Записать(РежимЗаписиДокумента.Проведение);
    
        
КонецПроцедуры
1 RomanYS
 
08.04.20
22:12
В чем проблема то? Какая ошибка? Код выполняется?
2 Lucifer09
 
08.04.20
22:17
Результата нет - СФ не создается и не проводится на основании РТУ
3 RomanYS
 
08.04.20
22:19
(2) Значит ошибки тоже нет. Не умеешь включать отладку - добавь отладочное сообщение или запись в ЖР, чтобы убедиться что код выполняется
4 hhhh
 
08.04.20
23:12
(0) вообще-то правильно писать не Объект, а ТекущийОбъект
5 AlvlSpb
 
08.04.20
23:21
(4) Это форма документа - правильно Объект
6 AlvlSpb
 
08.04.20
23:24
(0) 1. У тебя ВСЕГДА результат не будет пустым из-за левого соединения, надо внутреннее. А правильней - Запрос к критерию отбора Связанные документы
2. В структуру включи Дата = ТекущаяДата()
7 RomanYS
 
08.04.20
23:25
(4)(5) Правильно и так и так.
Объект - основной реквизит формы,
ТекущийОбъект - ДокументОбъект параметр функции.

В данном случае разницы наверное нет.
8 RomanYS
 
08.04.20
23:34
(0) Код вероятно не выполняется. Запрос должен падать с ошибкой: параметр "Проведен" не  задан.
9 Lucifer09
 
08.04.20
23:46
Попробовал иначе все равно без результатно.
&НаСервере
Процедура СА_АФСФ_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)
    
    Если Не Объект.Проведен Тогда
      Возврат;
   КонецЕсли;

   Запрос = Новый Запрос;
   Запрос.Текст =
     "ВЫБРАТЬ
     |    РасходнаяНакладная.Ссылка КАК Ссылка,
     |    РасходнаяНакладная.Дата КАК Дата,
     |    СчетФактура.ДокументыОснования.(
     |        ДокументОснование КАК ДокументОснование
     |    ) КАК ДокументыОснования
     |ИЗ
     |    Документ.РасходнаяНакладная КАК РасходнаяНакладная
     |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактура КАК СчетФактура
     |        ПО (СчетФактура.ДокументыОснования.ДокументОснование = РасходнаяНакладная.Ссылка)
     |ГДЕ
     |    РасходнаяНакладная.Проведен = &Проведен
     |    И СчетФактура.Ссылка ЕСТЬ NULL
     |    И РасходнаяНакладная.Ссылка = &Ссылка";
   Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
  
   РезультатЗапроса = Запрос.Выполнить();
   Если РезультатЗапроса.пустой() Тогда
      
        ДанныеСчетаФактуры = Новый Структура;
        ДанныеСчетаФактуры.Вставить("ДокументОснование", Объект.Ссылка);
        ДанныеСчетаФактуры.Вставить("Организация", Объект.Организация);
        ДанныеСчетаФактуры.Вставить("Дата", Объект.Дата);
        СФ = Документы.СчетФактура.СоздатьДокумент();
        СФ.Заполнить(ДанныеСчетаФактуры);
        СФ.Записать(РежимЗаписиДокумента.Проведение);
   КонецЕсли;
  
КонецПроцедуры
10 AlvlSpb
 
08.04.20
23:47
(9) Решение в (8)
11 AlvlSpb
 
08.04.20
23:48
Сделай окончание запроса
     | ГДЕ
     |    РасходнаяНакладная.Проведен
     |    И СчетФактура.Ссылка ЕСТЬ NULL
     |    И РасходнаяНакладная.Ссылка = &Ссылка";
12 Lucifer09
 
08.04.20
23:54
(11) Спасибо, это поправил.
13 Lucifer09
 
08.04.20
23:55
(8) В том то и проблема что отладка ничего не выдает
14 Ненавижу 1С
 
гуру
09.04.20
08:53
ОФФТОП: мне кажется неправильно выбран уровень абстракции, не надо привязываться к UI, надо это делать в событии объекта
15 Lucifer09
 
09.04.20
09:21
(14) Нашел только такую реализацию задачи. Вроде как вопрос давний но на просторах интернета нет решений рабочих.
16 RomanYS
 
09.04.20
09:34
(13) Так с этого и надо начинать. Какая разница какой код, если он не выполняется.
Расширение активно?
База перезапускалась?
Основное (расширяемое) событие вызывается?
17 Ray Zexter
 
09.04.20
09:57
Отладчик доходит до момента СФ = Документы.СчетФактура.СоздатьДокумент(); или спотыкается где то ранее?
18 Sneer
 
09.04.20
10:09
(2) Может безопасный режим не отключен?
19 mzelensky
 
09.04.20
10:55
(0)
Вот тут "Процедура СА_АФСФ_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)" входящий параметр "ТекущийОбъект"

А вот тут

"Если Не ЗначениеЗаполнено(Объект.Ссылка)
        Или Не Объект.Проведен Тогда
       Возврат;
    
    КонецЕсли;"

Ты проверяешь "Объект.Ссылка"

Это точно так и надо?
20 Lucifer09
 
09.04.20
11:17
(16) Расширение активно, база перезапускалась.
Отладка не выдает ничего.
Скорее всего событие вообще не запускается, а причина не понятна.

По убирал все лишнее. Пришел к выводу что мне условия проверки статуса проведения документа не нужны так как я после проведения выполняю процедуру.
Но все равно что-то не могу понять что я не учел.

&НаСервере
Процедура ПСФ_ПровестиИЗакрытьПослеНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    
   Запрос = Новый Запрос;
   Запрос.Текст =
     "ВЫБРАТЬ
     |    РасходнаяНакладная.Ссылка КАК Ссылка,
     |    РасходнаяНакладная.Дата КАК Дата
     |ИЗ
     |    Документ.РасходнаяНакладная КАК РасходнаяНакладная
     |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактура КАК СчетФактура
     |        ПО (СчетФактура.ДокументыОснования.Ссылка = РасходнаяНакладная.Ссылка)
     |ГДЕ
     |    РасходнаяНакладная.Проведен
     |    И СчетФактура.Ссылка ЕСТЬ NULL
     |    И РасходнаяНакладная.Ссылка = &Ссылка";
   Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка);
  
   РезультатЗапроса = Запрос.Выполнить();
  
        ДанныеСчетаФактуры = Новый Структура;
    ДанныеСчетаФактуры.Вставить("ДокументОснование", ТекущийОбъект.Ссылка);
        ДанныеСчетаФактуры.Вставить("Организация", ТекущийОбъект.Организация);
    ДанныеСчетаФактуры.Вставить("Дата", ТекущийОбъект.Дата);
        СФ = Документы.СчетФактура.СоздатьДокумент();
        СФ.Заполнить(ДанныеСчетаФактуры);
        СФ.Записать(РежимЗаписиДокумента.Проведение);
      
КонецПроцедуры
21 Ray Zexter
 
09.04.20
11:39
Отладчик в расширение в принципе заходит?
22 RomanYS
 
09.04.20
11:44
(20) Выкинь весь код пока. Сделай одну строку
Сообщить("Расширение запускается");
Пока не увидишь сообщение про свой код вообще забудь.

Основное событие формы (которое ты расширяешь) запускается?
Может у тебя, например, кнокпа "Записать" обрабатывается кодом, а не вызывает стандартную команду формы со стандартными обработчиками
23 Lucifer09
 
09.04.20
12:25
(22) Спасибо за дельный совет.
Выяснил таким образом выяснил что код исполняется только на клиенте.
24 Sneer
 
09.04.20
17:42
(23) Ты галку "Безопасный режим" снял?
25 runoff_runoff
 
09.04.20
17:44
отладка на сервере не включена
26 Lucifer09
 
10.04.20
09:39
(25) База файловая
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.