Однажды в наш отдел прилетела задача: наладить ЭДО с ПАО "Татнефть" с минимумом вложений по соглашению ЭДО, предусматривающему обязательное заполнение доп полей в счетах-фактурах и товарных накладных (номер договора, код подразделения получателя, ГУИД документа и т.д.).
Задача достаточно простая, но есть несколько нюансов, на которые стоит обратить внимание, чтобы не терять понапрасну время.
Далее написано для УПП 1.3.106.1 и платформы 8.2.19.130
Решение:
- Подключить 1С-Такском — система ЭДО, встроенная в большинство типовых конфигураций 1С 8, обратившись к обслуживающему партнеру. Буквально в течение часа специалист франчайзи подключил услугу, настроил ключи ЭЦП, форматы отправки, послал приглашения контрагенту. Бесплатно 100 документов в месяц при подписке ИТС Проф. Подробности на оф сайте https://portal.1c.ru/applications/8.
- Обязательно проверьте правильность заполнения данных в справочнике "Контрагенты", "Договоры контрагентов"
- Обновите КЛАДР, справочник банков (Устаревшее название банка в торг — отказ)
- Контактная информация должна быть заполнена и заполнена по классификатору адресов (российский адрес был заполнен как зарубежный — неизвестный код страны — отказ)
- У контрагента должен быть заведен банковский счет и он должен быть помечен как "Основной" (банковские реквизиты не попадали в торг-12 без пометки счета "Основным" — отказ)
- Суть обмена — создается файл xml, подписывается и средствами оператора ЭДО передается контрагенту, который его подписывает и тем принимает к учету.
В УПП этот файл создается как:- в процедуре СформироватьХМЛФайл общего модуля ЭлектронныеДокументыСлужебный определяется по ключу функция, для каждого вида электронного документа своя. Нас интересуют
- для ТОРГ-12 (формат 551 приказа ФНС) — ЭлектронныеДокументыВнутренний.СформироватьПередачаТоваровПродавец
- для счета-фактуры — ЭлектронныеДокументыВнутренний.СформироватьИнформациюПродавца
- В этих функциях происходит заполнение ДереваЗначений данными документа-источника и вызов одноименной функции с добавлением xml (ЭлектронныеДокументыВнутренний.СформироватьПередачаТоваровПродавецXML и т.д.), которая уже и формирует сам xml файл на основе переданного дерева значений.
- в процедуре СформироватьХМЛФайл общего модуля ЭлектронныеДокументыСлужебный определяется по ключу функция, для каждого вида электронного документа своя. Нас интересуют
- Таким образом нам остается только перед вызовом функции СформироватьПередачаТоваровПродавец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
Как раз нужно сделать обмен с Татнефтью, спасибо тебе !
(2) да не за что) сам просидел почти две недели, пока пытался с Диадоком это провернуть и привел в соответствие справочники. С такскомом оказалось все проще. Проверь данные в своих справочниках — по пункту 2, а лучше в Татнефть запроси. Очень неприятно, когда возвращают документы из-за запятых, а чтобы исправить ЭД нужно кучу телодвижений совершить.
(3) Учту обязательно !) Вы случайно не в Альметьевске находитесь ?
(4) Нет, в Новотроицке.
во-во, в тему) благодарю, тоже собрался писать уже, правда для БП3
как бы вам СМ подкинуть за работу вашу
(6)Damir, рад был помочь.
Публикация сделана в формате бесплатной статьи специально. Задача простая, код не универсальный.
а что в модулях ygЗначенияНепредопределенныхОбъектов и YgМодульПривилегированный?
(8)
Вы, наверняка, сталкивались с тем, что нужно обратиться в коде к не предопределенным элементам.
НайтиПоКоду(«000000001») и т. д. А это вызывает проблемы при изменениях, особенно когда используется в нескольких местах.
Мы сделали регистр сведений с измерением типа Строка и Ресурсом — Любая Ссылка.
И обращаемся к этому регистру когда нужно получить не предопределенное значение.
В этом модуле только одна функция, которая работает с этим регистром.
(8)
Общий модуль с признаком привилегированный. Используется для разных целей.
(9)
И обращаемся к этому регистру когда нужно получить не предопределенное значение.
В этом модуле только одна функция, которая работает с этим регистром.
Есть более «стабильный» способ. Где-то здесь подсмотрел. Это когда вместо РС создается справочник с одним реквизитом «Значение» — любого типа. А в предопределенных элементах этого справочника уже создаете нужный элемент и ссылаетесь на него. Получается что-то вроде Справочник.ПредопределенныеНастройки.ОсновнойПокупатель, а значение у него уже устанавливаете (инициализируете) какое нужно.
(10) В коде выглядит красивее, но добавление предопределенного элемента — это нединамическое обновление вроде, да?
Мы выбирали сознательно РС. Доступ на редактирование и просмотр есть только у полных прав, на чтение у всех. Так что пользователи удалить/изменить не смогут.
вообщем доработал. а как проверить xml? или пока приглашение не кинешь не получится?
(12)
К сожалению, не знаю. Настраивал уже после принятия приглашения.
добрый день.не пойму такую ситуацию.есть головная организация. есть подразделения НГДУ. если я делаю реализацию товаров и услуг от НГДУ.то мне надо отправлять приглашение на каждое НГДУ? или делать от головной, но тогда акты сверки как в бухгалтерии вести?
(14)
Если документы будет выставлять каждое НГДУ, то, скорей всего, нужно от каждого будет приглашаться.
Вы можете уточнить эти моменты или у своего партнера по ИТС, или в техподдержке Такскома.
(15)как я понял нет.даже если ты в 1с контрагента ставишь НГДУ, то формировать хмл надо головную организацию с указанием кода подразделения
(16) НГДУ — это ваши подразделения или Татнефти?
Мы выставляем документы только на контрагента Татнефть, но в грузополучателе указываем подразделения. Соглашение у нас только одно с Татнефтью.
(17)да НГДУ это подразделение. у нас услуги.поэтому грузополучателя не укажешь
Дополнение
В статье не указано, как добавить поля для акта об оказанных услугах.
Можно использовать ту же процедуру ДобавитьДопПоляВТОРГ12Татнефть, но вызов ее нужно добавить добавить примерно так:
ДобавитьДопПоляВТОРГ12Татнефть(СтрокаДопДанных, СсылкаНаОбъект);
Если СформироватьПередачаРаботИсполнительCML(ДеревоДанных) И ПризнакЭД Тогда
(18) приглашение высылается на контрагента с конкретным ИНН и КПП. У разных подразделений, как правило разные КПП. Если у ТН есть свои подразделения, которые «прячутся» под одним КПП, то они как раз маршрутизацию добавили через дополнительные поля, про которые, как раз данная статья.
У себя в базе вы можете внести хоть сколько контрагентов с одинаковым инн+кпп, но обмен вы сможете вести только по одному из них.
Может кому интересно, оформили подобный функционал расширением. Теперь доступно в БП3 стандартных конфигурациях. Подробности в личке
(21) Можно в личку данные по расширению для БП? А то второй день голову ломаю как это реализовать. Заранее спасибо.
(21)а для клиент эдо подойдет?
(21) присоединяюсь к (22) , можно пример расширения в личку? а то снимать с поддержки бухню из-за Татнефти не хочется. Буду очень признательна.
(21) присоединяюсь к (22 и 24) , можно пример расширения в личку? Заранее благодарю
(25)
Присоединяюсь к (22, 24 и 25), можно и мне пример в личку? Премного благодарен.
(26) Присоединяюсь к (22, 24 и 25), можно и мне пример в личку? Премного благодарен.
(21) Присоединяюсь, можно и мне пример расширения? Заранее благодарю!
(26) меня интересует внешняя обработка для БУХ 3.0 как вам написать, почему то в личку не пишет!
(30)ответил
Нашей организации нужно настроить доп поля. Своего программиста нет. Кто поможет?
(32)
Функционал по созданию доп полей реализован в БЭД 1.5.1.
Ожидайте обновление вашего прикладного решения
(21) Добрый день! А можно и нам в личку расширение? Также пытаемся наладить ЭДО с Татнефтью — не могут пустить документ по своему маршруту, т.к. произвольные документы не имеют номера договора, т.е. в файле xml значение договора контрагента указывается ПоУмолчанию»
Тут некоторые дилетанты пытаются продать три функции на языке 1с для БП 3.0 по ЭДО с Татнефть за 15 000 руб.. Позор. Кому надо пришлю бесплатно, но только бухгалтерам.
(35) Доброго дня.
Полностью согласен.
Прошу прислать мне -начинающему этот весёлый квест.
(36)Увы нет, я написал, только бухгалтеру, по звонку.
Мы имеем УПП 120 релиз , но платформа 8.2.19.106 и пока в силу технологических причин мы не можем перейти на 8.2.19.130. Поэтому у нас нет выхода из УПП в Интернет. В качестве временной меры было решено выгружать из УПП XML а затем подписывать и отсылать в Татнефть уже в Такскоме. Однако найти модуль где можно просто выгрузить документы и как то с ним работать мы не смогли. Не могли бы вы нам помочь? Может быть у вас есть обработка для выгрузки в XML документов для Татнефти?
(38) Сами файлы именно как файл формируются в процедуре СформироватьПрисоединенныеФайлы общего модуля ЭлектронныеДокументыСлужебный. А заполнение в СформироватьХМЛФайлыДокументов этого же модуля
У меня есть вопрос по последнему абзацу статьи:
«В УПП, начиная с версии 1.3.117.1 внесены изменения в модуль ЭлектронныеДокументыВнутренний
Теперь для заполнения доп полей в Счет-фактуре нужно внести изменения в процедуры
СформироватьИнформациюПродавца_5_01 и СформироватьИнформациюПродавца_2019″
У нас версия 1.3.120.1 я нашел эти процедуры, но мне непонятно где и как в них вставить доп. поля по номеру договора, дате договора, коду подразделения. Прошу привести пример, так как не получится просто перенести код из выгрузки в ЭД Торг12.
Спасибо!
(40) @isstas, до версии 1.117 нужно было вставлять код
После эту процедуру разбили на две в обновлении. Нужно в каждой из них найти ту же строчку
и перед ней так же вставить код формирования доп полей
Спасибо. Я нашел строчку РезультатФормирования =
У меня есть вопросы:
я вставляю перед этой строчкой операторы:
перед этим определяю переменные Номер_Договора и т.д.
через СсылкаНаОбъект.
вопрос: СсылкаНаОбъект — это ссылка на счет-фактуру или на реализацию?
и еще, правильно ли я определяю параметр «ДопДанные.подписанные.Номер_договора», ведь это параметры реализации, а не счет-фактуры, может быть нужно в начале процедуры добавлять другие
параметры типа
Выложил решение для Бухгалтерии 3.0https://infostart.ru/public/1085934/