Имя: Пароль:
1C
1C 7.7
v7: Позиционирование на новом документе веденным на основании
0 Роспатнюк Сергей Сер
 
20.06.19
11:39
Добрый день, есть документ Заявка на склад там есть кнопочка называется ПоОстаткам так вот не получает нужные остатки при вводе на основании Предварительной заявки если документ еще не записан/сохранен, не получает остатки если
_Док.Выбран() = 0, как сделать _Док.Выбран() = 1? все это дело в глобальном модуле и его менять не хочется, а вод код документа переделал бы но методы АктивизироватьОбъект и Активизировать не помогают.
1 vip03
 
20.06.19
11:44
а какая связь между выбран() (т.е. документ существует) и активизировать?
скорее всего остатки выводятся на момент выбраного документа.
переделайте что если документ не записан - остатки на ТА
2 HawkEye
 
20.06.19
11:49
(0) "как сделать _Док.Выбран() = 1?" - записать....
в остальном вообще ничего не понятно, какой-то поток сознания....
3 Роспатнюк Сергей Сер
 
20.06.19
11:49
Выбран() (т.е. спозиционирован)
Синтаксис:
Выбран()
Назначение:
Определение факта позиционирования объекта типа документ.
Возвращает: 1 - если документ выбран; 0 - если не выбран.

Процедура ПоОстаткам()
    _Остатки = гсСформироватьОстаткиАдресаХранения(Контекст);
далее
Функция  гсСформироватьОстаткиАдресаХранения(_Док,_Модуль = 0) Экспорт

.....

    Если _Док.Выбран() = 0 Тогда
            // Новый документ
            Если _Док.ДатаДок < ПолучитьДатуТА() Тогда
                РегОстатки.ВременныйРасчет(1);
                ОбщРег.РассчитатьРегистрыНа(_Док.ДатаДок);     
            КонецЕсли;
        ИначеЕсли _Док.ДатаДок < _Док.ТекущийДокумент().ДатаДок Тогда
            // Поменяли дату документа.
            Если _Док.ДатаДок < ПолучитьДатуТА() Тогда
                // выписываемый задним числом
                РегОстатки.ВременныйРасчет(1);
                ОбщРег.РассчитатьРегистрыНа(_Док.ДатаДок);     
            КонецЕсли;
        ИначеЕсли _Док.СравнитьТА() < 1 Тогда
            //Позиция не больше ТА.
            РегОстатки.ВременныйРасчет(1);
            ОбщРег.РассчитатьРегистрыНа(_Док.ТекущийДокумент());     
        КонецЕсли;
нужно что бы не попадал в условие // Новый документ так как в этом условии остатки не правельные а вот если записать то все верно
4 Роспатнюк Сергей Сер
 
20.06.19
11:50
(1) (2) причем здесь запись объекта ?
5 Роспатнюк Сергей Сер
 
20.06.19
11:51
(4) или сп что то не то говорит
6 Bigbro
 
20.06.19
11:53
а дата документа по умолчанию какая?
вообще то должен правильный остаток выдаваться код нормальный.
7 HawkEye
 
20.06.19
11:53
(4) ты считаешь, тебе одному можно писать бессмысленный набор слов? ))

(5) СП всегда говорит то....
8 HawkEye
 
20.06.19
11:54
(3) для того, чтобы попадал в условие, надо смотреть что передается во входе.... но ты же считаешь, что там все ОК... да?
9 Роспатнюк Сергей Сер
 
20.06.19
11:55
(6) по умолчанию дата документа основание
10 Роспатнюк Сергей Сер
 
20.06.19
11:56
(8) вход я уже написал первая строка кнопки ПоОснованию передают Контекст
11 Bigbro
 
20.06.19
11:56
(9) уверен? покажи код

ВводНового(Основание)

для твоего _Док
12 HawkEye
 
20.06.19
11:57
(6) (9) при чем тут дата, если код даже не заходит в условие?
(10) ну и что тебе возвращает незаписанный контекст при применении Выбран() ?
13 Роспатнюк Сергей Сер
 
20.06.19
11:58
Процедура ВводНаОсновании(ДокОснование)
    Если ДокОснование.Проведен()=0  Тогда
        Сообщить("Документ заявка на склад нельзя вводить на основании не проведенного документа!","i");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    Автор = глФамилияИмяОтчество(ПолноеИмяПользователя());  
    ДатаАктуальности = ТекущаяДата();
    ДокументОснование = ДокОснование;
    Если  ДокОснование.Вид() = "ПредварительнаяЗаявка" Тогда
        Машина   = ДокОснование.Машина;
        Заказчик = ДокОснование.Заказчик;
        Склад    = ДокОснование.Склад;
        ДатаДок = ДокОснование.ДатаДок;
        Если ДокОснование.ТолькоДляСнабжения = 1 Тогда
            Возврат;
        КонецЕсли;    
        _ОстаткиЗаявок = сСформироватьОстаткиЗаявки(ДокОснование);
        _ТЗ = СоздатьОбъект("ТаблицаЗначений");
        ДокОснование.ВыгрузитьТабличнуюЧасть(_ТЗ);  
        
        _ТЗ.ВыбратьСтроки();
        Пока _ТЗ.ПолучитьСтроку()=1 Цикл
            _СтрокаЗаявки = 0;
            _Флаг = _ОстаткиЗаявок.НайтиЗначение(_ТЗ.ГУИД,_СтрокаЗаявки,"СтрокаЗаявки");
            Если _Флаг = 0 Тогда
                Продолжить;
            КонецЕсли;
            _ОстаткиЗаявок.ПолучитьСтрокуПоНомеру(_СтрокаЗаявки);
            _Осталось = _ОстаткиЗаявок.Заказано -  _ОстаткиЗаявок.КОформлению - _ОстаткиЗаявок.Снабжению ;
            Если _Осталось <=0 Тогда
                Продолжить;
            КонецЕсли;  
            _Количество = _ТЗ.Количество;
            Если _ТЗ.Количество > _Осталось Тогда
                _Количество = _Осталось;
                _Осталось =  0;
            Иначе
                _Осталось = _Осталось - _Количество ;
            КонецЕсли;    
            НоваяСтрока();
            Материал = _ТЗ.Материал;
            МатериалЗаявки = _ТЗ.Материал;
            Пояснение = _ТЗ.Пояснение;
            Количество = _Количество;
            ЕдИзм = _ТЗ.ЕдИзм;
            ГУИД = _ТЗ.Гуид;
        КонецЦикла;
    ИначеЕсли ДокОснование.Вид() = "ПередачаЗаявкиМенеджерам" Тогда
        _Параметры = Форма.Параметр;
        Менеджер = "";
        Если ТипЗначенияСтр(_Параметры) = "СписокЗначений" Тогда
            Заказчик = _Параметры.Получить("Заказчик");
            Машина = _Параметры.Получить("Объект");
            Склад = _Параметры.Получить("МестоХранения");
            Менеджер = _Параметры.Получить("Менеджер");
        КонецЕсли;    
        _ОстаткиЗаявок = сОстаткиЗаявкиДляПЗМ(ДокОснование);
        _ТЗ = СоздатьОбъект("ТаблицаЗначений");
        ДокОснование.ВыгрузитьТабличнуюЧасть(_ТЗ);  
        _ТЗ.ВыбратьСтроки();
        Пока _ТЗ.ПолучитьСтроку()=1 Цикл
            _СтрокаЗаявки = 0;
            _Флаг = _ОстаткиЗаявок.НайтиЗначение(_ТЗ.СтрокаПредварительнойЗаявки,_СтрокаЗаявки,"СтрокаЗаявки");
            Если _Флаг = 0 Тогда
                Продолжить;
            КонецЕсли;
            _ОстаткиЗаявок.ПолучитьСтрокуПоНомеру(_СтрокаЗаявки);  
            Если (_ОстаткиЗаявок.Заказчик <> Заказчик ) И ( Заказчик.Выбран() = 1 ) Тогда
                Продолжить;
            КонецЕсли;    
            _Осталось = _ОстаткиЗаявок.Заказано -  _ОстаткиЗаявок.КОформлению - _ОстаткиЗаявок.Снабжению ;
            Если _Осталось <=0 Тогда
                Продолжить;
            КонецЕсли;
            Если _ТЗ.СтрокаПредварительнойЗаявки.Менеджер <> Менеджер Тогда
                Продолжить;
            КонецЕсли;    
            
            НоваяСтрока();
            Материал = _ТЗ.СтрокаПредварительнойЗаявки.Материал;
            МатериалЗаявки = _ТЗ.СтрокаПредварительнойЗаявки.Материал;
            Количество = _Осталось;
            ЕдИзм = _ТЗ.СтрокаПредварительнойЗаявки.Материал.ЕдиницаИзмерения;
            ГУИД = _ТЗ.СтрокаПредварительнойЗаявки;
        КонецЦикла;

    КонецЕсли;
    
КонецПроцедуры // ВводНаОсновании()
14 HawkEye
 
20.06.19
12:00
(11) проси сразу весь md-ник, чего мелочиться ))
15 Роспатнюк Сергей Сер
 
20.06.19
12:01
все понял незаписанный контекст при применении Выбран() будет 0 всегда(
16 HawkEye
 
20.06.19
12:01
(15) об это и написано в (2)....
17 Роспатнюк Сергей Сер
 
20.06.19
12:02
(6) но почему тогда не верный остаток если сдвинуть дату на 1 день вперед от даты предварительной заявки то получает верные в чем может быть проблема ?
18 Bigbro
 
20.06.19
12:47
я нигде не увидел что _Док.ДатаДок = ДокОснование.ДатаДок
так что по умолчанию там рабочаяДата()
и остатки скорее всего верные, но вы ожидаете там видеть какие то другие.
19 Роспатнюк Сергей Сер
 
20.06.19
14:11
(18) странно но я вижу
   Если  ДокОснование.Вид() = "ПредварительнаяЗаявка" Тогда
        Машина   = ДокОснование.Машина;
        Заказчик = ДокОснование.Заказчик;
        Склад    = ДокОснование.Склад;
        ДатаДок = ДокОснование.ДатаДок;
20 Arbuz
 
20.06.19
17:12
(17) потому что так написано в коде (3). точнее, для нового документа рассчитывается на дату документа НЕ_ВКЛЮЧИТЕЛЬНО, а для записанного  - конкретно на его позицию. если конечно ТА не в прошлом. другой логики там нет.