В поисках грузоотправителя
Клиент поставил задачу: номер Торг-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С проблематично.
В современных типовых чтото находить и править — это сложности. Которые еще и никто не хочет оплачивать
Вот-вот, в этой же ветке есть комментарий про «9 тыщ». 😉
наверное, надо за тарелку супа такие задачи решать. 😉
Да, навык использования Google сейчас хорошо помогает программистам.
9 тысяч ни за что. А с 1 июля новый формат будет — еще 9 тысяч возьмешь?
с клиента взял за 3 часа, как и было оговорено по ТЗ. 2 часа считай потратил на самообразование.
Я не занимаюсь философией, а выполняю работы, которые нужны клиенту.
Если клиент платит, значит ему нужно.
1 июля клиент что делать будет?
Ну я не Нострадамус. Он не может ждать 1 июля, ему нужно уже сейчас обмениваться ЭДО
Ясно.
>копируем процедуру целиком, т.к. вмешаться внутрь нельзя, там нет для этого вызовов
«глобальное и надежное» решение?
Более тонкие деньги стоят более дорого, а там и так овербюджет. Вполне нормальное решение, учитывая, что конфа полностью типовая и можно работать только расширениями.
Что будет когда изменится код типовой процедуры?
Стандартно, нужно будет обновить код в расширении и заново вставить изменения.
Круть. «Перегрузка которую мы заслужили» за 15 лет развития платформы
А как бы сделали вы?
ага, только для начала программисту, который это будет сопровождать, придется потратить не иллюзорное кол-во времени, чтобы понять, в каком месте произошел «разъезд».
ну такова участь 1сников.
я с 1с не знаком, и код тут приведен обрывками, но напрашивается вопрос: почему нельзя вызвать исходную процедуру, а потом допилить данные (там вроде xml-документ), которые она возвращает? заодно можно поставить человеческий ассерт на тот случай, если в исходных данных что-то изменится.
Это дороже. Потому что процедура не формирует XML, а сразу пишет в файл, придется считать файл, распарсить в XDTO и записать заново.
Я же говорю, что есть методы подороже.
так это работы на 15 минут
Смешно.
Пять минут заняло (первый раз работаю с этой 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 часов. 😉
я не спорю, что можно разобрать уже записанный файл. Но это как-то не комильфо, не?
мое решение: вызвать функцию в типовой и дописать недостающую инфу в результат ее выполнения. а если место куда надо дописать инфу не найдено (типовая изменилась), поставить человеческий ассерт
твое решение: скопипасть код типовой и добавить изменения туда. что будет, когда типовая изменится, одному тебе теперь известно
вот и думай, что комильфо, а что нет
в каждом решении есть свои плюсы и минусы.
1ц сама провоцирует делать такие залепухи. Ибо язык и архитектура из прошлого века уже не лезет ни в какие рамки
Скорее из будущего. В других платформах я не встречал такой гибкости.
Открой для себя понятие override
В 1с или вообще. В 1С чем богаты, тем и рады.
да есть там override, насколько я понял, — «вызов вместо».