Имя: Пароль:
1C
1С v8
Как в массиве оставить только различные элементы?
0 suvolod
 
19.06.12
20:31
Вроде простая задачка, а с ходу решить не мог.
Есть Массив, в котором хранятся структуры вида

ТекДанные=Новый Структура;
       ТекДанные.Вставить("Наименование", СокрЛП(Элем77.Наименование));
       ТекДанные.Вставить("ЭтоГруппа", ЭтоГруппа);
       ТекДанные.Вставить("Родитель", СокрЛП(Элем77.Родитель.ТекущийЭлемент().Наименование));

это обязательные поля структуры.. + могут быть дополнительные поля (ИНН, КПП и т.д.), если текущая структура хранит данные о Элементе справочника (а не группе).

Массив на самом деле создается Через ТЗ.ВыгрузитьКолонку(...), и в нем могут среди элементов появиться дубли. Не могу понять, как быстрее правильнее его очистить от этих дубликатов.

Хотел запросом, нечто вроде:
"ВЫБРАТЬ Различные * ПОМЕСТИТЬ ВремТаб ИЗ &ТЗ КАК ТЗ" .. ну и дальше, но ругается на Различные..
1 Пеппи
 
19.06.12
20:36
в смысле ругается? покажи запрос. Скорее всего ты неправильно запрос пишешь.
2 Fragster
 
гуру
19.06.12
20:38
ТМП = ТЗ.Скопировать(...)
ТМП.Свернуть(...)
Массив = ТМП.ВыгрузитьКолонку(...)
3 НастоящееИмя
 
19.06.12
20:38
а если ТЗ свернуть()
4 suvolod
 
19.06.12
20:41
(1) да нет, вроде правильно..
здесь скорее всего дело в несовместимости оператора "*" и Различные.
Даже если отойти от моей задачи и в консоли запросов набрать запрос, например,

ВЫБРАТЬ РАЗЛИЧНЫЕ * ИЗ Справочник.Контрагенты КАК Контрагенты;

... то та-же ошибка вылезет: В запросе с предложениями РАЗЛИЧНЫЕ или ОБЪЕДИНИТЬ нельзя использовать поля неограниченной длины
5 Пеппи
 
19.06.12
20:48
(4) используй Выразить и ограничь длину этим длину
6 suvolod
 
19.06.12
20:51
проблема в том, что мне не понятно, на какую длину она ругается... В структуре только поля, полученные через СокрЛП, т.е. имеют ограниченную длину, так?

кроме этого, сами структуры разные.. в смысле в одной может быть только три поля, в другой - три обязательных + 4 дополнительных.
7 suvolod
 
19.06.12
20:55
ладно, видимо запросом сделать это действительно не получиться. попробую объектную модель (ТЗ.Свернуть)
8 guevara74
 
19.06.12
21:02
На самом деле надо в таблице значений ЯВНО определить типы колонок через ОписаниеТипов. Тогда загрузится нормально.  И в запросе указывать не * а название полей. И сначала целиком грузаните таблицу а потом из нее делайте Выбрать различные
9 m-serg74
 
19.06.12
21:05
(0) а зачем массив структур, может проще таб. знач, с определенным набором колонок?
10 m-serg74
 
19.06.12
21:09
и вот это - "ТекДанные=Новый Структура" с точки зрения 1С будет генерировать новый объект, и даже если элементы двух структур будут идентичными, Структура1 всегда будет не равна Структура2
11 ПесняПроЗайцев
 
19.06.12
21:11
массив передать в запрос и выбрать различные.)
12 m-serg74
 
19.06.12
21:13
(11) да зачем? если он из ТЗ получает этот массив, отчего просто как в (2) не свернуть ТЗ?
13 m-serg74
 
19.06.12
21:15
а вообще ТС что то не договаривает
14 ПесняПроЗайцев
 
19.06.12
21:24
(13) да сам не знает, чего хочет.)
15 chaplin-che
 
19.06.12
21:32
Запрос не поймет никогда объект типа "структура", чеза херня тут написана. Поди пихает таблицу с необъявленным описанием типа в параметр запроса как таблицы.
16 suvolod
 
19.06.12
21:36
(10) Здесь вы оказались правы. Сейчас потестил, и понял что проглядел этот момент. Получается, хочешь-не хочешь придется определять структуру с максимально возможным количеством полей, даже если реально (для групп) будет использоваться всего три
17 DrShad
 
19.06.12
21:41
да что за бредовая ТЗ со структурами внутри? может задача изначально решается по-другому и проще?
18 suvolod
 
19.06.12
21:48
Делаю универсальную обработку переноса справочников из 7.7 в 8.2. (про КД2 знаю, но в данном случае не использовал).

Мне надо перенести иерархию. для этого сделал ТЗ, в каждой строке "сидит" элемент и его родители. Например, если Элем77.Уровень()=4, то он будет сидеть в колонке "А4", его родитель - в колонке "А3", родитель родителя - в колонке "А2" и т.д.
Соответственно, когда весь справочник обработан (и создана ТЗ со всеми родителями), я поочередно обрабатываю ее колонки, начиная с "А1",что соответствует корневым элементам. Таким образом, обрабатывая далее остальные колонки ("А2","А3" и т.д), мы можем гарантировать, что все родители элементов из этих колонок уже существуют (созданы на предыдущем шаге итерации)

Вот такая задачка...
19 DrShad
 
19.06.12
21:49
неверное решение, про рекурсию слышал?
20 suvolod
 
19.06.12
21:50
Слышал. И даже сделал. Но она менее читабельна.
21 suvolod
 
19.06.12
21:51
и когда надо быстро переделать обработку под новую задачу (перегрузку какой-нибудь самописной конфы), полдня уходит на то, чтобы вспомнить код/разобраться где-что поправить.
22 DrShad
 
19.06.12
21:52
(21) лажа все, ничего никуда не уходит, если написать действительно грамотно
23 DrShad
 
19.06.12
21:54
т.е. даже из таблицы с двумя колонками, где в первой элемент, а во второй родитель, я тебе всегда загружу полную иерархию элементов и гарантированно верно
24 DrShad
 
19.06.12
21:55
а теперь давай начнем по порядку
через что работает твоя обработка?
25 suvolod
 
19.06.12
21:56
не спорю :).. У меня не рекурсивная функция была, а Цикл
Пока Родитель.Уровень()>1
//создаем нового родителя
Родитель=Родитель.Родитель
и т.д.


Через Com к семерке подключаюсь
26 DrShad
 
19.06.12
21:57
ща, погодь, если через COM я те кину функцию, которая обходом по элементам создаст тебе всех родителей
27 suvolod
 
19.06.12
22:00
Спасибо, интересно будет посмотреть. В любом случае надо будет дописывать новую обработку.. Первая редакция сегодня умерла с сообщением "неверный формат хранилища данных", после того как на работе моргнул свет. Так что у нас уже первый час ночи, а приходиться переписывать
28 DrShad
 
19.06.12
22:03
твое мыло говорят не существует :)
29 suvolod
 
19.06.12
22:05
chromo sobaka mail.ru
30 DrShad
 
19.06.12
22:07
лови, давно писал, но действует безотказно
31 Песец
 
19.06.12
22:08
//Удаляет повторяющиеся элементы массива.
Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт

Бухгалтерия предприятия КОРП, редакция 2.0
32 suvolod
 
19.06.12
22:10
Поймал, спасибо :). Буду смотреть
33 DrShad
 
19.06.12
22:13
(31) по сабжу не удалит!
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой