Версия для печати темы (https://pro1c.org.ua/index.php?s=b56572da314ae0a176b70306ea0377ba&showtopic=66516)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Процедура пошуку номенклатури в БАС Бухгалтерії: проблема в дублювані позицій при загрузці через обробку

Автор: bandrah 26.05.21, 21:10

Створив обробку для завантаження звітів про роздрібні продажі, перший раз все ок, при повтрній вгрузці дублюється номенклатура, додаю процедуру, що роблю не правильно вже не можу поняти, дякую всім наперед, впевнений, що світ не без добрих людей

Код

&НаСервере
Функция НайтиНоменклатуру(Номенкл, СтавкаПДВ, АртикулП)
    
    Если СокрЛП(СтавкаПДВ)="" Тогда
        СтавкаПДВ = 0;
    КонецЕсли;
    Артикул = СокрЛП(АртикулП);
    
    СтавкаНоменкл = Перечисления.СтавкиНДС.НДС20;
    //Если СтавкаПДВ = 7 Тогда
    //    СтавкаНоменкл = Перечисления.СтавкиНДС.НДС7;
    //ИначеЕсли СтавкаПДВ = 20 Тогда
    //    СтавкаНоменкл = Перечисления.СтавкиНДС.НДС20;
    //Иначе
    //    СтавкаНоменкл = Перечисления.СтавкиНДС.НДС0;
    //КонецЕсли;
    
    Если Артикул <> "" Тогда
        НайдАрт = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",АртикулП);
        Если СокрЛП(НайдАрт)<> "" Тогда
            Артикул = НайдАрт.Ссылка;
            
        Иначе
            НовДов = Справочники.Номенклатура.СоздатьЭлемент();
            НовДов.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("2009"); // шт
            
            НовДов.Наименование = Номенкл;
            НовДов.НаименованиеПолное = Номенкл;
            Если Артикул<>""  Тогда
                НовДов.Артикул = Артикул;
            КонецЕсли;    
            
            НовДов.СтавкаНДС = СтавкаНоменкл;
            
            Запись = НовДов.ЕдиницыИзмерения.Добавить();
            Запись.Коэффициент         = 1;
            Запись.ЕдиницаИзмерения = НовДов.БазоваяЕдиницаИзмерения;
            
            НовДов.Записать();
            
            Возврат НовДов.Ссылка;
        КонецЕсли;
    КонецЕсли;
    
    Запит = Новый Запрос;
    Запит.Текст = "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Номенкл,
    |    Номенклатура.Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.ПометкаУдаления = ЛОЖЬ
    |    И Номенклатура.Наименование = &Назва
    |    И Номенклатура.Артикул = &Артикул
    |    И Номенклатура.СтавкаНДС = &СтавкаПДВ";
    
    Запит.УстановитьПараметр("Назва", Номенкл);
    Запит.УстановитьПараметр("СтавкаПДВ", СтавкаНоменкл);
    Запит.УстановитьПараметр("Артикул", АртикулП);
    Виб = Запит.Выполнить().Выбрать();
    Если Виб.Следующий() Тогда
        Если Артикул<>"" И СокрЛП(Виб.Номенкл.Артикул)="" Тогда
            Об = Виб.Номенкл.ПолучитьОбъект();
            Об.Артикул = Артикул;
            Об.Записать();
        КонецЕсли;    
        
        Если СтавкаНоменкл <> Виб.Номенкл.СтавкаНДС Тогда
            Об = Виб.Номенкл.ПолучитьОбъект();
            Об.СтавкаНДС = СтавкаНоменкл;
            Об.Записать();
        КонецЕсли;
        
        Возврат Виб.Номенкл;
    КонецЕсли;
    
КонецФункции

Автор: logist 26.05.21, 21:35

У вас нет понимания что такое типы данных, это касается всего кода.
И в следствии этого, скорее всего не срабатывает это условие:

Цитата(bandrah @ 26.05.21, 22:10) *
Если СокрЛП(НайдАрт)<> "" Тогда


Автор: bandrah 26.05.21, 22:19

logist @ Сегодня, 21:35 * ,
дякую за наводку (типы данных), артикул був числом, а має бути строка, виправив - все запрацювало коректно

Автор: logist 26.05.21, 22:27

Цитата(bandrah @ 26.05.21, 23:19) *
ртикул був числом, а має бути строка, виправив - все запрацювало коректно

Насправді проблема створення може бути й тут "НайдАрт", бо це не строка а СправочникСсылка, і тут треба використовувати НайдАрт.Пустая() або ЗначениеЗаполнено(НайдАрт)

Автор: bandrah 26.05.21, 22:57

logist @ Сегодня, 22:27 * ,
дякую за підказку

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua