15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
1

Учет партий при реализации номенклатуры

14.05.2017, 16:40. Показов 2015. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь сделать учет партий при реализации товара, но что-то не получается, в чем может быть проблема?
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Процедура ОбработкаПроведения(Отказ, РежимПроведения) 
    // 1. Очистка старых движений регистра
    Движения.СвободныеОстатки.Очистить(); Движения.СвободныеОстатки.Записывать = Истина; Движения.Записать();
    // 2. Получение запросом данных документа и остатков регистра 
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ 
    | Товары.Номенклатура КАК Номенклатура,
    | СУММА(Товары.Количество) КАК Количество 
    |ПОМЕСТИТЬ Товары 
    |ИЗ
    | Документ.РеализацияТоваровУслуг.Товары КАК Товары 
    |ГДЕ 
    | Товары.Ссылка = &Ссылка 
    | 
    |СГРУППИРОВАТЬ ПО 
    | Товары.Номенклатура 
    | 
    |ИНДЕКСИРОВАТЬ ПО 
    | Номенклатура 
    |; 
    | 
    |//////////////////////////////////////////////////////////////////////////////// 
    |ВЫБРАТЬ 
    | Товары.Номенклатура КАК Номенклатура,
    | ПРЕДСТАВЛЕНИЕССЫЛКИ(Товары.Номенклатура) КАК НоменклатураПредставление,
    | Товары.Количество КАК Количество, 
    | ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток 
    |ИЗ
    | Товары КАК Товары 
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки( 
    | &МоментВремени, 
    | Номенклатура В 
    | (ВЫБРАТЬ 
    | Товары.Номенклатура КАК Номенклатура 
    | ИЗ 
    | Товары КАК Товары)) КАК Остатки
| ПО Товары.Номенклатура = Остатки.Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса = Запрос.Выполнить(); 
// 3. Обход результатов запроса 
ВыборкаТовары = РезультатЗапроса.Выбрать(); 
Пока ВыборкаТовары.Следующий() Цикл 
    отбор = Новый Структура (); 
    к=0;
    регистр= РегистрыНакопления.СвободныеОстатки; 
    Данные = регистр.СвободныеОстатки(, отбор);
    // 4. Проверка на достаточность товаров 
    Дефицит = ВыборкаТовары.Количество - ВыборкаТовары.Остаток;
    Движение = Движения.Остатки.Добавить();
    Если Дефицит>0 Тогда Отказ = Истина; 
        Движение.Партия = Данные[к].Партия; 
 
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Товара "+ВыборкаТовары.НоменклатураПредставление+" недостаточно в количестве "+Дефицит+" шт."; 
        Сообщение.Сообщить(); КонецЕсли; 
    // 5. Переход в начало цикла, если были ошибки 
    Если Отказ Тогда Продолжить; КонецЕсли;
    // 6. Выполнение движений в регистры
    Движение = Движения.СвободныеОстатки.ДобавитьРасход();
    Движение.Период = Дата; Движение.Номенклатура = ВыборкаТовары.Номенклатура; 
    Движение.Количество = ВыборкаТовары.Количество; КонецЦикла; 
// 7. Установка флага записи движений в конце транзакции 
Движения.СвободныеОстатки.Записывать = Истина; КонецПроцедуры
Добавлено через 7 минут
Другая, почти рабочая версия
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
48
49
50
51
52
53
54
Процедура ОбработкаПроведения(Отказ, Режим)
        Движения.Остатки.Записывать = Истина; 
        Для Каждого ТекСтрокаТовар Из Номенклатура Цикл 
        к=0; 
        всего=ТекСтрокаТовар.Количество; 
        регистр= РегистрыНакопления.Остатки; 
        отбор = Новый Структура (); 
        отбор.Вставить ("Номенклатура", ТекСтрокаТовар.Товар);
        отбор.Вставить("Склад",Склад);
        Данные = регистр.Остатки(, отбор);
        Попытка
        пока всего<>0 цикл 
        если Данные[к].количество>0 тогда 
        Движение = Движения.Остатки.Добавить(); 
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход; 
        Движение.Период = Дата; 
        Движение.Номенклатура = ТекСтрокаТовар.Товар; 
        Движение.Партия = Данные[к].Партия; 
        если Данные[к].Партия < 0 тогда
        Движение.Партия = -1 * Данные[к].Партия;
    КонецЕсли;
        
        если всего>Данные[к].количество тогда 
        Движение.Количество = Данные[к].количество; 
        всего=всего-Данные[к].количество; 
        
        иначе 
        Движение.Количество = всего; 
        всего=0; 
        конецесли; 
        Движение.Склад = Склад;               
        конецесли; 
        к=к+1;            
        конеццикла; 
    Исключение
    Отказ = Истина;
    КонецПопытки;
    КонецЦикла;
 
    Движения.КолвоСумма.Записывать = Истина;
    Для Каждого ТекСтрокаНоменклатура Из Номенклатура Цикл
        Движение = Движения.КолвоСумма.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаНоменклатура.Товар;
        Движение.Контрагент = Покупатель;
        Движение.Склад = Склад;
        Движение.Ответственный = Ответственный;
        Движение.Количество = ТекСтрокаНоменклатура.Количество;
        Движение.Сумма = Сумма;
    КонецЦикла;
 
    
    КонецПроцедуры
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2017, 16:40
Ответы с готовыми решениями:

ФИФО для реализации номенклатуры
Здравствуйте, сделал обработку по ФИФО, адекватно ли она сделана, стоит ли ее дорабатывать,...

Учет номенклатуры в нескольких единицах измерения...
Учет номенклатуры в нескольких единицах измерения, Автозаполнение единиц в ОКЕИ, в зависмости от...

Складской учет.Поступление партии номенклатуры, расход парти номенклатуры, вычисление остатка
Доброго времени суток! Помогите решить возникшую проблему: Существует таблица tblЧип с перечнем...

Структура БД по организации складского учета партий номенклатуры
Доброго времени суток форумчане! Занимаюсь организацией складского учета в БД Аксесс, есть...

18
2133 / 1474 / 525
Регистрация: 16.01.2015
Сообщений: 6,309
14.05.2017, 23:53 2
В первом варианте
1C
1
2
регистр= РегистрыНакопления.СвободныеОстатки; 
    Данные = регистр.СвободныеОстатки(, отбор);
Здесь точно нет отбора. Во первых запись неверна, во вторых Отбор в вашем коде - пустая структура
Во втором варианте тоже вопросы
1C
1
Данные = регистр.Остатки(, отбор); // явно не то
Возможно надо
1C
1
Данные = регистр.Остатки.Выбрать(, отбор);
?
И возникает сомнение по имени регистра накопления
1C
1
регистр= РегистрыНакопления.Остатки;
Точно регистр называется Остатки?
1
Модератор
Эксперт 1С
3783 / 2963 / 589
Регистрация: 10.03.2011
Сообщений: 11,665
Записей в блоге: 1
15.05.2017, 03:06 3
Цитата Сообщение от Chubaka101 Посмотреть сообщение
почти рабочая версия

Не по теме:

Chubaka101, а ты я смотрю позитивный человек))))

1
857 / 656 / 111
Регистрация: 01.11.2012
Сообщений: 2,411
15.05.2017, 09:57 4
Ёлки-палки, ну и каша у тебя, ТС, что в 1м варианте, что во втором.
Нарисуй алгоритм списания партий, потом пиши код.

В конце концов посмотри видео-уроки Чистова или Гилёва, там всё разжёвано.

Добавлено через 6 минут
Дам подсказку.
У тебя 2 регистра, в одном как я понимаю общий остаток, в другом партии. (Непонятно зачем, когда можно использовать 1 регистр, но это моё мнение)

Ты должен сгруппировать используя итоги в запросе, с упорядочиванием по времени партии ( в зависимости FIFO или LIFO)

Товар - ОбщийОстаток
Товар - Партия - ОстатокПартии


Обходя выборку результата, должно быть 2 цикла, по товарам и партиям товаров
В 1-м проверить, хватает ли вообще товара
Если хватает уйти во 2-й цикл по партиям
В этом цикле проверяй остаток по партии и уменьшай количество списываемого товара на остаток партии, пока он не станет равным нулю

Если не хватает, выдавай сообщение пользователю
1
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
15.05.2017, 10:08  [ТС] 5
Цитата Сообщение от polax Посмотреть сообщение
Точно регистр называется Остатки?
Не, я запутался немного. Регистр Остатки не относится к тому, что я хочу сделать.
Надо работать с регистром СвободныеОстатки.
Учет партий при реализации номенклатуры

Похимичил с кодом, теперь такая ошибка.


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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Процедура ОбработкаПроведения(Отказ, РежимПроведения) 
    // 1. Очистка старых движений регистра
    Движения.СвободныеОстатки.Очистить(); 
    Движения.СвободныеОстатки.Записывать = Истина;
    Движения.Записать();
    // 2. Получение запросом данных документа и остатков регистра 
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ 
    | Товары.Номенклатура КАК Номенклатура,
    | СУММА(Товары.Количество) КАК Количество 
    |ПОМЕСТИТЬ Товары 
    |ИЗ
    | Документ.РеализацияТоваровУслуг.Товары КАК Товары 
    |ГДЕ 
    | Товары.Ссылка = &Ссылка 
    | 
    |СГРУППИРОВАТЬ ПО 
    | Товары.Номенклатура 
    | 
    |ИНДЕКСИРОВАТЬ ПО 
    | Номенклатура 
    |; 
    | 
    |//////////////////////////////////////////////////////////////////////////////// 
    |ВЫБРАТЬ 
    | Товары.Номенклатура КАК Номенклатура,
    | ПРЕДСТАВЛЕНИЕССЫЛКИ(Товары.Номенклатура) КАК НоменклатураПредставление,
    | Товары.Количество КАК Количество, 
    | ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток 
    |ИЗ
    | Товары КАК Товары 
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки( 
    | &МоментВремени, 
    | Номенклатура В 
    | (ВЫБРАТЬ 
    | Товары.Номенклатура КАК Номенклатура 
    | ИЗ 
    | Товары КАК Товары)) КАК Остатки
| ПО Товары.Номенклатура = Остатки.Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса = Запрос.Выполнить(); 
// 3. Обход результатов запроса 
ВыборкаТовары = РезультатЗапроса.Выбрать(); 
Пока ВыборкаТовары.Следующий() Цикл 
    
    отбор = Новый Структура (); 
    к=0;
    регистр= РегистрыНакопления.СвободныеОстатки; 
    Данные = регистр.Выбрать(, отбор);
    
    
    // 4. Проверка на достаточность товаров 
    Дефицит = ВыборкаТовары.Количество - ВыборкаТовары.Остаток;
    
    Движение = Движения.СвободныеОстатки.Добавить();
    
    Если Дефицит>0 Тогда Отказ = Истина; 
        
        Движение.Партия = Данные[к].Партия; 
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Товара "+ВыборкаТовары.НоменклатураПредставление+" недостаточно в количестве "+Дефицит+" шт."; 
        Сообщение.Сообщить(); КонецЕсли; 
    // 5. Переход в начало цикла, если были ошибки 
    Если Отказ Тогда Продолжить; КонецЕсли;
    // 6. Выполнение движений в регистры
    Движение = Движения.СвободныеОстатки.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаТовары.Номенклатура; 
    Движение.Количество = ВыборкаТовары.Количество;
КонецЦикла; 
// 7. Установка флага записи движений в конце транзакции 
Движения.СвободныеОстатки.Записывать = Истина; КонецПроцедуры
0
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
15.05.2017, 10:14  [ТС] 6
Xomych, Я делал по этой статье http://курсы-по-1с.рф/articles... ory-check/
Цитата Сообщение от Xomych Посмотреть сообщение
Дам подсказку.
У тебя 2 регистра, в одном как я понимаю общий остаток, в другом партии. (Непонятно зачем, когда можно использовать 1 регистр, но это моё мнение)
У меня один регистр, я чутка запутался и не переименовал в коде Остатки на СвободныеОстатки.

Мне ФИФО надо реализовать.
0
2133 / 1474 / 525
Регистрация: 16.01.2015
Сообщений: 6,309
15.05.2017, 10:35 7
Chubaka101,
1C
1
2
3
4
отбор = Новый Структура (); 
    к=0;
    регистр= РегистрыНакопления.СвободныеОстатки; 
    Данные = регистр.Выбрать(, отбор);
Ошибка в последней строчке. Регистр периодический. Перед запятой должен стоять параметр с типом Дата
И снова, отбора нет. Структура пустая. Надо что-то добавить в отбор. Типа
1C
1
Отбор.Вставить("Номенклатура", Выборка.Номенклатура)
Ну и загадочное к = 0 )))

Добавлено через 10 минут
1C
1
2
3
4
5
6
7
8
Если Дефицит>0 Тогда Отказ = Истина; 
        
        Движение.Партия = Данные[к].Партия; 
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Товара "+ВыборкаТовары.НоменклатураПредставление+" недостаточно в количестве "+Дефицит+" шт."; 
        Сообщение.Сообщить(); КонецЕсли; 
   
    Если Отказ Тогда Продолжить; КонецЕсли;
Если Отказ=Истина Стандартный обработчик прекращает работу, Продолжить не получится. Да и продолжать нет смысла. Документ и все движения по нему не должны записываться, товара не хватает.

Добавлено через 2 минуты
1C
1
2
3
4
5
6
Если Дефицит>0 Тогда  
 Сообщение = Новый СообщениеПользователю;
 Сообщение.Текст = "Товара "+ВыборкаТовары.НоменклатураПредставление+" недостаточно в количестве "+Дефицит+" шт."; 
 Сообщение.Сообщить(); 
Отказ = Истина;
КонецЕсли;
1
857 / 656 / 111
Регистрация: 01.11.2012
Сообщений: 2,411
15.05.2017, 16:53 8
Сил нет смотреть на твои мучения, держи пример
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
48
49
50
51
52
53
54
55
56
    Движения.ОстаткиТоваров.Записывать=Истина;
    
    ВТ=Новый МенеджерВременныхТаблиц;
    З=Новый Запрос;
    З.МенеджерВременныхТаблиц=ВТ;
    
    З.Текст="ВЫБРАТЬ
    |Товар,
    |Сумма(Количество) КАК Количество
    |ПОМЕСТИТЬ ТЧ
    |ИЗ Документ.РасходнаяНакладная.Товары КАК Товары
    |ГДЕ Ссылка=&Ссылка
    |СГРУППИРОВАТЬ ПО Товар
    |;
    |ВЫБРАТЬ 
    |ТЧ.Товар,
    |Остатки.ПрихНакл,
    |Количество,
    |ЕСТЬNULL(Остатки.ОстатокТовараОстаток,0) КАК Остаток
    |ИЗ ТЧ КАК ТЧ
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени,Склад=&Склад И Товар В(ВЫБРАТЬ ТОВАР ИЗ ТЧ КАК ТЧ)) КАК Остатки
    |ПО ТЧ.Товар=Остатки.Товар
    |ГДЕ ЕСТЬNULL(Остатки.ОстатокТовараОстаток,0)>=0
    |УПОРЯДОЧИТЬ ПО ПрихНакл.Дата ВОЗР
    |ИТОГИ МАКСИМУМ(Количество),СУММА(Остаток)
    |ПО ТЧ.Товар";
    
    З.УстановитьПараметр("МоментВремени",МоментВремени());
    З.УстановитьПараметр("Склад",Склад);
    З.УстановитьПараметр("Ссылка",Ссылка);
    
    Выб=З.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    while Выб.Следующий() do
        if Выб.Количество>Выб.Остаток then
            Сообщить("Не хватает товара """+Выб.Товар);
            Отказ=Истина;
        endif;
        
        ОстСпис=Min(Выб.Количество,Выб.Остаток);
        БСум=0;
        
        ВыбПН=Выб.Выбрать();
        while ВыбПН.Следующий() И ОстСпис>0 do
            КолСпис=Мин(ОстСпис,ВыбПН.Остаток);
            ОстСпис=ОстСпис-КолСпис;
            
            Движение = Движения.ОстаткиТоваров.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Товар = ВыбПН.Товар;
            Движение.Склад = Склад;
            Движение.ПрихНакл = ВыбПН.ПрихНакл;
            Движение.ОстатокТовара = КолСпис ;
        enddo;  
    enddo;
    Движения.Записать();
