В поисках грузоотправителя

Клиент поставил задачу: номер Торг-12 должен быть прописан также в поле <ТранГруз СвТранГруз=»ТН 42 от 30.03.2021″>. И начались поиски решения.

При формировании электронного документа (ЭД) к реализации в XML файле я поля ТранГруз не нашел. Кроме того, не нашел этого поля даже в описании формата.

После обсуждения с клиентом пришли к мысли, что это поле может быть в счет-фактуре. Выгрузил счет-фактуру в XML, но и там не было этого поля.

Я уже начал думать, что это поле должно быть только в ТТН, но все-же погуглил и нашел, где «прячется» это поле:

А СвПер находится в СодФХЖ3 под тегом СВПродПер:

Ну а поле СодФХЖ3 в файле я видел, он находится в Документ:

Далее включаю замер производительности и нажимаю:

При этом формируется электронный документ.

Путем отладки опредляем, что XML заполняется в процедуре СформироватьИнформациюПродавцаXML_2019 модуля ОбменСКонтрагентамиВнутренний.

И наши искомые теги не выгружаются для счет-фактуры:

Поэтому нужно их добавить. Добавляем процедуру СформироватьИнформациюПродавцаXML_2019 в расширение. Копируем процедуру целиком, т.к. вмешаться внутрь нельзя, там нет для этого вызовов. В самый конец, перед проверкой, добавляем вызов наших доработок:

    //Осипов — в конце, перед проверкой +++
       
Если ЭлектронноеВзаимодействиеСлужебный.ЗначениеРеквизитаВДереве(ДеревоДанных, «Функция») = СЧФ() Тогда
           
СвПродПер = ПолучитьОбъектТипаCML(«Файл.Документ.СвПродПер», ПространствоИменСхемы);
           
СвПер = ПолучитьОбъектТипаCML(«Файл.Документ.СвПродПер.СвПер», ПространствоИменСхемы);
           
ТранГруз = ПолучитьОбъектТипаCML(«Файл.Документ.СвПродПер.СвПер.ТранГруз», ПространствоИменСхемы);


           
ТекНомер = ЭлектронноеВзаимодействиеСлужебный.ЗначениеРеквизитаВДереве(ДеревоДанных, «НомерДокумента»);
           
ТекДата = ЭлектронноеВзаимодействиеСлужебный.ЗначениеРеквизитаВДереве(ДеревоДанных, «ДатаДокумента»);
           
СодержаниеНомерДата = «ТН » + ТекНомер + » от » + Формат(ТекДата, «ДФ=dd.MM.yyyy»);

           
//ОснПер — обязательное поле, приходится заполнять
           
ОснПер = ПолучитьОбъектТипаCML(«Файл.Документ.СвПродПер.СвПер.ОснПер», ПространствоИменСхемы);
           
ОснПер.НаимОсн = СодержаниеНомерДата;
           
СвПер.ОснПер.Добавить(ОснПер);

           
ЗаполнитьСвойствоXDTO(Документ, «СвПродПер», СвПродПер, Истина, Ошибки);

           
ЗаполнитьСвойствоXDTO(СвПродПер, «СвПер», СвПер, Истина, Ошибки);

           
ЗаполнитьСвойствоXDTO(СвПер, «ТранГруз», ТранГруз, Истина, Ошибки);

           
//СодОпер — обязательное поле, приходится заполнять
           
ЗаполнитьСвойствоXDTO(СвПер, «СодОпер», «Товары переданы», Истина, Ошибки);

           
ЗаполнитьСвойствоXDTO(ТранГруз, «СвТранГруз», СодержаниеНомерДата, Истина, Ошибки);

        КонецЕсли;
       
//—

       
Файл.Проверить();

Для отладки кода, чтобы XML формировался заново, после каждого формирования ЭД нужно удалять его из регистра «Состояния электронных документов»:

Если не открывается форма электронного документа, идем в журнал регистрации и там смотрим причину ошибки:

Наблюдательный читатель заметит, что я разместил СвПер не в СодФХЖ3 а в Документ. Ну это уже пришло на практике, возможно ссылки вели на старый формат.

Также пришлось заполнять обязательные поля, чтобы прорваться через ошибку контроля полей XDTO.

Результат красивый:

Время: 5 часов. Можно было бы и быстрее, но сама постановка задачи была не понятная, да и находить участки в коде 1С проблематично.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 29

  1. Павел:

    В современных типовых чтото находить и править — это сложности. Которые еще и никто не хочет оплачивать

    • Вот-вот, в этой же ветке есть комментарий про «9 тыщ». 😉
      наверное, надо за тарелку супа такие задачи решать. 😉

  2. klopik:

    Да, навык использования Google сейчас хорошо помогает программистам.

  3. Тык:

    9 тысяч ни за что. А с 1 июля новый формат будет — еще 9 тысяч возьмешь?

    • с клиента взял за 3 часа, как и было оговорено по ТЗ. 2 часа считай потратил на самообразование.
      Я не занимаюсь философией, а выполняю работы, которые нужны клиенту.
      Если клиент платит, значит ему нужно.

  4. fajij28770:

    >копируем процедуру целиком, т.к. вмешаться внутрь нельзя, там нет для этого вызовов
    «глобальное и надежное» решение?

    • Более тонкие деньги стоят более дорого, а там и так овербюджет. Вполне нормальное решение, учитывая, что конфа полностью типовая и можно работать только расширениями.

      • naf2000:

        Что будет когда изменится код типовой процедуры?

        • Стандартно, нужно будет обновить код в расширении и заново вставить изменения.

          • Павел:

            Круть. «Перегрузка которую мы заслужили» за 15 лет развития платформы

          • А как бы сделали вы?

          • fajij28770:

            ага, только для начала программисту, который это будет сопровождать, придется потратить не иллюзорное кол-во времени, чтобы понять, в каком месте произошел «разъезд».

          • ну такова участь 1сников.

      • fajij28770:

        я с 1с не знаком, и код тут приведен обрывками, но напрашивается вопрос: почему нельзя вызвать исходную процедуру, а потом допилить данные (там вроде xml-документ), которые она возвращает? заодно можно поставить человеческий ассерт на тот случай, если в исходных данных что-то изменится.

        • Это дороже. Потому что процедура не формирует XML, а сразу пишет в файл, придется считать файл, распарсить в XDTO и записать заново.
          Я же говорю, что есть методы подороже.

          • fajij28770:

            так это работы на 15 минут

          • Смешно.

          • fajij28770:

            Пять минут заняло (первый раз работаю с этой API-шкой)
            import xml.etree.ElementTree as ET
            if __name__ == ‘__main__’:
            doc = ET.parse(‘foo.xml’)
            bar = doc.getroot().find(‘.//bar’)
            assert bar is not None, ‘Something goes wrong’
            bar.append(ET.Element(‘buzz’))
            doc.write(‘foo.xml’)

          • Решения за пять минут приводят к последствиям на 5 часов. 😉
            я не спорю, что можно разобрать уже записанный файл. Но это как-то не комильфо, не?

          • fajij28770:

            мое решение: вызвать функцию в типовой и дописать недостающую инфу в результат ее выполнения. а если место куда надо дописать инфу не найдено (типовая изменилась), поставить человеческий ассерт
            твое решение: скопипасть код типовой и добавить изменения туда. что будет, когда типовая изменится, одному тебе теперь известно
            вот и думай, что комильфо, а что нет

          • в каждом решении есть свои плюсы и минусы.

  5. Павел:

    1ц сама провоцирует делать такие залепухи. Ибо язык и архитектура из прошлого века уже не лезет ни в какие рамки

Добавить комментарий для klopik Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *