Имя: Пароль:
1C
1С v8
При проведении документа вылезает ошибка,что типы сравниваемых переменных различные.
, ,
0 malex18
 
11.08.17
10:44
Проверял через Shift + F9. и правда. Не находит тип "КоличествоОстаток" в выражении :
ЕСЛИ КоличествоОстаток < ТекСтрокаТовары.Количество Тогда

"ЕСТЬNULL" использовать надо?куда только не подставлял. подскажите без гонора пожалуйста)

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

если нет записей - не пиши ВыборкаДетальныеЗаписи.КоличествоОстаток
2 DexterMorgan
 
11.08.17
10:51
ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА
            Движение.Сумма=ТекСтрокаТовары.Количество*ВыборкаДетальныеЗаписи.ЦенаЗаЕд;
        
        КоличествоОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;
        ЕСЛИ КоличествоОстаток < ТекСтрокаТовары.Количество Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Данного товара осталось " +КоличествоОстаток+ " шт.";
            Сообщение.Сообщить();
        КонецЕсли;
КонецЕсли;
3 DexterMorgan
 
11.08.17
10:53
К спецу готовишься?)
4 DexterMorgan
 
11.08.17
10:59
Запрос.УстановитьПараметр("Период", Дата);

помница там нужно не дату передавать, а
Новый Граница(МоментВермени(), ВидГраницы.Включая)
5 DexterMorgan
 
11.08.17
11:00
И БлокироватьДляИзменения = Истина
6 AsadRoman
 
11.08.17
11:02
Может мне кто-нибудь объяснить почему сначала делают движения. а потом проверяют условие возможности проведения? На мой взгляд нужно делать наоборот. Далее по коду зачем в запросе запихивать данные во временную таблицу, чтобы затем из нее выбирать тоже самое, только с математическими действиями? Можно ведь сразу. И последнее: за создание лишней ТЗ снимают балл. Поэтому лучше сразу делать запрос по всеми необходимыми реквизитами чтобы затем

Движения.ОстаткиТоваров.Загрузить(Запрос.Выполнить.Выгрузить());
7 DexterMorgan
 
11.08.17
11:04
(6) Деревня, не позорься
8 AsadRoman
 
11.08.17
11:05
(7) с Этого момента поподробней.
9 malex18
 
11.08.17
11:05
Какой спец))вы что)
это стажировочное задание)
вот пытаюсь разобраться
сказали исправить эту ошибку.
10 DexterMorgan
 
11.08.17
11:06
Да запрос в цикле это ужас
11 malex18
 
11.08.17
11:06
Это я тоже понимаю,
но сказали на первое время пойдет.и нужно с этой ошибкой разобраться
12 DexterMorgan
 
11.08.17
11:08
13 AsadRoman
 
11.08.17
11:13
(12) Почитал и что? В чем я не прав?
14 h-sp
 
11.08.17
11:24
(13) ну а в чем прав? Твой метод хороший, но он в два раза медленнее. Поэтому мы выбираем (12). А ты можешь по-старому фигачить.
15 DexterMorgan
 
11.08.17
11:26
(13) в том, что на твой взгдяд нужно делать наоборот
16 AsadRoman
 
11.08.17
11:31
(14) (15) Вы сами то статью до конца внимательно прочитали? Где вы увидели в два раза медленнее?
17 Buster007
 
11.08.17
11:33
КоличествоОстаток = 0;        
ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА
            Движение.Сумма=ТекСтрокаТовары.Количество*ВыборкаДетальныеЗаписи.ЦенаЗаЕд;
КоличествоОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;
        КонецЕсли;
18 AsadRoman
 
11.08.17
11:33
Сделайте документ с 1000 строк и посмотрите что у вас будет: сначала в цикле (!) создать движения, затем опять в цикле (!) проверить можно ли проводить. Ага : проводить нельзя. Давай удалять созданное.
19 Buster007
 
11.08.17
11:34
Код - УГ, но может быть научится
20 AsadRoman
 
11.08.17
11:38
Я так запросом выбираю только отрицательные остатки. Если запрос пустой, то проводим. Если непустой то вывожу сообщения по всем позициям в запросе.
21 DexterMorgan
 
11.08.17
11:40
(18) Речь не про реализацию ТС, а о различиях в старой и новой методике проведения. Плюсы указаны в конце статьи:

///
Нет необходимости очищать старые движения документа. По сути это операция записи в БД пустого набора движений и удаление существующих движений — это довольно ресурсоемкие операции
2.Запрос, получающий данные по отрицательным остаткам, обращается только к одной таблице — нет необходимости делать левое соединение с данными документа и применять функцию «ЕСТЬNULL()»
22 DexterMorgan
 
11.08.17
11:41
(18) "Нормальный" код без блокировок, там тоже приведен:

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

"Может мне кто-нибудь объяснить почему сначала делают движения. а потом проверяют условие возможности проведения?"

Тебе объяснили?
25 AsadRoman
 
11.08.17
11:45
(24) Цитирую дословно: Ok, значит, нужно всегда использовать новую методику, верно? Нет, это не так!   Источник: ©Курсы-по-1С.рф
26 AsadRoman
 
11.08.17
11:46
Короче парни: я все равно останусь при своем.
27 DexterMorgan
 
11.08.17
11:47
(25) В случае ТС это именно тот случай когда нужно использовать новую методику
28 AsadRoman
 
11.08.17
11:48
(22) А вот это уже ответ на вопрос по теме. Чел пусть воспользуется.
29 DexterMorgan
 
11.08.17
11:48
(25) старая нужна, только если например себестоимость нужно расчитать для списания
30 DexterMorgan
 
11.08.17
11:49
(25) Ты мастер вырывать фразы из контекста
31 DexterMorgan
 
11.08.17
11:50
(26) Да мне по барабану, позорься дальше
32 malex18
 
11.08.17
11:51
Товарищи программисты, прочитал и старую и новую методику.
Ответа не это так и не дало.
Скажите конкретнее пожалуйста почему типы разные и что сделать?
запрос может пустой просто?
для тупых пожалуйста
33 malex18
 
11.08.17
11:51
для "тупых"-для меня в смысле)
34 h-sp
 
11.08.17
11:51
(26) вот это читал? Особенно 2 последних абзаца

Нет необходимости очищать старые движения документа. По сути это операция записи в БД пустого набора движений и удаление существующих движений — это довольно ресурсоемкие операции

Запрос, получающий данные по отрицательным остаткам, обращается только к одной таблице — нет необходимости делать левое соединение с данными документа и применять функцию «ЕСТЬNULL()»

Кроме этого, при нормальном течении бизнес-процессов пользователь указывает количество, не превышающее остаток на складе.

В этом случае второй запрос не вернет никаких данных и проведение документа будет максимально быстрым.   Источник: ©Курсы-по-1С.рф
35 DexterMorgan
 
11.08.17
11:52
(33) Мля, я тебе в (1), (2) написал
36 h-sp
 
11.08.17
11:55
(26) ну то есть тут дело в теории вероятностей. То есть с вероятностью 99% пользователь вводит правильные данные.

твоя ошибка, ты думаешь, что отакт назад будет в 100% случаев.

а на самом деле откат будет только в 1% всех случаев.

а в 99% будет максимальная скорость. Просто тупо сразу запись.
37 malex18
 
11.08.17
11:55
Он тогда контроль остатков не производит
38 Бубр
 
11.08.17
11:55
(8) новая методика проведения документов.  на спеце проверяется в том или ином виде.
39 h-sp
 
11.08.17
11:58
(37) ну так

КоличествоОстаток = 0;
    
    ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА
            Движение.Сумма=ТекСтрокаТовары.Количество*ВыборкаДетальныеЗаписи.ЦенаЗаЕд;
        КоличествоОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;  

     КонецЕсли;
40 malex18
 
11.08.17
12:01
Простите, но ничего не изменилось)
41 DexterMorgan
 
11.08.17
12:02
(40) Перезапусти отладку
42 malex18
 
11.08.17
12:03
(41) Ну я не на столько "тупой"-то))
43 malex18
 
11.08.17
12:05
На складе сейчас 1000.
Провожу реализацию - 1000
Второй раз также можно провести на любое количество-к примеру на 500
А третий раз уже пишет "что остаток -500"
44 mistеr
 
11.08.17
12:06
(0) 1. Ты обращаешься к ВыборкаДетальныеЗаписи.КоличествоОстаток даже в том случае, если выборка пустая. Все обращения к выборке помести внутрь условия "ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА".

2. В выражении "ЕСТЬNULL(ВремТабл.СуммаОстаток, 0) / ЕСТЬNULL(ВремТабл.КоличествоОстаток, 0)" возможно деление на 0. Сейчас не стрельнуло, потом обязательно стрельнет.

Твоя ошибка скорее всего связана с п. 1. Через Shift + F9 посмотри типы, ТипЗнч(ВыборкаДетальныеЗаписи.КоличествоОстаток) и ТипЗнч(ТекСтрокаТовары.Количество).
45 malex18
 
11.08.17
12:13
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
        ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА
            Движение.Сумма=ТекСтрокаТовары.Количество*ВыборкаДетальныеЗаписи.ЦенаЗаЕд;
            КоличествоОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;
        ЕСЛИ КоличествоОстаток < ТекСтрокаТовары.Количество Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Данного товара осталось " +КоличествоОстаток+ " шт.";
            Сообщение.Сообщить();  
        
        КонецЕсли;
        КонецЕсли;
46 malex18
 
11.08.17
12:13
так?
47 malex18
 
11.08.17
12:14
Не изменилось ничего
48 malex18
 
11.08.17
12:14
(43)
49 DexterMorgan
 
11.08.17
12:15
Посмотри еще раз внимательно (39)
50 mistеr
 
11.08.17
12:15
(47) Типы посмотри уже.
51 AsadRoman
 
11.08.17
12:16
(34) Тогда давай разберемся: новый вариант. Движения записались. Затем отказ = истина. Что с движениями делается?
52 h-sp
 
11.08.17
12:18
(51) что значит отказ = истина? кто его выдает?
53 AsadRoman
 
11.08.17
12:19
(52) Т.е. отрицательные остатки
54 h-sp
 
11.08.17
12:20
(53) еще раз для непонятливых. Отказ = Истина по статистике выдается в 1% всех случаев записи.

То есть твоя методика быстрее в 1% случаев.

Новая методика рулит в 99% случаев.
55 AsadRoman
 
11.08.17
12:21
(54) Пользователи косячат в 80% (!) случаев. Это не теория вероятностей, это факт.
56 AsadRoman
 
11.08.17
12:22
(54) Спуститесь на землю идите посмотрите что творят пользователи
57 AsadRoman
 
11.08.17
12:25
Да и хватит тут не по делу спорить. Челу помочь нуно.
58 h-sp
 
11.08.17
12:26
(55) ну это ты загнул, насчет 80%.  Но даже если у тебя такая суперфирма, где все косячат. То всё равно получается в 20% случаев выигрыш. А 80% примерно то же самое
59 malex18
 
11.08.17
12:30
Можете пожалуйста написать код правильный и объяснить, что и как в новом коде. может так разберусь.Радченко проштудировал.но таких тонкостей нет там.и что делать не знаю.подскажите пжл.
60 AsadRoman
 
11.08.17
12:35
(59) ДА перепиши ты свой код по (12) и будет тебе счастье
61 malex18
 
11.08.17
12:39
Подскажите только какие данные мне подставлять в часть про "дефицит"?)
62 AsadRoman
 
11.08.17
12:42
вот здесь

ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА
            Движение.Сумма=ТекСтрокаТовары.Количество*ВыборкаДетальныеЗаписи.ЦенаЗаЕд;
        КонецЕсли;
        КоличествоОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;

сделай так:

КоличествоОстаток = 0;
ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА
            Движение.Сумма=ТекСтрокаТовары.Количество*ВыборкаДетальныеЗаписи.ЦенаЗаЕд;
        КоличествоОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;

        КонецЕсли;

будет быстро и сердито.
63 malex18
 
11.08.17
12:46
Сделал)не изменилось ничегО)
64 malex18
 
11.08.17
12:47
А нет.именилось.теперь в регистр накопления не пишутся записи про реализацию)
65 AsadRoman
 
11.08.17
12:48
(64) т.е. от ошибки сравнения типов избавился?
66 malex18
 
11.08.17
12:49
Ну вообще да)
Спасибо)
67 malex18
 
11.08.17
12:49
А почему в регистр не пишется теперь ничего?
и остатки собственно не контролируются?
68 AsadRoman
 
11.08.17
12:54
Движения.ОстаткиТоваров.Записать();

перенеси в самый конец
69 malex18
 
11.08.17
12:57
в регистр теперь все заносится, но снова вылезает ошибки про невоможность сравнения двух переменных разного типа
70 malex18
 
11.08.17
12:57
Движения.ОстаткиТоваров.Записывать = Истина;
    Движения.Записать();
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Товары.Номенклатура КАК Номенклатура,
    |    Товары.Количество КАК Количество,
    |    Товары.ЦенаПродажи КАК Цена,
    |    Товары.Сумма КАК Сумма
    |ПОМЕСТИТЬ ВременнаяТаб
    |ИЗ
    |    &Товары КАК Товары
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВременнаяТаб.Номенклатура КАК Номенклатура,
    |    СУММА(ВременнаяТаб.Количество) КАК Количество,
    |    ВременнаяТаб.Цена КАК Цена
    |ИЗ
    |    ВременнаяТаб КАК ВременнаяТаб
    |
    |СГРУППИРОВАТЬ ПО
    |    ВременнаяТаб.Номенклатура,
    |    ВременнаяТаб.Цена";
    Запрос.УстановитьПараметр("Товары",Товары);
    ТоварыСвертка = Запрос.Выполнить().Выгрузить();
    
    Для Каждого ТекСтрокаТовары Из ТоварыСвертка Цикл
        Движение = Движения.ОстаткиТоваров.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.Количество = ТекСтрокаТовары.Количество;
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ОстаткиТоваровОстатки.Номенклатура,
        |    СУММА(ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
        |    СУММА(ОстаткиТоваровОстатки.СуммаОстаток) КАК СуммаОстаток
        |ПОМЕСТИТЬ ВремТабл
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваров.Остатки(&Период, Номенклатура = &Номенклатура) КАК ОстаткиТоваровОстатки
        |
        |СГРУППИРОВАТЬ ПО
        |    ОстаткиТоваровОстатки.Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВремТабл.Номенклатура,
        |    ЕСТЬNULL(ВремТабл.СуммаОстаток, 0) / ВремТабл.КоличествоОстаток КАК ЦенаЗаЕд,
        |    ЕСТЬNULL(ВремТабл.КоличествоОстаток, 0) КАК КоличествоОстаток
        |ИЗ
        |    ВремТабл КАК ВремТабл";
        
        Запрос.УстановитьПараметр("Номенклатура", ТекСтрокаТовары.Номенклатура);
        Запрос.УстановитьПараметр("Период", Дата);
        РезультатЗапроса = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
      
        ЕСЛИ ВыборкаДетальныеЗаписи.Следующий() ТОГДА
            Движение.Сумма=ТекСтрокаТовары.Количество*ВыборкаДетальныеЗаписи.ЦенаЗаЕд;
            КоличествоОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;
            КонецЕсли;
        ЕСЛИ КоличествоОстаток < ТекСтрокаТовары.Количество Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Данного товара осталось " +КоличествоОстаток+ " шт.";
            Сообщение.Сообщить();
                    
        
        КонецЕсли;
        Движения.ОстаткиТоваров.Записать();
        
    КонецЦикла;
71 malex18
 
11.08.17
12:58
Теперь код такой.может в запросе что не так?
72 Ёпрст
 
11.08.17
13:02
(71) да всё не так, весь код в топку.
Запрос в цикле там не нужен, если что.
73 AsadRoman
 
11.08.17
13:12
(71) КоличествоОстаток = 0;

забыл добавить
74 AsadRoman
 
11.08.17
13:13
И

Движения.ОстаткиТоваров.Записать();


вынеси из цикла
75 malex18
 
11.08.17
14:48
Движения.Продажи.Очистить();
    Движения.Продажи.Записывать = Истина;
    Движения.Записать();
    
    Запрос = Новый Запрос;
    Запрос.Текст=
                     
             "ВЫБРАТЬ
     |    РеализацияТовары.Номенклатура КАК Номенклатура,
     |    СУММА(РеализацияТовары.Количество) КАК Количество
     |ПОМЕСТИТЬ РеализацияТовары
     |ИЗ
     |    Документ.Реализация.Товары КАК РеализацияТовары
     |ГДЕ
     |    РеализацияТовары.Ссылка=&Ссылка
     |
     |СГРУППИРОВАТЬ ПО
     |    РеализацияТовары.Номенклатура
     |
     |ИНДЕКСИРОВАТЬ ПО
     |    Номенклатура
     |;
     |
     |/////////////////////////////////////////////////////////////////////
     |ВЫБРАТЬ  
     |     Товары.Номенклатура КАК Номенклатура,
     |   ПРЕДСТАВЛЕНИЕССЫЛКИ(Товары.Номенклатура) КАК НоменклатураПредставление,  
     |   Товары.Количество КАК Количество,
     |   ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток  
     |ИЗ  
     |   РеализацияТовары КАК Товары  
     |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени, Номенклатура В (ВЫБРАТЬ  
     |                       Товары.Номенклатура КАК Номенклатура
     |                   ИЗ  
     |                       Товары КАК Товары)) КАК Остатки     
     |       ПО Товары.Номенклатура = Остатки.Номенклатура";                
    
     Запрос.УстановитьПараметр("Ссылка", Ссылка);
     Запрос.УстановитьПараметр("МоментВремени", МоментВремени());    
     РезультатЗапроса = Запрос.Выполнить();  
    
     ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
     Пока ВыборкаТовары.Следующий() Цикл
         Дефицит = ВыборкаТовары.Количество - ВыборкаТовары.Остаток;        
         Если Дефицит>0 Тогда            
             Отказ = Истина;            
             Сообщение = Новый СообщениеПользователю;            
             Сообщение.Текст = "Товара "+ВыборкаТовары.НоменклатураПредставление+" недостаточно в количестве "+Дефицит+" шт.";            
             Сообщение.Сообщить();        
         КонецЕсли;
         Если Отказ Тогда            
             Продолжить;        
         КонецЕсли;  
         Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
         Движение.Период = Дата;    
         Движение.Номенклатура = ВыборкаТовары.Номенклатура;  
         Движение.Количество = ВыборкаТовары.Количество;    
     КонецЦикла;
     Движения.ОстаткиТоваров.Записывать = Истина;
76 malex18
 
11.08.17
14:48
Вот сделал код по "Старой Методике".
но видимо неправильно подставил свои данные.
что не так здесь?
77 malex18
 
11.08.17
14:50
Все, подправил.Всем СПАСИБО!!!!
   AsadRoman   - СПАСИБО ЗА ТЕРПЕНИЕ)))
78 AsadRoman
 
11.08.17
14:55
(77) Да не за что. Всегда рад помочь.
79 h-sp
 
11.08.17
15:20
(77) так в чем было дело в итоге?
80 malex18
 
11.08.17
16:11
Во всем в принципе.все неправильно было. нужно было делать по старой методике.толко подставив свои данные.вот и все
81 Buster007
 
11.08.17
16:31
Офигеть с (17) до (62)...
Трудно тебе будет... Может ну его нафиг?
82 malex18
 
14.08.17
09:12
Русские не сдаются)
Ошибка? Это не ошибка, это системная функция.