Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неправильный режим проведения документа.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
Skodnik
Добрый день, хорошим людям.
Вот просвещаюсь по учебнику Радченка М. Г. "1С Предприятие 8.2 Практическое пособие разработчика" 2009 г.
Установлена платформа 1С:Підприємство 8.2 (8.2.16.352).
Есть документ "ОказаниеУслуг", при проведении документа необходимо контролировать остатки материалов на складе, которые им списываются. Соответственно режим проведения документа - оперативный. Указывает в свойствах документа "ОказаниеУслуг" - Оперативне проведення : дозволити.

Запускаю отладчик, точку останову ставлю на начале процедуры "ОбработкаПроведения" и режим проведения документа "Неоперативный"
icon_cuss.gif
В чем может быть проблема?

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

Процедура ОбработкаПроведения(Отказ, Режим)    
    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
    
    //Создать менеджер временных таблиц
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    //Указать, какой менедж6ер ВТ использует этот запрос
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОказаниеУслугПереченьНоменклатуры.Номенклатура,
        |    ОказаниеУслугПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
        |    СУММА(ОказаниеУслугПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
        |    СУММА(ОказаниеУслугПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
        |ПОМЕСТИТЬ НоменклатураДокумента
        |ИЗ
        |    Документ.ОказаниеУслуг.ПереченьНоменклатуры КАК ОказаниеУслугПереченьНоменклатуры
        |ГДЕ
        |    ОказаниеУслугПереченьНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    ОказаниеУслугПереченьНоменклатуры.Номенклатура,
        |    ОказаниеУслугПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Результат = Запрос.Выполнить();

    //
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст = "ВЫБРАТЬ
                    |    НоменклатураДокумента.Номенклатура,
                    |    НоменклатураДокумента.ВидНоменклатуры,
                    |    НоменклатураДокумента.КоличествоВДокументе,
                    |    НоменклатураДокумента.СуммаВДокументе,
                    |    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
                    |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
                    |ИЗ
                    |    НоменклатураДокумента КАК НоменклатураДокумента
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
                    |                ,
                    |                Материал В
                    |                    (ВЫБРАТЬ
                    |                        НоменклатураДокумента.Номенклатура
                    |                    ИЗ
                    |                        НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
                    |        ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
                    |                ,
                    |                Материал В
                    |                    (ВЫБРАТЬ
                    |                        НоменклатураДокумента.Номенклатура
                    |                    ИЗ
                    |                        НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
                    |        ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";
    //Установим необходимость блокировки изменяемых данных в регистрах
    //СтоимостьМатериалов и ОстаткиМатериалов
    Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
    Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;
                    
                    
    //Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе.                
    Движения.СтоимостьМатериалов.Записать();
    Движения.ОстаткиМатериалов.Записать();
                    
    Результат = Запрос2.Выполнить();                
    //ТЗ = Результат.Выгрузить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
             СтоимостьМатериала = 0;
        Иначе
             СтоимостьМатериала = ВыборкаДетальныеЗаписи
                                   .Стоимость / ВыборкаДетальныеЗаписи.Количество;
        КонецЕсли;                          
     Если ВыборкаДетальныеЗаписи
             .ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда    
            
        // регістр ОстаткиМатериалов Расход    
        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
           Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад = Склад;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        //Регистр СтоимостьМатериалов расход
        Движение = Движения.СтоимостьМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе
                                      *СтоимостьМатериала;  
       КонецЕсли;
       //Регистр продажи
      Движение = Движения.Продажи.Добавить();
      Движение.Период = Дата;
      Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
      Движение.Клиент = Клиент;
      Движение.Мастер = Мастер;
      Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
      Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
      Движение.Стоимость = СтоимостьМатериала
                            *ВыборкаДетальныеЗаписи.КоличествоВДокументе;                            
    КонецЦикла;
    // Просмотреть нет ли отрицательных остатоков по материалам после
    //                                                  проведения документа.
    Движения.Записать();
    //Режим - параметр процедуры ОбработкаПроведения(...)
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
         //Проверить отрицательные отстатки
         Запрос3 = Новый Запрос;
         Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
         Запрос3.Текст = "ВЫБРАТЬ
                         |    ОстаткиМатериаловОстатки.Материал,
                         |    ОстаткиМатериаловОстатки.КоличествоОстаток
                         |ИЗ
                         |    РегистрНакопления.ОстаткиМатериалов.Остатки(
                         |            ,
                         |            Материал В
                         |                    (ВЫБРАТЬ
                         |                        НоменклатураДокумента.Номенклатура
                         |                    ИЗ
                         |                        НоменклатураДокумента)
                         |                И Склад = &Склад) КАК ОстаткиМатериаловОстатки
                         |ГДЕ
                         |    ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
          Запрос3.УстановитьПараметр("Склад",Склад);
          Результат = Запрос3.Выполнить();
          ТЗ = Результат.Выгрузить();

          ВыборкаДетальныеЗаписи = Результат.Выбрать();
          Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
              Сообщение = Новый СообщениеПользователю();
              Сообщение.Текст = "Не хватает " + Строка(-ВыборкаДетальныеЗаписи
                                  .КоличествоОстаток) + " единиц материала """
                                  + ВыборкаДетальныеЗаписи.Материал + """";
              Сообщение.Сообщить();
              //Параметр процедуры
              Отказ = Истина;          
          КонецЦикла;
    КонецЕсли;    
        
КонецПроцедуры

Vofka
Цитата(Skodnik @ 15.11.13, 16:58) необходимо зарегистрироваться для просмотра ссылки
В чем может быть проблема?

В том, что проводить текущей датой надо.
Skodnik
Спасибо! Такая ситуация при проведении документа "задним числом", и он таки проводится.

Недочитал.
Если проводить "задним числом", документ будет проведен неоперативно. Соответственно никакого контроля остатков не будет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.