Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка при переборе записей в таблице значений
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Fabri
Обработка печать ценников. Есть необходимость выводить записи только со штрих-кодом.
Создал на форме флажек, и реквизит ТолькоСШтрихКодом - Булево
Так как кроме стандартных подборов есть ещё и дописанные (заполнение из документов ПоступлениеТоваровУслуг и РеализацияТоваровУслуг)
правильней создать отдельную процедуру.

//Отфильтруем товары только по штрих кодам
Процедура ОтфильтроватьПоШтрихКодам()
    
Если ЭтотОбъект.ТолькоСШтрихКодом Тогда
        
    Для Каждого Строка ИЗ ЭтотОбъект.Товары Цикл
            
        Если ЕстьШтрихКод(Строка.Номенклатура.Ссылка)=Ложь Тогда
            Товары.Удалить(Строка.НомерСтроки);
        КонецЕсли;
                
    КонецЦикла;

КонецЕсли;

КонецПроцедуры

//Функция проверяет есть ли штрих-код у номенклатуры и возвращает значение Булево
Функция ЕстьШтрихКод(Номенклатура)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    Штрихкоды.Штрихкод
        |ИЗ
        |    РегистрСведений.Штрихкоды КАК Штрихкоды
        |ГДЕ
        |    Штрихкоды.Владелец.Ссылка = &Номенклатура";

    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Возврат Истина;
    КонецЦикла;

    Возврат Ложь;
       
КонецФункции


Вроде все нормально. Но вот получаются фокусы. При выводе удаляются не все записи, т.е. с 19 записей без штрих-кодов. Удаляет всего лишь 10.
Вывел уже отдельно кнопку вызывающую процедуру ОтфильтроватьПоШтрихКодам(). Та же картина. Далее ещё интересней. Вывел 19 записей, нажал кнопку отфильтровать, осталось 9 записей. Нажал ещё раз, осталось 5 записей, нажал ещё - 2 записи, ещё 1 запись, и потом пусто. Какая-то фантастика.

Попробовал по другому:
    
Для А=0 ПО Товары.Количество() Цикл
    
Строка=Товары.Получить(А);

      Если ЕстьШтрихКод(Строка.Номенклатура.Ссылка)=Ложь Тогда
             Товары.Удалить(А);
      КонецЕсли;

      А=А+1;        

КонецЦикла;


Поставил точки останова, смотрю в конфигураторе, Товары.Количество()=19, продолжаю отладку, 10 раз проходит и дальше останавливается. Вообще непойму в чем проблема. Может кто-то сталкивался. Заранее спасибо за ответы.
sava1
что есть Товары ?
Если ТаблПоле проще установить отбор чем удалять.
Fabri
Цитата(sava1 @ 21.12.12, 11:48) необходимо зарегистрироваться для просмотра ссылки
что есть Товары ?
Если ТаблПоле проще установить отбор чем удалять.


да, Табличное поле. Щас попробую.

Если можете, подскажите как использовать отбор, или ссылочку где можно почитать. Спасибо.
sava1
Если внешняя обработка - лучше сразу в запросе выбрать только товары со штрихкодом

ЭлементыФормы.ТабличноеПоле.ОтборСтрок.Колонка.Установить(Значение)
Fabri
Я писал выше:
Так как кроме стандартных подборов есть ещё и дописанные (заполнение из документов ПоступлениеТоваровУслуг и РеализацияТоваровУслуг)
правильней создать отдельную процедуру.

Процедура подбора не одна и запрос естесно не один. Это щас каждый надо переделывать. Проще отдельной процедурой.


Все равно, отбором ничего неполучается. Мне надо отобрать только ту номенклатуру, которая имеется в РегистреСведений - Штрихкоды, а как это отбором в табличном поле осуществить?
sava1
Или получать в ТЧ поле Штрихкод (левое соединение по номенклатуре) или отдельно заполнять ТЧ с отбором в запросе

Пример отбора по полю ТМЦ
тОтбор = ЭлементыФормы.тФил.ОтборСтрок;
    Если тОтбор.Найти("ТМЦ") = Неопределено Тогда тОтбор.Добавить("ТМЦ");
    КонецЕсли;
    тОтбор["ТМЦ"].Значение = текТМЦ;
    тОтбор["ТМЦ"].ВидСравнения  = ВидСравнения.Равно;
    тОтбор["ТМЦ"].Использование = Истина;


Для этого нужно чтобы поле Штрихкод было в ТЧ (точне наличиеШтрихкода=1/0)
Fabri
Спасибо. Я сделал другим способом. Я раньше дописывал параметр Печатать(Булево) в табличной части, который, если флажек установлен выводит элемент на печать, если нет - нет. Я просто установкой этого параметра решил вопрос.
Zaval
Классические грабли ))

Когда Вы удаляете строку, что происходит с номерами строк, лежащих ниже?
Поэтому:
Для удаления строк ТаблицуЗначений нужно перебирать в обратном порядке.
Vofka
Проблема уже 100500 раз обсуждалась на форуме. Люди, читайте форум, найдете много интересного.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.