1
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
23.05.2017, 13:46  [ТС] 9
Xomych, Т.е. Вместо регистра накоплений ОстаткиТоваров у меня СвободныеОстатки, ТЧ - это табличная часть?
ОстаткиТоваров.Остатки - это ресурс?
Цитата Сообщение от Xomych Посмотреть сообщение
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени,Склад=&Склад И Товар В(ВЫБРАТЬ ТОВАР ИЗ ТЧ КАК ТЧ)) КАК Остатки
А ПрихНакл - это что?

У меня такая структура
Учет партий при реализации номенклатуры
0
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
23.05.2017, 13:47  [ТС] 10
Xomych, Т.е. Вместо регистра накоплений ОстаткиТоваров у меня СвободныеОстатки, ТЧ - это табличная часть?
ОстаткиТоваров.Остатки - это ресурс?
Цитата Сообщение от Xomych Посмотреть сообщение
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени,Склад=&Склад И Товар В(ВЫБРАТЬ ТОВАР ИЗ ТЧ КАК ТЧ)) КАК Остатки
А ПрихНакл - это что?

У меня такая структура Вложение 836048
0
857 / 656 / 111
Регистрация: 01.11.2012
Сообщений: 2,411
24.05.2017, 09:11 11
Прихнакл это партия (ссылка на документ прихода) и это Измерение, а не Ресурс.
ОстаткиТоваров.Остатки это таблица регистра
1
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
25.05.2017, 21:58  [ТС] 12
Xomych, Поменял вот так
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
48
49
50
51
52
53
54
55
56
57
58
Процедура ОбработкаПроведения(Отказ, РежимПроведения) 
Движения.СвободныеОстатки.Записывать=Истина;
    
    ВТ=Новый МенеджерВременныхТаблиц;
    З=Новый Запрос;
    З.МенеджерВременныхТаблиц=ВТ;
    
    З.Текст="ВЫБРАТЬ
    |Номенклатура,
    |Сумма(Количество) КАК Количество
    |ПОМЕСТИТЬ ТЧ
    |ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары
    |ГДЕ Ссылка=&Ссылка
    |СГРУППИРОВАТЬ ПО Номенклатура
    |;
    |ВЫБРАТЬ 
    |ТЧ.Номенклатура,
    |Остатки.ПрихНакл,
    |Количество,
    |ЕСТЬNULL(Остатки.ОстатокТовараОстаток,0) КАК Остаток
    |ИЗ ТЧ КАК ТЧ
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&МоментВремени,Склад=&Склад И Товар В(ВЫБРАТЬ ТОВАР ИЗ ТЧ КАК ТЧ)) КАК Остатки
    |ПО ТЧ.Номенклатура=Остатки.Номенклатура
    |ГДЕ ЕСТЬNULL(СвободныеОстатки.ОстатокТовараОстаток,0)>=0
    |УПОРЯДОЧИТЬ ПО ПрихНакл.Дата ВОЗР
    |ИТОГИ МАКСИМУМ(Количество),СУММА(Остаток)
    |ПО ТЧ.Номенклатура";
    
    З.УстановитьПараметр("МоментВремени",МоментВремени());
    З.УстановитьПараметр("Склад",Склад);
    З.УстановитьПараметр("Ссылка",Ссылка);
    
    Выб=З.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    while Выб.Следующий() do
        if Выб.Количество>Выб.Остаток then
            Сообщить("Не хватает товара """+Выб.Товар);
            Отказ=Истина;
        endif;
        
        ОстСпис=Min(Выб.Количество,Выб.Остаток);
        БСум=0;
        
        ВыбПН=Выб.Выбрать();
        while ВыбПН.Следующий() И ОстСпис>0 do
            КолСпис=Мин(ОстСпис,ВыбПН.Остаток);
            ОстСпис=ОстСпис-КолСпис;
            
            Движение = Движения.СвободныеОстатки.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Товар = ВыбПН.Товар;
            Движение.Склад = Склад;
            Движение.ПрихНакл = ВыбПН.ПрихНакл;
            Движение.ОстатокТовара = КолСпис ;
        enddo;  
    enddo;
    Движения.Записать();
КонецПроцедуры
Цитата Сообщение от Xomych Посмотреть сообщение
ОстаткиТоваров.Остатки это таблица регистра
Что за таблица такая? у меня ошибку выдает
Учет партий при реализации номенклатуры
0
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
25.05.2017, 22:08  [ТС] 13
Xomych, Поменял вот так
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
48
49
50
51
52
53
54
55
56
57
58
Процедура ОбработкаПроведения(Отказ, РежимПроведения) 
Движения.СвободныеОстатки.Записывать=Истина;
    
    ВТ=Новый МенеджерВременныхТаблиц;
    З=Новый Запрос;
    З.МенеджерВременныхТаблиц=ВТ;
    
    З.Текст="ВЫБРАТЬ
    |Номенклатура,
    |Сумма(Количество) КАК Количество
    |ПОМЕСТИТЬ ТЧ
    |ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары
    |ГДЕ Ссылка=&Ссылка
    |СГРУППИРОВАТЬ ПО Номенклатура
    |;
    |ВЫБРАТЬ 
    |ТЧ.Номенклатура,
    |Остатки.ПрихНакл,
    |Количество,
    |ЕСТЬNULL(Остатки.ОстатокТовараОстаток,0) КАК Остаток
    |ИЗ ТЧ КАК ТЧ
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&МоментВремени,Склад=&Склад И Товар В(ВЫБРАТЬ ТОВАР ИЗ ТЧ КАК ТЧ)) КАК Остатки
    |ПО ТЧ.Номенклатура=Остатки.Номенклатура
    |ГДЕ ЕСТЬNULL(СвободныеОстатки.ОстатокТовараОстаток,0)>=0
    |УПОРЯДОЧИТЬ ПО ПрихНакл.Дата ВОЗР
    |ИТОГИ МАКСИМУМ(Количество),СУММА(Остаток)
    |ПО ТЧ.Номенклатура";
    
    З.УстановитьПараметр("МоментВремени",МоментВремени());
    З.УстановитьПараметр("Склад",Склад);
    З.УстановитьПараметр("Ссылка",Ссылка);
    
    Выб=З.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    while Выб.Следующий() do
        if Выб.Количество>Выб.Остаток then
            Сообщить("Не хватает товара """+Выб.Товар);
            Отказ=Истина;
        endif;
        
        ОстСпис=Min(Выб.Количество,Выб.Остаток);
        БСум=0;
        
        ВыбПН=Выб.Выбрать();
        while ВыбПН.Следующий() И ОстСпис>0 do
            КолСпис=Мин(ОстСпис,ВыбПН.Остаток);
            ОстСпис=ОстСпис-КолСпис;
            
            Движение = Движения.СвободныеОстатки.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Товар = ВыбПН.Товар;
            Движение.Склад = Склад;
            Движение.ПрихНакл = ВыбПН.ПрихНакл;
            Движение.ОстатокТовара = КолСпис ;
        enddo;  
    enddo;
    Движения.Записать();
КонецПроцедуры
Цитата Сообщение от Xomych Посмотреть сообщение
ОстаткиТоваров.Остатки это таблица регистра
Что за таблица такая? у меня ошибку выдает Вложение 837054

Добавлено через 9 минут
Не понимаю, что откуда должно идти для этого учета по партиям, бред бредом.
Такая дичь этот 1С, как же удобно писать на php или C#.
0
857 / 656 / 111
Регистрация: 01.11.2012
Сообщений: 2,411
26.05.2017, 20:07 14
У тебя должно быть КоличествоОстаток, судя по твоему ресурсу регистра
1
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
26.05.2017, 20:22  [ТС] 15
Цитата Сообщение от Xomych Посмотреть сообщение
У тебя должно быть КоличествоОстаток, судя по твоему ресурсу регистра
У меня 2 измерения и 1 ресурс должен быть в Регистре Накопления? Ошибки выдает(
Учет партий при реализации номенклатуры
Учет партий при реализации номенклатуры
Учет партий при реализации номенклатуры

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
48
49
50
51
52
53
54
55
Процедура ОбработкаПроведения(Отказ, РежимПроведения) 
   Движения.СвободныеОстатки.Записывать=Истина;
   ВТ=Новый МенеджерВременныхТаблиц;
   З=Новый Запрос;
   З.МенеджерВременныхТаблиц=ВТ;
   З.Текст="ВЫБРАТЬ
    |Номенклатура,
    |Сумма(Количество) КАК Количество
    |ПОМЕСТИТЬ ТЧ
    |ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары
    |ГДЕ Ссылка=&Ссылка
    |СГРУППИРОВАТЬ ПО Номенклатура
    |;
    |ВЫБРАТЬ 
    |ТЧ.Номенклатура,
    |СвободныеОстатки.ПрихНакл,
    |Количество,
    |ЕСТЬNULL(Остатки.Количество,0) КАК Остаток
    |ИЗ ТЧ КАК ТЧ
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&МоментВремени,Склад=&Склад И Товар В(ВЫБРАТЬ ТОВАР ИЗ ТЧ КАК ТЧ)) КАК Остатки
    |ПО ТЧ.Номенклатура=Остатки.Номенклатура
    |ГДЕ ЕСТЬNULL(СвободныеОстатки.Количество,0)>=0
    |УПОРЯДОЧИТЬ ПО ПрихНакл.Дата ВОЗР
    |ИТОГИ МАКСИМУМ(Количество),СУММА(Остаток)
    |ПО ТЧ.Номенклатура";
    
    З.УстановитьПараметр("МоментВремени",МоментВремени());
    З.УстановитьПараметр("Склад",Склад);
    З.УстановитьПараметр("Ссылка",Ссылка);
    
    Выб=З.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    while Выб.Следующий() do
        if Выб.Количество>Выб.Остаток then
            Сообщить("Не хватает товара """+Выб.Товар);
            Отказ=Истина;
        endif;
        
        ОстСпис=Min(Выб.Количество,Выб.Остаток);
        БСум=0;
        
        ВыбПН=Выб.Выбрать();
        while ВыбПН.Следующий() И ОстСпис>0 do
            КолСпис=Мин(ОстСпис,ВыбПН.Остаток);
            ОстСпис=ОстСпис-КолСпис;
            Движение = Движения.СвободныеОстатки.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Товар = ВыбПН.Товар;
            Движение.Склад = Склад;
            Движение.ПрихНакл = ВыбПН.ПрихНакл;
            Движение.ОстатокТовара = КолСпис ;
        enddo;  
    enddo;
    Движения.Записать();
