Настройка заполнения дополнительных полей в ТОРГ-12 и счетах-фактурах ЭДО 1С-Такском УПП 1.3 (на примере ЭДО с ПАО "Татнефть имени Д.В. Шашина")

Как настроить заполнение доп. полей в формате ФНС 5.01 для счета-фактуры и Торг-12.

Однажды в наш отдел прилетела задача: наладить ЭДО с ПАО "Татнефть" с минимумом вложений по соглашению ЭДО, предусматривающему обязательное заполнение доп полей в счетах-фактурах и товарных накладных (номер договора, код подразделения получателя, ГУИД документа и т.д.). 

Задача достаточно простая, но есть несколько нюансов, на которые стоит обратить внимание, чтобы не терять понапрасну время.

Далее написано для УПП 1.3.106.1 и платформы 8.2.19.130

Решение:

  1.  Подключить 1С-Такском — система ЭДО, встроенная в большинство типовых конфигураций 1С 8, обратившись к обслуживающему партнеру. Буквально в течение часа специалист франчайзи  подключил услугу, настроил ключи ЭЦП, форматы отправки, послал приглашения контрагенту. Бесплатно 100 документов в месяц при подписке ИТС Проф. Подробности на оф сайте https://portal.1c.ru/applications/8.
     
  2. Обязательно проверьте правильность заполнения данных в справочнике "Контрагенты", "Договоры контрагентов"
    • Обновите КЛАДР, справочник банков (Устаревшее название банка в торг — отказ)
    • Контактная информация должна быть заполнена и заполнена по классификатору адресов (российский адрес был заполнен как зарубежный — неизвестный код страны — отказ)
    • У контрагента должен быть заведен банковский счет и он должен быть помечен как "Основной" (банковские реквизиты не попадали в торг-12 без пометки счета "Основным" — отказ)
       
  3. Суть обмена — создается файл xml, подписывается и средствами оператора ЭДО передается контрагенту, который его подписывает и тем принимает к учету.
    В УПП этот файл создается как:

    • в процедуре СформироватьХМЛФайл общего модуля ЭлектронныеДокументыСлужебный определяется по ключу функция, для каждого вида электронного документа своя. Нас интересуют
      • для ТОРГ-12  (формат 551 приказа ФНС) — ЭлектронныеДокументыВнутренний.СформироватьПередачаТоваровПродавец
      • для счета-фактуры — ЭлектронныеДокументыВнутренний.СформироватьИнформациюПродавца
    • В этих функциях происходит заполнение ДереваЗначений данными документа-источника и вызов одноименной функции с добавлением xml (ЭлектронныеДокументыВнутренний.СформироватьПередачаТоваровПродавецXML и т.д.), которая уже и формирует сам xml файл на основе переданного дерева значений.
  4. Таким образом нам остается только перед вызовом функции СформироватьПередачаТоваровПродавецXML дополнить ДеревоЗначений своими реквизитами. Все заполняемые доп. поля должны быть проверены на непустое значение (проблемы при отправке — несоответствие формату ФНС)
    • Для ТОРГ-12 узел дерева называется "ДопДанные.Подписанные" и новые строки в него добавляются функцией ДобавитьЗначениеВДерево или ВставитьЗначениеВДерево. Отличия в том, что ВставитьЗначениеВДерево проверяет наличие узла дерева по имени и меняет его значение, если найдено, если не найдено — создает новый узел, а ДобавитьЗначениеВДерево без проверок добавляет новый узел в дерево.
    • Для счета-фактуры — "ДопДанныеСчетаФактуры.ТекстоваяИнформация" и узлы добавляются функцией ОбщегоНазначенияЭД.ДобавитьЗаписьВТаблицуДерева.
       

