Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цикл и ПомеченУдаление()
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Redneck
Добрый день!

Нужна небольшая помощь с кодом...
Сразу оговорюсь, в 1с-ке пока не силен.

В общем, сейчас дописываю стандартную обработку "обмен данными с Клиентбанком" для импорта банковских выписок из формата .csv в 1С-Бух(укр).
Основной функционал уже работает, но столкнулся с проблемой.

Из файла с банковской выпиской подтягивается ЕГРПОУ и сравнивается с ЕГРПОУ в Справочнике "Контрагенты", а уже оттуда в документ "Банковская выписка" подтягивается полное название контрагента.

В самом справочнике у бухов имеется несколько на элементов помеченных на удаление с прошлых лет.
И вот при совпадении ЕГРПОУ обработка выбирает "помеченный на удаление" элемент вместо нормального.

К сожалению, никак не разберусь сам, как правильно реализовать...
Пробовал разные варианты с циклами, условиями и прочее, но безуспешно. Спр.ПометкаУдаления() никак не срабатывает так, как мне надо.

Был бы очень благодарен, если кто-то подскажет, что мне поправить в коде:

            Если (Нашли = 1) и (Спр.ПометкаУдаления()=0) Тогда // нашли
                тВыписка.сКонтрагент = Спр.ТекущийЭлемент();
                тВыписка.Контрагент = СокрЛП(Спр.ТекущийЭлемент());      
            ИначеЕсли    (Спр.ПометкаУдаления()=1)  Тогда  
                Спр.ВыбратьЭлементы();
                        Пока Спр.ПолучитьЭлемент() = 1 Цикл        
                            Сообщить(Спр.ТекущийЭлемент());    
                            Сообщить(Спр.ПолучитьАтрибут(ТипРеквизитаОКПО));
                                Сообщить(ОКПО);
                            Если (Спр.ПолучитьАтрибут(ТипРеквизитаОКПО) = ОКПО) и (Спр.ПометкаУдаления()=0) Тогда
                                Сообщить(Спр.ПолучитьАтрибут(ТипРеквизитаОКПО));
                                Сообщить(ОКПО);    
                                тВыписка.сКонтрагент = Спр.ТекущийЭлемент();
                                    тВыписка.Контрагент = СокрЛП(Спр.ТекущийЭлемент());    
                                    Прервать;
                            Иначе  
            //    Сообщить(Спр.ТекущийЭлемент());    
                                Продолжить;                    
                            КонецЕсли;  
                        КонецЦикла;
                
            Иначе // не нашли (заполняем еще и тКонтрагенты)
                тВыписка.Контрагент = КонтрагентНаименование;
                тВыписка.Предупреждение = 3;
                ТКонтрагенты.НоваяСтрока();    
                ТКонтрагенты.НСтроки = ТКонтрагенты.НомерСтроки; // номер строки для связи с тВыписка
                ТВыписка.ссылкаНатКонтрагентов = ТКонтрагенты.НСтроки;
                ТКонтрагенты.фВкл = 2;
                // ОКПО - как получили из файла от клиент-банка
                ТКонтрагенты.ОКПО = СокрЛП(Сп.Получить("ОКПО"));
                ТКонтрагенты.Контрагент = КонтрагентНаименование;
                ТКонтрагенты.РСчет = РСчет;
                ТКонтрагенты.МФО = МФО;
                Если Метаданные.Справочник("Банки").Выбран() = 1 Тогда
                    СпрБ = СоздатьОбъект("Справочник.Банки");
                    Если СпрБ.НайтиПоКоду(МФО,0) = 1 Тогда
                        ТКонтрагенты.Банк = СокрЛП(СпрБ.ТекущийЭлемент());                            
                        ТКонтрагенты.сБанк = СпрБ.ТекущийЭлемент();
                    Иначе
                        ТКонтрагенты.Банк = Банк;  
                    КонецЕсли;
                Иначе
                    ТКонтрагенты.Банк = Банк;
                КонецЕсли;
            КонецЕсли;



Вот тут что-то не срабатывает, хотя вроде должно:
(Спр.ПолучитьАтрибут(ТипРеквизитаОКПО) = ОКПО)
Redneck
Пока что для решения своей задачи с этим повторяющимся элементом придумал "костыль", но буду благодарен, если кто-то подскажет, как правильно реализовать перебор элементов любого справочника, исключив помеченные на удаление. На мой код выше можете не смотреть в таком случае.
Pepe
Метод ПометкаУдаления() должен работать.
Назначение:
Прочитать флаг пометки удаления элемента справочника.
Возвращает: 1 - если на элементе справочника стоит пометка удаления; 0 - иначе.
Если простой перебор элементов, то по условию пропускать или обрабатывать.
volodya1122
При переборі вставити провірку на помітку видалення
Щось типу цього:
  Пока Спр.ПолучитьЭлемент() = 1 Цикл      
   Если Спр.ПометкаУдаления()=1 тогда
   Продолжить;    //в даному випадку помічені на видалення елементи не будуть перевірятись
   КонецЕсли:
  ..............
Redneck
Спасибо большое! Разобрался наконец-то. По глупости совал изначально НайтиПоРеквизиту внутрь самого цикла, а не под ним.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.