Имя: Пароль:
1C
1С v8
Правильное условие Если
,
0 capllary
 
11.02.15
09:03
Как правильно прописать вот это:

Если СтрокаТаблицы.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы И СтрокаТаблицы.Сотрудник Из СписокСотрудников Тогда
1 piter3
 
11.02.15
09:04
забавно вырвать кусок кода и спрашивать
2 capllary
 
11.02.15
09:05
СписокСотрудников это полученный запросом список значений.
3 capllary
 
11.02.15
09:05
Вот эту часть как грамотно оформить: И СтрокаТаблицы.Сотрудник Из СписокСотрудников Тогда
4 n0ther
 
11.02.15
09:06
(0) lol. Синтаксис помощник в руки, в зависимости от типа СписокСотрудников
5 Mankubus
 
11.02.15
09:07
(0) надо чтобы сотрудник был в списке?
6 capllary
 
11.02.15
09:08
(5) Да, проверка на наличие сотрудника в этом списке.
7 Mankubus
 
11.02.15
09:09
(6) читай в СП списокЗначений
8 РеализоВано
 
11.02.15
09:09
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается индекс элемента (нумерация с 0).
9 Mankubus
 
11.02.15
09:11
(8) не, надо НайтиПоЗначению
10 Wern
 
11.02.15
09:12
(9) Если это список значений а не массив, а может это вообще тз с одной колонкой.
11 capllary
 
11.02.15
09:13
(10) Это точно список значений.
12 capllary
 
11.02.15
09:14
Есть идея разделить все это, то есть отделать Если СтрокаТаблицы.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы Тогда, а внутри прописать что-то типа Пока СтрокаТаблицы.Сотрудник В СписокСотрудников Цикл и т.д.
13 Mankubus
 
11.02.15
09:15
(12) ловите наркомана)
14 FIXXXL
 
11.02.15
09:15
Найти юзай
только не строку целиком, а значение из строки
15 РеализоВано
 
11.02.15
09:15
А запросом выбрать сразу то что нужно, не...???
16 piter3
 
11.02.15
09:15
(15) +1
17 FIXXXL
 
11.02.15
09:16
(15) запрос в цикле??? ай=яй-яй :)
18 salvator
 
11.02.15
09:16
(12) Не ну что за люди. Синтакс-помощник лень открыть. И в (9) ответили уже явно. Все равно чего-то надо еще.
19 piter3
 
11.02.15
09:16
(17)просто запрос не?
20 РеализоВано
 
11.02.15
09:16
(17) Какой цикл?? сразу одним запросом все что нужно из таблиц
21 РеализоВано
 
11.02.15
09:17
(20) И глумится дальше на данными как ТС угодно
22 ShoGUN
 
11.02.15
09:21
Что вы к этой строчке прицепились? :) Человек то ли только из клюшек вынырнул, то ли вообще с 1с на "Вы"...
Тут надо кусок кода смотреть, а не одну строчку.
23 ShoGUN
 
11.02.15
09:21
А так-то (9), с учётом (11).
24 capllary
 
11.02.15
09:22
Получилось, правда не без порно:

Если СтрокаТаблицы.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы Тогда
            Пока СписокСотрудников.Следующий() Цикл
                Если СтрокаТаблицы.Сотрудник = СписокСотрудников.Сотрудник Тогда
                СтрокаТаблицы.Показатель1 = 999;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
25 capllary
 
11.02.15
09:24
Не, все равно пока не то. Поменялось только одно значение, первое.
26 ShoGUN
 
11.02.15
09:25
(24) Ты гонишь либо что "получилось", либо в (11).
27 ShoGUN
 
11.02.15
09:26
Нет у списка значений метода Следующий()
28 Wern
 
11.02.15
09:26
(24) А ты говорил что это список значений. "СписокСотрудников.Следующий()" не работает со списками значений, а работает с выборками. Так что где то ты обманываешь.
29 capllary
 
11.02.15
09:26
(26) Да, походу на выходе из запроса не список значений.
30 ShoGUN
 
11.02.15
09:27
(29) По ходу рано ещё код писать, надо ЖКК полистать сначала.
31 Wern
 
11.02.15
09:27
Потому показывай весь где получается этот твой список, а не только это условие.
32 capllary
 
11.02.15
09:28
Если НЕ РаботаСДиалогами.ЗаписатьДокументОтменивПроведениеПередВыполнениемДействия(мОбъект, мФорма, "рассчитать") Тогда
        Возврат;
    КонецЕсли;
    
    ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
    ОбработкаКомментариев.УдалитьСообщения();
    мОбъект.РассчитатьНачисления();
    
    // получить список сотрудников для изменения
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РаботникиОрганизацийСрезПоследних.ГрафикРаботы,
    |    РаботникиОрганизацийСрезПоследних.Сотрудник
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций.СрезПоследних(, ) КАК РаботникиОрганизацийСрезПоследних
    |ГДЕ
    |    РаботникиОрганизацийСрезПоследних.ГрафикРаботы = &График";
    
    //Запрос.УстановитьПараметр("ДатаНачала",            НачалоМесяца(ПериодРегистрации));
    //Запрос.УстановитьПараметр("ДатаОкончания",        КонецМесяца(ПериодРегистрации));
    //Запрос.УстановитьПараметр("ПериодРегистрации",    ПериодРегистрации);
    //Запрос.УстановитьПараметр("Организация",        Организация);
    //Запрос.УстановитьПараметр("ГоловнаяОрганизация",ОбщегоНазначенияЗК.ГоловнаяОрганизация(Организация));
    //Запрос.УстановитьПараметр("РегламентВалюта",    Константы.ВалютаРегламентированногоУчета.Получить());
    //Запрос.УстановитьПараметр("Год",                Год(ПериодРегистрации));
    //Запрос.УстановитьПараметр("ДатаНач",            НачалоКвартала(ПериодРегистрации));
    //Запрос.УстановитьПараметр("ДатаКон",            КонецКвартала(ПериодРегистрации));
    //Запрос.УстановитьПараметр("ПолЖ",                 Перечисления.ПолФизическихЛиц.Женский);
    Запрос.УстановитьПараметр("График",             Справочники.ГрафикиРаботы.НайтиПоНаименованию("Сменный график (учетный период 3 месяца) - 40ч."));
    СписокСотрудников = Запрос.Выполнить().Выбрать();
        
    // корректируем начисления на процент
    ТаблицаНачислений = Новый ТаблицаЗначений;
    ТаблицаНачислений = мОбъект[мИмяТабличнойЧасти].Выгрузить();
    Для Каждого СтрокаТаблицы Из ТаблицаНачислений Цикл
        СтрокаТаблицы.Результат = Окр(СтрокаТаблицы.Результат / 50 * 10, 2, 1);
        Если СтрокаТаблицы.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы Тогда
            Пока СписокСотрудников.Следующий() Цикл
                Если СтрокаТаблицы.Сотрудник = СписокСотрудников.Сотрудник Тогда
                СтрокаТаблицы.Показатель1 = 999;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    мОбъект[мИмяТабличнойЧасти].Загрузить(ТаблицаНачислений);
    
    ОбработкаКомментариев.ПоказатьСообщения();
    
    ТекущаяСтрока = мФорма.ЭлементыФормы.Начисления.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено Тогда
        мСтарыйРезультат                = ТекущаяСтрока.Результат;
        мБылоОтработаноДней                = ТекущаяСтрока.ОтработаноДней;
        мБылоОтработаноЧасов            = ТекущаяСтрока.ОтработаноЧасов;
        мБылоОтработаноДнейПоПятидневке    = ТекущаяСтрока.ОтработаноДнейПоПятидневке;
        мБылоНормаДней                    = ТекущаяСтрока.НормаДней;
        мБылоНормаЧасов                    = ТекущаяСтрока.НормаЧасов;
        мБылоНормаДнейПоПятидневке        = ТекущаяСтрока.НормаДнейПоПятидневке;
        мБылоОплаченоДнейЧасов            = ТекущаяСтрока.ОплаченоДнейЧасов;
    КонецЕсли;
    
    ТекущаяСтрока = мФорма.ЭлементыФормы.ДополнительныеНачисления.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено Тогда
        мСтарыйРезультатТЧДополнительныеНачисления            = ТекущаяСтрока.Результат;
        мБылоОплаченоДнейЧасовТЧДополнительныеНачисления    = ТекущаяСтрока.ОплаченоДнейЧасов;
    КонецЕсли;
    
    ЗаполнитьРасчетныйЛисток(Истина);
        
    Закрыть();
33 FIXXXL
 
11.02.15
09:30
и вот это
СтрокаТаблицы.Показатель1 = 999;
значения не меняет, если ты конечно не в ТЗ запрос выгрузил
34 capllary
 
11.02.15
09:32
(33) Почему? У одного сотрудника поменялось значение на 999.
35 Timon1405
 
11.02.15
09:32
Ох, чувствую, щас насчитают кому-то ЗП... (32)
(32) см. СП меотоды выборки "НайтиСледующий" и "Сбросить"
36 piter3
 
11.02.15
09:34
временные перемещения не учтутся в твоем запросе.
37 capllary
 
11.02.15
09:35
Глобальная цель переделать механизм формирования тарифной ставки для доплаты за ночные часы и только для сотрудников с графиком работы "Сменный график (учетный период 3 месяца) - 40ч." на новую формулу: ТарифнаяСтавкаМесячная * 3 / НормаЧасовЗаКвартал (по производственному календарю)
38 capllary
 
11.02.15
09:36
(36) Почему?
39 FIXXXL
 
11.02.15
09:38
(34) увидел код, тут поменяется
"но только один разик" :)

метод Следующий() позиционирует курсор на конец выборки и обратно не возвращает

юзай Найти, будет проще и код читабельнее
40 FIXXXL
 
11.02.15
09:39
(39)+ позиционирует в твоем цикле
41 piter3
 
11.02.15
09:41
(38)чел может быть переведен на неделю на другой график,а потом вернуться на твой
42 Kumar_K
 
11.02.15
09:42
Знаете, что забавляет на форуме
Зачем людям которые не знают основ программирования, не умеют крутить циклы, не имют представление о запросах, не могут понять или прочитать книг коих масса, открывать конфигуратор.
43 piter3
 
11.02.15
09:42
(42)хихи многие не открывают.даже не знаю,что лучше
44 vhl
 
11.02.15
09:43
(32) "НайтиПоНаименованию". Mother of god...
45 ilyavorobyev
 
11.02.15
09:43
ТС где траву брал?
46 Serg_1960
 
11.02.15
09:45
"Да, походу на выходе из запроса не список значений."(capllary)

Пятница, внезапно, началась в среду :)
47 Kumar_K
 
11.02.15
09:46
А потом говорят 1С не программисты.
Я конечно понимаю, что 1С знать предметную область может и главное и в ней быть богом, но черт ....
48 ShoGUN
 
11.02.15
09:46
(33) Ты код внимательней читай.
(35) Не нужна ему выборка.
(37) В принципе, код почти рабочий, но не очень эффективный и с кучей ошибок новичка.
Лучше не использовать выборку и перебор, а выгрузить сотрудников из результата в ТЗ или массив, и в полученной коллекции искать.

А так надо перед циклом Пока СписокСотрудников.Следующий() Цикл
добавить
СписокСотрудников.Сбросить()

Сейчас у тебя выборка после первого прохода цикла остаётся позиционированной в конце и вложенный цикл Пока СписокСотрудников.Следующий() Цикл выполняется только один раз.

Но лучше весь код переписать, хотя бы из-за того, что выборка тут неэффективна и вот так:
Справочники.ГрафикиРаботы.НайтиПоНаименованию("Сменный график (учетный период 3 месяца) - 40ч.")

делать не надо. При переименовании графика всё полетит к чертям. Хардкодинг - зло.
49 ShoGUN
 
11.02.15
09:54
Да, и (41) прав, тут всё несколько сложнее.
50 Timon1405
 
11.02.15
09:59
(48) >>Лучше не использовать выборку и перебор, а выгрузить сотрудников из результата в ТЗ или массив, и в полученной коллекции искать.
Чем это лучше метода НайтиСледующий у выборки?
51 capllary
 
11.02.15
10:05
(48) Справочники.ГрафикиРаботы.НайтиПоНаименованию("Сменный график (учетный период 3 месяца) - 40ч.")


Сам никогда так не ставлю, просто у справочника даже кода нет.
52 piter3
 
11.02.15
10:06
(51) на форму вынести реквизит не?
53 kosts
 
11.02.15
10:10
В запрос можно передать ТЗ с номером строки и сотрудником.
Сделать отбор. Мало смысла тащить всех сотрудников.
Тогда обработка упрощается.
54 capllary
 
11.02.15
10:13
(48) СписокСотрудников.Сбросить()  помогло.
55 kosts
 
11.02.15
10:23
Не забудь про важное замечание
> временные перемещения не учтутся в твоем запросе.

Плюс срез надо делать на конкретную дату. А то заплатите лишнее или не доплатите, в общем косяк будет... )))
56 kosts
 
11.02.15
10:25
(55) А еще лучше срезать на дату начисления. Т.к. сотруднику могут и в середине что-то поменять.
57 kosts
 
11.02.15
10:26
(56) *середине месяца
58 capllary
 
11.02.15
10:26
(55) Ок, спасибо. Учтем.
59 piter3
 
11.02.15
10:26
(37) не пойму,а почему нельзя поменять на вид расчета с нужной формулой
60 kosts
 
11.02.15
10:29
(59) Там не формулы, а что-то с чем-то у нас на предприятии куча начислений разных, так по формуле рассчитывается только одно:  Результат = Сумма
Все остальное в коде исправлено.
61 capllary
 
11.02.15
10:34
(59) Потому что к примеру, там нельзя высчитать НормуЧасовЗаКвартал.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.