Имя: Пароль:
1C
1С v8
жую задачу. Разработать алгоритм проведения документа "оказания услуг"
,
0 JuliaMakej
 
26.12.16
17:22
Списывать количество материалов со склада, указанного в реквизите документа
Затем материалы списываются с остальных складов в алфавитном порядке
______________________________________________________________

написала херь, от которой сама в ужасе. конечно же не работает.
запнулась. гляньте, бывалые, подскажите зеленой
______________________________________________________________

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

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

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

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

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

КонецПроцедуры
1 Cool_Profi
 
26.12.16
17:24
Документ оказания услуг списывает материалы?
2 Tatitutu
 
26.12.16
17:24
(0) без фото в личке даже на + (в строке + Соde - нажимать не будут) Традиция (с)
3 Джинн
 
26.12.16
17:25
Выгрузить запросом остатки на складах и приоритетом, отфильтровать по приоритету и списывать построчно, пока необходимо.
4 JuliaMakej
 
26.12.16
17:25
ага, документ услуг
5 JuliaMakej
 
26.12.16
17:28
Выгрузить запросом остатки на складах и приоритетом, отфильтровать по приоритету и списывать построчно, пока необходимо. // так я итак выгрузила остатки запросом, разве нет?
6 ERWINS
 
26.12.16
17:31
лучше сделай заполнение ТЧ
7 JuliaMakej
 
26.12.16
17:31
(2) ваша галя балована
8 ERWINS
 
26.12.16
17:31
и потом по заполненому списывай
9 JuliaMakej
 
26.12.16
17:32
вообще не понимаю о чем вы. написала же, что зеленая совсем
10 patapum
 
26.12.16
17:36
(9) не понимаешь, значит и не нужно? свежее предложение - выйти замуж за программиста и готовить ему борщ, а он пусть программирует
11 Garykom
 
гуру
26.12.16
17:37
Будет весело когда при перепроведении (или отмене и снова проводка) дока материалы не смогут уйти в минус ))
12 JuliaMakej
 
26.12.16
17:46
смотрю, много спецов трепаться не по теме) мда, вот тебе и "возлюби ближнего своего".

при отмене и перепроводке все норм
13 Garykom
 
гуру
26.12.16
17:49
(12) Делаешь 2 одинаковые дока, затем проводишь 1-й, затем его распроводишь, проводишь "новый" 2-й и пробуешь снова провести "старый" 1-й.

Особенно будет весело если кто то распроведет/перепроведет сильно старый документик этак полугодовой/годовой давности...
14 Garykom
 
гуру
26.12.16
17:50
И да нескоко "вложенных" запросов в цикле это мощно!
15 patapum
 
26.12.16
17:53
(12) ну как бы если хочется на 100500 постов троллить по поводу решения тестовых задач, то хотя бы скачать фотку из инета и поставить в личку можно. а то скучно.
16 JuliaMakej
 
26.12.16
18:00
Эх, Мишаня, я из приличных. еще при реге пробовала, но чет выдает ошибку. хотя все по требованиям
17 Джинн
 
26.12.16
18:18
(5) Нет. Вы какую-то хрень сделали.
18 Garykom
 
гуру
26.12.16
18:28
Хм задачка навела что хорошо бы в платформе реализовать функцию для ТЗ не тока Свернуть().

Но и Распределить()
19 Смотрящий
 
26.12.16
19:35
Без фото - не vзлетит
20 Неверный Параметр И
 
26.12.16
19:42
21 Неверный Параметр И
 
26.12.16
19:43
Стартуйте =)
22 Shrek_yar
 
26.12.16
19:45
(0)без фото нет
23 JuliaMakej
 
26.12.16
19:46
слабо свежее фоту накопать?)
24 Неверный Параметр И
 
26.12.16
19:51
(23) А слабо алгоритм разработать?
25 Garykom
 
гуру
26.12.16
19:54
Общение работодателя с кандидатом на мисте это нечто новое...
26 JuliaMakej
 
26.12.16
19:57
не слабо, бодаюсь, отчего же. я же не разместила "решите", речь шла о подсказке
27 Неверный Параметр И
 
26.12.16
20:02
(26) Выбираешь остатки отсортированно по складам. Первый склад- всегда из документа, остальные (за исключением первого) по алфавиту. Списываешь по порядку, не хватает - идешь на следующий склад. Все.
28 Garykom
 
гуру
26.12.16
20:02
(26) Подсказки (3) и (10) чем не устроили?
29 zvial
 
27.12.16
07:40
Как то так:

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

Запрос.УстановитьПараметр("СкладДокумента", Объект.Склад);
Запрос.Установитьпараметр("ДатаДокумента", Объект.Дата);
Запрос.УстановитьПараметр("ПереченьНоменклатуры", Объект.Товары);

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

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

Это как шаблон. При Ctrl+C, Ctrl+V не заработает, надо допилить.
Ну, с группировкой количества перечня номенклатуры сделал по тупому, сами разберетесь.
30 DrZombi
 
гуру
27.12.16
07:56
(0) Без фото не взлетит
31 JuliaMakej
 
29.12.16
18:49
(28) (10) слабо тянет на подсказку) а впрочем, если и тянет, сами такой и пользуйтесь)
32 JuliaMakej
 
29.12.16
18:50
пусть и не летит) решила
33 JuliaMakej
 
29.12.16
18:52
(29) о, интересен Ваш вариант, погляжу
34 Смотрящий
 
29.12.16
18:54
Ух! Сама решила ? да ладно ?
Борщъ видимо тоже умеешь ?
Выходи за него !
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.