Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятное поведение контроля остатков
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
Evgeniux
Добрый день. Делаю контроль остатков и столкнулся с непонятностью, допустим нужно укомплектовать 4 номенклатуры системных блоков, 2 из них комплектуются нормально, следущие два вылетают с ошибкой, хотя остатки комплектующих в норме.
вот отрывок кода с остатками:
//  1. Получение запросом данных документа
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
      Запрос.Текст = "ВЫБРАТЬ
        |   Товары.Номенклатура КАК Номенклатура,
        |   СУММА(Товары.Количество) КАК Количество
        |ПОМЕСТИТЬ Товары
        |ИЗ
        |   Документ.СборкаПК.Комплектующие КАК Товары
        |ГДЕ
        |   Товары.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   Товары.Номенклатура
        |
        |ИНДЕКСИРОВАТЬ ПО
        |   Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   Товары.Номенклатура КАК Номенклатура,
        |   Товары.Количество КАК Количество
        |ИЗ
        |   Товары КАК Товары";
    
     Запрос.УстановитьПараметр("Ссылка", Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
  
    //  2. Формирование движений-расход регистра
    Движения.ОстаткиТоваров.Очистить();
    ВыборкаТовары = РезультатЗапроса.Выбрать();
    Пока ВыборкаТовары.Следующий() Цикл
        Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаТовары.Номенклатура;
        Движение.Количество = ВыборкаТовары.Количество;
    КонецЦикла;
  
    //  3. Запись движений в БД
    Движения.ОстаткиТоваров.Записывать = Истина;
    Движения.Записать();
  
    //  4. Запрос, получающий отрицательные остатки из регистра
    Запрос.Текст =
        "ВЫБРАТЬ
        |   Остатки.Номенклатура КАК Номенклатура,
        |   ПРЕДСТАВЛЕНИЕССЫЛКИ(Остатки.Номенклатура) КАК НоменклатураПредставление,
        |   -Остатки.КоличествоОстаток КАК Дефецит
        |ИЗ
        |   РегистрНакопления.ОстаткиТоваров.Остатки(
        |           &МоментВремени,
        |           Номенклатура В
        |               (ВЫБРАТЬ
        |                   Товары.Номенклатура КАК Номенклатура
        |               ИЗ
        |                   Товары КАК Товары)) КАК Остатки
        |ГДЕ
        |   Остатки.КоличествоОстаток < 0";
  
    ГраницаКонтроля = Новый Граница(МоментВремени(), ВидГраницы.Включая);
    Запрос.УстановитьПараметр("МоментВремени", ГраницаКонтроля);
    РезультатЗапроса = Запрос.Выполнить();
  
    //  5. Вывод сообщений о недостатке товаров
    Если Не РезультатЗапроса.Пустой() Тогда
        Отказ = Истина;
        ВыборкаОшибки = РезультатЗапроса.Выбрать();
        Пока ВыборкаОшибки.Следующий() Цикл
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Товара "+ВыборкаОшибки.НоменклатураПредставление+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.";
            Сообщение.Сообщить();
        КонецЦикла;
    КонецЕсли;


ошибка
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.СборкаПК.МодульОбъекта(80)}: Поле объекта не обнаружено (Дефицит)
            Сообщение.Текст = "Товара "+ВыборкаОшибки.НоменклатураПредставление+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.";
MATEVI
Evgeniux @ Сегодня, 16:37 необходимо зарегистрироваться для просмотра ссылки ,

Грамматика? КАК ДефЕцит в запросе и ВыборкаОшибки.ДефИцит
Evgeniux
MATEVI @ Сегодня, 19:23 необходимо зарегистрироваться для просмотра ссылки ,
Спасибо, исправил, но эта ошибка относилась больше к выводу сообщения пользователю. Если раньше выводилось, что просто чего-то не хватает, то сейчас выводится конкретная позиция.
На всякий случай привожу весь код процедуры:
Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

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



    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.