Имя: Пароль:
1C
1С v8
Как сделать движение по партиям
0 Oleg102
 
08.10.13
07:04
Всем привет! Хочу сделать движение товара по партиям. Конфигурация самописная. Не подскажите как это возможно сделать? Или где и куда посмотреть?
1 Гефест
 
08.10.13
07:06
2 Oleg102
 
08.10.13
07:09
(1) Есть такая книжка, до конца пока не дочитал, чуть больше середины дошел. Надо быстрее дочитывать и разбираться значит =) А глава какая не скажите пожалуйста? =)
3 Wobland
 
08.10.13
07:20
дарю. регистр подставишь свой


Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;

    Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

        // регистр ОстаткиМатериалов Приход
        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Материал = ТекСтрокаМатериалы.Материал;
        Движение.Склад = Склад;
        Движение.Количество = ТекСтрокаМатериалы.Количество;

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

КонецПроцедуры
4 Oleg102
 
08.10.13
07:23
(3) Благодарю.
5 Oleg102
 
08.10.13
08:01
Так сразу не догнал, движение это у меня давно есть. Как реализовать продажу по партиям? Нужно что бы когда пришло товара 20 шт. по цене 10 рублей, а потом еще 10 шт. по цене 14 рублей. Мне надо, что бы пока эти 20 штук не продадутся по цене 10 рублей, другой товара по цене 15 рублей 10 штук не продавались. Как это возможно реализовать. В самом начале что то не правильно поставил вопрос.
6 Oleg_Kag
 
08.10.13
08:08
Задача 1.1 из Опер.учета.
Читать тут: http://www.ax-online.ru/Exams/AttPlatf/Task-1.1.aspx
7 Wobland
 
08.10.13
08:10
(5) усложнение. нужно не только ФИФО, но и ЛИФО в зависимости от фазы луны и учётной политики на тот год
8 Oleg102
 
08.10.13
08:12
(6) Очень благодарен. Буду читать и разбираться.
9 Oleg102
 
08.10.13
10:16
Вроде сделал все движение по партиям, списывается в регистре правильно, так как нужно. Например:

Приходная накладная 000001:
Осталось 1 штука. по цене 10 рублей
приходная накладная 000002:
Осталось 6 штук. по цене 15 рублей

Когда идет списание Расходная накладная 2 штук то в регистре списывается и показывает 2 строки.
Приходная накладная 000001 = 1 штука. по цене 10 рублей.
Приходная накладная 000002 = 1 штука. по цене 10 рублей.

Все хорошо. Только цена как сделать что бы ставилась автоматически при проведении, если осталось 1 штука по цене 10 рублей то и списывалось по цене 10 рублей, а еще 1 штука по цене 15 рублей. То есть, что бы была запись в регистре такая

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Приходная накладная 000001 = 1 штука. по цене 10 рублей.
Приходная накладная 000002 = 1 штука. по цене 15 рублей.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Что бы так выглядел регистр. Я так понимаю нужно сделать проверку в форме документа при проведении. Если требуемое количество не хватает по цене 10 рублей, то создавалась вторая строка с количеством в нашем случае 1 штука и ценой 15 рублей. Как это возможно сделать?
10 Oleg102
 
08.10.13
10:17
Вот мое проведение расходной накладной
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
     // Чтение метода списания себестоимости
    МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания;

    Если МетодСписания.Пустая() Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Учетная политика не определена!";
        Сообщение.Сообщить();

        Отказ = Истина;
        Возврат;
    КонецЕсли;

    СортировкаПартий = ?(МетодСписания = Перечисления.УчетнаяПолитика.ФИФО, "", " УБЫВ");
    
    Движения.Продажи.Записывать = Истина;    
    Движения.ОстаткиМатериалов.Записывать = Истина;

    // Удаление предыдущих движений документа
    Движения.ОстаткиМатериалов.Записать();

    // Блокировка данных
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиМатериалов");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = Номенклатура;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");

    Блокировка.Заблокировать();

    // Чтение партий, доступных для списания. Сортировка согласно метода списания себестоимости
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РасходнаяНакладнаяНоменклатура.Номенклатура,
        |    РасходнаяНакладнаяНоменклатура.Номенклатура.Товар КАК Товар,
        |    СУММА(РасходнаяНакладнаяНоменклатура.Количество) КАК Количество,
        |    СУММА(РасходнаяНакладнаяНоменклатура.Сумма) КАК Сумма,
        |    СУММА(РасходнаяНакладнаяНоменклатура.Цена) КАК Цена,
        |    РасходнаяНакладнаяНоменклатура.ЕдиницаИзмерения,
        |    РасходнаяНакладнаяНоменклатура.Ссылка.Склад,
        |    РасходнаяНакладнаяНоменклатура.Ссылка.ВнутренняяНакладная
        |ПОМЕСТИТЬ РасходнаяНакладная
        |ИЗ
        |    Документ.РасходнаяНакладная.Номенклатура КАК РасходнаяНакладнаяНоменклатура
        |ГДЕ
        |    РасходнаяНакладнаяНоменклатура.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    РасходнаяНакладнаяНоменклатура.Номенклатура,
        |    РасходнаяНакладнаяНоменклатура.Номенклатура.Товар,
        |    РасходнаяНакладнаяНоменклатура.ЕдиницаИзмерения,
        |    РасходнаяНакладнаяНоменклатура.Ссылка.Склад,
        |    РасходнаяНакладнаяНоменклатура.Ссылка.ВнутренняяНакладная
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    РасходнаяНакладная.Номенклатура КАК Номенклатура,
        |    РасходнаяНакладная.Товар КАК Товар,
        |    РасходнаяНакладная.Количество КАК Количество,
        |    РасходнаяНакладная.Сумма,
        |    ОстаткиМатериаловОстатки.Партия КАК Партия,
        |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
        |    РасходнаяНакладная.Цена,
        |    РасходнаяНакладная.ЕдиницаИзмерения,
        |    РасходнаяНакладная.Склад,
        |    РасходнаяНакладная.ВнутренняяНакладная
        |ИЗ
        |    РасходнаяНакладная КАК РасходнаяНакладная
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
        |                &МоментВремени,
        |                Номенклатура В
        |                    (ВЫБРАТЬ
        |                        РасходнаяНакладная.Номенклатура
        |                    ИЗ
        |                        РасходнаяНакладная)) КАК ОстаткиМатериаловОстатки
        |        ПО РасходнаяНакладная.Номенклатура = ОстаткиМатериаловОстатки.Номенклатура
        |
        |УПОРЯДОЧИТЬ ПО
        |    ОстаткиМатериаловОстатки.Партия.МоментВремени" + СортировкаПартий + "
        |ИТОГИ
        |   МАКСИМУМ(Товар),
        |   МАКСИМУМ(Количество),
        |   МАКСИМУМ(Сумма),
        |   МАКСИМУМ(Цена),
        |   СУММА(КоличествоОстаток)
        |ПО
        |   Номенклатура";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

    Результат = Запрос.Выполнить();
    ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    Пока ВыборкаНоменклатура.Следующий() Цикл

        // Контроль остатков
        Если (НЕ ВыборкаНоменклатура.Товар)
              И (ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток) Тогда
              
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не хватает "+ (ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток) +
                              " позиций номенклатуры " + ВыборкаНоменклатура.Номенклатура + ".";
            Сообщение.Сообщить();

            Отказ = Истина;
        КонецЕсли;

        Если Отказ Тогда
            Продолжить;
        КонецЕсли;

        // Создание движений
        Если не ВыборкаНоменклатура.Товар Тогда

            ОсталосьСписать = ВыборкаНоменклатура.Количество;
            ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();

            Пока (ОсталосьСписать > 0) И ВыборкаДетальныеЗаписи.Следующий() Цикл
                Списываем = Мин(ОсталосьСписать,  ВыборкаДетальныеЗаписи.КоличествоОстаток);

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

        // регистр Продажи
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
        Движение.Количество = ВыборкаНоменклатура.Количество;
        Движение.Цена = ВыборкаНоменклатура.Цена;
        Движение.Сумма = ВыборкаНоменклатура.Сумма;
    КонецЦикла;
КонецПроцедуры
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
11 Wobland
 
08.10.13
10:19
товар (реквизит) больше на услугу смахивает
12 Oleg102
 
08.10.13
10:20
(11) В смысле. Не правильно списывается
13 Wobland
 
08.10.13
10:22
(12) в смыле Если не ВыборкаНоменклатура.Товар, то списываем с остатков
14 Wobland
 
08.10.13
10:28
как там было?
#define true false //счастливой отладки