В качестве примера привожу код по заполнению дополнительных полей, обязательных при ЭДО с ПАО "Татнефть им. Шашина Д.В.".  Здесь доп поля используются для автоматических процессов согласования и доставки документа до адресата (http://1c-edo.ru/reviews/2601/). Передаются номер договора, дата договора, код подразделения (храним в свойствах контрагента), уникальный идентификатор документа -он используется для связи счета-фактуры и ТОРГ-12 и должен совпадать для одного комплекта документов.

 

Код общего модуля mokЭДОТатнефть:

Процедура ДобавитьДопПоляВТОРГ12Татнефть(СтрокаДерева, СсылкаНаОбъект) Экспорт;

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

Попытка
//Обязательные доп поля 
Номер_Договора = Лев(СсылкаНаОбъект.ДоговорКонтрагента.Номер, 200);
Дата_Договора = Лев(Формат(СсылкаНаОбъект.ДоговорКонтрагента.Дата, "ДФ=dd.MM.yyyy"), 200);

ИдентификаторСвойстваПодразделениеПолучателя = ygЗначенияНепредопределенныхОбъектов.ПолучитьЗначениеПоИдентификатору("ТатнефтьСвойствоПодразделение");
Подразделение_получатель = YgМодульПривилегированный.ПолучитьЗначениеСвойстваОбъекта(СсылкаНаОбъект.Грузополучатель, ИдентификаторСвойстваПодразделениеПолучателя);

ИдентификаторДокументаОснования = Строка(СсылкаНаОбъект.УникальныйИдентификатор());

Исключение
Сообщить("Обратись в ОИТ");
Сообщить(ОписаниеОшибки());
КонецПопытки;

Если НЕ ЗначениеЗаполнено(Номер_Договора) Тогда
ВызватьИсключение "Не заполнен номер договора в документе ";
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Дата_Договора) Тогда
ВызватьИсключение "Не заполнена дата договора в документе ";
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Подразделение_получатель) Тогда
ВызватьИсключение "Не заполнен код структурного подразделения Татнефти";
КонецЕсли;

ДобавитьЗначениеВДерево(СтрокаДерева, "ДопДанные.Подписанные.Номер_договора",      Номер_Договора);
ДобавитьЗначениеВДерево(СтрокаДерева, "ДопДанные.Подписанные.Дата_договора",       Дата_Договора);
ДобавитьЗначениеВДерево(СтрокаДерева, "ДопДанные.Подписанные.Подразделение_получатель",    Подразделение_получатель);
ВставитьЗначениеВДерево(СтрокаДерева,  "ДопДанные.Подписанные.ИдентификаторДокументаОснования",  ИдентификаторДокументаОснования)

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

Процедура ДобавитьЗначениеВДерево(ДеревоДанных, ИмяРеквизита, ЗначениеРеквизита)

НовСтрока = ДеревоДанных.Строки.Добавить();
НомерУровня = СтрЧислоВхождений(ИмяРеквизита, ".") + 1;
НовСтрока.ПолныйПуть = ИмяРеквизита;
НовСтрока["Уровень" + НомерУровня] = ОбщегоНазначенияЭД.НазваниеКолонки(ИмяРеквизита);
НовСтрока.Значение = ЗначениеРеквизита;

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

Процедура ВставитьЗначениеВДерево(ДеревоДанных, ИмяРеквизита, ЗначениеРеквизита)

НовСтрока = ДеревоДанных.Строки.Найти(ИмяРеквизита, "ПолныйПуть", Истина);
Если НовСтрока = Неопределено Тогда
НовСтрока = ДеревоДанных.Строки.Добавить();
НомерУровня = СтрЧислоВхождений(ИмяРеквизита, ".") + 1;
НовСтрока.ПолныйПуть = ИмяРеквизита;
НовСтрока["Уровень" + НомерУровня] = ОбщегоНазначенияЭД.НазваниеКолонки(ИмяРеквизита);
КонецЕсли;
НовСтрока.Значение = ЗначениеРеквизита;

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

Процедура ДобавитьДопПоляВСЧФТатнефть(ДеревоДанных, ТекстоваяИнформация, СсылкаНаОбъект) Экспорт;

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

Попытка
//Обязательные доп поля 
Номер_Договора = Лев(СсылкаНаОбъект.ДоговорКонтрагента.Номер, 200);
Дата_Договора = Лев(Формат(СсылкаНаОбъект.ДоговорКонтрагента.Дата, "ДФ=dd.MM.yyyy"), 200);

