С Новым годом! Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
11 / 11 / 1
Регистрация: 05.09.2013
Сообщений: 48
1
1C 8.x

Подсчет остатков

05.09.2013, 12:09. Показов 2327. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте
У меня есть регистр накопления и документ списания, надо сделать так, чтобы в отчете на основе регистра (впрочем и в самом регистре) не было значений меньше 0 (т.е. были только положительные числа).
Сам код:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Для Каждого ТекСтрокаТовары Из Товары Цикл
      Запрос = Новый Запрос("ВЫБРАТЬ
                            | ТоварыНаСкладахОстатки.КоличествоОстаток,
                            | ТоварыНаСкладахОстатки.Номенклатура,
                            | ТоварыНаСкладахОстатки.Состояние,
                            | СУММА(СписаниеТоваровТовары.Количество) КАК Количество,
                            | СписаниеТоваровТовары.Номенклатура КАК Номенклатура1,
                            | СписаниеТоваровТовары.Состояние КАК Состояние1
                            |ИЗ
                            | РегистрНакопления.ТоварыНаСкладах.Остатки(
                            |     &ДатаСреза,
                            |     Номенклатура = &Номенклатура
                            |       И РабочиеМеста = &РабочиеМеста) КАК ТоварыНаСкладахОстатки,
                            | Документ.СписаниеТоваров.Товары КАК СписаниеТоваровТовары
                            |
                            |СГРУППИРОВАТЬ ПО
                            | ТоварыНаСкладахОстатки.КоличествоОстаток,
                            | ТоварыНаСкладахОстатки.Номенклатура,
                            | ТоварыНаСкладахОстатки.Состояние,
                            | СписаниеТоваровТовары.Номенклатура,
                            | СписаниеТоваровТовары.Состояние");
      
      ОстатокНаСкладе = 0;
      Количество = 0;
      Запрос.УстановитьПараметр("ДатаСреза", Новый Граница(ЭтотОбъект.МоментВремени(), ВидГраницы.Исключая));
      Запрос.УстановитьПараметр("Номенклатура", ТекСтрокаТовары.Номенклатура);
      Запрос.УстановитьПараметр("РабочиеМеста", РабочиеМеста);
      Запрос.УстановитьПараметр("Состояние", ТекСтрокаТовары.Состояние);
      ВыбРез = Запрос.Выполнить().Выбрать();
      Если ВыбРез.Следующий() Тогда
        ОстатокНаСкладе = ВыбРез.КоличествоОстаток;
        Количество = ВыбРез.Количество;
      КонецЕсли;
      Если ОстатокНаСкладе < Количество Тогда
        Сообщить("Не хватает " + ТекСтрокаТовары.Номенклатура + ". На складе " + ОстатокНаСкладе + " в документе " + Количество);
        Отказ = Истина;
        Возврат;
      КонецЕсли; 
      Движение = Движения.ТоварыНаСкладах.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
      Движение.Период = Дата;
      Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
      Движение.РабочиеМеста = РабочиеМеста;
      Движение.Количество = ТекСтрокаТовары.Количество;
      Движение.Состояние = ТекСтрокаТовары.Состояние;
    КонецЦикла;
Где косяк? Все работает, т.е. идет проверка, но если указать несколько наименований в привязанной форме списания а именно
[Наименование_1
[Наименование_2
[Наименование_1
то игнорируется последнее наименование и все последующие первые наименования ("Наименование_1"). Если добавить третье, то первые два будут игнорироваться и их остатки проверяться уже не будут.
Код прописан в Процедуре Обработки Проведения формы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2013, 12:09
Ответы с готовыми решениями:

Контроль остатков.
Всем привет. Тут столкнулся с популярной проблемой. Но чёткого решения не нашёл. В УТ при...

Перенос остатков из УТ 10.3 в УТ 10.3
нужно перенести остатки из одной базы в новую. подкиньте инструкцию по переносу или напишите...

Ведомость остатков ОС
в ведомости остатков ОС (БГУ) некоторые сроки повторяются 4 раза. А некоторые вообще не встречаются...

Запрос Остатков 1с 8.2
Всем салют =) Как можно сделать запрос остатков номенклатуры? Код привожу ниже но он явно не...

10
286 / 186 / 18
Регистрация: 20.02.2012
Сообщений: 926
05.09.2013, 12:19 2
Цитата Сообщение от Londreik Посмотреть сообщение
Наименование_1
на форме можно задать список значений? то есть выбрать несколько номенклатур?
0
Эксперт 1С
476 / 413 / 93
Регистрация: 26.09.2012
Сообщений: 1,920
05.09.2013, 12:44 3
Сначала группирую табличную часть товары, потом связывай с регистром и смотри остатки
1
11 / 11 / 1
Регистрация: 05.09.2013
Сообщений: 48
05.09.2013, 12:45  [ТС] 4
Цитата Сообщение от SonicQ Посмотреть сообщение
на форме можно задать список значений? то есть выбрать несколько номенклатур?
Да, номенклатуры заполняются из справочника в табличном поле документа.
Спасибо, уже решено. Решилось все установлением правильных условий и соединений в запросе, так же вынесли из под цикла проверку.
Код, если интересно:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  Если Константы.ВыводОтрицательныхЗначений.Получить() = Ложь Тогда
      Запрос = Новый Запрос("ВЫБРАТЬ
                            | ВложенныйЗапрос.Номенклатура,
                            | ВложенныйЗапрос.Состояние,
                            | ВложенныйЗапрос.Количество КАК КоличествоВДокументе,
                            | ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
                            | ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) - ВложенныйЗапрос.Количество КАК Разность
                            |ИЗ
                            | (ВЫБРАТЬ
                            |   СписаниеТоваровТовары.Номенклатура КАК Номенклатура,
                            |   СУММА(СписаниеТоваровТовары.Количество) КАК Количество,
                            |   СписаниеТоваровТовары.Состояние КАК Состояние
                            | ИЗ
                            |   Документ.СписаниеТоваров.Товары КАК СписаниеТоваровТовары
                            | ГДЕ
                            |   СписаниеТоваровТовары.Ссылка = &НашДокумент
                            | 
                            | СГРУППИРОВАТЬ ПО
                            |   СписаниеТоваровТовары.Номенклатура,
                            |   СписаниеТоваровТовары.Состояние) КАК ВложенныйЗапрос
                            |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаСреза, РабочиеМеста = &РабочиеМеста) КАК ТоварыНаСкладахОстатки
                            |   ПО ВложенныйЗапрос.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
                            |     И ВложенныйЗапрос.Состояние = ТоварыНаСкладахОстатки.Состояние");
      Запрос.УстановитьПараметр("ДатаСреза", Новый Граница(ЭтотОбъект.МоментВремени(), ВидГраницы.Исключая));                       
      Запрос.УстановитьПараметр("РабочиеМеста", РабочиеМеста);
      Запрос.УстановитьПараметр("НашДокумент", Ссылка);
    
      ВыбРез = Запрос.Выполнить().Выбрать();
      Пока ВыбРез.Следующий() Цикл
        Если ВыбРез.Разность < 0 Тогда
          Сообщить("Не хватает номенклатуры " + ВыбРез.Номенклатура + " " + ВыбРез.Состояние + ". На рабочем месте " + ВыбРез.КоличествоОстаток + " в документе " + ВыбРез.КоличествоВДокументе);
          Отказ = Истина;  
        КонецЕсли;  
      КонецЦикла;
    КонецЕсли;
    
    Если Не Отказ Тогда
      Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.РабочиеМеста = РабочиеМеста;
        Движение.Количество = ТекСтрокаТовары.Количество;
        Движение.Состояние = ТекСтрокаТовары.Состояние;
      КонецЦикла;
    КонецЕсли;
Тему закрыть

Добавлено через 31 секунду
Цитата Сообщение от Joker_vad Посмотреть сообщение
Сначала группирую табличную часть товары, потом связывай с регистром и смотри остатки
Уже) Если бы пораньше написал) Спасибо
0
Эксперт 1С
476 / 413 / 93
Регистрация: 26.09.2012
Сообщений: 1,920
05.09.2013, 12:49 5
Запрос в цикле то зачем, тут без него можно обойтись

Добавлено через 1 минуту
Всегда старайся избегать запроса в цикле, я помню как меня "по головке погладили" за такое)

Добавлено через 1 минуту
А вложенный запрос зачем, когда через виртуальные таблицы сделать можно? на 8,2 делаешь?
1
11 / 11 / 1
Регистрация: 05.09.2013
Сообщений: 48
05.09.2013, 12:51  [ТС] 6
Цитата Сообщение от Joker_vad Посмотреть сообщение
А вложенный запрос зачем, когда через виртуальные таблицы сделать можно? на 8,2 делаешь?
8.1
В плане через виртуальные таблицы? По подробней, пожалуйста
0
Эксперт 1С
476 / 413 / 93
Регистрация: 26.09.2012
Сообщений: 1,920
05.09.2013, 12:56 7
Подсчет остатков
через во это
0
11 / 11 / 1
Регистрация: 05.09.2013
Сообщений: 48
05.09.2013, 13:02  [ТС] 8
Тогда надо будет делать ссылку на документ в самом запросе? И каждый раз во временную выносить не тягостно будет, ежели можно организовать во внутреннем один раз? Может я заблуждаюсь, просто..
0
858 / 657 / 111
Регистрация: 01.11.2012
Сообщений: 2,411
05.09.2013, 13:04 9
Зачем сложно так?
Я так делаю.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Движения.ОстаткиТоваров.Записывать = Истина;
    ТЧ=Товары.Выгрузить();
    ТЧ.Свернуть("Товар","Количество"); //сворачиваем табл. часть по номенклатуре
    Для Каждого ТекСтрокаТовары Из ТЧ Цикл
        Ост=0;
        Тов=ТекСтрокаТовары.Товар;
        Кол=ТекСтрокаТовары.Количество;
        
        Фильтр   = Новый Структура;
        Фильтр.Вставить("Товар", Тов);
        Фильтр.Вставить("Склад", Склад);
        ТблОст=РегистрыНакопления.ОстаткиТоваров.Остатки(,Фильтр,"Товар,Склад","Количество");
        for each ТблСтр in ТблОст do //у меня в таблице 1 строка
            Ост=ТблСтр.Количество;
        enddo;
        //получили остаток
        if Кол>Ост then 
                      //даем отлуп
                      Отказ=Истина;
                      break; 
                endif;
        //тут добавляем запись регистра накопления
    КонецЦикла;
0
Эксперт 1С
476 / 413 / 93
Регистрация: 26.09.2012
Сообщений: 1,920
05.09.2013, 13:06 10
Цитата Сообщение от Londreik Посмотреть сообщение
Тогда надо будет делать ссылку на документ в самом запросе?
Вот это не понял. На сколько мне известно, вы выполните запрос по группировки табличной части только один раз и сохраните его в виртуальной таблице. Сейчас же этот запрос выполняется для каждой строки, что как раз таки я тягостно. Использование виртуальных таблиц оптимальнее
1
11 / 11 / 1
Регистрация: 05.09.2013
Сообщений: 48
05.09.2013, 13:09  [ТС] 11
Цитата Сообщение от Joker_vad Посмотреть сообщение
На сколько мне известно, вы выполните запрос по группировки табличной части только один раз и сохраните его в виртуальной таблице. Сейчас же этот запрос выполняется для каждой строки, что как раз таки я тягостно. Использование виртуальных таблиц оптимальнее
Хорошо, попробую
0
05.09.2013, 13:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2013, 13:09
Помогаю со студенческими работами здесь

Запрос остатков 1С 8.2
Всем привет! Может кто делал запрос остатков номенклатуры? Поделитесь пожалуйста..

Перенос остатков
Здраствуйте. База разрослась до больших размеров да и устарела. как перенести остатки в новую...

Контроль остатков
Добрый день! Начал изучение 1с с книги М.Г. Радченко, дошел до регистров накопления... Есть 2...

Перенос остатков
Требуется перенести остатки из базы конфигурации УПП в Бухгалтерию на определенную дату. Как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru