Имя: Пароль:
1C
 
Запрос --> Структура --> Массив --> Файлы по определенному условию ???
,
0 листопад
 
15.03.15
15:15
8.3 Управляемое приложение

У каждого физ.лица есть реквизит "Коэффициент". У многих он одинаковый. Подскажите, как мне сформировать dbf-файлы таким образом, чтобы они были сгруппированы по этим коэффициентам? Вот код:

&НаКлиенте
Процедура СформироватьФайл(Команда)
    
    БД = Новый XBase;
    БД.поля.Добавить("FIO", "S", "30");
    БД.поля.Добавить("LCHET", "S", "30");
    БД.поля.Добавить("KOEFF", "S", "30");
    БД.поля.Добавить("SUMMA", "S", "30");
    БД.СоздатьФайл(Каталог + "\" + ИмяФайла + ".dbf");
    БД.Записать();
    
    Массив = ВыборкаНаСервере();
    
    Для каждого Строка Из Массив Цикл
        // вот здесь как раскидать ФЛ по разным dbf-файлам,
        // в зависимости от Коэффициента
        
        БД.Добавить();
        
    КонецЦикла;
    
КонецПроцедуры


&НаСервере
Функция ВыборкаНаСервере()
    
    Массив = Новый Массив;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.Сотрудник.ФизическоеЛицо КАК ФЛ,
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.НомерЛицевогоСчета,
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.Сотрудник.ФизическоеЛицо.Коэффициент КАК Коэффициент,
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.КВыплате
    |ИЗ
    |    Документ.ВедомостьНаВыплатуЗарплатыВБанк.Зарплата КАК ВедомостьНаВыплатуЗарплатыВБанкЗарплата
    |ГДЕ
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.Ссылка = &Докум";
    
    Запрос.УстановитьПараметр("Докум", Докум);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Структура = Новый Структура;
        Структура.Вставить("Фамилия", Выборка.ФЛ);
        Структура.Вставить("НомерЛицевогоСчета", Выборка.НомерЛицевогоСчета);
        Структура.Вставить("КВыплате", Выборка.КВыплате);
        Структура.Вставить("Коэффициент", Выборка.Коэффициент);
        
        Массив.Добавить(Структура);
        
    КонецЦикла;
    
КонецЦикла;

Возврат(Массив);

КонецФункции
1 zak555
 
15.03.15
15:17
а что за Коэффициент -- какой его сымсл ?
2 GROOVY
 
15.03.15
15:19
Сортировать в запросе научить?

Упорядочить ПО ВедомостьНаВыплатуЗарплатыВБанкЗарплата.Сотрудник.ФизическоеЛицо.Коэффициент
3 Asmody
 
15.03.15
15:19
(0) в запросе сделать группировку типа Итоги, делать выборку по группировкам, внути создавать и заполнять дбфки.
4 листопад
 
15.03.15
15:26
(3) Так не получится, т.к. дбфки заполняться должны НаКлиенте (у нас кодировка на сервере неверная). Поэтому запрос я передаю в виде массива на клиента.
5 листопад
 
15.03.15
15:27
(2) Ваш вариант тоже не подойдет нам, по той же причине, что в (4) я написала.
6 Asmody
 
15.03.15
15:28
(4) верни массив массивов структур
7 листопад
 
15.03.15
15:32
(6) Ничего не поняла... Это как???
8 Asmody
 
15.03.15
15:35
(7)
Массив = Новый Массив();
Массив1 = Новый Массив();
Массив1.Добавить(Новый Структура());
Массив.Добавить(Массив1);
9 GROOVY
 
15.03.15
15:35
Ничего не понятно. Массив, кодировки на клиенте и сервере разные, передавать тудя-сюда... В чем проблема, я не понимаю.
При чем тут вообще клиент-сервер?
Кодировку, не установить нужную?
Нафига масссив передавать?
10 Asmody
 
15.03.15
15:36
(9) она на клиенте дбф создает. По какой причине - не важно.
11 alle68
 
15.03.15
15:38
(7) Для каждого значения коэффициента получаешь структуру (Коэффициент, Данные) и помещаешь их в массив.  
Данные - это массив структур, как в твоём примере, но можно без коэф-та.
И не забудь поле "ФЛ" в запросе перевести в строку.
12 листопад
 
15.03.15
15:43
(8) Спасибо. Но я не поняла из Вашего примера, где тут отбор по коэффициенту?
13 листопад
 
15.03.15
15:47
Физ.лиц у нас примерно 1000человек. Коэффициентов примерно 70, соответственно должно сформироваться 70дбф-файлов.
А все коэффициенты прописывать - будет неправильным... Как это сделать???
14 листопад
 
15.03.15
15:48
Т.е. если у физ.лиц повторяется коэффициент, то они попадают в один дбф-файл.
15 листопад
 
15.03.15
15:48
(11) Как это написать??? Мне что-то подобное и нужно сделать.
16 alle68
 
15.03.15
15:58
(15) Сортируешь запрос по коэф-ту, выборку перебираешь 2-мя циклами, внешний СледующийПоЗначениюПоля("Коэф"), здесь создаешь структуру, заполняешь её, как у тебя в примере, после этого добавляешь в результирующий массив.
17 листопад
 
15.03.15
16:00
(16) Я это не осилю ((( Помогите пож-та...
18 alle68
 
15.03.15
16:14
(17) Ты заранее не сдавайся, начни и всё получится.
Кстати, ты уверена, что нужно создавать так много файлов, под каждый коэффициент? Гораздо удобней обрабатывать один файл.
19 листопад
 
15.03.15
17:31
HELP!!! Кто-нибудь!!!
20 Torquader
 
15.03.15
18:59
А нельзя разве ТЗ передать с сервера на клиента ?
Ну или двумерный массив ?
У меня, помнится, всё содержимое листа Excel в виде двумерного массива между сервером и клиентом бегало без проблем.
21 Torquader
 
15.03.15
19:00
А, извините, "листопад"-то женского полу - может и не получиться.
22 zak555
 
15.03.15
19:03
(20) нету ТЗ/ДЗ на клиентах
23 yavasya
 
15.03.15
19:13
и дбф зачем? в экселе смотреть удобнее
24 Остап Сулейманович
 
15.03.15
19:16
(22) Зато есть табличные части. Доступны и на сервере и без гемора визуализируются на клиенте.
25 листопад
 
15.03.15
19:20
Up!
26 Torquader
 
15.03.15
19:24
(25) Выбери данные в запросе вместе с коэффициентом во временную таблицу, потом из неё выбери с сортировкой по коэффициенту - потом, то что выбрали в ТЗ - после этого ТЗ - в массив и на клиента - а там пиши всё в dbf, если так хочется.
Какое слово не понятно ?
27 Остап Сулейманович
 
15.03.15
19:24
(25) Чего "Up!"? Что не получается? Только по буквам и пытаться вопрос прочитать самостоятельно. А то из вот этого вот "сформировать dbf-файлы таким образом, чтобы они были сгруппированы" нифига не понятно.
Что означает фраза "файлы сгуппированы"? Это значит лежат в одном каталоге?
28 Torquader
 
15.03.15
19:28
(27) Я, например, понял, что файл один, а записи в нём сортированы.
29 Asmody
 
15.03.15
19:30
Что вы теоритизируете? Не видите - девушке готовый код нужен.
30 Остап Сулейманович
 
15.03.15
19:31
(28) Таки у ТС проблема посортировать выборку запроса?
В самом запросе или выгрузив в ТЧ/ТЗ и посортировать там?
31 Asmody
 
15.03.15
19:31
Мне это неинтересно, я женат.
32 Остап Сулейманович
 
15.03.15
19:33
(29) Показать ей где в конструкторе запроса вкладка "Порядок" - поможет?
33 Torquader
 
15.03.15
19:36
(32) А, так там даже в самом запросе есть этот коэффициент - тогда да - достаточно ткнуть носом во вкладку.
(31) Тут, видимо, все в таком же состоянии. Потом, красивых глаз для готового кода не достаточно.
34 Asmody
 
15.03.15
19:39
Алчные, скупые, мелочные гении
35 листопад
 
15.03.15
19:46
Объясняю. В ведомости есть:
ФИО, №лицевого, Коэфф-т, Сумма.

Вот так:
Иванов   1111111   25   1000
Петров   2222222   15   2000
Сидоров  3333333   25   5000

В данном примере, у меня должно получиться два дбф-файла, т.к. у Иванова и Сидорова одинаковый коэфф-т (25), то они попадают в один файл. А Петров будет в другом дбф-файле. Т.е. на выходе получить должны:

Первый дбф-файл:
Иванов   1111111   25   1000
Сидоров  3333333   25   5000

Второй дбф-файл:
Петров   2222222   15   2000
36 zak555
 
15.03.15
19:47
(31) она уже что-то предлагала ?
37 zak555
 
15.03.15
19:47
(35) в какой банк идёт выгрузка ?
38 Torquader
 
15.03.15
19:51
(35) Отсортировать таблицу по коэффициенту - это просто.
Потом, догадаться при переборе, что если коэффициент меняется, то закрываем старый файл (если открыт, чтобы первую запись обработать) и открываем новый.
Так ?
39 листопад
 
15.03.15
19:51
Написала, как посоветовали в (16), но все равно собирается все в один дбф-файл. Вот код:

&НаКлиенте
Процедура СформироватьФайл(Команда)
    
    БД = Новый XBase;
    БД.поля.Добавить("FIO", "S", "30");
    БД.поля.Добавить("LCHET", "S", "30");
    БД.поля.Добавить("KOEFF", "S", "30");
    БД.поля.Добавить("SUMMA", "S", "30");
    БД.СоздатьФайл(Каталог + "\" + ИмяФайла + ".dbf");
    БД.Записать();
    
    Массив = ВыборкаНаСервере();
    
    Для каждого Строка Из Массив Цикл
        // вот здесь как раскидать ФЛ по разным dbf-файлам,
        // в зависимости от Коэффициента
        
        БД.Добавить();
        
    КонецЦикла;
    
КонецПроцедуры


&НаСервере
Функция ВыборкаНаСервере()
    
    Массив = Новый Массив;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.Сотрудник.ФизическоеЛицо КАК ФЛ,
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.НомерЛицевогоСчета,
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.Сотрудник.ФизическоеЛицо.Коэффициент КАК Коэффициент,
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.КВыплате
    |ИЗ
    |    Документ.ВедомостьНаВыплатуЗарплатыВБанк.Зарплата КАК ВедомостьНаВыплатуЗарплатыВБанкЗарплата
    |ГДЕ
    |    ВедомостьНаВыплатуЗарплатыВБанкЗарплата.Ссылка = &Докум";
    
    Запрос.УстановитьПараметр("Докум", Докум);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.СледующийПоЗначениюПоля("Коэффициент") Цикл
        
        Структура = Новый Структура;
        Структура.Вставить("Фамилия", Выборка.ФЛ);
        Структура.Вставить("НомерЛицевогоСчета", Выборка.НомерЛицевогоСчета);
        Структура.Вставить("КВыплате", Выборка.КВыплате);
        Структура.Вставить("Коэффициент", Выборка.Коэффициент);
        
        Пока Выборка.Следующий() Цикл
            
            Массив.Добавить(Структура);
            
        КонецЦикла;
        
    КонецЦикла;
    
    Возврат(Массив);
    
КонецФункции
40 Torquader
 
15.03.15
19:52
(39) Читаем внимательно (38) и думаем, как проверить, что коэффициент изменился (запомнить значение с предыдущей строки).
41 листопад
 
15.03.15
19:52
(38) Да!!! Как мне догадаться при переборе, что если коэффициент меняется, то закрываем старый файл (если открыт, чтобы первую запись обработать) и открываем новый???
42 Torquader
 
15.03.15
19:52
Кстати, самый главный вопрос - как формируется имя файла ?
43 Torquader
 
15.03.15
19:53
(41) Человек, который открывает конфигуратор, чтобы писать код, не должен задавать такой вопрос.
44 листопад
 
15.03.15
19:55
(42) Имя файла совпадает с коэфф-том.
45 Torquader
 
15.03.15
20:01
ПрошлыйКоэффициент=НЕОПРЕДЕЛЕНО;
БД=НЕОПРЕДЕЛЕНО;
Для Каждого Эл из НашМассив Цикл
Если ПрошлыйКоэффицент=НЕОПРЕДЕЛЕНО Тогда
  СоздаёмНовыйФайл=Истина;
Иначе Если ПрошлыйКоэффицент=Эл.Коэффициент Тогда
  СоздаёмНовыйФайл=Ложь;
Иначе
  СоздаёмНовыйФайл=Истина;
КонецЕсли;
Если СоздаёмНовыйФайл=Истина Тогда
  ПрошлыйКоэффицент=Эл.Коэффициент;
  Если БД<>НЕОПРЕДЕЛЕНО Тогда БД.Закрыть();КонецЕсли;
  БД=Новый ХBase;
  // здесь поля
  БД.Создать(Каталог+ПрошлыйКоэффицент+".dbf");
КонецЕсли;
// здесь записываем элемент
КонецЦикла;
Если БД<>НЕОПРЕДЕЛЕНО Тогда БД.Закрыть();КонецЕсли;
P.S. не помню, а есть ли команда БД.Закрыть() или файл закрывается БД=НЕОПРЕДЕЛЕНО, но это вы сами проверите.
46 zak555
 
15.03.15
20:02
(45) у всё, сейчас она тебя поведёт в ресторан
47 Остап Сулейманович
 
15.03.15
20:02
(35)
1. Отсортировать в запросе.
2. при обходе структуры примерно такой код :

&НаКлиенте
Функция СформироватьДБФ()
    БД = Новый XBase;
    БД.поля.Добавить("FIO", "S", "30");
    БД.поля.Добавить("LCHET", "S", "30");
    БД.поля.Добавить("KOEFF", "S", "30");
    БД.поля.Добавить("SUMMA", "S", "30");
    //*** откуда берется ИмяФайла - непонятно
    //*** но пока оставим так.
    БД.СоздатьФайл(Каталог + "\" + ИмяФайла + ".dbf");
    БД.Записать();
    Возврат БД;
КонецФункции

&НаКлиенте
Процедура СформироватьФайл(Команда)

    Массив = ВыборкаНаСервере();
    БД = Неопределено;
    текКоэфиициент = 0; // ну или такой которого
                        // гарантированно не будет в выборка (например Неопределено)

    Для Каждого Запись ИЗ Массив[0] Цикл
    //Вообще тоже непонятно зачем массив с единственным элементом
        Если Запись.Коэффициент <> текКоэфиициент Тогда
            Если БД <> Неопределено Тогда
                БД.ЗакрытьФайл();
            КонецЕсли;
            БД = СформироватьДБФ();
        КонецЕсли;
        БД.Добавить();
        БД.FIO = Запись.;
        БД.LCHET = ...;
        ...
    КонецЦикла;
КонецПроцедуры
48 Torquader
 
15.03.15
20:05
(46) Нет уж, лучше потом пусть помогает отчётность с бумажек набивать - у меня, иногда, для этого работников не хватает.
49 Остап Сулейманович
 
15.03.15
20:06
+ (47)
В проверку добавить присвоение нового коэфиициента
Если Запись.Коэффициент <> текКоэфиициент Тогда
   Если БД <> Неопределено Тогда
      БД.ЗакрытьФайл();
   КонецЕсли;
   БД = СформироватьДБФ();

   //****** вот здесь
   текКоэфиициент = Запись.Коэффициент;
   //******
КонецЕсли;
50 zak555
 
15.03.15
20:07
(48) ты не автоматизировал себе процесс этот ?
51 листопад
 
15.03.15
20:07
(45) Спасибо большое! Сейчас попробую. Только уточните еще пож-та, а запрос оставляю как в (0) или как в (39) я написала?
52 листопад
 
15.03.15
20:08
(47) Спасибо. Ваш вариант тоже попробую.

Отпишусь что получилось в результате...
53 Torquader
 
15.03.15
20:09
(51) В (39) Фигня полная написана.
В запрос нужно добавить "Упорядочить по", а в структуру - пихать каждую строку - боюсь, что код из (39) придётся просто выкинуть.
54 листопад
 
15.03.15
20:11
(53) Прощу прощения, а где УпорядочитьПо написать?
55 Torquader
 
15.03.15
20:12
(54) А где это обычно пишется ? В запросе, конечно, и в правильном месте.
56 листопад
 
15.03.15
20:13
(55) Нашла )))
57 Остап Сулейманович
 
15.03.15
20:13
(51) Учти, что строчку "Для Каждого Эл из НашМассив Цикл" придется переписать. У тебя в массиве единственный элемент. А обходить нужно "элементы этого элемента". Тавтология конечно, но единственным элементом массива будет структура. Вот ее элементы и нужно будет обходить.
А вообще отлаживать придется и (45) и (47).
58 Torquader
 
15.03.15
20:14
(57) В (39) Там и в структуре будет один элемент, так как более чем один туда просто не влезет.
В итоге, это реализация схемы "последний герой".
59 Torquader
 
15.03.15
20:16
Точнее, там будет "замечательный массив" в котором первый чувак с коэффициентом будет упомянут столько раз, сколько человек с коэффициентом было обнаружено.
Так что массив-то, конечно, можно перебирать, но это не спасёт.
60 листопад
 
15.03.15
20:17
в (45) не поняла:
СоздаёмНовыйФайл - это что?
61 zak555
 
15.03.15
20:19
зачем вы так мучаетесь ?

создайте реквизит формы ДЗ

выгрузите в него данные

далее программно создайте элемент табличу формы, связанную с ДЗ

и обойдите её
62 Остап Сулейманович
 
15.03.15
20:20
(60) см СформироватьДБФ() из(47)
63 листопад
 
15.03.15
20:25
Запутали совсем...
64 zak555
 
15.03.15
20:38
(63) пора спать уже
65 ДенисЧ
 
15.03.15
20:42
(64) Сначала ресторан, потом спать ))
66 zak555
 
15.03.15
20:50
(65) он же не предлагет
67 Torquader
 
15.03.15
23:18
Я понял, почему "листопад" - когда дятел "глумиться" над деревом "сверх нормы", то с него начинают падать листья, а "листопад" - это когда уже полностью "задолбал".

P.S. не обижайтесь, но за вас уже несколько раз задачу решили, а вам всё мало.
68 Torquader
 
16.03.15
00:48
(66) Нет, я только представил себе поход в ресторан:
Как был, "листопад" - крутой чувак, в красной кепочке и чёрном костюме - говорит, что, дескать, знаю замечательное место, где наши всегда бывают.
Ну, раз так, значит - идём.
А дальше, как всегда - непонятные переулки в центре города, где, вроде бы и есть жизнь, но вокруг развалины, и даже трудно пройти.
Заходим в какой-то подвал с забавной вывеской "весёлый стук".
Железные столы, стальные стулья и каменный пол.
Заказываем чего-то свежее, как сказал официант - пользуется спросом, ну - не вопрос - раз пользуется, так, значит, не отравят.
Ждём немного - официант приносит две таких больших стальных тарелки, немного помятых, как будто на них гвозди распрямляли, и, самое главное пустых.
Ставят керамические чашки, полные какой-то жидкости.
Я спрашиваю - что это - официант отвечает - как обычно - берёзовый сок - свежевыжатый.
Ну, сок как сок - пить можно - опилки же не плавают.
И тут приносят еду - два больших еловых полена - запах смолы и коры наполняет помещение.
Это наше фирменное - ель с дубовыми вставками - изрекает официант.
Я смотрю на полено, потом на официанта, и понимаю, что окружающая действительность перестаёт меня радовать, и мне очень сильно хочется домой.
"Листопадец", тем временем начинает поедание - стоит громкий треск и хруст - теперь я понимаю, почему тарелки так выглядят - ведь вместо столовых приборов выдают стамеску и киянку.
И вот - уже половины полена, как ни бывало.
Я же верчу своё в руках из стороны в сторону и с грустным взглядом изрекаю фразу - эх, надо было программировать на Java или хотя бы на php, тогда бы было что-то вкуснее.
... и тут я проснулся.
69 Asmody
 
16.03.15
00:53
(68) а я-то думаю: почему в красной шапочке? :)
70 шаэс
 
16.03.15
01:08
(68) о, класс, сказки уже начались...
71 zak555
 
16.03.15
07:16
(68) вот это да
72 Simod
 
16.03.15
07:35
Массив..  в массив структура..  обкурились штоле?

(45) Вообще нечитаемо.
73 D_E_S_131
 
16.03.15
09:57
В этой теме массовое умопомрачение что ли (или я невнимательно читаю)?
Выборка из результата запроса очень замечательно передается на Клиент, а сделать Итоги по коэффициенту еще Asmody в (3) предложил.
74 ДенисЧ
 
16.03.15
09:58
(73) Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
75 D_E_S_131
 
16.03.15
10:01
(74) "толстый клиент" — есть же, что не так?
76 D_E_S_131
 
16.03.15
10:01
(68) Предлагаю название "Ужин с бобром".
77 ДенисЧ
 
16.03.15
10:02
(75) Как бы 1с по умолчанию очень любит запускать именно тонкого. Поэтому нужно уточнять.
78 D_E_S_131
 
16.03.15
10:06
(77) Согласен. Если очень нужно именно тонкого клиента, то обход выборки сделать на Сервере, а на клиента передавать структуру:

СтруктураФайла = Новый Структура("Коэф, ДанныеКоэф", Выборка.Коэффициент, МассивДанных);
79 Лефмихалыч
 