ИдентификаторСвойстваПодразделениеПолучателя = ygЗначенияНепредопределенныхОбъектов.ПолучитьЗначениеПоИдентификатору("ТатнефтьСвойствоПодразделение");
Подразделение_получатель = YgМодульПривилегированный.ПолучитьЗначениеСвойстваОбъекта(СсылкаНаОбъект.ДокументОснование.Грузополучатель, ИдентификаторСвойстваПодразделениеПолучателя);

ДокументОснование =  СсылкаНаОбъект.ДокументыОснования[0].ДокументОснование;
ИдентификаторДокументаОснованияСчф = Строка(ДокументОснование.УникальныйИдентификатор());

Исключение
Сообщить("Обратись в ОИТ");
Сообщить(ОписаниеОшибки());
ВызватьИсключение "Fatal error";
КонецПопытки;

Если НЕ ЗначениеЗаполнено(Номер_Договора) Тогда
ВызватьИсключение "Не заполнен номер договора в документе ";
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Дата_Договора) Тогда
ВызватьИсключение "Не заполнена дата договора в документе ";
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Подразделение_получатель) Тогда
ВызватьИсключение "Не заполнен код структурного подразделения Татнефти";
КонецЕсли;

Если НЕ ЗначениеЗаполнено(ИдентификаторДокументаОснованияСчф) Тогда
ВызватьИсключение "Не существующий документ";
КонецЕсли;

НоваяСтрока = ТекстоваяИнформация.Добавить();
НоваяСтрока.Идентификатор = "Номер_договора";
НоваяСтрока.Значение = Номер_Договора;
ОбщегоНазначенияЭД.ДобавитьЗаписьВТаблицуДерева(ДеревоДанных, НоваяСтрока, "ДопДанныеСчетаФактуры.ТекстоваяИнформация");

НоваяСтрока = ТекстоваяИнформация.Добавить();
НоваяСтрока.Идентификатор = "Дата_договора";
НоваяСтрока.Значение = Дата_Договора;
ОбщегоНазначенияЭД.ДобавитьЗаписьВТаблицуДерева(ДеревоДанных, НоваяСтрока, "ДопДанныеСчетаФактуры.ТекстоваяИнформация");

НоваяСтрока = ТекстоваяИнформация.Добавить();
НоваяСтрока.Идентификатор = "ИдентификаторДокументаОснования";
НоваяСтрока.Значение = ИдентификаторДокументаОснованияСчф;
ОбщегоНазначенияЭД.ДобавитьЗаписьВТаблицуДерева(ДеревоДанных, НоваяСтрока, "ДопДанныеСчетаФактуры.ТекстоваяИнформация");

НоваяСтрока = ТекстоваяИнформация.Добавить();
НоваяСтрока.Идентификатор = "Подразделение_получатель";
НоваяСтрока.Значение = Подразделение_получатель;
ОбщегоНазначенияЭД.ДобавитьЗаписьВТаблицуДерева(ДеревоДанных, НоваяСтрока, "ДопДанныеСчетаФактуры.ТекстоваяИнформация");

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


 

Вызываем соответствующие процедуры в функциях прямо перед формированием xml файла

  • В функции ЭлектронныеДокументыВнутренний.СформироватьПередачаТоваровПродавец

     

    //............................................
    //Мы заполняем доп поля
    mokЭДОТатнефть.ДобавитьДопПоляВТОРГ12Татнефть(СтрокаДопДанных, СсылкаНаОбъект);
    //Здесь формируется файл xml
    Если СформироватьПередачаТоваровПродавецCML(ДеревоДанных) И ПризнакЭД Тогда
    
    .......

     

  • В функции ЭлектронныеДокументыВнутренний.СформироватьИнформациюПродавца

     

     
    //............................................
    .....
    //Перед формированием файла добавляем свои доп поля
    mokЭДОТатнефть.ДобавитьДопПоляВСЧФТатнефть(ДеревоДанных, ТекстоваяИнформация, СсылкаНаОбъект);
    
    //Тут на основе ДеревоДанных формируется xml
    РезультатФормирования = СформироватьИнформациюПродавцаXML(ДеревоДанных);
    .......
    

    UPD 17.04.2024

  • В УПП, начиная с версии 1.3.117.1 внесены изменения в модуль ЭлектронныеДокументыВнутренний
    Теперь для заполнения доп полей в Счет-фактуре нужно внести изменения в процедуры
    СформироватьИнформациюПродавца_5_01 и СформироватьИнформациюПродавца_2024

