Имя: Пароль:
1C
1С v8
обработка групповой загрузки XML файлов в УТ 10.3
0 1c1c
 
26.06.17
16:01
Добрый день! Нужна помощь знающих и просветленных
Есть обработка групповой загрузки XML файлов в УТ 10.3. Работает корректно, загружает и создает документы "Поступление товаров и услуг", вот только есть проблема... Если один документ загружать несколько раз, то программа создаст столько же документов поступления. Как сделать так чтобы не было дублирования документов??

Код обработки:
Процедура КнопкаВыполнитьНажатие(Кнопка)
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Для Каждого ИмяФайла Из МассивФайлов1 Цикл
       // ВыбФайл = Новый Файл(ИмяФайла);
            
       Сообщить(ИмяФайла);
            ///////////////////////////////////////////////////////////////////////////////////////////////////
    фф = 0;
    ыы = 0;
    вв = "20010101";
    аа = 0;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
    ///// Вставить содержимое обработчика.
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяФайла);
    Имя = ЧтениеXML.Имя;
    //Массив = Новый Структура(Имя);                                                    
    Пока ЧтениеXML.Прочитать() Цикл                  
        ПолучитьXMLТип(ЧтениеXML);
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента  Тогда
            Имя = ЧтениеXML.Имя;
            //Сообщить(ЧтениеXML.Имя);
            Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
                Атрибут = ЧтениеXML.Значение;
                Если ЧтениеXML.Имя = "НомерСчФ" Тогда аа = ЧтениеXML.Значение КонецЕсли;
                Если ЧтениеXML.Имя = "ДатаСчФ" Тогда вы = ЧтениеXML.Значение КонецЕсли;
                Если ЧтениеXML.Имя = "СтТовУчНал" Тогда фф = ЧтениеXML.Значение КонецЕсли;
                Если ЧтениеXML.Имя = "СтТовБезНДСВсего" Тогда зы = ЧтениеXML.Значение КонецЕсли;
                //Сообщить("начало:" + ЧтениеXML.Имя + "=" + ЧтениеXML.Значение);
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    ыы = фф - зы;
    вв = Сред(вы, 7,4) + Сред(вы, 4,2) + Сред(вы, 1,2);    
    //Сообщить(вы);
    
    ДокОбъект = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
    ДокОбъект.Дата = Дата(вв);
    ДокОбъект.Контрагент = Справочники.Контрагенты.НайтиПоКоду("УT0000063");
    ДокОбъект.СкладОрдер = Справочники.Склады.НайтиПоКоду("000000004");
    ДокОбъект.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("УT0000893");
    ДокОбъект.ДатаВходящегоДокумента = Дата(вв);
    ДокОбъект.НомерВходящегоДокумента = аа;                                                
    
    ДокОбъект.УчитыватьНДС = Истина;
    ДокОбъект.СуммаВключаетНДС = Истина;
    ДокОбъект.ОтражатьВБухгалтерскомУчете = Истина;
    ДокОбъект.ОтражатьВНалоговомУчете = Истина;
    ДокОбъект.ОтражатьВУправленческомУчете = Истина;
    ДокОбъект.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
    ДокОбъект.БанковскийСчетКонтрагента = Справочники.БанковскиеСчета.НайтиПоКоду("УТ0000780");
    ДокОбъект.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
    ДокОбъект.Организация = Справочники.Организации.НайтиПоКоду("000000001");
    ДокОбъект.КратностьВзаиморасчетов = 1;
    ДокОбъект.КурсВзаиморасчетов = 1;
    
    стрУслуги = ДокОбъект.Услуги.Добавить();
    стрУслуги.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("УT000000531");
    стрУслуги.Содержание = "Валютный контроль";    
    стрУслуги.Количество = 1;
    стрУслуги.Цена = фф;
    стрУслуги.Сумма = фф;
    стрУслуги.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
    стрУслуги.СуммаНДС = ыы;
    стрУслуги.Подразделение = Справочники.Подразделения.НайтиПоКоду("000000002");
    стрУслуги.СтатьяЗатрат = Справочники.СтатьиЗатрат.НайтиПоКоду("000000010");

    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    
    Форма = ДокОбъект.ПолучитьФорму();
    ОбъектСчетаФактуры = Документы.СчетФактураПолученный.ПолучитьФормуНовогоДокумента( , Форма, Строка(ДокОбъект));
    ОбъектСчетаФактуры.ДокументыОснования.Очистить();
    ОбъектСчетаФактуры.ДополнительныеСвойства.Вставить("НеЗаполнятьСчетФактуруНаАванс");
    ОбъектСчетаФактуры.Заполнить(ДокОбъект.Ссылка);
    //Если ОбъектСчетаФактуры.мДокументЗаполнен Тогда
    ОбъектСчетаФактуры.ДатаВходящегоДокумента = Дата(вв);
    ОбъектСчетаФактуры.НомерВходящегоДокумента = аа;
    
    //ОбъектСчетаФактуры.Открыть();
    ОбъектСчетаФактуры.Записать(РежимЗаписиДокумента.Проведение);
    //Форма = СфОбъект.ПолучитьФорму();
    //Форма.Открыть();

    КонецЦикла;
    
КонецПроцедуры


Загружаемые доки отличаются номером счет-фактуры (НомерСчф) - это наша переменная "аа". Т.е нужна проверка есть ли в базе документ Поступление товаров с таким входящим номером. Мне кажется можно сделать с помощью функции "НайтиПокоду", но как это сделать и в какую часть обработки вставить код не знаю.....
1 pessok
 
26.06.17
16:14
можно
2 pessok
 
26.06.17
16:14
только не по коду, а по реквизиту
3 pessok
 
26.06.17
16:15
ну а лучше сделать запросом и проверить, что он пустой. притом сделать это ДО загрузки, чтобы не городить запрос в цикле. т.е. обойти заголовки, посмотреть, каких документов нет в базе, а их уже грузить
4 1c1c
 
26.06.17
16:22
А если не запросом? как будет выглядеть код поиска по реквизиту, а именно по "номеру входящего документа" который считывается из файла XML и записывается в документ Поступления и с таким же номером создается счет-фактура. Как именно сделать сравнение реквизитов??
5 pessok
 
26.06.17
16:24
в СП искать по НайтиПоРеквизиту
6 1c1c
 
26.06.17
17:43
если не затруднит напишите код, именно как сделать поиск и сравнить нет ли в базе такого номера. Я не понимаю в этом, сижу целый день, а толку ноль..
7 pessok
 
26.06.17
19:45
хоспаде

Док = Документы.ПоступлениеТоваровУслуг.НайтиПоРеквизиту("НомерВходящегоДокумента", aa);

Если Не Док.Пустая() Тогда
Продолжить;
КонецЕсли;

как вы дальше работать собираетесь, если не секрет?
8 1c1c
 
27.06.17
08:41
Спасибо, 1с это не мои обязанности, пока другой сотрудник в отпуске надо сделать эту задачу. Я пока только начинаю, первое место работы
Ошибка? Это не ошибка, это системная функция.