8.х Таблица значений: индексация

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

  1. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а при чем тут строка - вы колонки же перебираете и что у вас в массиве?
  2. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    В массиве у меня ссылки на элементы, которые нужно удалить(нужно удалить полностью строки содержащие найденные элементы). Соответственно я перебираю столбец в таблице, содержащий эти ссылки - нахожу строку, но не могу найти ни ее номер, ни удалить эту строку.
  3. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Не могу найти номера строк как это сделать?
    Код:
    Для Каждого Элемент ИЗ Массив Цикл
    Массив6.Вставить(0, Таблица4.Индекс(Таблица4.Колонки.Найти(Элемент, "ЗаказНоменклатураСсылка")));
    КонецЦикла;
    
    В массиве содержаться ссылки, мне вот эти номера строк нужно найти.
    Где ошибка в коде или может как-нибудь можно сразу же найденную строку удалить.
  4. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Таблица.Колонки.Найти("ЗаказНоменклатураСсылка") - этот код найдет вам колонку по наименованию, а не элемент в колонке, потому и не понятно было что вы делаете
  5. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    А как элемент в колонке найти?
  6. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    странный алгоритм, я бы попробовала примерно так, надо адаптировать
    Код:
    отбор = Новый Структура;
    Для Каждого элем Из ТЗ.Колонки Цикл //цикл по колонкам
    Для Каждого эл Из мас Цикл //цикл по вашим элементам для поиска
    отбор.Очистить();
    отбор.Вставить(элем.Имя, эл); //задаем отбор по колонке по значению
    стр = тз.НайтиСтроки(отбор); //все найденные строки ТЗ
    Для Каждого ст Из стр Цикл //удаляем найденные строки
    тз.Удалить(ст);
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
  7. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Код:
    отбор = Новый Структура;
    Для Каждого элем Из Таблица4.Колонки Цикл //цикл по колонкам
    Для Каждого эл Из Массив Цикл //цикл по вашим элементам для поиска
    отбор.Очистить();
    отбор.Вставить(элем.ЗаказНоменклатураСсылка, эл); //задаем отбор по колонке по значению
    стр = Таблица4.НайтиСтроки(отбор); //все найденные строки ТЗ
    Для Каждого ст Из стр Цикл //удаляем найденные строки
    Таблица4.Удалить(ст);
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    
    Ничего не могу понят, мне нужно искать именно по колонке ЗаказНоменклатураСсылка а мне говорит:
    {Форма.ФормаОтчета.Форма(355)}: Поле объекта не обнаружено (ЗаказНоменклатураСсылка)
    отбор.Вставить(элем.ЗаказНоменклатураСсылка, эл); //задаем отбор по колонке по значению
  8. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ааа, т.е. у вас не по всем колонкам надо бежать? тогда вот так
    Код:
    отбор = Новый Структура;
    Для Каждого эл Из мас Цикл //цикл по вашим элементам для поиска
    отбор.Очистить();
    отбор.Вставить(тз.Колонки["ЗаказНоменклатураСсылка"], эл); //задаем отбор по колонке по значению
    стр = тз.НайтиСтроки(отбор); //все найденные строки ТЗ
    Для Каждого ст Из стр Цикл //удаляем найденные строки
    тз.Удалить(ст);
    КонецЦикла;
    КонецЦикла;
    а ошибку выдан, потому что имя колонки задается как строка в [], а не как поле у Колонки таблицы значений
  9. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Код:
    отбор = Новый Структура;
    Для Каждого эл Из Массив Цикл //цикл по вашим элементам для поиска
    отбор.Очистить();
    отбор.Вставить(Таблица4.Колонки["ЗаказНоменклатураСсылка"], эл); //задаем отбор по колонке по значению
    стр = Таблица4.НайтиСтроки(отбор); //все найденные строки ТЗ
    Для Каждого ст Из стр Цикл //удаляем найденные строки
    Таблица4.Удалить(ст);
    КонецЦикла;
    КонецЦикла;
    
    {Форма.ФормаОтчета.Форма(355)}: Ошибка при вызове метода контекста (НайтиСтроки)
    стр = Таблица4.НайтиСтроки(отбор); //все найденные строки ТЗ
    по причине:
    Неверное имя колонки

    У меня 100% в этой таблице есть полностью заполненная колонка ЗаказНоменклатураСсылка.

    Тип данных Массив и Таблица4 совпадает(делалась выборка из Таблица4 в Массив)
  10. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    это я ошиблась, извините, надо не колонку, а имя колонки - вот это
    Код:
    отбор.Вставить(Таблица4.Колонки["ЗаказНоменклатураСсылка"], эл);
    замените на
    Код:
    отбор.Вставить("ЗаказНоменклатураСсылка", эл);
  11. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Очень нужна возможность хранения в одной ячейки значений из нескольких ячеек(тип один и тот же). Нашел что для этого нужно использовать список значений.
    Под 7-ку это выглядит вроде вот так:
    Код:
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Таблица"); //колонка не обязательно типизирована
    ТЗ.НоваяСтрока();
    ТЗ.Таблица=СоздатьОбъект("ТаблицаЗначений");
    
    Под 8-ку пробовал переписать - не работает. Как все-таки эту возможность реализовать? Не может такого не быть.

    Или через запятую их хранить и искать по содержимому?
  12. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    я конечно не пробовала, но предположу, что наверное так
    Код:
    тз.Колонки.Добавить("СписокЗнач", Новый ОписаниеТипов("СписокЗначений"));
    НО это только предположение, если получится, отпишитесь о результатах
  13. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    А как изменить тип столбца? У меня ограничение не более 11 символов. Все что дальше откидывается. Хочу в строку переделать.
  14. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    какой тип у вас 11 символов и почему он такой? задайте сразу побольше?
  15. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Есть вот такя таблица:
    Код1|Количество1|Код2|Количество2|
    9898|222|1722|2211|
    2112|122|1722|2211|
    1221|2100|1722|2211|
    3443|233|1722|2211|
    Смысл в том, что в столбцах Код2 и Количество2 в данном случае одна и таже позиция(т.е. вместо 4-х разных позиций закупается одна). Необходимо получить таблицу вида:
    Код1|Количество1|Код2|Количество2|Итог|
    9898|222|1722|2211|222|
    2112|122|1722|2211|122|
    1221|2100|1722|2211|1756|
    3443|233|1722|2211|0|
    Смысл в том что необходимо последовательно заполнитьзначение итог, т.е. то на сколько хватит значения из поля Код2. Как это реализовать?
    Как я понимаю можно завести статическую или глобальную переменную, пробовал , целый день потратил так у меня и не получилось. Если можете наставьте меня на нужный курс а я буду разбираться. Спасибо.
  16. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    для такой обработки нужно
    1 получить список закупаемых позиций
    Код:
    ТаблицаЗакупаемых = ИсходнаяТаблица.Скопировать();
    ТабилцаЗакупаемых.Свернуть("Код2");
    после этого у вас в ТаблицаЗакупаемых будут только коды позиций для закупки.
    2. проходим по кодам закупаемых позиций и отбираем для обработки строки из исходной таблицы
    Код:
    Для Каждого СтрокаЗакупаемых Из ТаблицаЗакупаемых Цикл
    СтрокиИсходной = ИсходнаяТаблица.НайтиСтроки(Новый Структура("Код2", СтрокаЗакупаемых.Код2));
    // теперь распределяем количество
    КоличествоРаспределить = СтрокиИсходной[0].Количество2;
    Для Каждой СтрокаИсходной Из СтрокиИсходной Цикл
    Если СтрокаИсходной.Количество1<КоличествоРаспределить Тогда
    СтрокаИсходной.Итог = СтрокаИсходной.Количество1;
    КоличествоРаспределить = КоличествоРаспределить-СтрокаИсходной.Количество1;
    Иначе
    СтрокаИсходной.Итог = КоличествоРаспределить;
    КоличествоРаспределить = 0;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Колонку Итог в исходную таблицу надо добавить
  17. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Есть еще одно условие:
    Код1|Количество1|Код2|Количество2|Итог|
    5423|588|6577|1155|1155|
    а по вышеприведенному коду будет в этом случае:
    5423|588|6577|1155|588|
    Как адаптировать код?
    ПРобовал переписать цикл на :
    Код:
    Для Каждого СтрокаЗакупаемых Из Таблица5 Цикл
    СтрокиИсходной = Таблица4.НайтиСтроки(Новый Структура("АналогСсылка", СтрокаЗакупаемых.АналогСсылка));
    // распределяем количество
    КоличествоРаспределить = СтрокиИсходной[0].СписанныеТоварыКоличество;
    Для Сч = 0 По СтрокиИсходной.Количество()-1 Цикл
    Если ПривестиКЧислу(СтрокиИсходной[Сч].ЗаказНоменклатураКоличество)<ПривестиКЧислу(КоличествоРаспределить) и СтрокиИсходной[Сч].АналогСсылка = СтрокиИсходной[Сч+1].АналогСсылка Тогда
    СтрокиИсходной[Сч].Сумма = СтрокиИсходной[Сч].ЗаказНоменклатураКоличество;
    КоличествоРаспределить = КоличествоРаспределить-СтрокиИсходной[Сч].ЗаказНоменклатураКоличество;
    ИначеЕсли ПривестиКЧислу(СтрокиИсходной[Сч].ЗаказНоменклатураКоличество)<ПривестиКЧислу(КоличествоРаспределить) И СтрокиИсходной[Сч].АналогСсылка <> СтрокиИсходной[Сч+1].АналогСсылка Тогда
    СтрокиИсходной[Сч].Сумма = КоличествоРаспределить;
    КоличествоРаспределить = 0;      
    Иначе
    СтрокиИсходной[Сч].Сумма = КоличествоРаспределить;
    КоличествоРаспределить = 0;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    но тут из-за условия СтрокиИсходной.Количество()-2 не все строки учитываются а обойти это условие не могу.
  18. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Нужно в этот код добавить условие для сравнения со следующим элементом на предмент равенства поля Аналог Ссылка исключив выход за пределы массива
    Код:
    Для Каждого СтрокаЗакупаемых Из Таблица5 Цикл
    СтрокиИсходной = Таблица4.НайтиСтроки(Новый Структура("АналогСсылка", СтрокаЗакупаемых.АналогСсылка));
    // распределяем количество
    КоличествоРаспределить = СтрокиИсходной[0].СписанныеТоварыКоличество;
    Для Сч = 0 По СтрокиИсходной.Количество()-1 Цикл
    Если ПривестиКЧислу(СтрокиИсходной[Сч].ЗаказНоменклатураКоличество)<ПривестиКЧислу(КоличествоРаспределить) Тогда
    СтрокиИсходной[Сч].Сумма = СтрокиИсходной[Сч].ЗаказНоменклатураКоличество;
    КоличествоРаспределить = КоличествоРаспределить-СтрокиИсходной[Сч].ЗаказНоменклатураКоличество;
    Иначе
    СтрокиИсходной[Сч].Сумма = КоличествоРаспределить;
    КоличествоРаспределить = 0;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    так как условие СтрокиИсходной.Количество()-2 мне не подходит.
  19. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Как проверить существует ли строка?
    СтрокиИсходной[Сч+1]
  20. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Переписать все на цикл Try или есть другие решения?

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