ТаблицаЗначений
28.11.2007
10:43
#11
отчет,
слушай точно, ведь в справочнике должности наименование - это строка, а в таблицеРеквизитов получается, что справочник. как же с этим быть?
слушай точно, ведь в справочнике должности наименование - это строка, а в таблицеРеквизитов получается, что справочник. как же с этим быть?
28.11.2007
13:06
#13
"Поскольку высланный мне код оказался не полным и чтобы долго те телепатировать, решил набросать
более оптимальный (в моем понимании) код, показывающий, как надо работать с данными.
//*******************************************
Процедура Сформировать()
Сотр = СоздатьОбъект("Справочник.Сотрудники");
НаДату = ТекущаяДата(); //или брать из диалога
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Сотр");
ТЗ.НоваяКолонка("Пол");
ТЗ.НоваяКолонка("Должность");
ТЗ.НоваяКолонка("Категория");
ТЗ.НоваяКолонка("Кол");
Сотр.ВыбратьЭлементы();
Пока Сотр.ПолучитьЭлемент() = 1 Цикл
Если (Сотр.ЭтоГруппа() = 1)
ИЛИ (ПустоеЗначение(Сотр.Должность.Получить(НаДату)) = 1)
ИЛИ (ПустоеЗначение(Сотр.Пол) = 1) Тогда
Продолжить;
КонецЕсли;
ТЗ.НоваяСтрока();
ТЗ.Сотр = Сотр.ТекущийЭлемент();
ТЗ.Пол = Сотр.Пол;
ТЗ.Должность = Сотр.Должность.Получить(НаДату);
ТЗ.Категория = Сотр.Должность.Получить(НаДату).Категория;
ТЗ.Кол = 1;
КонецЦикла;
//и вот с этой ТЗ можно работать, извлекая из нее все данные
//
ВремТЗ = СоздатьОбъект("ТаблицаЗначений");
//разберемся с полами
ТЗ.Выгрузить(ВремТЗ,,,"Пол,Кол");
ВремТЗ.Свернуть("Пол","Кол");
ВремТЗ.ВыбратьСтроки();
Пока ВремТЗ.ПолучитьСтроку() = 1 Цикл
Сообщить("В организации "+ВремТЗ.Кол+" сотрудников имеют "+ВремТЗ.Пол+" пол");
КонецЦикла;
Сообщить("=========================================================== ========");
ВремТЗ.Очистить();
//теперь с должностями
ТЗ.Выгрузить(ВремТЗ,,,"Должность,Кол");
ВремТЗ.Свернуть("Должность","Кол");
ВремТЗ.ВыбратьСтроки();
Пока ВремТЗ.ПолучитьСтроку() = 1 Цикл
Сообщить("В организации "+ВремТЗ.Кол+" сотрудников в должности "+ВремТЗ.Должность);
КонецЦикла;
Сообщить("=========================================================== ========");
ВремТЗ.Очистить();
//теперь с категориями
ТЗ.Выгрузить(ВремТЗ,,,"Категория,Кол");
ВремТЗ.Свернуть("Категория","Кол");
ВремТЗ.ВыбратьСтроки();
Пока ВремТЗ.ПолучитьСтроку() = 1 Цикл
Сообщить("В организации "+ВремТЗ.Кол+" сотрудников категории "+ВремТЗ.Категория);
КонецЦикла;
КонецПроцедуры
"
более оптимальный (в моем понимании) код, показывающий, как надо работать с данными.
//*******************************************
Процедура Сформировать()
Сотр = СоздатьОбъект("Справочник.Сотрудники");
НаДату = ТекущаяДата(); //или брать из диалога
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Сотр");
ТЗ.НоваяКолонка("Пол");
ТЗ.НоваяКолонка("Должность");
ТЗ.НоваяКолонка("Категория");
ТЗ.НоваяКолонка("Кол");
Сотр.ВыбратьЭлементы();
Пока Сотр.ПолучитьЭлемент() = 1 Цикл
Если (Сотр.ЭтоГруппа() = 1)
ИЛИ (ПустоеЗначение(Сотр.Должность.Получить(НаДату)) = 1)
ИЛИ (ПустоеЗначение(Сотр.Пол) = 1) Тогда
Продолжить;
КонецЕсли;
ТЗ.НоваяСтрока();
ТЗ.Сотр = Сотр.ТекущийЭлемент();
ТЗ.Пол = Сотр.Пол;
ТЗ.Должность = Сотр.Должность.Получить(НаДату);
ТЗ.Категория = Сотр.Должность.Получить(НаДату).Категория;
ТЗ.Кол = 1;
КонецЦикла;
//и вот с этой ТЗ можно работать, извлекая из нее все данные
//
ВремТЗ = СоздатьОбъект("ТаблицаЗначений");
//разберемся с полами
ТЗ.Выгрузить(ВремТЗ,,,"Пол,Кол");
ВремТЗ.Свернуть("Пол","Кол");
ВремТЗ.ВыбратьСтроки();
Пока ВремТЗ.ПолучитьСтроку() = 1 Цикл
Сообщить("В организации "+ВремТЗ.Кол+" сотрудников имеют "+ВремТЗ.Пол+" пол");
КонецЦикла;
Сообщить("===========================================================
ВремТЗ.Очистить();
//теперь с должностями
ТЗ.Выгрузить(ВремТЗ,,,"Должность,Кол");
ВремТЗ.Свернуть("Должность","Кол");
ВремТЗ.ВыбратьСтроки();
Пока ВремТЗ.ПолучитьСтроку() = 1 Цикл
Сообщить("В организации "+ВремТЗ.Кол+" сотрудников в должности "+ВремТЗ.Должность);
КонецЦикла;
Сообщить("===========================================================
ВремТЗ.Очистить();
//теперь с категориями
ТЗ.Выгрузить(ВремТЗ,,,"Категория,Кол");
ВремТЗ.Свернуть("Категория","Кол");
ВремТЗ.ВыбратьСтроки();
Пока ВремТЗ.ПолучитьСтроку() = 1 Цикл
Сообщить("В организации "+ВремТЗ.Кол+" сотрудников категории "+ВремТЗ.Категория);
КонецЦикла;
КонецПроцедуры
"
28.11.2007
13:16
#14
Спасибо большое! Обязательно попробую так. Может, я действительн пошла слишком сложным путем.
08.12.2007
21:10
#15
"Вообще, запросы рулят.
Типа
запрос = создатьОбъект("Запрос");
Если
Запрос.Выполнить("
|сотр = Справочник.Сотрудники;
|Должность = Справочник.Сотрудники.Должность;
|Пол = Справочник.Сотрудники.Пол;
|Группировка Сотр без групп;
|Группировка Должность без групп;
|Группировка Пол;") = 0 Тогда Сообщить("Все плохо!"); возврат КонецЕсли;
колсотр = 0;
Пока Запрос.Группировка(1)=1 Цикл
колпроф = 0;
колсотр = колсотр + 1;
Пока Запрос.Группировка(2)=1 Цикл
колмуж = 0;
кол = 0;
колпроф = колпроф + 1;
Пока Запрос.Группировка(3)=1 Цикл
колмуж = ?(Лев(Запрос.Пол)="М",1,0);
кол = кол + 1;
КонецЦикла;
сообщить("Количество мужчин на должности "+Запрос.Должность+" :"+колмуж);
сообщить("Количество женщин на должности "+Запрос.Должность+" :"+(кол-колмуж));
КонецЦикла;
КонецЦикла;
Ну и т.д."
Типа
запрос = создатьОбъект("Запрос");
Если
Запрос.Выполнить("
|сотр = Справочник.Сотрудники;
|Должность = Справочник.Сотрудники.Должность;
|Пол = Справочник.Сотрудники.Пол;
|Группировка Сотр без групп;
|Группировка Должность без групп;
|Группировка Пол;") = 0 Тогда Сообщить("Все плохо!"); возврат КонецЕсли;
колсотр = 0;
Пока Запрос.Группировка(1)=1 Цикл
колпроф = 0;
колсотр = колсотр + 1;
Пока Запрос.Группировка(2)=1 Цикл
колмуж = 0;
кол = 0;
колпроф = колпроф + 1;
Пока Запрос.Группировка(3)=1 Цикл
колмуж = ?(Лев(Запрос.Пол)="М",1,0);
кол = кол + 1;
КонецЦикла;
сообщить("Количество мужчин на должности "+Запрос.Должность+" :"+колмуж);
сообщить("Количество женщин на должности "+Запрос.Должность+" :"+(кол-колмуж));
КонецЦикла;
КонецЦикла;
Ну и т.д."