8.х Типы =)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем mavaly, 8 июн 2010.

  1. TopicStarter Overlay
    mavaly
    Offline

    mavaly Опытный в 1С

    Регистрация:
    17 янв 2010
    Сообщения:
    233
    Симпатии:
    0
    Баллы:
    26
    Код:
    Регистр = Запрос.Выполнить().Выбрать();
    РегитрК = 0;
    Пока Регистр.Следующий() Цикл
    РегистрК = РегистрК + Регистр.Количество;
    КонецЦикла;
    
    Ошибка: {Документ.ТребованиеНакладная(1451)}: Преобразование значения к типу Число не может быть выполнено РегистрК = РегистрК + Регистр.Количество;


    Подскажите )))...как решить? )

    1С:Предприятие 8.1 (8.1.15.14)
    Управление производственным предприятием, редакция 1.2 (1.2.30.1)
    Copyright (С) ЗАО "1C", 2004-2010. Все права защищены
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Покажите запрос. Скорее всего у Вас там нет проверки на ЕСТЬNULL() и одно из значений явлется типом неопределенно и получается что в цикле вы попадает на такую ситуацию когда складываете число с Неопределенно. Запрос давайте. или там в Запросе в самом начале в выборке ставтье ЕСТЬNULL() на количество
  3. TopicStarter Overlay
    mavaly
    Offline

    mavaly Опытный в 1С

    Регистрация:
    17 янв 2010
    Сообщения:
    233
    Симпатии:
    0
    Баллы:
    26
    Код:
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Номенклатура", СтрокаТабЧасти.Номенклатура);
    Запрос.УстановитьПараметр("Основание", ДокументОснование.Ссылка);
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	МатериалыВПроизводстве.Затрата КАК Затрата,
    |	МатериалыВПроизводстве.Количество КАК Количество,
    |	МатериалыВПроизводстве.Заказ
    |ИЗ
    |	РегистрНакопления.МатериалыВПроизводстве КАК МатериалыВПроизводстве
    |ГДЕ
    |	МатериалыВПроизводстве.Заказ.Ссылка = &Основание
    |	И МатериалыВПроизводстве.Затрата = &Номенклатура";
    
    Регистр = Запрос.Выполнить().Выбрать();
    РегитрК = 0;
    Пока Регистр.Следующий() Цикл
    РегистрК = РегистрК + Регистр.Количество;			КонецЦикла;
    
    
  4. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Попробуйте так

    ВЫБРАТЬ РАЗЛИЧНЫЕ
    | МатериалыВПроизводстве.Затрата КАК Затрата,
    | ЕСТЬNULL(МатериалыВПроизводстве.Количество,0) КАК Количество,
    | МатериалыВПроизводстве.Заказ
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    И еще, у вас написано:
    Код:
    РегитрК = 0;
    
    а надо я так думаю
    Код:
    РегистрК = 0;
    

    А это у вас отчет или что? Почему нельзя сразу сумму посчитать в запросе (вы только часть кода привели что-ли?).
    Кроме того, я вижу у вас
    Код:
    Запрос.УстановитьПараметр("Номенклатура", СтрокаТабЧасти.Номенклатура);
    
    у вас там случайно не цикл по строкам табличной части, где для каждой вы вызываете запрос? Тогда можно опять таки, для всей номенклатуры в одном запросе сделать.
  6. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    И еще немного ОФФТОП. По вот этой строчки

    Запрос.УстановитьПараметр("Номенклатура", СтрокаТабЧасти.Номенклатура);

    Думаю. что у Вас запрос в цикле идет и вы его выполняете для каждой строчки ТЧ. если это так то это неправильно
  7. TopicStarter Overlay
    mavaly
    Offline

    mavaly Опытный в 1С

    Регистрация:
    17 янв 2010
    Сообщения:
    233
    Симпатии:
    0
    Баллы:
    26
    Не получилось....та же ошибка(

    Да! Вы правы запрос для каждой строки табличной части.
    Я пытаюсь организовать проверку каждой номенклатуры в требовании-накладной ... что бы количество списываемого и уже списанного материала не превышало потребность, которая есть в документе-основании! =(
    А как это по-другому возможно организовать?
  8. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    А вотладчике смотрели при ошике какие переменные какой тип имеют?

    А насчет проверки. Вот вы передаете в запрос строку ТЧ и в услови пишите =&Номенклатура, что мешает передават всю ТЧ и в запросе писать В(&Номенклатура)
  9. TopicStarter Overlay
    mavaly
    Offline

    mavaly Опытный в 1С

    Регистрация:
    17 янв 2010
    Сообщения:
    233
    Симпатии:
    0
    Баллы:
    26
    Код:
    //Проверка на количество материала в заказе на произ-во
    Если ЗначениеЗаполнено(ДокументОснование) и ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.ЗаказНаПроизводство") 
    И РазрешитьПревышениеЛимита = Ложь <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    Для Каждого СтрокаТабЧасти Из Материалы Цикл
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Номенклатура", СтрокаТабЧасти.Номенклатура);
    Запрос.УстановитьПараметр("Основание", ДокументОснование.Ссылка);
    Запрос.Текст = "ВЫБРАТЬ
    |	МатериалыВПроизводстве.Затрата КАК Затрата,
    | 	ЕСТЬNULL(МатериалыВПроизводстве.Количество,0) КАК Количество, 
    |	МатериалыВПроизводстве.Заказ
    |ИЗ
    |	РегистрНакопления.МатериалыВПроизводстве КАК МатериалыВПроизводстве
    |ГДЕ
    |	МатериалыВПроизводстве.Заказ.Ссылка = &Основание
    |	И МатериалыВПроизводстве.Затрата = &Номенклатура";
    
    Регистр = Запрос.Выполнить().Выбрать();
    РегистрК = 0;
    Пока Регистр.Следующий() Цикл
    РегистрК = РегистрК + Регистр.Количество;
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Номенклатура", СтрокаТабЧасти.Номенклатура);
    Запрос.УстановитьПараметр("Основание", ДокументОснование.Ссылка);
    Запрос.Текст = "ВЫБРАТЬ
    |	ЗаказНаПроизводство.Номенклатура КАК Номенклатура,
    | 	ЕСТЬNULL(ЗаказНаПроизводство.Количество,0) КАК Количество
    |ИЗ
    |	Документ.ЗаказНаПроизводство.Материалы КАК ЗаказНаПроизводство
    |ГДЕ
    |	ЗаказНаПроизводство.Номенклатура = &Номенклатура И
    |	ЗаказНаПроизводство.Ссылка = &Основание";
    
    Заказ = Запрос.Выполнить().Выбрать();
    ЗаказК = 0;
    Пока Заказ.Следующий() Цикл
    ЗаказК = ЗаказК + Заказ.Количество;
    КонецЦикла;
    
    Если РегистрК + СтрокаТабЧасти.Количество > ЗаказК Тогда
    Отказ = Истина;
    Предупреждение ("Превышение!");
    КонецЕсли;
    
    КонецЦикла;
    
    КонецЕсли;
    
    А так у меня получилось все (

    Может быть это возможно сделать более рационально?
    Не подскажите как? )
  10. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    НУ это стандартно. Берете эти 2 запроса, лепите в 1. Соединяете их там находите разницу, между количествами в запросе. а потом смотрите это поле разница. если есть отрицательная то лимит привышен. ,т.е аналог обычной задачи проверки остатков на складах номенкалтуры из ТЧ документа. Только налаог регистра статки у вас документ Заказ

    Только не совсем понятно зачем Вам все это если у вас например УПП то там естьтиповые отчеты, котоые это все дают.
  11. TopicStarter Overlay
    mavaly
    Offline

    mavaly Опытный в 1С

    Регистрация:
    17 янв 2010
    Сообщения:
    233
    Симпатии:
    0
    Баллы:
    26
    Мне же не отчет нужен...мне нужно запретить проведение требования, если выявленно превышение


    А ваш язык я не поняла =(.....я вообще не поняла, что значит "Лепите в 1" =(
  12. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Прошу прощения. Из этих 2х запросов делаете 1 запрос. в котором будет у Вас таблица из 1го и таблица из 2го запроса, которые соеденены например левым соедением Таблицы требования с таблицой заказа. из Таблицы требование вытаскиваете номенкалатуру и количество из заказа количество заказа и создаете еще одно поле = кол требования- кол. заказа
  13. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    Вместо

    РегистрК = РегистрК + Регистр.Количество;

    нужно сделать

    РегистрК = РегистрК + Регистр.Количество();
  14. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    ....проехали :)
  15. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Так вы получите количество выборки, а не значение поля количество
  16. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    mavaly, я тут глянул, сам запрос может выглядеть допустим вот так:
    Код:
    "ВЫБРАТЬ
    ЗаказНаПроизводствоМатериалы.Номенклатура,
    ЗаказНаПроизводствоМатериалы.Количество - ЕстьNULL(МатериалыВПроизводстве.Количество, 0) КАК Разница
    ИЗ
    Документ.ЗаказНаПроизводство.Материалы КАК ЗаказНаПроизводствоМатериалы
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МатериалыВПроизводстве КАК МатериалыВПроизводстве
    ПО ЗаказНаПроизводствоМатериалы.Номенклатура = МатериалыВПроизводстве.Затрата
    И ЗаказНаПроизводствоМатериалы.Ссылка = МатериалыВПроизводстве.Заказ
    ГДЕ
    ЗаказНаПроизводствоМатериалы.Ссылка = &Основание"
    
    
    но у меня не используются документы "Заказ на производство", поэтому что здесь получается, сказать не могу. Засуньте это в консоль запросов и гляньте результат.
  17. TopicStarter Overlay
    mavaly
    Offline

    mavaly Опытный в 1С

    Регистрация:
    17 янв 2010
    Сообщения:
    233
    Симпатии:
    0
    Баллы:
    26
    А как это потом стабличной частью еще стравнить?
  18. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Это не надо сравнивать с табличной частью. Если данные выдаваемые запросом вас утраивают, то будет что-то вроде:
    Код:
    //Проверка на количество материала в заказе на произ-во
    Если ЗначениеЗаполнено(ДокументОснование) и ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.ЗаказНаПроизводство") 
    И РазрешитьПревышениеЛимита = Ложь <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Основание", ДокументОснование.Ссылка);
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗаказНаПроизводствоМатериалы.Номенклатура,
    |	ЗаказНаПроизводствоМатериалы.Количество - ЕстьNULL(МатериалыВПроизводстве.Количество, 0) КАК Разница
    |ИЗ
    |	Документ.ЗаказНаПроизводство.Материалы КАК ЗаказНаПроизводствоМатериалы
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МатериалыВПроизводстве КАК МатериалыВПроизводстве
    |		ПО ЗаказНаПроизводствоМатериалы.Номенклатура = МатериалыВПроизводстве.Затрата
    |			И ЗаказНаПроизводствоМатериалы.Ссылка = МатериалыВПроизводстве.Заказ
    |ГДЕ
    |	ЗаказНаПроизводствоМатериалы.Ссылка = &Основание";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка.Разница < 0 Тогда
    Отказ = Истина;
    Предупреждение ("Превышение!");
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    КонецЕсли;
    
    

Поделиться этой страницей