ТаблицаЗначений
Показывать по
10
20
40
сообщений
- 1
- 2
28.11.2007
01:25
#1
"Всем привет! проблема такая: есть таблица значений, которая содержит список должностей и категорий иесть переменная "Должность", которая содержит определенные должности. Как из таблицы значений получить категорию той должности, которая содержится в переменной "Должность";
Заранее спасибо!"
Заранее спасибо!"
28.11.2007
08:42
#2
С пом. метода "НайтиЗначение" ищется строка с нужной должностью, а методом "ПолучитьЗначение" по найденному номеру строки получим категорию.
28.11.2007
08:54
#3
"Спасибо! Это я уже получила. Теперь мне надо подсчитать численность сотрудников по мужчина и женщинам, так еще и по атегориям, то есть:
Женщина рабочий, женщина руководитель, мужчина рабочий и т.п.
Я условияе прописываю, а программа все равно считает только в общем по мужчинам и женщинам. Вот код:
СпрСотр.ПорядокНаименований();
СпрСотр.ВыбратьЭлементы(0);
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
Если СпрСотр.ЭтоГруппа()=1 Тогда
Продолжить
КонецЕсли;
Сотрудник = СпрСотр.ТекущийЭлемент();
Если Сотрудник.ОсновнойЭлемент=Сотрудник Тогда
СписокСотр.ДобавитьЗначение(Сотрудник);
КонецЕсли;
КонецЦикла;
//перебираем сотрудников в списке
Для Сч = 1 По СписокСотр.РазмерСписка() Цикл
Сотрудник = СписокСотр.ПолучитьЗначение(Сч);
Если Найти(Сотрудник.Пол.Наименование,"М") > 0 Тогда
Женщина = 0;
Мужчина = 1;
Иначе
Женщина = 1;
Мужчина = 0;
КонецЕсли;
ТаблицаРеквизитов = глПолучитьТаблицуИсторииРеквизитов(Сотрудник,ДатаАктуальности,ДатаАктуальности,"СостояниеФизлица,Должность,ФормаТруда,ГрафикРаботы");
ТаблицаРеквизитов.ВставитьКолонку("Кат");
КоличествоСтрок = ТаблицаРеквизитов.КоличествоСтрок();
//перебираем строки в ТаблицеРеквизитов
Для Номер = 1 по КоличествоСтрок Цикл
ТаблицаРеквизитов.ПолучитьСтрокуПоНомеру(Номер);
СостояниеФизлица = ТаблицаРеквизитов.СостояниеФизлица;
Должность = ТаблицаРеквизитов.Должность;
Для НомСтроки = 1 по ТаблицаДолжностей.КоличествоСтрок() цикл
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтроки, НомКолонки);
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтроки, 2);
ТаблицаРеквизитов.УстановитьЗначение(Номер, "Кат", Кат); КонецЦикла;
//проверка состояния физлица
Если СостояниеФизлица = Перечисление.СостояниеФизлица.СотрудникОсновной тогда
Категория = ТаблицаРеквизитов.Кат;
Если Категория = Перечисление.КатегорииСотрудников.Рабочие тогда
ФормаОплаты = ТаблицаРеквизитов.ФормаТруда;
//проверка формы оплаты труда
Если ((ФормаОплаты=Перечисление.ФормыТруда.ТабельПодневнОклад) или (ФормаОплаты=Перечисление.ФормыТруда.ТабельПочасОклад) или (ФормаОплаты=Перечисление.ФормыТруда.ТабельПочасТариф)) Тогда // для работающих неполное время при учете времени табелями
ГрафикРаботы = ТаблицаРеквизитов.ГрафикРаботы;
Если ПустоеЗначение(ГрафикРаботы)=1 Тогда
ГрафикРаботы = Константа.ОсновнойГрафик;
КонецЕсли;
Если ПустоеЗначение(ГрафикРаботы)=1 Тогда
Календарь = СоздатьОбъект("Календарь.Пятидневка");
Иначе
Календарь = ГрафикРаботы.ОсновныеЧасы;
КонецЕсли;
ЖурналРасчетовЗарплата.ВыбратьЗаписиПоОбъекту(Сотрудник, ДатаАктуальности, ДатаАктуальности);
Если (Женщина = 1) и (Мужчина = 0) тогда
СписокЖенщинРаб.ДобавитьЗначение(Сотрудник);
ИначеЕсли (Женщина = 0) и (Мужчина = 1) тогда
СписокМужчинРаб.ДобавитьЗначение(Сотрудник);
КонецЕсли;
КолЖенщинРаб = СписокЖенщинРаб.РазмерСписка();
КолМужчинРаб = СписокМужчинРаб.РазмерСписка();
КонецЕсли; //проверка формы оплаты труда
КонецЕсли; //проверка состояния физлица
КонецЕсли; //проверка категории
КонецЦикла; //перебора строк ТаблицыРеквизитов
КонецЦикла; //перебора сотрудников"
Женщина рабочий, женщина руководитель, мужчина рабочий и т.п.
Я условияе прописываю, а программа все равно считает только в общем по мужчинам и женщинам. Вот код:
СпрСотр.ПорядокНаименований();
СпрСотр.ВыбратьЭлементы(0);
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
Если СпрСотр.ЭтоГруппа()=1 Тогда
Продолжить
КонецЕсли;
Сотрудник = СпрСотр.ТекущийЭлемент();
Если Сотрудник.ОсновнойЭлемент=Сотрудник Тогда
СписокСотр.ДобавитьЗначение(Сотрудник);
КонецЕсли;
КонецЦикла;
//перебираем сотрудников в списке
Для Сч = 1 По СписокСотр.РазмерСписка() Цикл
Сотрудник = СписокСотр.ПолучитьЗначение(Сч);
Если Найти(Сотрудник.Пол.Наименование,"М") > 0 Тогда
Женщина = 0;
Мужчина = 1;
Иначе
Женщина = 1;
Мужчина = 0;
КонецЕсли;
ТаблицаРеквизитов = глПолучитьТаблицуИсторииРеквизитов(Сотрудник,ДатаАктуальности,ДатаАктуальности,"СостояниеФизлица,Должность,ФормаТруда,ГрафикРаботы");
ТаблицаРеквизитов.ВставитьКолонку("Кат");
КоличествоСтрок = ТаблицаРеквизитов.КоличествоСтрок();
//перебираем строки в ТаблицеРеквизитов
Для Номер = 1 по КоличествоСтрок Цикл
ТаблицаРеквизитов.ПолучитьСтрокуПоНомеру(Номер);
СостояниеФизлица = ТаблицаРеквизитов.СостояниеФизлица;
Должность = ТаблицаРеквизитов.Должность;
Для НомСтроки = 1 по ТаблицаДолжностей.КоличествоСтрок() цикл
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтроки, НомКолонки);
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтроки, 2);
ТаблицаРеквизитов.УстановитьЗначение(Номер, "Кат", Кат); КонецЦикла;
//проверка состояния физлица
Если СостояниеФизлица = Перечисление.СостояниеФизлица.СотрудникОсновной тогда
Категория = ТаблицаРеквизитов.Кат;
Если Категория = Перечисление.КатегорииСотрудников.Рабочие тогда
ФормаОплаты = ТаблицаРеквизитов.ФормаТруда;
//проверка формы оплаты труда
Если ((ФормаОплаты=Перечисление.ФормыТруда.ТабельПодневнОклад) или (ФормаОплаты=Перечисление.ФормыТруда.ТабельПочасОклад) или (ФормаОплаты=Перечисление.ФормыТруда.ТабельПочасТариф)) Тогда // для работающих неполное время при учете времени табелями
ГрафикРаботы = ТаблицаРеквизитов.ГрафикРаботы;
Если ПустоеЗначение(ГрафикРаботы)=1 Тогда
ГрафикРаботы = Константа.ОсновнойГрафик;
КонецЕсли;
Если ПустоеЗначение(ГрафикРаботы)=1 Тогда
Календарь = СоздатьОбъект("Календарь.Пятидневка");
Иначе
Календарь = ГрафикРаботы.ОсновныеЧасы;
КонецЕсли;
ЖурналРасчетовЗарплата.ВыбратьЗаписиПоОбъекту(Сотрудник, ДатаАктуальности, ДатаАктуальности);
Если (Женщина = 1) и (Мужчина = 0) тогда
СписокЖенщинРаб.ДобавитьЗначение(Сотрудник);
ИначеЕсли (Женщина = 0) и (Мужчина = 1) тогда
СписокМужчинРаб.ДобавитьЗначение(Сотрудник);
КонецЕсли;
КолЖенщинРаб = СписокЖенщинРаб.РазмерСписка();
КолМужчинРаб = СписокМужчинРаб.РазмерСписка();
КонецЕсли; //проверка формы оплаты труда
КонецЕсли; //проверка состояния физлица
КонецЕсли; //проверка категории
КонецЦикла; //перебора строк ТаблицыРеквизитов
КонецЦикла; //перебора сотрудников"
28.11.2007
09:23
#4
""Для НомСтроки = 1 по ТаблицаДолжностей.КоличествоСтрок() цикл"
"ТаблицаДолжностей.НайтиЗначение(Должность, НомСтроки, НомКолонки);"
Неправильно это, что во второй строке имя переменной куда запоминается номер найденной строки совпадает с именем переменной цикла. Лучше так:
Для НомСтроки = 1 по ТаблицаДолжностей.КоличествоСтрок() цикл
НомСтр = 0;
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки);"
"ТаблицаДолжностей.НайтиЗначение(Должность, НомСтроки, НомКолонки);"
Неправильно это, что во второй строке имя переменной куда запоминается номер найденной строки совпадает с именем переменной цикла. Лучше так:
Для НомСтроки = 1 по ТаблицаДолжностей.КоличествоСтрок() цикл
НомСтр = 0;
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки);"
28.11.2007
09:37
#5
" тогда получается так:
Для НомСтроки = 1 по ТаблицаДолжностей.КоличествоСтрок() цикл
НомСтр = 0;
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки);
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
ТаблицаРеквизитов.УстановитьЗначение(Номер, "Кат", Кат); // = ТаблицаДолжностей.ПолучитьЗначение(НомСтроки, 2);
КонецЦикла;
но программа выдает ошибку, что номер за пределами значения"
Для НомСтроки = 1 по ТаблицаДолжностей.КоличествоСтрок() цикл
НомСтр = 0;
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки);
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
ТаблицаРеквизитов.УстановитьЗначение(Номер, "Кат", Кат); // = ТаблицаДолжностей.ПолучитьЗначение(НомСтроки, 2);
КонецЦикла;
но программа выдает ошибку, что номер за пределами значения"
28.11.2007
09:45
#6
"А если так:
Для Номер = 1 по КоличествоСтрок Цикл
ТаблицаРеквизитов.ПолучитьСтрокуПоНомеру(Номер);
СостояниеФизлица = ТаблицаРеквизитов.СостояниеФизлица;
Должность = ТаблицаРеквизитов.Должность;
НомСтр = 0;
НомКолонки = 0;
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки);
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
ТаблицаРеквизитов.Кат = Кат;
Лишний цикл."
Для Номер = 1 по КоличествоСтрок Цикл
ТаблицаРеквизитов.ПолучитьСтрокуПоНомеру(Номер);
СостояниеФизлица = ТаблицаРеквизитов.СостояниеФизлица;
Должность = ТаблицаРеквизитов.Должность;
НомСтр = 0;
НомКолонки = 0;
ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки);
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
ТаблицаРеквизитов.Кат = Кат;
Лишний цикл."
28.11.2007
09:55
#7
" все равно та же ошибка, когда доходит до этой строки:
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
"
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
"
28.11.2007
10:07
#8
"Значит, скорее всего не находит значение в ТаблицаДолжностей и НомСтр = 0.
Возможно типы значений "Должность" в ТаблицаРеквизитов и ТаблицаДолжностей разные.
Попробуй:
НомСтр = 0;
НомКолонки = 0;
Если ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки)=1 Тогда
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
ТаблицаРеквизитов.Кат = Кат;
Иначе
Сообщить("Найти не удалось. НомСтр="+НомСтр);
КонецЕсли;
А вообще отладчиком быстрее.
"
Возможно типы значений "Должность" в ТаблицаРеквизитов и ТаблицаДолжностей разные.
Попробуй:
НомСтр = 0;
НомКолонки = 0;
Если ТаблицаДолжностей.НайтиЗначение(Должность, НомСтр, НомКолонки)=1 Тогда
Кат = ТаблицаДолжностей.ПолучитьЗначение(НомСтр, 2);
ТаблицаРеквизитов.Кат = Кат;
Иначе
Сообщить("Найти не удалось. НомСтр="+НомСтр);
КонецЕсли;
А вообще отладчиком быстрее.
"
28.11.2007
10:25
#9
так он и пишет, что не удалось найти НомСтр = 0
а вот так, как у меня было в первый раз в отладчике все нормально показывал
только вот условие не выполнял
а вот так, как у меня было в первый раз в отладчике все нормально показывал
только вот условие не выполнял
28.11.2007
10:39
#10
Это было неправильно. Значение переменной-счетчика цикла передавалось методу НайтиЗначение. А как сказано в Писании (ЖКК):
<Строка> - идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.
Проверь, совпадают ли типы значений в таблицах.
Что пишешь? Отчет, обработку?
<Строка> - идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.
Проверь, совпадают ли типы значений в таблицах.
Что пишешь? Отчет, обработку?
- 1
- 2
Читают тему
(гостей: 1)