Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Билет 1.33, платформа          
kosalex Подменю пользователя
сообщение 14.05.14, 22:14
Сообщение #1

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Компания занимается оптовой торговлей. Для минимизации складских запасов закупки товаров происходят согласно предполагаемым продажам. Принят следующий порядок работы:
Поступает заказ покупателя (документ «Заказ покупателя»). На основании существующих заказов покупателей производится закупка оборудования у поставщика (документ «Приходная накладная»). После того, как оборудование поступило, оно может быть отгружено покупателю (документ «Расходная накладная»).
При проведении документа «Приходная накладная» необходимо производить анализ неотгруженных товаров, заказанных покупателем. Поступивший товар распределяется по заказам покупателей, исходя из хронологии (начиная с самого раннего и далее до самого последнего). В том случае, если товара закуплено больше, чем есть неотгруженных заказов покупателей, то избыток составляет «свободный остаток».
Отгрузка оборудования по одному заказу покупателя может происходить несколькими документами «Расходная накладная». Следует считать, что оборудование по заказу будет отгружено полностью и отгрузка может происходить только на основании заказа. Себестоимость оборудования рассчитывается как средняя в рамках закупок под заказ покупателя. В первую очередь списывается товар, распределенный на текущий заказ. Если товара не хватает, то можно списать свободный остаток. Если же не хватает и его, то документ не должен проводиться.
При закупке следует учитывать, что товар по заказу может быть уже отгружен из свободного остатка.
Учет товаров в разрезе складов не ведется.


Создал РН: ЗаказыПокупателей, ОстаткиНоменклатуры, ТоварыВРезерве.

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


//Документ ПриходнаяНакладная

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

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


Функция ПолучитьКоличествоЗаказаногоТовара(Номенклатура)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПокупателейОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ЗаказыПокупателей.Остатки(, ) КАК ЗаказыПокупателейОстатки
        |ГДЕ
        |    ЗаказыПокупателейОстатки.Номенклатура = &Номенклатура
        |ИТОГИ ПО
        |    ЗаказыПокупателейОстатки.Номенклатура";

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

    ТаблицаНоменклатуры = Запрос.Выполнить().Выгрузить();
    
    Если ТаблицаНоменклатуры.Количество() > 0 Тогда
        Возврат ТаблицаНоменклатуры;
    Иначе                                                            
        Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);
    КонецЕсли;
КонецФункции


Функция ПолучитьНомерЗаказа(Номенклатура)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПокупателей.НомерЗаказа
        |ИЗ
        |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
        |ГДЕ
        |    ЗаказыПокупателей.Номенклатура = &Номенклатура
        |
        |УПОРЯДОЧИТЬ ПО
        |    ЗаказыПокупателей.Период";

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

    ТаблицаНоменклатуры = Запрос.Выполнить().Выгрузить();
    
    Если ТаблицаНоменклатуры.Количество() > 0 Тогда
        Возврат ТаблицаНоменклатуры;
    Иначе                                                            
        Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);
    КонецЕсли;
КонецФункции

//Документ РасходнаяНакладная

Процедура ОбработкаПроведения(Отказ, Режим)
    
    // регистр ТоварыВРезерве Расход
    Движения.ТоварыВРезерве.Записывать = Истина;
    Движения.ОстаткиНоменклатуры.Записывать = Истина;
    Движения.ЗаказыПокупателей.Записывать = Истина;
    Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
        НомераЗаказов = ПолучитьНомерЗаказа(ТекСтрокаСписокНоменклатуры.Номенклатура);
        КоличествоТовараВРезерве = ПолучитьКоличествоТовараВРезерве(ТекСтрокаСписокНоменклатуры.Номенклатура);
        КоличествоТовараВОстатке = ПолучитьКоличествоТовараВОстатке(ТекСтрокаСписокНоменклатуры.Номенклатура);
        
        Если ТекСтрокаСписокНоменклатуры.Количество <= КоличествоТовараВРезерве[0].КоличествоОстаток Тогда
            //регистр ТоварыВРезерве
            Движение = Движения.ТоварыВРезерве.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.НомерЗаказа = НомераЗаказов[0].НомерЗаказа;
            Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
            Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
            
            //регистр ЗаказыПокупателей Расход
            Движение = Движения.ЗаказыПокупателей.Добавить();
            Движение.ВидДвиженияНакопления = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.НомерЗаказа = НомераЗаказов[0].НомерЗаказа;
            Движение.Номенклатура = ТекСтрокаСписокНоменклатуры;
            Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
            
        ИначеЕсли ТекСтрокаСписокНоменклатуры.Количество <= КоличествоТовараВОстатке[0].КоличествоОстаток Тогда
            //регистр ОстаткиНоменклатуры Расход
            Движение = Движения.ОстаткиНоменклатуры.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.НомерЗаказа = НомераЗаказов[0].НомерЗаказа;
            Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
            Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
            
            
            //регистр ЗаказыПокупателей Расход
            Движение = Движения.ЗаказыПокупателей.Добавить();
            Движение.ВидДвиженияНакопления = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.НомерЗаказа = НомераЗаказов[0].НомерЗаказа;
            Движение.Номенклатура = ТекСтрокаСписокНоменклатуры;
            Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
        
        Иначе    
            Отказ = Истина;
            Сообщить("Товара" + ТекСтрокаСписокНоменклатуры.Номенклатура +  " в колличестве " + ТекСтрокаСписокНоменклатуры.Количество + " нет в резерве и в остатке");
        КонецЕсли;
    КонецЦикла;
        Движения.Записать();    
КонецПроцедуры

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


Функция ПолучитьНомерЗаказа(Номенклатура) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПокупателей.НомерЗаказа
        |ИЗ
        |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
        |ГДЕ
        |    ЗаказыПокупателей.Номенклатура = &Номенклатура
        |
        |УПОРЯДОЧИТЬ ПО
        |    ЗаказыПокупателей.Период";

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

    НомераЗаказов = Запрос.Выполнить().Выгрузить();
    
    Если НомераЗаказов.Количество() > 0 Тогда
        Возврат НомераЗаказов;
    Иначе                                                            
        Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);
    КонецЕсли;
КонецФункции

Функция ПолучитьКоличествоТовараВОстатке(Номенклатура)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОстаткиНоменклатурыОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(, ) КАК ОстаткиНоменклатурыОстатки
        |ГДЕ
        |    ОстаткиНоменклатурыОстатки.Номенклатура = &Номенклатура
        |ИТОГИ ПО
        |    ОстаткиНоменклатурыОстатки.Номенклатура";

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

    КоличествоТовараВОстатке = Запрос.Выполнить().Выгрузить();
    
    Если КоличествоТовараВОстатке.Количество() > 0 Тогда
        Возврат КоличествоТовараВОстатке;
    Иначе                                                            
        Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);
    КонецЕсли;
КонецФункции


Функция ПолучитьКоличествоТовараВРезерве(Номенклатура)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыВРезервеОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ТоварыВРезерве.Остатки(, ) КАК ТоварыВРезервеОстатки
        |ГДЕ
        |    ТоварыВРезервеОстатки.Номенклатура = &Номенклатура
        |ИТОГИ ПО
        |    ТоварыВРезервеОстатки.Номенклатура";

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

    КоличествоТовараВРезерве = Запрос.Выполнить().Выгрузить();
    
    Если КоличествоТовараВРезерве.Количество() > 0 Тогда
        Возврат КоличествоТовараВРезерве;
    Иначе                                                            
        Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);
    КонецЕсли;
КонецФункции


Сообщение отредактировал Vofka - 15.05.14, 16:25

Vofka Подменю пользователя
сообщение 15.05.14, 7:49
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Какой это номер билета?

kosalex Подменю пользователя
сообщение 15.05.14, 16:16
Сообщение #3

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(Vofka @ 15.05.14, 7:49) *
Какой это номер билета?


1.33 вроде

Agapov_Stas Подменю пользователя
сообщение 16.05.14, 15:41
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 217
Из: Днепропетровск
Спасибо сказали: 18 раз
Рейтинг: 0

 КоличествоЗаказанногоТовара = ПолучитьКоличествоЗаказаногоТовара(ТекСтрокаСписокНоменклатуры.Номенклатура);
НомераЗаказов = ПолучитьНомерЗаказа(ТекСтрокаСписокНоменклатуры.Номенклатура);


Функция ПолучитьКоличествоЗаказаногоТовара(Номенклатура)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПокупателейОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ЗаказыПокупателей.Остатки(, ) КАК ЗаказыПокупателейОстатки
        |ГДЕ
        |    ЗаказыПокупателейОстатки.Номенклатура = &Номенклатура
        |ИТОГИ ПО
        |    ЗаказыПокупателейОстатки.Номенклатура";

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

    ТаблицаНоменклатуры = Запрос.Выполнить().Выгрузить();
    
    Если ТаблицаНоменклатуры.Количество() > 0 Тогда
        Возврат ТаблицаНоменклатуры;
    Иначе                                                            
        Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);
    КонецЕсли;
КонецФункции


Функция ПолучитьНомерЗаказа(Номенклатура)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПокупателей.НомерЗаказа
        |ИЗ
        |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
        |ГДЕ
        |    ЗаказыПокупателей.Номенклатура = &Номенклатура
        |
        |УПОРЯДОЧИТЬ ПО
        |    ЗаказыПокупателей.Период";

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

    ТаблицаНоменклатуры = Запрос.Выполнить().Выгрузить();
    
    Если ТаблицаНоменклатуры.Количество() > 0 Тогда
        Возврат ТаблицаНоменклатуры;
    Иначе                                                            
        Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);
    КонецЕсли;
КонецФункции


Может глупый вопрос - но почему данные функции ничего не возвращают если НЕ ТаблицаНоменклатуры.Количество() > 0??
как можно потом выполнить эту строку кода ?
Если ТекСтрокаСписокНоменклатуры.Количество > КоличествоЗаказанногоТовара[0].КоличествоОстаток Тогда

Если КоличествоЗаказанногоТовара будет равен Неопределено

Сообщить("Товар " + Номенклатура + " не нуждается в отгрузке", СтатусСообщения.Информация);

А если я выполняю проведение только на стороне сервера и клиент у меня не доступен ?

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 13:50
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!