Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 дек 2024, 14:45

Процедура ПОдобратьПартии

Автор Chuchi, 18 апр 2011, 11:30

0 Пользователей и 1 гость просматривают эту тему.

Chuchi

Помогите пожалуйста разобраться с
Процедура ПодобратьПартии
Задание простое, проверить при попытке реализации наличие товара на 2 складах.. (разных организаций) если нет на первом всего объема то недостающую часть попробовать взять со второго если и там не хватает то сообщить о не возможности провести реализацию..
в коде так много всего(
Можно ли его упростить?

Процедура ПодобратьПартии(ТаблицаСписания, СтруктураПараметров, Отказ)

    // Партии для данного учета

    ДеревоОстатковПартий = СтруктураПараметров["ДеревоПартийТоваровНаСкладах"];
   
    // Переменная определяет списывать номенклатуру исходя из стоимости остатка

    // номенклатуры на счете или по указанной в параметрах стоимости.

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

        СписыватьПоУказаннойСтоимости = СтрокаДокумента.СписыватьПоУказаннойСтоимости;
       
        Если СписыватьПоУказаннойСтоимости Тогда
            УказаннаяСтоимость = СтрокаДокумента.СуммаБезНДС;
        КонецЕсли;
       
       
        // Подлежащее погашению при списании количество

        КоличествоОсталосьПогасить = СтрокаДокумента.Количество;
       
        //Определим количествоДт для комплектации

        Если СтруктураПараметров.ЕстьКоличествоДт Тогда
            КоличествоОсталосьПогаситьДт = СтрокаДокумента.КоличествоДт;
        Иначе
            КоличествоОсталосьПогаситьДт = КоличествоОсталосьПогасить;
        КонецЕсли;
       
        Если ДеревоОстатковПартий.Строки.Количество() <> 0 Тогда
           
            // Если указана конкретная партия и на счете учета ведется

            // партионный учет, то в структура отбора добавим партию.

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

            // партионный учет, то в структуру отбора добавим договор поставщика.

            ОтборПоДоговоруПоставщика = Неопределено;
            Если ЗначениеЗаполнено(СтрокаДокумента.ДоговорПоставщика) И    (НаСчетеВедетсяПартионныйУчет(СчетУчета) И (НЕ СтруктураПараметров["СпособОценкиМПЗ"] = Перечисления.СпособыОценки.ПоСредней)) Тогда
                ОтборПоДоговоруПоставщика = СтрокаДокумента.ДоговорПоставщика;
            КонецЕсли;
           
            // Полученную таблицу отсортируем в соответствии со стратегией

            Если КомиссионныйТовар(СчетУчета) Тогда
                // Для товаров, принятых на комиссию, в качестве стратегиии

                // списания устанавливается стратегия - ФИФО.

                СпособОценкиМПЗ = "ФИФО";
                ПрямойОбход = (НЕ СтруктураПараметров["СпособОценкиМПЗ"] = "ЛИФО");
            Иначе
                СпособОценкиМПЗ = СтруктураПараметров["СпособОценкиМПЗ"];
                ПрямойОбход =  Истина;
            КонецЕсли;
           
            // Пустой склад покупателя - значение измерения "Склад" когда не ведется учет по складам (или не ведется суммовой учет по складам)

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

               
                // Количество по строке больше 0

                Если (НЕ СтрокаПартии.КоличествоПоСкладу > 0) ИЛИ (НЕ СтрокаПартии.Количество > 0) Тогда
                    Продолжить;
                КонецЕсли;
               
                // Склад, если ведется суммовой учет по складам

                Если ВедетсяУчетПоСкладам(СчетУчета) Тогда
                    Если СтрокаПартии.Склад <> СтрокаДокумента.Склад
                        И СтрокаПартии.Склад <> ПустойСклад Тогда // пустые склады могут остаться со времени, когда не было учета по складам

                        Продолжить;
                    КонецЕсли;
                КонецЕсли;
               
                Количество             = Мин(СтрокаПартии.КоличествоПоСкладу, КоличествоОсталосьПогасить);
                КоличествоПриход     = ?(Количество = КоличествоОсталосьПогасить, КоличествоОсталосьПогаситьДт, Окр(КоличествоОсталосьПогаситьДт * Количество / КоличествоОсталосьПогасить,3,1));
               
                Если СписыватьПоУказаннойСтоимости Тогда // списывать по стоимости, указанной в параметрах

                    Стоимость = Окр(УказаннаяСтоимость  * Количество / КоличествоОсталосьПогасить,2,1);
                    СтоимостьНУ = Стоимость;
                    СтоимостьПР = 0;
                    СтоимостьВР = 0;
                   
                    УказаннаяСтоимость = УказаннаяСтоимость - Стоимость;
                   
                ИначеЕсли СтрокаДокумента.Себестоимость = 0 Тогда
                    Стоимость      = Окр(СтрокаПартии.Стоимость * Количество / СтрокаПартии.Количество, 2, 1);
                    СтоимостьНУ = Окр(СтрокаПартии.СтоимостьНУ * Количество / СтрокаПартии.Количество, 2, 1);
                    СтоимостьПР = Окр(СтрокаПартии.СтоимостьПР * Количество / СтрокаПартии.Количество, 2, 1);
                    СтоимостьВР = Окр(СтрокаПартии.СтоимостьВР * Количество / СтрокаПартии.Количество, 2, 1);               
                Иначе
                    Стоимость      = Окр(СтрокаДокумента.Себестоимость * Количество / СтрокаДокумента.Количество, 2, 1);
                    СтоимостьНУ = Стоимость;
                    СтоимостьПР = 0;
                    СтоимостьВР = 0;
                КонецЕсли;
               
                КоличествоОсталосьПогасить = КоличествоОсталосьПогасить - Количество;
                КоличествоОсталосьПогаситьДт = КоличествоОсталосьПогаситьДт - КоличествоПриход;
               
                СтрокаПартии.Количество = СтрокаПартии.Количество - Количество;
                СтрокаПартии.Стоимость = СтрокаПартии.Стоимость - Стоимость;
                СтрокаПартии.СтоимостьНУ = СтрокаПартии.СтоимостьНУ - СтоимостьНУ;
                СтрокаПартии.СтоимостьПР = СтрокаПартии.СтоимостьПР - СтоимостьПР;
                СтрокаПартии.СтоимостьВР = СтрокаПартии.СтоимостьВР - СтоимостьВР;
                СтрокаПартии.КоличествоПоСкладу = СтрокаПартии.КоличествоПоСкладу - Количество;
               
                // В таблицу списанных партий записывается строка с информацией.

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

        // в таблицу списанных партий.

        Если КоличествоОсталосьПогасить > 0  Тогда
           
            // В таблицу списанных партий записывается строка с информацией.

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

Chuchi

Процедура ПодобратьПартии(ТаблицаСписания, СтруктураПараметров, Отказ)

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


Klyacksa

Попробуйте оформить код подобающим образом, заключив его в тег.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Chuchi

Извините..а как это сделать?

Klyacksa

Проще всего так:
1. Выбираем "Ответ" внизу темы (не "Быстрый ответ", а именно просто "Ответ")
2. Открывается новая страничка для воода ответа, с кучей кнопочек
3. Нажимаем кнопочку "#" - она вставит в текст нужные теги, между ними вставляем код
и вся премудрость :)

Если запомните, какие именно теги вставляются по кнопочке "#", то можно будет вставлять их и в "Быстром ответе" просто текстом.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Chuchi

Процедура ПодобратьПартии(ТаблицаСписания, СтруктураПараметров, Отказ)

// Партии для данного учета
ДеревоОстатковПартий = СтруктураПараметров["ДеревоПартийТоваровНаСкладах"];

// Переменная определяет списывать номенклатуру исходя из стоимости остатка
// номенклатуры на счете или по указанной в параметрах стоимости.
СписыватьПоУказаннойСтоимости = Ложь;
УказаннаяСтоимость = 0;
ПустаяТаблица = ПустаяТаблицаСписанныхПартий();

Для Каждого СтрокаДокумента Из ТаблицаСписания Цикл

СчетУчета = СтрокаДокумента.СчетУчета;
СтрокаДокумента.СписанныеПартии = ПустаяТаблица.Скопировать();
ТаблицаСписанныхПартии = СтрокаДокумента.СписанныеПартии;

// Если стоимость списания указана, то списывать надо по указанной стоимости.
СписыватьПоУказаннойСтоимости = СтрокаДокумента.СписыватьПоУказаннойСтоимости;

Если СписыватьПоУказаннойСтоимости Тогда
УказаннаяСтоимость = СтрокаДокумента.СуммаБезНДС;
КонецЕсли;


// Подлежащее погашению при списании количество
КоличествоОсталосьПогасить = СтрокаДокумента.Количество;

//Определим количествоДт для комплектации
Если СтруктураПараметров.ЕстьКоличествоДт Тогда
КоличествоОсталосьПогаситьДт = СтрокаДокумента.КоличествоДт;
Иначе
КоличествоОсталосьПогаситьДт = КоличествоОсталосьПогасить;
КонецЕсли;

Если ДеревоОстатковПартий.Строки.Количество() <> 0 Тогда

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

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

// Полученную таблицу отсортируем в соответствии со стратегией
Если КомиссионныйТовар(СчетУчета) Тогда
// Для товаров, принятых на комиссию, в качестве стратегиии
// списания устанавливается стратегия - ФИФО.
СпособОценкиМПЗ = "ФИФО";
ПрямойОбход = (НЕ СтруктураПараметров["СпособОценкиМПЗ"] = "ЛИФО");
Иначе
СпособОценкиМПЗ = СтруктураПараметров["СпособОценкиМПЗ"];
ПрямойОбход =  Истина;
КонецЕсли;

// Пустой склад покупателя - значение измерения "Склад" когда не ведется учет по складам (или не ведется суммовой учет по складам)
ПустойСклад = Справочники.Склады.ПустаяСсылка();

СтрокаНоменклатуры = ДеревоОстатковПартий.Строки.Найти(СтрокаДокумента.Номенклатура, "Номенклатура");
ПартийПоСтроке = ?(СтрокаНоменклатуры = Неопределено, -1, СтрокаНоменклатуры.Строки.Количество() - 1);

Для индекс = 0 по ПартийПоСтроке Цикл

Если ПрямойОбход Тогда
СтрокаПартии = СтрокаНоменклатуры.Строки[индекс];
Иначе
СтрокаПартии = СтрокаНоменклатуры.Строки[ПартийПоСтроке - индекс];
КонецЕсли;

Если СтрокаПартии.СчетУчета <> СчетУчета Тогда
Продолжить;
КонецЕсли;

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

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

Если КоличествоОсталосьПогасить <= 0 Тогда
Прервать;
КонецЕсли;

// Проверки условий:

// Количество по строке больше 0
Если (НЕ СтрокаПартии.КоличествоПоСкладу > 0) ИЛИ (НЕ СтрокаПартии.Количество > 0) Тогда
Продолжить;
КонецЕсли;

// Склад, если ведется суммовой учет по складам
Если ВедетсяУчетПоСкладам(СчетУчета) Тогда
Если СтрокаПартии.Склад <> СтрокаДокумента.Склад
И СтрокаПартии.Склад <> ПустойСклад Тогда // пустые склады могут остаться со времени, когда не было учета по складам
Продолжить;
КонецЕсли;
КонецЕсли;

Количество = Мин(СтрокаПартии.КоличествоПоСкладу, КоличествоОсталосьПогасить);
КоличествоПриход = ?(Количество = КоличествоОсталосьПогасить, КоличествоОсталосьПогаситьДт, Окр(КоличествоОсталосьПогаситьДт * Количество / КоличествоОсталосьПогасить,3,1));

Если СписыватьПоУказаннойСтоимости Тогда // списывать по стоимости, указанной в параметрах
Стоимость = Окр(УказаннаяСтоимость  * Количество / КоличествоОсталосьПогасить,2,1);
СтоимостьНУ = Стоимость;
СтоимостьПР = 0;
СтоимостьВР = 0;

УказаннаяСтоимость = УказаннаяСтоимость - Стоимость;

ИначеЕсли СтрокаДокумента.Себестоимость = 0 Тогда
Стоимость  = Окр(СтрокаПартии.Стоимость * Количество / СтрокаПартии.Количество, 2, 1);
СтоимостьНУ = Окр(СтрокаПартии.СтоимостьНУ * Количество / СтрокаПартии.Количество, 2, 1);
СтоимостьПР = Окр(СтрокаПартии.СтоимостьПР * Количество / СтрокаПартии.Количество, 2, 1);
СтоимостьВР = Окр(СтрокаПартии.СтоимостьВР * Количество / СтрокаПартии.Количество, 2, 1);
Иначе
Стоимость  = Окр(СтрокаДокумента.Себестоимость * Количество / СтрокаДокумента.Количество, 2, 1);
СтоимостьНУ = Стоимость;
СтоимостьПР = 0;
СтоимостьВР = 0;
КонецЕсли;

КоличествоОсталосьПогасить = КоличествоОсталосьПогасить - Количество;
КоличествоОсталосьПогаситьДт = КоличествоОсталосьПогаситьДт - КоличествоПриход;

СтрокаПартии.Количество = СтрокаПартии.Количество - Количество;
СтрокаПартии.Стоимость = СтрокаПартии.Стоимость - Стоимость;
СтрокаПартии.СтоимостьНУ = СтрокаПартии.СтоимостьНУ - СтоимостьНУ;
СтрокаПартии.СтоимостьПР = СтрокаПартии.СтоимостьПР - СтоимостьПР;
СтрокаПартии.СтоимостьВР = СтрокаПартии.СтоимостьВР - СтоимостьВР;
СтрокаПартии.КоличествоПоСкладу = СтрокаПартии.КоличествоПоСкладу - Количество;

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

КонецЦикла;

КонецЕсли;

// Не списанное количесвто добавим отдельной строкой
// в таблицу списанных партий.
Если КоличествоОсталосьПогасить > 0  Тогда

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

КонецЕсли;

ОтключитьКонтрольОстатков = СтруктураПараметров.ОтключитьКонтрольОстатков;

Если НЕ СтруктураПараметров.ФормироватьДвижения Тогда
Продолжить;
КонецЕсли;

Если (КоличествоОсталосьПогасить > 0) И ((НЕ ОтключитьКонтрольОстатков) ИЛИ КомиссионныйТовар(СчетУчета)) И (СтруктураПараметров.ПроводитьДокументПоРазделуУчета) Тогда

ОбщегоНазначения.СообщитьОбОшибке("Строка: " + СтрокаДокумента.НомерСтроки + Символы.ПС
+ "Не списано " + КоличествоОсталосьПогасить + " " + СтрокаДокумента.Номенклатура.БазоваяЕдиницаИзмерения
+ " товара " + СтрокаДокумента.Номенклатура + ", счет учета " + СчетУчета, Отказ, СтруктураПараметров.Заголовок);

КонецЕсли;
КонецЦикла;

КонецПроцедуры // СписаниеСоСклада()

Chuchi

Klyacksa Спасибо за терпение в таких глупых вопросах

Klyacksa

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

Пожалуйста, в моих же интересах читать грамотно оформленный и подсвеченный код, а не нечитабельное полотно ;)
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Chuchi

Себестоимость не нужна  и по партиям бить не надо, только надо проверить наличие на первом скалде, если нет то на втором, если есть то со второго на первый перекинуть и потом покупателю..
делала вот так
Запрос = Новый Запрос;

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

ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();

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



НО так делала в документе, а мне оказывается необходимо это сделать в обработчике, а в нем к табличной части напрямую не обратиться чтобы вытащить номенклатуру

Klyacksa

Ну какие-то же данные в обработчик передаются? Как минимум, ссылка на документ. Вот из нее можно и вытаскивать табличную часть.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск