8.х Помогите с проверкой

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем pashsho, 21 дек 2010.

  1. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    есть xml
    Код:
    <DOCUMENTS>
    <DOC IDWBILL="2456912" CREATED="13-12-2010 08:08:24">
    <HEAD WAYBILL_NUM="20673" WAYBILL_DATE="13-12-2010" POST="98004" SKLAD="04071" SKLAD_POST="98004" SHIFTMAN=" Шабалин С.А." OTPUSK="Афанасьева Л.И." KTO="Шкирдова В А" DOVEREN="" TRANSPORT="В926НМ63" BUHG="Кошелева И.И" TTN="" WITHLABELS="1">
    <DOGOVOR>
    <NCTRT>84352</NCTRT>
    <DCTRT>06-11-2009</DCTRT>
    <SPFC_MONTH></SPFC_MONTH>
    </DOGOVOR>
    </HEAD>
    <BODY>
    <STROKA NDET="21010540120000" NAME="ЖEЛOБOK CTO4H  HЫЙ KPЫШИ ПPAB" EI="13" QUANTITY="1440.00" PRICE="24.75" IDSPFC="13644350">
    <LABEL NOM="6015592272" IDBOX_OWNERS="6015592272" IDTARA="81456518" EI="13" QUANTITY="720" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015592273" IDBOX_OWNERS="6015592273" IDTARA="81456518" EI="13" QUANTITY="720" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="21010540120100" NAME="ЖEЛOБOK ЛEB    2101-5401200" EI="13" QUANTITY="1440.00" PRICE="24.75" IDSPFC="13644365">
    <LABEL NOM="6015592315" IDBOX_OWNERS="6015592315" IDTARA="81456518" EI="13" QUANTITY="720" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015592322" IDBOX_OWNERS="6015592322" IDTARA="81456518" EI="13" QUANTITY="720" BRUTTO="" NETTO=""/>
    </STROKA>
    </BODY>
    </DOC>
    <DOC IDWBILL="2457698" CREATED="13-12-2010 13:11:34">
    <HEAD WAYBILL_NUM="30677" WAYBILL_DATE="13-12-2010" POST="98004" SKLAD="04071" SKLAD_POST="98004" SHIFTMAN="Сухов О.Е." OTPUSK="Шляпкина Н.В." KTO="Анохина" DOVEREN="" TRANSPORT="Е414РН63" BUHG="Кошелева И.И." TTN="" WITHLABELS="1">
    <DOGOVOR>
    <NCTRT>84352</NCTRT>
    <DCTRT>06-11-2009</DCTRT>
    <SPFC_MONTH>12</SPFC_MONTH>
    </DOGOVOR>
    </HEAD>
    <BODY>
    <STROKA NDET="21010620301400" NAME="PAMKA OKHA     ПPAB ДB CБ" EI="13" QUANTITY="1440.00" PRICE="56.52" IDSPFC="13644364">
    <LABEL NOM="6015574301" IDBOX_OWNERS="6015574301" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015583334" IDBOX_OWNERS="6015583334" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015607632" IDBOX_OWNERS="6015607632" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015607633" IDBOX_OWNERS="6015607633" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015607634" IDBOX_OWNERS="6015607634" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015617941" IDBOX_OWNERS="6015617941" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015617942" IDBOX_OWNERS="6015617942" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015617943" IDBOX_OWNERS="6015617943" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="21010620301500" NAME="PAMKA OKHA ДB  CБ2101-6203014" EI="13" QUANTITY="360.00" PRICE="56.52" IDSPFC="13644445">
    <LABEL NOM="6015595798" IDBOX_OWNERS="6015595798" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015595823" IDBOX_OWNERS="6015595823" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="21020620301400" NAME="PAMKA OKHA     ЗAДHEЙ ДBEPИ CБ" EI="13" QUANTITY="180.00" PRICE="71.35" IDSPFC="13644357">
    <LABEL NOM="6015618413" IDBOX_OWNERS="6015618413" IDTARA="81456526" EI="13" QUANTITY="90" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015618414" IDBOX_OWNERS="6015618414" IDTARA="81456526" EI="13" QUANTITY="90" BRUTTO="" NETTO=""/>
    </STROKA>
    <STROKA NDET="21050610301400" NAME="PAMKA OKHA CБ" EI="13" QUANTITY="360.00" PRICE="60.97" IDSPFC="13644355">
    <LABEL NOM="6015617766" IDBOX_OWNERS="6015617766" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    <LABEL NOM="6015617767" IDBOX_OWNERS="6015617767" IDTARA="81456526" EI="13" QUANTITY="180" BRUTTO="" NETTO=""/>
    </STROKA>
    </BODY>
    </DOC>
    </DOCUMENTS>
    
    есть процедура

    Код:
    Процедура Загрузить(Файл)
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(Файл); //ПутьКФайлу - Путь к загружаемому XML-документу указан в переменной
    //Используется модель последовательного доступа.
    Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.
    
    // Проверить, какая часть элемента текущая.
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    ИмяУзла = Чтение.Имя;
    Если //ИмяУзла = "DOC" Тогда
    
    ИмяУзла = "STROKA" Тогда
    Если Документ.Товары.Количество() > 0 Тогда
    Документ.Товары.Очистить();
    КонецЕсли;
    Строка = Документ.Товары.Добавить();
    
    КонецЕсли;
    Сообщить("--" + ИмяУзла);
    
    // Атрибуты элементов можно читать, только если текущая часть – начало элемента.
    Пока Чтение.ПрочитатьАтрибут() Цикл
    
    // Прочитать данные узла атрибута.
    ТипУзла = Чтение.ТипУзла;
    Имя = Чтение.Имя;
    Значение = Чтение.Значение;
    
    Если Имя = "WAYBILL_NUM" Тогда
    
    Номер = Значение;
    
    
    
    ИначеЕсли Имя = "CREATED" Тогда
    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("Номер",);
    Если ИщемДок = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда
    Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    
    Иначе
    Документ = ИщемДок.ПолучитьОбъект();
    
    Сообщить("Документ ---" + Документ + " --- уже существует")
    КонецЕсли;
    Документ.Дата = Дата(СтрЗаменить(Значение,"-","."));
    Документ.ОтражатьВНалоговомУчете = ЭлементыФормы.ОтражатьВналоговомУчете.АктивизироватьПоУмолчанию;
    ИначеЕсли Имя = "WAYBILL_DATE" Тогда
    //Документ.
    
    ИначеЕсли Имя = "POST" Тогда
    //Документ.
    ИначеЕсли Имя = "SKLAD" Тогда
    //Документ.
    ИначеЕсли Имя = "SKLAD_POST" Тогда
    //Документ.
    ИначеЕсли Имя = "SHIFTMAN" Тогда
    //Документ.
    ИначеЕсли Имя = "OTPUSK" Тогда
    //Документ.
    ИначеЕсли Имя = "KTO" Тогда
    //Документ.
    ИначеЕсли Имя = "DOVEREN" Тогда
    //Документ.
    ИначеЕсли Имя = "TRANSPORT" Тогда
    //Документ.
    ИначеЕсли Имя = "BUHG" Тогда
    //Документ.
    ИначеЕсли Имя = "TTN" Тогда
    //Документ.
    ИначеЕсли Имя = "WITHLABELS" Тогда
    //Документ.
    
    ИначеЕсли Имя = "LABEL" Тогда
    //Документ.
    ИначеЕсли Имя = "QUANTITY" Тогда
    Строка.Количество = Значение;
    ИначеЕсли Имя = "PRICE" Тогда
    Строка.Цена = Значение;
    
    ИначеЕсли Имя = "NAME" Тогда
    
    Наименование = Значение;
    
    ИначеЕсли Имя = "NDET" Тогда
    
    Строка.Номенклатура = ВыгрузитьТовар(Значение,Наименование);
    
    
    ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.ЗаполнитьНомерГТДИСтрануПроисхождения(Строка, Ложь, Документ.Организация, Документ.Дата);
    Документ.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(Строка, "Товары", Истина, Документ.ОтражатьВНалоговомУчете);
    // Рассчитываем реквизиты табличной части.
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, Документ);
    СчетБУ = Строка.СчетДоходовБУ;
    СчетНУ = Строка.СчетДоходовНУ;
    
    
    КонецЕсли;
    
    //Документ.Дата = СтрЗаменить(Значение,"-",".");
    Сообщить(Значение);
    // Обработать полученные значения.
    // ...
    
    КонецЦикла;
    
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
    
    // В примере просто выводим текст в окно сообщений.
    Сообщить("Текст:" + Чтение.Значение);
    
    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
    
    // В примере просто выводим признак конца элемента в окно сообщений.
    Сообщить("--Конец:" + Чтение.Имя);
    Если Чтение.Имя = "DOC" Тогда
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, Документ);
    ИщемДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("Номер",Номер);
    Документ.Номер = Номер;
    Документ.Записать();
    
    
    
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    
    
    КонецПроцедуры
    
    Все загружается вроде бы как надо, только необходимо чтобы работал поиск покоду уже существующего документа, попытка в тексте процедуры есть, а он неработает. Подскажите пожалуйста что иправить? Огромное спасибо
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Код:
    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("Номер",);
    
    Кавычки уберите в переменной Номер, а то у вас ищется документ с номером Номер.
  3. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    увы но таже ошибка при повторной загрузке {Форма.Форма(150)}: Ошибка при вызове метода контекста (Записать): Не уникальный номер документа
    Документ.Записать();
    по причине:
    Не уникальный номер документа
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Так все правильно, вы же создаете документ с уже существующим номером.
    Код:
    Документ.Номер = Номер;
    Документ.Записать();
    
  5. Vintorez
    Offline

    Vintorez Опытный в 1С

    Регистрация:
    13 ноя 2010
    Сообщения:
    71
    Симпатии:
    0
    Баллы:
    26
    Наверно мой ответ покажется странным, а что у тебя в отладчике видно, какие номера смотрятся и т.д. и т.п.

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

    правильнее все же вот так

    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер,);
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Тут проверку нужно делать, если документ с таким номером существует, то создавать новый, иначе просто перезаписывать, без присвоения номера.
    Новый номер устанавливается:

    ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
    УстановитьНовыйНомер (SetNewNumber)
    Синтаксис:
    УстановитьНовыйНомер(<Префикс номера>)
    Параметры:
    <Префикс номера> (необязательный)
    Тип: Строка. Префикс устанавливаемого номера.
    Значение по умолчанию: Пустая строка
    Описание:
    Устанавливает новый номер документа для заданного префикса номера.
    Примечание:
    Для документов с нумерацией в пределах периода, номер устанавливается в пределах периода, соответствующего установленной дате документа. Если дата - пустая, процедура установит номер в пределах периода соответствующего пустой дате.
    Пример:
    РасходнаяНакладная.УстановитьНовыйНомер(ПрефиксИБ);
  7. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    новый документ нужно создавать только в случае если он несуществует, если нет то пропускать ветку doc и начинать следущий,
  8. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    А в чем тогда проблема? Проверяйте выполнение условия в отладчике.
  9. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Вроде как заработало условие, но пишет неуказана дата, непойму почему

    Процедура Загрузить(Файл)
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(Файл); //ПутьКФайлу - Путь к загружаемому XML-документу указан в переменной
    //Используется модель последовательного доступа.
    Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.

    // Проверить, какая часть элемента текущая.
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
    ИмяУзла = Чтение.Имя;
    Если //ИмяУзла = "DOC" Тогда

    ИмяУзла = "STROKA" Тогда
    Если Документ.Товары.Количество() > 0 Тогда
    Документ.Товары.Очистить();
    КонецЕсли;
    Строка = Документ.Товары.Добавить();

    КонецЕсли;
    Сообщить("--" + ИмяУзла);

    // Атрибуты элементов можно читать, только если текущая часть – начало элемента.
    Пока Чтение.ПрочитатьАтрибут() Цикл

    // Прочитать данные узла атрибута.
    ТипУзла = Чтение.ТипУзла;
    Имя = Чтение.Имя;
    Значение = Чтение.Значение;

    Если Имя = "WAYBILL_NUM" Тогда

    Номер = Значение;



    ИначеЕсли Имя = "WAYBILL_DATE" Тогда
    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер,);
    Если ИщемДок = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда
    Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

    Иначе
    Документ = ИщемДок.ПолучитьОбъект();

    Сообщить("Документ ---" + Документ + " --- уже существует")
    КонецЕсли;
    Дата = СтрЗаменить(Значение, "-", ".");
    Документ.Дата = Дата;
    Документ.ОтражатьВНалоговомУчете = ЭлементыФормы.ОтражатьВналоговомУчете.АктивизироватьПоУмолчанию;
    ИначеЕсли Имя = "WAYBILL_DATE" Тогда
    //Документ.

    ИначеЕсли Имя = "POST" Тогда
    //Документ.
    ИначеЕсли Имя = "SKLAD" Тогда
    //Документ.
    ИначеЕсли Имя = "SKLAD_POST" Тогда
    //Документ.
    ИначеЕсли Имя = "SHIFTMAN" Тогда
    //Документ.
    ИначеЕсли Имя = "OTPUSK" Тогда
    //Документ.
    ИначеЕсли Имя = "KTO" Тогда
    //Документ.
    ИначеЕсли Имя = "DOVEREN" Тогда
    //Документ.
    ИначеЕсли Имя = "TRANSPORT" Тогда
    //Документ.
    ИначеЕсли Имя = "BUHG" Тогда
    //Документ.
    ИначеЕсли Имя = "TTN" Тогда
    //Документ.
    ИначеЕсли Имя = "WITHLABELS" Тогда
    //Документ.

    ИначеЕсли Имя = "LABEL" Тогда
    //Документ.
    ИначеЕсли Имя = "QUANTITY" Тогда
    Строка.Количество = Значение;
    ИначеЕсли Имя = "PRICE" Тогда
    Строка.Цена = Значение;

    ИначеЕсли Имя = "NAME" Тогда

    Наименование = Значение;

    ИначеЕсли Имя = "NDET" Тогда

    Строка.Номенклатура = ВыгрузитьТовар(Значение,Наименование);


    ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.ЗаполнитьНомерГТДИСтрануПроисхождения(Строка, Ложь, Документ.Организация, Документ.Дата);
    Документ.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(Строка, "Товары", Истина, Документ.ОтражатьВНалоговомУчете);
    // Рассчитываем реквизиты табличной части.
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, Документ);
    СчетБУ = Строка.СчетДоходовБУ;
    СчетНУ = Строка.СчетДоходовНУ;


    КонецЕсли;

    //Документ.Дата = СтрЗаменить(Значение,"-",".");
    Сообщить(Значение);
    // Обработать полученные значения.
    // ...

    КонецЦикла;

    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда

    // В примере просто выводим текст в окно сообщений.
    Сообщить("Текст:" + Чтение.Значение);

    ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

    // В примере просто выводим признак конца элемента в окно сообщений.
    Сообщить("--Конец:" + Чтение.Имя);
    Если Чтение.Имя = "DOC" Тогда
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка, Документ);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(Строка, Документ);
    Документ.Номер = Номер;
    Документ.Записать();


    КонецЕсли;
    КонецЕсли;
    КонецЦикла;



    КонецПроцедуры
  10. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    При создании документа, попробуйте присваивать и дату.
    А зачем вы пустой параметр указываете в
    Код:
    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер,);
    
    ?
  11. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Код:
    Дата = СтрЗаменить(Значение, "-", ".");
    Документ.Дата = Дата;
    
    Тут тип должен быть дата, а не строка.
  12. TopicStarter Overlay
    pashsho
    Offline

    pashsho

    Регистрация:
    21 дек 2010
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    вобщем работает, всем спасибо

    Если Имя = "WAYBILL_NUM" Тогда

    Номер = Значение;



    ИначеЕсли Имя = "WAYBILL_DATE" Тогда
    ИщемДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер,(СтрЗаменить(Значение, "-", "."))+" 0:00:00");
    Если ИщемДок = Документы.РеализацияТоваровУслуг.ПустаяСсылка() Тогда
    Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    Дата = СтрЗаменить(Значение, "-", ".");
    Документ.Дата = Дата+" 0:00:00";
    Документ.Организация=Справочники.Организации.НайтиПоКоду("000000001");

    Иначе
    Документ = ИщемДок.ПолучитьОбъект();

    Сообщить("Документ ---" + Документ + " --- уже существует");

    КонецЕсли;
  13. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Кнопочка есть:))))

Поделиться этой страницей