42 Comments

  1. khabibullin.tu

    Как раз нужно сделать обмен с Татнефтью, спасибо тебе !

    Reply
  2. ojleg

    (2) да не за что) сам просидел почти две недели, пока пытался с Диадоком это провернуть и привел в соответствие справочники. С такскомом оказалось все проще. Проверь данные в своих справочниках — по пункту 2, а лучше в Татнефть запроси. Очень неприятно, когда возвращают документы из-за запятых, а чтобы исправить ЭД нужно кучу телодвижений совершить.

    Reply
  3. khabibullin.tu

    (3) Учту обязательно !) Вы случайно не в Альметьевске находитесь ?

    Reply
  4. ojleg

    (4) Нет, в Новотроицке.

    Reply
  5. twiny

    во-во, в тему) благодарю, тоже собрался писать уже, правда для БП3

    как бы вам СМ подкинуть за работу вашу

    Reply
  6. ojleg

    (6)Damir, рад был помочь.

    Публикация сделана в формате бесплатной статьи специально. Задача простая, код не универсальный.

    Reply
  7. serq82

    а что в модулях ygЗначенияНепредопределенныхОбъектов и YgМодульПривилегированный?

    Reply
  8. ojleg

    (8)

    ygЗначенияНепредопределенныхОбъектов

    Вы, наверняка, сталкивались с тем, что нужно обратиться в коде к не предопределенным элементам.

    НайтиПоКоду(«000000001») и т. д. А это вызывает проблемы при изменениях, особенно когда используется в нескольких местах.

    Мы сделали регистр сведений с измерением типа Строка и Ресурсом — Любая Ссылка.

    И обращаемся к этому регистру когда нужно получить не предопределенное значение.

    В этом модуле только одна функция, которая работает с этим регистром.

    (8)

    YgМодульПривилегированный

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

    Reply
  9. twiny

    (9)

    Мы сделали регистр сведений с измерением типа Строка и Ресурсом — Любая Ссылка.

    И обращаемся к этому регистру когда нужно получить не предопределенное значение.

    В этом модуле только одна функция, которая работает с этим регистром.

    Есть более «стабильный» способ. Где-то здесь подсмотрел. Это когда вместо РС создается справочник с одним реквизитом «Значение» — любого типа. А в предопределенных элементах этого справочника уже создаете нужный элемент и ссылаетесь на него. Получается что-то вроде Справочник.ПредопределенныеНастройки.ОсновнойПокупатель, а значение у него уже устанавливаете (инициализируете) какое нужно.

    Reply
  10. ojleg

    (10) В коде выглядит красивее, но добавление предопределенного элемента — это нединамическое обновление вроде, да?

    Мы выбирали сознательно РС. Доступ на редактирование и просмотр есть только у полных прав, на чтение у всех. Так что пользователи удалить/изменить не смогут.

    Reply
  11. serq82

    вообщем доработал. а как проверить xml? или пока приглашение не кинешь не получится?

    Reply
  12. ojleg

    (12)

    вообщем доработал. а как проверить xml? или пока приглашение не кинешь не получится?

    К сожалению, не знаю. Настраивал уже после принятия приглашения.

    Reply
  13. serq82

    добрый день.не пойму такую ситуацию.есть головная организация. есть подразделения НГДУ. если я делаю реализацию товаров и услуг от НГДУ.то мне надо отправлять приглашение на каждое НГДУ? или делать от головной, но тогда акты сверки как в бухгалтерии вести?

    Reply
  14. ojleg

    (14)

    добрый день.не пойму такую ситуацию.есть головная организация. есть подразделения НГДУ. если я делаю реализацию товаров и услуг от НГДУ.то мне надо отправлять приглашение на каждое НГДУ? или делать от головной, но тогда акты сверки как в бухгалтерии вести?

    Если документы будет выставлять каждое НГДУ, то, скорей всего, нужно от каждого будет приглашаться.

    Вы можете уточнить эти моменты или у своего партнера по ИТС, или в техподдержке Такскома.

    Reply
  15. serq82

    (15)как я понял нет.даже если ты в 1с контрагента ставишь НГДУ, то формировать хмл надо головную организацию с указанием кода подразделения

    Reply
  16. ojleg

    (16) НГДУ — это ваши подразделения или Татнефти?

    Мы выставляем документы только на контрагента Татнефть, но в грузополучателе указываем подразделения. Соглашение у нас только одно с Татнефтью.

    Reply
  17. serq82

    (17)да НГДУ это подразделение. у нас услуги.поэтому грузополучателя не укажешь

    Reply
  18. twiny

    Дополнение

    В статье не указано, как добавить поля для акта об оказанных услугах.

    Можно использовать ту же процедуру ДобавитьДопПоляВТОРГ12Татнефть, но вызов ее нужно добавить добавить примерно так:

    ДобавитьДопПоляВТОРГ12Татнефть(СтрокаДопДанных, СсылкаНаОбъект);

    Если СформироватьПередачаРаботИсполнительCML(ДеревоДанных) И ПризнакЭД Тогда

    Reply
  19. twiny

    (18) приглашение высылается на контрагента с конкретным ИНН и КПП. У разных подразделений, как правило разные КПП. Если у ТН есть свои подразделения, которые «прячутся» под одним КПП, то они как раз маршрутизацию добавили через дополнительные поля, про которые, как раз данная статья.

    У себя в базе вы можете внести хоть сколько контрагентов с одинаковым инн+кпп, но обмен вы сможете вести только по одному из них.

    Reply
  20. twiny

    Может кому интересно, оформили подобный функционал расширением. Теперь доступно в БП3 стандартных конфигурациях. Подробности в личке

    Reply
  21. user1067408

    (21) Можно в личку данные по расширению для БП? А то второй день голову ломаю как это реализовать. Заранее спасибо.

    Reply
  22. serq82

    (21)а для клиент эдо подойдет?

    Reply
  23. chel-new

    (21) присоединяюсь к (22) , можно пример расширения в личку? а то снимать с поддержки бухню из-за Татнефти не хочется. Буду очень признательна.

    Reply
  24. user975499

    (21) присоединяюсь к (22 и 24) , можно пример расширения в личку? Заранее благодарю

    Reply
  25. twiny

    (25)

    Может кому интересно, оформили подобный функционал расширением. Теперь доступно в БП3 стандартных конфигурациях. Подробности в личке
    Reply
  26. mpvfaq

    Присоединяюсь к (22, 24 и 25), можно и мне пример в личку? Премного благодарен.

    Reply
  27. mpvfaq

    (26) Присоединяюсь к (22, 24 и 25), можно и мне пример в личку? Премного благодарен.

    Reply
  28. Stein1C

    (21) Присоединяюсь, можно и мне пример расширения? Заранее благодарю!

    Reply
  29. interservis-sc

    (26) меня интересует внешняя обработка для БУХ 3.0 как вам написать, почему то в личку не пишет!

    Reply
  30. twiny

    (30)ответил

    Reply
  31. user1110785

    Нашей организации нужно настроить доп поля. Своего программиста нет. Кто поможет?

    Reply
  32. user1068614

    (32)

    Функционал по созданию доп полей реализован в БЭД 1.5.1.

    Ожидайте обновление вашего прикладного решения

    Reply
  33. user1179625

    (21) Добрый день! А можно и нам в личку расширение? Также пытаемся наладить ЭДО с Татнефтью — не могут пустить документ по своему маршруту, т.к. произвольные документы не имеют номера договора, т.е. в файле xml значение договора контрагента указывается ПоУмолчанию»

    Reply
  34. MGreg

    Тут некоторые дилетанты пытаются продать три функции на языке 1с для БП 3.0 по ЭДО с Татнефть за 15 000 руб.. Позор. Кому надо пришлю бесплатно, но только бухгалтерам.

    Reply
  35. Азамат

    (35) Доброго дня.

    Полностью согласен.

    Прошу прислать мне -начинающему этот весёлый квест.

    Reply
  36. MGreg

    (36)Увы нет, я написал, только бухгалтеру, по звонку.

    Reply
  37. cherva

    Мы имеем УПП 120 релиз , но платформа 8.2.19.106 и пока в силу технологических причин мы не можем перейти на 8.2.19.130. Поэтому у нас нет выхода из УПП в Интернет. В качестве временной меры было решено выгружать из УПП XML а затем подписывать и отсылать в Татнефть уже в Такскоме. Однако найти модуль где можно просто выгрузить документы и как то с ним работать мы не смогли. Не могли бы вы нам помочь? Может быть у вас есть обработка для выгрузки в XML документов для Татнефти?

    Reply
  38. YUGPK

    (38) Сами файлы именно как файл формируются в процедуре СформироватьПрисоединенныеФайлы общего модуля ЭлектронныеДокументыСлужебный. А заполнение в СформироватьХМЛФайлыДокументов этого же модуля

    Reply
  39. isstas

    У меня есть вопрос по последнему абзацу статьи:

    «В УПП, начиная с версии 1.3.117.1 внесены изменения в модуль ЭлектронныеДокументыВнутренний

    Теперь для заполнения доп полей в Счет-фактуре нужно внести изменения в процедуры

    СформироватьИнформациюПродавца_5_01 и СформироватьИнформациюПродавца_2019″

    У нас версия 1.3.120.1 я нашел эти процедуры, но мне непонятно где и как в них вставить доп. поля по номеру договора, дате договора, коду подразделения. Прошу привести пример, так как не получится просто перенести код из выгрузки в ЭД Торг12.

    Спасибо!

    Reply
  40. YUGPK

    (40) @isstas, до версии 1.117 нужно было вставлять код

    //Перед формированием файла добавляем свои доп поля
    mokЭДОТатнефть.ДобавитьДопПоляВСЧФТатнефть(ДеревоДанных, ТекстоваяИнформация, СсылкаНаОбъект);
    
    //Вот эту строчку нужно найти в процедуре и перед ней поставить заполнение доп полей \
    РезультатФормирования = СформироватьИнформациюПродавцаXML(ДеревоДанных);
    

    После эту процедуру разбили на две в обновлении. Нужно в каждой из них найти ту же строчку

    РезультатФормирования = СформироватьИнформациюПродавцаXML(ДеревоДанных);

    и перед ней так же вставить код формирования доп полей

    Reply
  41. isstas

    Спасибо. Я нашел строчку РезультатФормирования =

    У меня есть вопросы:

    я вставляю перед этой строчкой операторы:

    ВставитьЗначениеВДерево(ДеревоДанных,»ДопДанные.Подписанные.Номер_договора», Номер_Договора);
    ВставитьЗначениеВДерево(ДеревоДанных,»ДопДанные.Подписанные.Дата_договора»,Дата_Договора);
    ВставитьЗначениеВДерево(ДеревоДанных,»ДопДанные.Подписанные.Подразделение_получатель», Подразделение_получатель);
    ВставитьЗначениеВДерево(ДеревоДанных,»ДопДанные.Подписанные.ИдентификаторДокументаОснования»,  ИдентификаторДокументаОснования)
    

    перед этим определяю переменные Номер_Договора и т.д.

    через СсылкаНаОбъект.

    вопрос: СсылкаНаОбъект — это ссылка на счет-фактуру или на реализацию?

    и еще, правильно ли я определяю параметр «ДопДанные.подписанные.Номер_договора», ведь это параметры реализации, а не счет-фактуры, может быть нужно в начале процедуры добавлять другие

    параметры типа

    СтруктураЭД.Вставить(«…»)?
    Reply
  42. nico2

    Выложил решение для Бухгалтерии 3.0 https://infostart.ru/public/1085934/

    Reply

Leave a Comment

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