КонецПроцедуры
0
857 / 656 / 111
Регистрация: 01.11.2012
Сообщений: 2,411
26.05.2017, 20:39 16
1C
1
2
3
4
5
ЕСТЬNULL(Остатки.КоличествоОстаток,0) КАК Остаток
    |ИЗ ТЧ КАК ТЧ
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&МоментВремени,Склад=&Склад И Товар В(ВЫБРАТЬ ТОВАР ИЗ ТЧ КАК ТЧ)) КАК Остатки
    |ПО ТЧ.Номенклатура=Остатки.Номенклатура
    |ГДЕ ЕСТЬNULL(СвободныеОстатки.КоличествоОстаток,0)>=0
Открой конструктор запроса чтоль для разнообразия, посмотри какие таблицы есть у регистра накопления, уроки посмотри Чистова например.
1
15 / 14 / 5
Регистрация: 14.10.2015
Сообщений: 266
31.05.2017, 17:35  [ТС] 17
Dethmontt, Xomych, polax, Вот рабочий код по ФИФО!!!!
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
Движения.ОстаткиТоваров.Записывать = Истина; 
    Для Каждого ТекСтрокаТовары Из Товары Цикл 
        Индекс1 = 0; 
        Всего = ТекСтрокаТовары.Количество; 
        Регистр = РегистрыНакопления.ОстаткиТоваров; 
        Отбор = Новый Структура (); 
        Отбор.Вставить ("Номенклатура", ТекСтрокаТовары.Товар); 
        Данные = Регистр.Остатки(, Отбор); 
        Пока Всего<>0 Цикл 
                Если Данные[Индекс1].Количество>0 Тогда 
                Движение = Движения.ОстаткиТоваров.Добавить(); 
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход; 
                Движение.Период = Дата; 
                Движение.Номенклатура = ТекСтрокаТовары.Товар; 
                Движение.Склад =Склад;
                Движение.Партия = Данные[Индекс1].Партия; 
                    Если Всего>Данные[Индекс1].Количество Тогда 
                    Движение.Количество = Данные[Индекс1].Количество; 
                    Всего=Всего-Данные[Индекс1].Количество; 
                    Иначе 
                    Движение.Количество = Всего;
                    Всего=0; 
                КонецЕсли;                 
                Движение.Сумма = ТекСтрокаТовары.Сумма;
                КонецЕсли; 
            Индекс1 = Индекс1 + 1;          
        КонецЦикла; 
    КонецЦикла;
    
    // регистр Продажи 
    Движения.Продажи.Записывать = Истина;
    Для Каждого ТекСтрокаТовары Из Товары Цикл
    Движение = Движения.Продажи.Добавить();
    Движение.Период = Дата; 
    Движение.Номенклатура = ТекСтрокаТовары.Товар;
    Движение.Клиент = Контрагент;
    Движение.Количество = ТекСтрокаТовары.Количество;
    Движение.Сумма = ТекСтрокаТовары.Сумма;
    КонецЦикла;
0
Модератор
Эксперт 1С
3783 / 2963 / 589
Регистрация: 10.03.2011
Сообщений: 11,665
Записей в блоге: 1
31.05.2017, 17:50 18
Chubaka101, Мда...

Поздравляю!!!
1
Xomych
01.06.2017, 14:19     Учет партий при реализации номенклатуры
  #19

Не по теме:

Сильный код, исправлять я его конечно не буду

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2017, 14:19

Как выполнить команду ./ty_all при конвертировании базы партий Го в sgf?
Всем привет! Заранее хочу извиниться, если мой вопрос покажется специалистам самоочевидным. Но я...

Какой тип номенклатуры можно указать для вида номенклатуры?
сдавал экзамен проф УТ 8, попался вопрос: какой тип номенклатуры можно указать для вида...

Какова вероятность, что при этом будет сыграно ровно m результативных партий (ничьи не учитываются)?
Данная задача находится в разделе &quot;независимые испытания с числом исходов больше двух&quot;, но я здесь...

не могу избавится от вируса TR/Crypt.XPACK.Gen ( по номенклатуры Авира) или Win32:Trojan-gen (по номенклатуры Аваста)...
не могу избавится от вируса TR/Crypt.XPACK.Gen ( по номенклатуры Авира) или Win32:Trojan-gen (по...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru