INFOSTART EVENT 2018 EDUCATION

Второй тур голосования за доклады.
Окончание 5 сентября.

Кашафутдинов Тимур | Разработчик | ООО еСолюшнс

«Логирование в приложениях»

Что такое логирование Какие потребности в информации о работе приложений возникают у отделов поддержки, тестирования, разработки Какие трудности возникают при сборе информации, в том числе из разрозненных систем Стандартные инструменты платформы 1С:Предприятие, их возможности и ограничения Самописные подсистемы логирования на базе 1С:Предприятия, их возможности и ограничения Общие требования к системе логирования: что должна уметь идеальная система? Краткий обзор возможностей специализированных систем логирования Внедрение и результаты Стоимость, преимущества и недостатки выбранной системы, перспективы Особенности реализации и использования библиотек логирования, на которые стоит обратить внимание Роль механизма расширений в конфигурировании и быстродействии подсистемы логирования

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

Обмен - Обмен с другими системами

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(ДеревоДанных);
    .......
    

     

3

См. также

Комментарии
Сортировка: Древо
2. khabibullin.tu 72 25.04.18 17:15 Сейчас в теме
Как раз нужно сделать обмен с Татнефтью, спасибо тебе !
3. ojleg 3 25.04.18 19:22 Сейчас в теме
(2) да не за что) сам просидел почти две недели, пока пытался с Диадоком это провернуть и привел в соответствие справочники. С такскомом оказалось все проще. Проверь данные в своих справочниках - по пункту 2, а лучше в Татнефть запроси. Очень неприятно, когда возвращают документы из-за запятых, а чтобы исправить ЭД нужно кучу телодвижений совершить.
4. khabibullin.tu 72 25.04.18 23:22 Сейчас в теме
(3) Учту обязательно !) Вы случайно не в Альметьевске находитесь ?
5. ojleg 3 26.04.18 04:59 Сейчас в теме
6. twiny 7 08.05.18 00:40 Сейчас в теме
во-во, в тему) благодарю, тоже собрался писать уже, правда для БП3

как бы вам СМ подкинуть за работу вашу
7. ojleg 3 08.05.18 05:26 Сейчас в теме
(6)Damir, рад был помочь.
Публикация сделана в формате бесплатной статьи специально. Задача простая, код не универсальный.
Оставьте свое сообщение