Книга знаний

1С:Предприятие / v8 / Типовые конфигурации / УПП 8.0

v8: Подмена партий в УПП. Директивная установка себестоимости.

Пример из жизни, как можно играть с себестоимостью в УПП. Пользователям было нужно, чтобы из документа себестоимость проставлялась в регистр.Автор статьи: Гений 1С
Последняя редакция №1 от 15.05.06
URL: http://kb.mista.ru/article.php?id=226

Ключевые слова: себестоимость,УПП,партии


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

Ну мы в табличную часть "Товары" нужных документов добавили колонку "СС", служебную партию находили запросом по организации.

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

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

Сказано - сделано.

Итак:

УправлениеЗапасами::СформироватьЗапросПоТабличнойЧасти - в самое начало процедуры всавляем:

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

УправлениеЗапасамиПартионныйУчет::ПолучитьТаблицуПартийНаСкладахНал(и Бух) перед последней строкой процедуры, т.е. перед выполнением запроса и возвратом его результата:
    //Чтобы партии списывались по нужной нам себестоимости
    п_ОбработатьЗапросПоПартиям_ДляСпецифики(Запрос, Отбор, "Нал");
    //}

    //{PRADO fixin 20060428 Добавить
    //Чтобы партии списывались по нужной нам себестоимости
    п_ОбработатьЗапросПоПартиям_ДляСпецифики(Запрос, Отбор, "Бух");

УправлениеЗапасамиПартионныйУчет::СписаниеПартий - после строки
ТаблицаПартий   = СтруктураПараметров["Таблица"+ИмяРегистра] ;

добавляем вызов:
    п_ДобавитьПартии_ДляСпецифики(ТаблицаПартий, СтрокаДокумента, ИмяРегистра);    



Ну а дальнейший код уже специфичен для конфигурации и имеет примено такое назначение:

Функция обрабатывает запрос и отключает выборку из него товаров, которым мы будем подсовывать партии:
Функция    п_ОбработатьЗапросПоПартиям_ДляСпецифики(Запрос, Отбор, ВидУчета) Экспорт
    //Первая часть - по специфическим товарам
    НовыйОтбор=" Номенклатура НЕ В (&п_СписокСпецифическихТоваров) "+?(Отбор.Количество()=0, "  "," И ");
    Запрос.Текст=СтрЗаменить(Запрос.Текст, "&МоментКон,", "&МоментКон,"+НовыйОтбор  );
    Запрос.УстановитьПараметр("п_СписокСпецифическихТоваров", п_СписокСвернутыхТоваров());
КонецФункции


Функция проверяет, нужно ли для товара выполнять списание по нашей особой схеме, т.е. подсовывать партию:
Функция ЭтоСвернутыйТовар(Товар) Экспорт
    Возврат 
        Товар=Справочники.Номенклатура.Товар18 ИЛИ 
        Товар=Справочники.Номенклатура.Товар10 ИЛИ 
        Товар.Наименование="Товар18" ИЛИ
        Товар.Наименование="Товар10" ИЛИ
        Товар.Наименование="Товары 10%";
КонецФункции


Функция формирует список товаров, по которым мы подсовываем партию - чтобы использовать этот список в запросе по остаткам партий - исключить эти товары.
Функция    п_СписокСвернутыхТоваров() Экспорт
    Список=Новый Массив();
    Список.Добавить(Справочники.Номенклатура.Товар18);
    Список.Добавить(Справочники.Номенклатура.Товар10);
    Список.Добавить(Справочники.Номенклатура.Товар20);
    Список.Добавить(Справочники.Номенклатура.ТоварБезНДС);
    Возврат Список;
КонецФункции


Ну и самый сложный момент - добавляется виртуальная партия.
Функция    п_ДобавитьПартии_ДляСпецифики(ТаблицаПартий, СтрокаДокумента, ИмяРегистра) Экспорт
    Если ЭтоСвернутыйТовар(СтрокаДокумента.Номенклатура) Тогда
        //Находим исходную строку
        МД=Метаданные.НайтиПоТипу(ТипЗнч(СтрокаДокумента.Регистратор));
        Если МД.ТабличныеЧасти.Найти("Материалы")<>Неопределено Тогда
            ИсхТЧ=СтрокаДокумента.Регистратор.Материалы;
            МДТЧ=МД.ТабличныеЧасти.Материалы;
        ИначеЕсли МД.ТабличныеЧасти.Найти("Товары")<>Неопределено Тогда
            ИсхТЧ=СтрокаДокумента.Регистратор.Товары;
            МДТЧ=МД.ТабличныеЧасти.Товары;
        Иначе
            Возврат ложь;
        КонецЕсли;
        
        Если ИмяРегистра="ПартииТоваровНаСкладахБух" Тогда
            СчетУчета=СтрокаДокумента.СчетУчетаБУ;
        ИначеЕсли ИмяРегистра="ПартииТоваровНаСкладахНал" Тогда
            СчетУчета=СтрокаДокумента.СчетУчетаНУ;
        Иначе
            Возврат ложь;
        КонецЕсли;

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

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


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


Да, еще в регистр Списанные товары мы добавили поле "СС" и заполняли его при проведении документа, иначе бы в структуре не было бы поля "СС" и мы бы не знали, какое значение себестоимости подставлять в партию.


Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика