Имя: Пароль:
1C
1С v8
Движения в регистр накопления
,
0 Сергей333
 
17.08.17
11:19
Ребят помогите плиз, запарил этот документ уже. В общем Есть документ  "МаршрутнаяКартаПроизводства" и таб.часть "ТехнологическиеОперации". В таб. части есть колонка "ВремяНачала" и "ВремяОкончания", так вот если заполнено "ВремяНачала" а Не заполнено "ВремяОкончания" тогда движение должно быть в Приход. А если заполнено и то и другое должно быть в Расход. Но проблема в том что если в таб.части документа присуцтвует одна строка, то все норм, а если две тогда он пишет и Приход и Расход и плюс удваивает. Что делать уже не пойму.
Пытался сделать:     Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала)  Тогда
            Движения.ВыполнениеМаршрутныхКарт.ВыполнитьРасход();
        КонецЕсли;
    КонецЦикла;    
    Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если Не ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) Тогда
            Движения.ВыполнениеМаршрутныхКарт.ВыполнитьПриход();
        КонецЕсли;
    КонецЦикла;
1 1dvd
 
17.08.17
11:21
где заполнение измерений, ресурсов и реквизитов регистра?
2 vicof
 
17.08.17
11:21
Ну ты быть хоть синтакс-помощник почитал
3 Сергей333
 
17.08.17
11:22
Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И ЗначениеЗаполнено(ТекСтрока.ВремяОкончания)  Тогда
            Движения.ВыполнениеМаршрутныхКарт.ВыполнитьРасход();
        КонецЕсли;
    КонецЦикла;    
    
    Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И Не ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) Тогда
            Движения.ВыполнениеМаршрутныхКарт.ВыполнитьПриход();
        КонецЕсли;
    КонецЦикла;
4 ColonelAp4u
 
17.08.17
11:23
Зачем двойной цикл?
5 vicof
 
17.08.17
11:24
Чтобы точно сработало
6 1dvd
 
17.08.17
11:24
это не двойной цикл. Это два независимых цикла
7 ColonelAp4u
 
17.08.17
11:25
Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И Не ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) Тогда
       Движения.ВыполнениеМаршрутныхКарт.ВыполнитьПриход();
ИначеЕсли ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И ЗначениеЗаполнено(ТекСтрока.ВремяОкончания)  Тогда
Движения.ВыполнениеМаршрутныхКарт.ВыполнитьРасход();        
КонецЕсли;
    КонецЦикла;
8 r_i_n_i_k
 
17.08.17
11:25
(5) что бы точно сработало цикл должден быть не двойной ,а от 0 до 65535
тогда эти гады точно никуда не денутся и пропишутся в РН как надо!)
9 ColonelAp4u
 
17.08.17
11:26
(6) я про то зачем одно и тоже дважды в циклах прогонять с разными условиями
10 1dvd
 
17.08.17
11:27
(9) меня больше (1) интересует. Потому что иначе это пустой пук от таких движений
11 ColonelAp4u
 
17.08.17
11:28
(10) ну это да)
12 Рэйв
 
17.08.17
11:29
Движения.ВыполнениеМаршрутныхКарт.ВыполнитьРасход(); - как подсознательное желание большой розовой кнопки "СДЕЛАТЬ ВСЕ!"
:-)
13 Сергей333
 
17.08.17
11:29
(7) Пишет Прихода два и Расхода 2
14 1dvd
 
17.08.17
11:30
(13) а строк сколько?
15 Сергей333
 
17.08.17
11:31
(14) 4
16 1dvd
 
17.08.17
11:31
(15) ну, и?
17 Сергей333
 
17.08.17
11:32
(14) Сорь. Строк в ТЧ 2, только в первой заполнено ВремяНачала и ВремяОкончания, а в другой строке только ВремяНачала.
18 1dvd
 
17.08.17
11:32
(17) на (1) будет ответ?
19 Сергей333
 
17.08.17
11:35
(18) В Обработке проведения
20 Альбатрос
 
17.08.17
11:36
=)
21 vicof
 
17.08.17
11:37
Мило
22 lera01
 
17.08.17
11:40
(17) Вы же по всем движениям делаете расход, если хоть в какой-то строке есть для этого условия. Все так и должно работать. Постарайтесь изменить логику таким образом, чтобы в цикле по строкам для каждой строки а зависимости от заполненности дат определять вид движения - приход или расход.
23 ColonelAp4u
 
17.08.17
11:43
Пришли код из обработки проведения где заполняются измерения
24 ColonelAp4u
 
17.08.17
11:43
что то подсказывает что там уже делается движение, а потом снова двигаешь циклом.
25 Сергей333
 
17.08.17
11:46
(22) Я это понимаю что так нужно сделать. Но опыта очень мало, я недавно этим занимаюсь. так сказать учусь.
26 Сергей333
 
17.08.17
11:46
(23) Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    Если мУдалятьДвижения Тогда
        ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ);
    КонецЕсли;

    // Сформируем структуру реквизитов шапки документа
    СтруктураШапкиДокумента = ОбщегоНазначения.СформироватьСтруктуруШапкиДокумента(ЭтотОбъект);

    // Заголовок для сообщений об ошибках проведения.
    Заголовок = ОбщегоНазначения.ПредставлениеДокументаПриПроведении(СтруктураШапкиДокумента);

    //// Заполним по шапке документа дерево параметров, нужных при проведении.
    ДеревоПолейЗапросаПоШапке = ОбщегоНазначения.СформироватьДеревоПолейЗапросаПоШапке();
    СтруктураШапкиДокумента = УправлениеЗапасами.СформироватьЗапросПоДеревуПолей(ЭтотОбъект, ДеревоПолейЗапросаПоШапке, СтруктураШапкиДокумента, ПолучитьВалютуРегламентированногоУчета());
    
    
    // Проверим правильность заполнения шапки документа
    ПроверитьЗаполнениеШапки(СтруктураШапкиДокумента, Отказ, Заголовок);
    
    // Получим необходимые данные для проведения и проверки заполенения данных по табличной части "БланкиСтрогогоУчета".
    СтруктураПолей = Новый Структура;
    СтруктураПростыхПолей = Новый Структура;
    СтруктураПолей.Вставить("Операция" , "Операция");
    СтруктураПолей.Вставить("НомерОперации" , "НомерОперации");
    СтруктураПолей.Вставить("Получил"  , "Получил");
    СтруктураПолей.Вставить("Выполнил" , "Выполнил");
    СтруктураПолей.Вставить("ВремяНачала"   , "ВремяНачала");
    СтруктураПолей.Вставить("ВремяОкончания" , "ВремяОкончания");

    РезультатЗапросаПоТехнологическимОперациям = ОбщегоНазначения.СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, "ТехнологическиеОперации", СтруктураПолей, СтруктураПростыхПолей);
    
    // Подготовим таблицу товаров для проведения.
    ТаблицаПоТехнологическимОперациям = ПодготовитьТаблицуТехнологическихОпераций(РезультатЗапросаПоТехнологическимОперациям, СтруктураШапкиДокумента);
    
    // Проверить заполнение ТЧ "Товары".
    ПроверитьЗаполнениеТабличнойЧастиТехнологическиеОперации(ТаблицаПоТехнологическимОперациям, СтруктураШапкиДокумента, Отказ, Заголовок);

    // Движения по документу
    ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТехнологическимОперациям, Отказ, Заголовок);
    
    Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И Не ЗначениеЗаполнено(ТекСтрока.Получил) Тогда
            Предупреждение("Не заполнен реквизит Получил");
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;    
    
    Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) И Не ЗначениеЗаполнено(ТекСтрока.Выполнил) Тогда
            Предупреждение("Не заполнен реквизит Выполнил");
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;    
    
    Движения.ВыполнениеМаршрутныхКарт.Записывать = Истина;

КонецПроцедуры // ОбработкаПроведения()
27 dezss
 
17.08.17
11:49
(26) теперь покажи процедуру ДвиженияПоРегистрам
28 Сергей333
 
17.08.17
11:50
Процедура ДвиженияПоРегиструВыполнениеМаршрутныхКарт(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТехнологическимОперациям, Отказ, Заголовок)
    
    НаборДвижений = Движения.ВыполнениеМаршрутныхКарт;

    // Получим таблицу значений, совпадающую со струкутрой набора записей регистра.
    ТаблицаДвижений = НаборДвижений.Выгрузить();
    ТаблицаДвижений.ЗаполнитьЗначения(ЭтотОбъект.Ссылка, "МаршрутнаяКартаПроизводства");  
    НаборДвижений.Загрузить(ТаблицаДвижений);
    
    // Заполним таблицу движений.
    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТехнологическимОперациям, ТаблицаДвижений);

    
    НаборДвижений.мПериод            = Дата;
    НаборДвижений.мТаблицаДвижений   = ТаблицаДвижений;
    
    Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И Не ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) Тогда
            Движения.ВыполнениеМаршрутныхКарт.ВыполнитьПриход();    
    ИначеЕсли ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И ЗначениеЗаполнено(ТекСтрока.ВремяОкончания)  Тогда
                Движения.ВыполнениеМаршрутныхКарт.ВыполнитьРасход();        
        КонецЕсли;
    КонецЦикла;    
    
    
КонецПроцедуры
29 ColonelAp4u
 
17.08.17
11:55
(28)    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТаблицаПоТехнологическимОперациям, ТаблицаДвижений);
Вот тут уже делает движения если я не ошибаюсь
30 Сергей333
 
17.08.17
11:59
(29) Без этого регистр пуст.
31 ColonelAp4u
 
17.08.17
12:03
(30) а теперь по пробуй закомментировать вот это  
    Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И Не ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) Тогда
            Движения.ВыполнениеМаршрутныхКарт.ВыполнитьПриход();    
    ИначеЕсли ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И ЗначениеЗаполнено(ТекСтрока.ВремяОкончания)  Тогда
                Движения.ВыполнениеМаршрутныхКарт.ВыполнитьРасход();        
        КонецЕсли;
    КонецЦикла;    
а (29)  оставь в рабочем виде
32 Сергей333
 
17.08.17
12:05
(31) Пусто
33 ColonelAp4u
 
17.08.17
12:06
(31) это будет типовой вариант работы записи в данный регистр, именно с 2мя строчками как в ТЧ.
Далее если тебе нужно написать свои движухи тогда все в комментарии и пишешь свои движения в цикле  условиями.
34 ColonelAp4u
 
17.08.17
12:07
(32) team vieawer есть?
35 1dvd
 
17.08.17
12:08
(28) ты сначала заполняешь движения по всем строкам, потом делаешь Приход по всем строкам и расход по всем строкам
36 Сергей333
 
17.08.17
12:11
(34) Нету. Офисный ПК.
37 Сергей333
 
17.08.17
12:13
Как я себе представляю и как сказал (22), мне просто нужно в этом цикле     Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И Не ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) Тогда
            Движения.ВыполнениеМаршрутныхКарт.ВыполнитьПриход();    
    ИначеЕсли ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И ЗначениеЗаполнено(ТекСтрока.ВремяОкончания)  Тогда
                Движения.ВыполнениеМаршрутныхКарт.ВыполнитьРасход();        
        КонецЕсли;
    КонецЦикла;    
прописать толи проверку толи движение по строкам.
38 ВРедная
 
17.08.17
12:16
(37) тебе нужно прочитать и понять, что такое ВыполнитьРасход() и ВыполнитьПриход()
По каким строкам эти команды делают движения.

Ты думаешь, программа волшебным образом подбирает строки для прихода и расхода?

Может их нужно как-то задать самостоятельно? Отдельно расход и приход?
Или вместо этого воспользоваться другим методом?
39 Сергей333
 
17.08.17
12:18
(38) А для чего тогда условия Если?
40 vicof
 
17.08.17
12:20
(39) Ты не поверишь
41 ВРедная
 
17.08.17
12:21
(39) еще раз. Что такое по-твоему, команда "Выполнить приход"?
Откуда она берет данные, которые записывает в приход?
Ты их где-то прописал? Где? Отдельно приход? Или все строки вместе? Как программе отделить твои приходы от расходов?

И еще раз, контрольный, самый главный: "Что такое команда "ВыполнитьПриход"?
42 ColonelAp4u
 
17.08.17
12:22
(39) ты не понял, (38) тут говорят то выполнить приход делается не по строке а таблице движений как и выполнить расход, я тебе уже предлагал, комментируй все полностью и пиши свои движения. в цикле.
43 Сергей333
 
17.08.17
12:42
Это движения из 1С7. Как переделать на 8-ку?
// ===============================
Процедура ДвижениеСтрокаМаршрутнаяКарта( СерийныйНомерПродукции = 0, ЭтоТекущаяОперация = 0 )
    
    Регистр.ВыполнениеМаршрутныхКарт.ПривязыватьСтроку(НомерСтроки);    
    Регистр.ВыполнениеМаршрутныхКарт.СерийныйНомерПродукции = СерийныйНомерПродукции;
    Регистр.ВыполнениеМаршрутныхКарт.МаршрутнаяКарта         = ТекущийДокумент();
    Регистр.ВыполнениеМаршрутныхКарт.НомерОперации           = НомерОперации;
    Регистр.ВыполнениеМаршрутныхКарт.ТехнологическаяОперация = ТехнологическаяОперация;
    Регистр.ВыполнениеМаршрутныхКарт.Количество         = 1;    
    Регистр.ВыполнениеМаршрутныхКарт.ДатаНачала              = ДатаНачала;
    Регистр.ВыполнениеМаршрутныхКарт.Получил                   = Получил;
    Регистр.ВыполнениеМаршрутныхКарт.ДатаОкончания          = ДатаОкончания;        
    Регистр.ВыполнениеМаршрутныхКарт.Выполнил               = Выполнил;
    
    Если (ПустоеЗначение(ДатаНачала) = 0) Или ( ЭтоТекущаяОперация = 1) Тогда
        Регистр.ВыполнениеМаршрутныхКарт.ДвижениеПриходВыполнить();
    КонецЕсли;
    
    Если ПустоеЗначение(ДатаОкончания) = 0 Тогда
        Регистр.ВыполнениеМаршрутныхКарт.ДвижениеРасходВыполнить();
    КонецЕсли;
    
КонецПроцедуры

// ===============================
Процедура ДвиженияМаршрутнаяКарта()
    
    Если спСерНомераПродукции.РазмерСписка() = 0 Тогда
        
        ПредДатаОкончания = '..';
        НайденаТекущаяОперация = 0;
        
        
        ВыбртьСтроки();
        Пока ПолучитьСтроку() = 1 Цикл
            ЭтоаТекущаяОперация = 0;
            Если (ПустоеЗначение(ДатаНачала) = 1) И (НомерСтроки = 1) // если в первой строке документа не указана дата начала ...
                Или (ПустоеЗначение(ПредДатаОкончания) = 0) И (ПустоеЗначение(ДатаОкончания) = 1) И (НайденаТекущаяОперация = 0) Тогда
                // ... или дата окончания в предыдущей строке указана, а в текущей - нет, тогда это текущая операция
                ЭтоТекущаяОперация = 1;
                НайденаТекущаяОперация = 1;
            КонецЕсли;
            ДвижениеСтрокаМаршрутнаяКарта( , ЭтоТекущаяОперация );
            ПредДатаОкончания = ДатаОкончания;
        КонецЦикла;
        
    Иначе
        ПредДатаОкончания = '..';
        НайденаТекущаяОперация = 0;
        
        
        ВыбратьСтроки();
        Пока ПолучитьСтроку() = 1 Цикл
            ЭтоТекущаяОперация = 0;
            Если (ПустоеЗначение(ДатаНачала) = 1) И (НомерСтроки = 1) // если в первой строке документа не указана дата начала ...
                Или (ПустоеЗначение(ПредДатаОкончания) = 0) И (ПустоеЗначение(ДатаОкончания) = 1) И (НайденаТекущаяОперация = 0) Тогда
                // ... или дата окончания в предыдущей строке указана, а в текущей - нет, тогда это текущая операция
                ЭтоТекущаяОперация = 1;
                НайденаТекущаяОперация = 1;
            КонецЕсли;
            Для Инд=1 По спСерНомераПродукции.РазмерСписка()  Цикл
                ДвижениеСтрокаМаршрутнаяКарта( спСерНомераПродукции.ПолучитьЗначение(Инд), ЭтоТекущаяОперация );
            КонецЦикла;
            ПредДатаОкончания = ДатаОкончания;
        КонецЦикла;
            
    КонецЕсли;
    
КонецПроцедуры

// ===============================
44 vicof
 
17.08.17
12:44
(43) Заплатить специалисту
45 lera01
 
17.08.17
13:02
Сделай примерно следующее: В обработке проведения напрямую пиши движения
  Для Каждого ТекСтрока Из ТехнологическиеОперации Цикл
Движение=Движения.ВыполнениеМаршрутныхКарт.Добавить();
.......... заполняешь реквизиты этого движения
        Если ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И Не ЗначениеЗаполнено(ТекСтрока.ВремяОкончания) Тогда
            Движение.ВидДвижения=ВидДвиженияНакопления.Приход;
    ИначеЕсли ЗначениеЗаполнено(ТекСтрока.ВремяНачала) И ЗначениеЗаполнено(ТекСтрока.ВремяОкончания)  Тогда
                Движение.ВидДвижения=ВидДвиженияНакопления.Расход;

        КонецЕсли;
    КонецЦикла;

//простите меня участники данной дискуссии за г**код, но ведь абсолютно нереально здесь объяснить, как сделать иначе и куда залезть в процедурах формирования таблиц движений
46 Сергей333
 
17.08.17
13:38
(45) Спасибо тебе огромное. И всем остальным тоже, в любом случае за стимуляцию мозга)) В хорошем смысле, это тоже надо.