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

Хранилище

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

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



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

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


Сорри, упустил в запросе указать ссылку на текущий документ. Вот так должно работать

Такс... Версия 1.100500 процедуры перед записью smile.gif

Чтото я туплю. Ссылки на документ процедуре перед записью еще нету.

О так правильнее будет.

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


ОбработкаПроведения без изменений
Анна Команкова,
05.07.15, 16:34 Расчитать учетную цену и учетную сумму
Цитата(Анна Команкова @ 05.07.15, 15:36) *
Извините, а Вы не могли бы объяснить, что такое Левое соединение?


Запрос формирует табличку ТоварТЧ КоличествоТЧ КоличествоОстаток

ЛевоеСоединение в данном случае значит: Выбрать все записи с табличной части и к ним присоединить количествоОстаток из регистра ТМЦ, по условию, что ТоварТЧ = Товар в регистре (Строка в Запросе
|        ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
)

Цитата
Остатки из временной таблицы переносятся в остатки регистра накопления ТМЦОстатки или что((?


Не переносятся, а присоединяются. Как описано выше.

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

КонецПроцедуры






Да, лучше как предложил Logist

Заполнять Перед записью лучше. Тогда так:

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

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


а в обработке проведения только проверяем остаток
Анна Команкова,
05.07.15, 13:14 Расчитать учетную цену и учетную сумму
Проверка на остаток лучше делать в процедуре "ОбработкаПроведения".

Вообще, запрос в цикле для проверки остатка (и вобще) это мягко говоря не красиво.

я бы проверил остатки тех товаров которые в документе так:


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

КонецПроцедуры



Рассчитать УчЦену и УчСумму. тут не понятно, куда ее алгоритм должен заполнять. Если в документ расходной то не понятен практический смысл от этого. Может все таки нужно списать товары с регистра ТМЦ?











Анна Команкова,
26.03.14, 20:35 Поиск по строке
Рабочий вариант. Если кому - то интересно:
Перем мПолеПодбора, мЭлементПодбора;

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

//////////////////////
Процедура ВыборВПоле(Элемент, ЭлементСписка)
    мЭлементПодбора.Значение = ЭлементСписка.Значение;
    ЭлементыФормы.Удалить(Элемент);
КонецПроцедуры


Vofka,
06.02.14, 15:24 В Акт сверки попадает сумма без НДС
Проблема решена. Оказалось, проблема была в договоре. В реквизите "договор" во всех документах по данному контрагенту договор только отображался, но на самом деле его не было если перейти по ссылке. Создали новый договор и все ОК.
Спасибо кто заглядывал в тему и уделял внимание!
Ardi,

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