Имя: Пароль:
1C
1С v8
Выборка
0 Swetlana521911
 
19.08.13
07:59
Здравствуйте!!! Столкнулась с проблемой.. Существует некая внешняя обработка, которая печатает бейджики. Т.е. она берет людей из справочника физ лиц и их должности. В этом же справочнике есть раздел заметки, в котором присваивается индивидуальный номер(номер бэйджа) каждому физ.лицу. Данные заметок хранятся в регистре сведений. Была поставлена задача: выбрать из физ.лиц только водителей, проверить уволены они или нет, если уволены, то освободить их индивидуальный номер и присвоить его к новым водителям. Таким образом на форме есть кнопки: "Заполнить физ.лица" - заполняет данные в таблицу(фио, должность, номер бэйджа) и "Сформировать номера ФЛ" - эта кнопка и формирует номера по порядку (от 1 до ....). Я уже сделала выборку уволенных водителей и их номера. Теперь необходимо взять эти номера и присваивать водителям, которые поступили на работу. А если номеров нет, то присваивать как обычно по порядку.
Вот код выборки:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|СотрудникиОрганизаций.Физлицо.Наименование  КАК ФизлицоНаименование,
|СотрудникиОрганизаций.Должность.Наименование КАК ДолжностьНаименование,
|СотрудникиОрганизаций.ДатаУвольнения   КАК ДатаУвольнения,
|Заметки.Содержание
| ИЗ
|Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| РегистрСведений.Заметки   КАК Заметки
|ПО Заметки.Объект = СотрудникиОрганизаций.ФизЛицо
|ГДЕ
|СотрудникиОрганизаций.ДатаУвольнения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|И СотрудникиОрганизаций.Должность.Наименование ПОДОБНО "%водитель%"
|";


Код кнопки "Сформировать номера ФЛ":
Процедура КоманднаяПанель2ЗаписатьНомераФЛ(Кнопка)
//Проверим уществование таких значений заметок, как в справочнике виды заметок
Значение = Справочники.ВидыЗаметок.НайтиПоНаименованию("НомерБэйджа");
Если Значение = Справочники.ВидыЗаметок.ПустаяСсылка() Тогда
    Сообщить("Не существует вид заметки НомерБэйджа в справочнике Виды заметок !");
    Возврат;
    КонецЕсли;
    
//Проверим есть ли префикс жд в форме.
Если ЭтаФорма.ЭлементыФормы.Префикс.Значение="" Тогда
    Сообщить("Не заполнен префикс железной дороги!");  
    Возврат;
КонецЕсли;

    
    //Определим последний номер в базе фл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
               |    Заметки.Содержание
               |ИЗ
               |    РегистрСведений.Заметки КАК Заметки
               |ГДЕ
               |    Заметки.ВидЗаметки.Ссылка = &ВидЗаметки
               |
               |УПОРЯДОЧИТЬ ПО
               |    Заметки.Дата УБЫВ";
Запрос.УстановитьПараметр("ВидЗаметки",Значение);
Выборка = Запрос.Выполнить().Выбрать();

//проверим, если таких номеров нет, то начнем с 1го.
Если Выборка.Количество()=0 Тогда
    ПоследнийНомер = 1;
Иначе
    ДлинаНомера = СтрДлина(Выборка.Содержание);
    
    ПоследнийНомер = Прав(Выборка.Содержание,ДлинаНомера-4);
    
    Попытка
        ПоследнийНомер = Число(ПоследнийНомер);
    Исключение
        ПоследнийНомер = 1;
    КонецПопытки;
КонецЕсли;


//Сделаем отбор на галочки по номерам

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

КонецПроцедуры
1 Starhan
 
19.08.13
08:09
(0)>>Я уже сделала выборку уволенных водителей и их номера. Теперь необходимо взять эти номера и присваивать водителям...

Продолжайте описывать свои действия, нам очень интересно.

-------------------
...
|СотрудникиОрганизаций.Должность.Наименование КАК ДолжностьНаименование,
...

ужс если это ЗиУП. Сообщите вышестоящему начальству о проф. не пригодности.
2 Wobland
 
19.08.13
08:11
так уж очень хочется старые номера заюзать?
3 Cube
 
19.08.13
08:35
(0) Почему бы вам не заполнить фото в личной карточке, глядишь и люди бы к вам потянулись... Намёк понятен? :)
4 Jonny_Khomich
 
19.08.13
08:38
(2) цифр и так мало осталось, надо думать об рациональном использовании.
5 Swetlana521911
 
19.08.13
08:40
вот вот именно их надо использовать.... причем это касается только должности "Водитель"
6 Jonny_Khomich
 
19.08.13
08:40
(0) что обозначают цифры в нике?
7 Swetlana521911
 
19.08.13
08:41
Получается водитель уволен его номер надо взять и присвоить к вновь прибывшему водителю, а старого удалить
8 Swetlana521911
 
19.08.13
08:49
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|СотрудникиОрганизаций.Физлицо.Наименование  КАК ФизлицоНаименование,
|СотрудникиОрганизаций.Должность.Наименование КАК ДолжностьНаименование,
|СотрудникиОрганизаций.ДатаУвольнения   КАК ДатаУвольнения,
|Заметки.Содержание
| ИЗ
|Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| РегистрСведений.Заметки   КАК Заметки
|ПО Заметки.Объект = СотрудникиОрганизаций.ФизЛицо
|ГДЕ
|СотрудникиОрганизаций.ДатаУвольнения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|И СотрудникиОрганизаций.Должность.Наименование ПОДОБНО ""%водитель%""
|";


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

вот запрос... как из его результата взять номера и поместить их в массив, а самих владельцев удалить??????????????
9 Jonny_Khomich
 
19.08.13
08:52
(8) я думаю, удалять сотрудников из справочника дурная затея. Проще номер у этого сотрудника затереть и присвоить его другому.
10 Starhan
 
19.08.13
09:01
(9) номер хранится в регистре сведений заметки.
Там же его надо и почистить и присвоить другим.

Не понимаю какой конкретно шаг у ТС вызывает трудности.
11 Peltzer
 
19.08.13
09:04
(7) А если понадобится посмотреть кто под этим беджиком ездил два года назад?
12 Starhan
 
19.08.13
09:05
(11) да просто повешают недостачу на водителя принятого неделю назад. :) Номер то тот же :)
13 Swetlana521911
 
19.08.13
09:26
))))) ну так то да))) ну это уже не мое дело.... мне главное сделать)
14 Swetlana521911
 
19.08.13
09:27
(9) номер хранится в регистре сведений заметки.
Там же его надо и почистить и присвоить другим.

Это и вызывает))) как программно прописать... ?
15 Starhan
 
19.08.13
09:35
http://www.google.ru/#bav=on.2,or.r_qf.&fp=47fbe83b7ce2a8a6&newwindow=1&q=регистр+сведений+удалить+записи
16 Starhan
 
19.08.13
09:35
еще раз
http://www.google.ru/#bav=on.2,or.r_qf.&fp=47fbe83b7ce2a8a6&newwindow=1&q=регистр+сведений+удалить+записи
17 Cyberhawk
 
19.08.13
09:36
Без фото не взлетит уже говорили?
18 Cyberhawk
 
19.08.13
09:36
19 Swetlana521911
 
19.08.13
09:44
1с Предприятие 8.2 (8.2.13.219), Конф ЗУП 2.5
20 Swetlana521911
 
19.08.13
10:59
Результат = Запрос.Выполнить().Выбрать();

МассивНомеров = Новый Массив;

Пока Результат.Следующий() Цикл


  МассивНомеров.Добавить(Результат.Содержание);

  МенеджерЗаписи = РегистрыСведений.Заметки.СоздатьМенеджерЗаписи();
  МенеджерЗаписи.Объект  = Результат.ФизЛицо;  
  МенеджерЗаписи.ВидЗаметки = Результат.ВидЗаметки;
  МенеджерЗаписи.Прочитать();


  Если МенеджерЗаписи.Выбран() Тогда
  
   МенеджерЗаписи.Удалить();
  
  КонецЕсли;

КонецЦикла;
21 Swetlana521911
 
19.08.13
10:59
Вот.. посмотрите все правильно???
22 Cube
 
19.08.13
11:25
(21) Фото на паспорт... Ну, уже что-то, конечно, но по-веселее нет?))
23 Swetlana521911
 
19.08.13
11:45
на работе я)))) нормальной нету)))
24 Cube
 
19.08.13
11:49
(23) В контакте/одноклассниках сто пудова есть, можно оттуда взять и сюда вставить))
25 Cyberhawk
 
19.08.13
11:54
(22) перед тем как просить фото из соцсети, подумай, что нынешнее фото может быть многолетней давности :) Подозрения закрались по циферкам в нике
26 Swetlana521911
 
19.08.13
11:57
А тут вся фишка в фотке или все таки в помощи???
27 Cube
 
19.08.13
12:01
(26) Смотря какое фото)))
К девушкам с удачными фотками желающих помочь набегает больше)))
28 Swetlana521911
 
19.08.13
12:10
АААААА ну вечером поменяю))
29 Swetlana521911
 
19.08.13
13:21
И все-таки кто-нибудь сможет мне помочь????
30 Starhan
 
19.08.13
13:27
(29)Конечно, в чем проблема?
31 Swetlana521911
 
19.08.13
13:32
Выше написана задача...
Думаю идти по такой логике:
1. Находим первого водителя без номера.

2. Находим первую запись со "свободным" номером

3. Если таковой нету, генерим новый номер,  Если такая запись есть, то удаляем эту запись со старого водителя, и присваиваем этот номер новому водителю.

4. Переходим к п.1
32 Swetlana521911
 
19.08.13
13:34
Выборку по новым водителям (т.е. без номера) сделала:
ВЫБРАТЬ
   СотрудникиОрганизаций.Ссылка,
   Заметки.Содержание
ИЗ
   Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Заметки КАК Заметки
       ПО (Заметки.Объект = СотрудникиОрганизаций.Физлицо)
ГДЕ
   СотрудникиОрганизаций.Должность.Наименование ПОДОБНО "%водитель%"
  И  Заметки.Содержание ЕСТЬ NULL

Выборка уволенных водителей тоже есть:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|СотрудникиОрганизаций.Физлицо.Наименование  КАК ФизлицоНаименование,
|СотрудникиОрганизаций.Должность.Наименование КАК ДолжностьНаименование,
|СотрудникиОрганизаций.ДатаУвольнения   КАК ДатаУвольнения,
|Заметки.Содержание
| ИЗ
|Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| РегистрСведений.Заметки   КАК Заметки
|ПО Заметки.Объект = СотрудникиОрганизаций.ФизЛицо
|ГДЕ
|СотрудникиОрганизаций.ДатаУвольнения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|И СотрудникиОрганизаций.Должность.Наименование ПОДОБНО ""%водитель%""
|";
33 Starhan
 
19.08.13
13:35
ну норм.
За исключением того номер может уже ни принадлежать ни текущему водителю, ни уволенному водителю. Номера лучше освобождать сразу при увольнении. И текущую должность надо брать не из справочника, а рс кадровая история сотрудников.
34 Swetlana521911
 
19.08.13
13:35
Как теперь связать все это? То есть взять у уволенных водителей номера и присваивать их к новым, а у уволенных водителей их удалять??
35 Swetlana521911
 
19.08.13
13:37
Пыталась удалить номера...Он ругается(((
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|СотрудникиОрганизаций.Физлицо.Наименование  КАК ФизлицоНаименование,
|СотрудникиОрганизаций.Должность.Наименование КАК ДолжностьНаименование,
|СотрудникиОрганизаций.ДатаУвольнения   КАК ДатаУвольнения,
|Заметки.Содержание
| ИЗ
|Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| РегистрСведений.Заметки   КАК Заметки
|ПО Заметки.Объект = СотрудникиОрганизаций.ФизЛицо
|ГДЕ
|СотрудникиОрганизаций.ДатаУвольнения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|И СотрудникиОрганизаций.Должность.Наименование ПОДОБНО ""%водитель%""
|";
  

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

МассивНомеров = Новый Массив;

Пока Результат.Следующий() Цикл

  // Добавим в массив номер, для дальнейшей его обработки
  МассивНомеров.Добавить(Результат.Содержание);

  МенеджерЗаписи = МенеджерЗаписи = РегистрыСведений.Заметки.СоздатьМенеджерЗаписи();  // освобождение номера, путем удалениедений.Заметки.СоздатьМенеджерЗаписи();
  МенеджерЗаписи.Объект  = Результат.ФизЛицо; // д.б. ключевым полем
  МенеджерЗаписи.ВидЗаметки = Результат.ВидЗаметки; // д.б. ключевым полем
  МенеджерЗаписи.Прочитать();


  Если МенеджерЗаписи.Выбран() Тогда
  
   МенеджерЗаписи.Удалить();
  
  КонецЕсли;
36 Swetlana521911
 
19.08.13
13:38
Ругается на эти 2 строчки :
МенеджерЗаписи.Объект  = Результат.ФизЛицо;

МенеджерЗаписи.ВидЗаметки = Результат.ВидЗаметки;

{Форма.Форма.Форма(950)}: Значение не является значением объектного типа (Объект)
37 Cube
 
19.08.13
13:39
(34) У меня вопрос на засыпку: зачем УДАЛЯТЬ номера у уволенных?
38 Swetlana521911
 
19.08.13
13:41
ну их же надо взять и присвоить к новым
39 Cube
 
19.08.13
13:42
(38) Ну и присваивай. Удалять-то зачем? Пусть будут для истории...
40 Wobland
 
19.08.13
13:43
как вариант.
1. работать при необходимости выдать новый номер;
2. брать любой уволенный, переназначать владельца;
3. нет уволенных - брать макс(0, максимальный из имеющихся)+1;
41 Starhan
 
19.08.13
13:45
(38) а сколько номеров максимум может быть на бейдже?
42 Swetlana521911
 
19.08.13
13:47
(40) ну по сути так и надо. правда все это касается только водителей. Вот один уволился у него был номер, теперь этот номер надо обозначить как свободный. И вот тут новый водитель поступил на работу ему нужен номер. Если есть свободные, то ему присваивается наименьший, а если свободных нет, то мах + 1
43 Swetlana521911
 
19.08.13
13:48
сколько сотрудников столько и номеров. у каждого он индивидуален
44 Wobland
 
19.08.13
13:48
(42) обозначение свободности - в уволенности. в чём затык?
45 Wobland
 
19.08.13
13:49
и я вообще молчу про сомнительность необходимости освобождения номеров
46 Cube
 
19.08.13
13:50
(44) А если договор срочный?))
47 Cube
 
19.08.13
13:50
(45) Вот это +100. Не, ну можно ещё освобождать через месяц после увольнения, но сразу... Будут коллизии 100%.
48 Swetlana521911
 
19.08.13
13:52
ну вот надо сразу...... Уволен - все номер свободен. Его можно отдать другому
49 Swetlana521911
 
19.08.13
13:52
это же бейджики они будут редко меняться
50 Cube
 
19.08.13
13:53
(48) Уволен случайно (ну кадровик после корпоратива не туда тыкнула) - меняй бейджик...
51 Wobland
 
19.08.13
13:55
автор так и не ответила ажно ещё на (2)
52 Swetlana521911
 
19.08.13
13:56
)))))))))) ну получается да)))))
53 Swetlana521911
 
19.08.13
13:57
на что не ответила??))
54 Starhan
 
19.08.13
13:57
(43)Кривая структура хранения данных. Высокая вероятность вылезти какому-нибудь глюку. В любом случае будет копрокод.

Вот тебе вариант.

Удаленных водителей выгружаешь в ТЗ. (сортируешь по номеру)

Обходишь выборку новых водителей.
Внутри проверяешь пустая ли таблица с удаленными водителями.
Если нет. Берешь номер с первой строки. Запись в регистре и ТЗ по водиле удаляешь.
55 Swetlana521911
 
19.08.13
13:59
это понятно на словах...... а вот программно ;((((((((((((((((((((((((((((((((((((((((((((((
56 Starhan
 
19.08.13
13:59
(48)(49) чо-то ты запутала. Когда номер освобожалется при увольнении сразу или редко во время печати бейджев?
57 Wobland
 
19.08.13
14:01
(53) на кой ляд нужна вся эта эротика?
58 mistеr
 
19.08.13
14:03
(42) Сколько у вас водителей? Сколько меняется каждый день?

Есть ли вообще смысл в автоматизации этого процесса? Моожет проще человеку ручками номер перебить. Только отчет ему в помощь, у кого какой номер. И отметить уволенных.
59 Swetlana521911
 
19.08.13
14:03
в общем вот в чем суть....... это все внешняя обработка и за добавление нового номера отвечает кнопка. То есть вот пришел новый водитель надо ему бейджик. Зашли они в обработку нажали кнопку "Заполнить номера" и тогда тут пошел процесс: ищет уволенных, берет их номера, присваивает первый номер ему, если нет номеров свободных то генерируется стандартно, т.е. мах +1
60 Wobland
 
19.08.13
14:04
(59) То есть вот пришел новый водитель надо ему бейджик, генерируется стандартно, т.е. мах +1
ТЧК
61 Swetlana521911
 
19.08.13
14:05
водителей 79. Меняться думаю будут редко. Вот первый раз распечатали всем бейджики и все. Теперь в следующий раз будут печатать только новому сотруднику.
62 Swetlana521911
 
19.08.13
14:05
ну так если есть уволенный водитель и номер у него тогда пропадет...
63 Swetlana521911
 
19.08.13
14:06
а генерировать можно до бесконечности
64 Wobland
 
19.08.13
14:06
(62) светлая память. ты ничего не сказала на эту тему
65 Wobland
 
19.08.13
14:07
(63) не до бесконечности, а до переполнения счётчика
66 Swetlana521911
 
19.08.13
14:07
в общем задача была поставлена брать у уволенных и ставить новым
67 Wobland
 
19.08.13
14:08
(66) слабый аргумент
68 Swetlana521911
 
19.08.13
14:10
например если сотрудников 300, а номеров больше 1000 это тоже не корректно
69 Swetlana521911
 
19.08.13
14:10
а у уволенных номера все равно никак не используются
70 Wobland
 
19.08.13
14:10
(68) почему?
кстати, табельные номера сотрудников освобождаются при увольнении?
71 Wobland
 
19.08.13
14:11
(69) ты уже целый день сидишь над задачей, которая упрощается до безобразия, если не вымудриваться
72 Swetlana521911
 
19.08.13
14:13
ну.... голову ломаю...((
73 Swetlana521911
 
19.08.13
14:14
тем более с 1с я ооочень мало знакома...
74 Wobland
 
19.08.13
14:16
(73) в общем, ты меня не убедила в том, что нужно делать именно так. реализовывать или участвовать в реализации такого алгоритма я не хочу
75 Starhan
 
19.08.13
14:19
(73) ааа. видимо им так важна 1ска раз они ставят такого человека на нее :(
76 Starhan
 
19.08.13
14:22
Если бы мне заплатили за копрокод сделал бы так.

//Уволенные
Запрос = //твой запрос уволенные.

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

Запрос = //твой запрос новые

ВыборкаНовые = Запрос.Выполнить.Выбрать();

Пока ВыборкаНовые.Следующий() Цикл
Если УволенныеТЗ.Количество() >0 Тогда
УдалитьЗаписьРС(УволенныеТЗ[0].Водитель);
номер = УволенныеТЗ.Номер;
УволенныеТЗ.Удалить(0);
ДобавитьЗаписьРС(ВыборкаНовые.Водитель,номер);
Иначе
ДобавитьЗаписьРС(ВыборкаНовые.Водитель);
КонецЦикла;

--
А если бы заплатили хорошо переделал бы структуру нормально :)
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс