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;
КонецЕсли;
//Суть наших изменений
Стр.Количество=СтрокаДокумента.Количество; //на все нужное количество
Стр.Стоимость=п_Себестоимость; //на всю нужную себестоимость
КонецЕсли;
Возврат Истина;
//Количество
//НомерСтрокиДокумента
КонецФункции
Да, еще в регистр Списанные товары мы добавили поле "СС" и заполняли его при проведении документа, иначе бы в структуре не было бы поля "СС" и мы бы не знали, какое значение себестоимости подставлять в партию.
|