16.03.15
10:13
отсортировать по Физлицо+Коэффициент, потом вернуть массив

ТекКоэффициент = Массив[0].Коэффициент;
ТекФизлоцо = Массив[0].Физлицо;
Пока не Массив.Конец Цикл
  Если ТекФизлоцо <> Массив[0].Физлицо Тогда
    // началось новое физлицо
  КонецЕсли;
  Если ТекКоэффициент <> Массив[0].Коэффициент Тогда
   // начался новый коэффициент
  КонецЕсли;
  ТекКоэффициент = Массив[0].Коэффициент;
  ТекФизлоцо = Массив[0].Физлицо;
80 Лефмихалыч
 
16.03.15
10:14
в последних двух строчках Массив[0] читать, как Массив[ТекИтерацияЦикла]
81 D_E_S_131
 
16.03.15
10:26
(79) Там вроде бы в условии, что нужно и сам коэффициент вернуть (в имени файла будет использоваться) и еще поля ЛицевойСчет и кВыплате. Видимо придется передавать ТЗ в реквизит формы...
82 Лефмихалыч
 
16.03.15
10:43
(81) массив соответствий с соответствиями
83 Torquader
 
16.03.15
14:02
(76) Ну какой там бобёр - там самый настоящий ДЯТЕЛ.
Бобра-то на мех сдать можно или попросить деревья нарубить, а что может дятел ?
84 Torquader
 
16.03.15
14:02
(82) Чем просто массив в массиве не устраивает ?
85 ДенисЧ
 
16.03.15
14:02
(83) на перья. И дырку в стволе продубить может...
86 Torquader
 
16.03.15
14:07
(85) Ну да, представляем такой восточный рынок, где полно всякой всячины. Стоит такая бабушка неизвестного возраста, и у неё большой тряпичный мешок, а на нём табличка "Перо дятла".
Закон Брукера: Даже маленькая практика стоит большой теории.