Имя: Пароль:
1C
1С v8
Процедура СообщитьОНедостаткеТовара
,
0 EKO LX
 
08.11.12
16:32
Здравствуйте уважаемые программисты 1С. Помогите пожалуйста с проблемой. Как дописать процедуру так чтобы при появлении служебной сообщении перед номенклатурой появлялась также его код

!! Остатка Товар   с качеством Новый на складе Склад недостаточно.

Процедура СообщитьОНедостаткеТовара(Требуется, Свободно = 0, ВРезерве = 0, КПередаче = 0, КПолучению = 0, Отказ, Заголовок="", Склад = "", ЗаказПоставщику = "", Номенклатура = "", Характеристика = "", Серия = "", Качество = "", ЕИ = "", СтрокаСообщения = "") Экспорт

   Если СтрокаСообщения = "" Тогда
       Если ВРезерве > 0 ИЛИ КПередаче > 0 Тогда
           СтрокаСообщения = "Свободного остатка ";
       Иначе
           СтрокаСообщения = "Остатка ";
       КонецЕсли;
   КонецЕсли;

   СтрокаСообщения = СтрокаСообщения + Номенклатура + Характеристика + Серия;
   СтрокаСообщения = СтрокаСообщения + ?(Качество = "", "", " с качеством " + Качество);
   Если ЗаказПоставщику <> "" И Склад <> "" Тогда
       СтрокаСообщения = СтрокаСообщения + " в заказах поставщикам на склад " + Склад + " недостаточно для размещения.";
   ИначеЕсли ЗаказПоставщику <> "" Тогда
       СтрокаСообщения = СтрокаСообщения + " заказанного по документу " + ЗаказПоставщику + " недостаточно для размещения.";
   ИначеЕсли Склад <> "" Тогда
       СтрокаСообщения = СтрокаСообщения + " на складе " + Склад + " недостаточно.";
   КонецЕсли;

   ОшибкаНетОстатка(СтрокаСообщения, Свободно , Требуется, ЕИ, Отказ, Заголовок);

   Если КПередаче > 0 Тогда
       Сообщить("К передаче " + КПередаче + " " + ЕИ);
   КонецЕсли;
   Если ВРезерве > 0 Тогда
       Сообщить("Зарезервировано " + ВРезерве + " " + ЕИ);
   КонецЕсли;
   Если КПолучению > 0 Тогда
       Сообщить("К получению "+ КПолучению + " "+ ЕИ);
   КонецЕсли;
   
КонецПроцедуры // СообщитьОНедостаткеТовара()
1 Maxus43
 
08.11.12
16:33
СтрокаСообщения = СтрокаСообщения + Номенклатура.Код + Номенклатура + Характеристика + Серия;
2 EKO LX
 
08.11.12
16:38
(1) ругается

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.УправлениеЗапасами(3059)}: Значение не является значением объектного типа (Код)
3 Maxus43
 
08.11.12
16:39
а, там строка передаётся. в процедуре видишь параметры? туда надо код передать ещё, ссылки на номенклатуру нету
4 EKO LX
 
08.11.12
16:44
(3) а не подскажи как это сделать?
5 drcrasher
 
08.11.12
16:45
(4) забей. не нужен тебе 1С.
6 Maxus43
 
08.11.12
16:45
(4) глобальным поиском "СообщитьОНедостаткеТовара", там смотри
7 EKO LX
 
08.11.12
16:47
(5) с чего вы это взяли?
8 drcrasher
 
08.11.12
16:48
(7)  с того, что программирование в первую очередь подразумевает умение логически мыслить, во вторую - разбираться в чужом коде.
9 EKO LX
 
08.11.12
16:50
(6) ну это процедура в (0) что так смотреть? очень нужно помогите пожалуйста
10 EKO LX
 
08.11.12
16:53
(8) дело в том что я не программист, а это процедура из типовой конфигурации УТ 8.1 10,3. могу лишь что-то откорректировать, ну тут не знаю что делать
11 Cunni
 
08.11.12
16:53
(4) в параметры процедура добавь еще один со значением кода.
(5) а о том, что ТС может быть еще совсем-совсем зеленый ты не подумал?
12 Maxus43
 
08.11.12
16:53
(9) глобальный поиск покажет Откуда она вызывается, там править надо
13 Cunni
 
08.11.12
16:53
ой, это типовая.. лучше ниче не добавлять)
14 EKO LX
 
08.11.12
16:58
(13) а как быть? этот код очень нужен, потом что наименование номенклатуры большинстве одинаковы, поэтому отличить можно только по коду
15 EKO LX
 
08.11.12
16:59
(12) а как ее вызвать?
16 Cunni
 
08.11.12
17:00
(14) Вот честно, как поступать в типовых я хз, сам работаю недавно и у меня тут полная самописка, мне было бы проще добавить еще один параметр, ну или вместо "Номенклатура = """ вставлять ссылку, а не текст и уже от нее плясать куда хочется. Сейчас умные люди ответят, можно так или нет)
17 Maxus43
 
08.11.12
17:00
(15) ктрл + шифт + F
всё, я пас. до такой степени разжёвывать не могу более)
18 drcrasher
 
08.11.12
17:01
(10) точно не программист?
http://www.forum.mista.ru/index.php?user_id=78342
19 EKO LX
 
08.11.12
17:05
(16) спасибо за попытку)
(17) я вас не понимаю зачем искать эту процедуру если я ее уже нашел
(18) только корректирую.
20 Maxus43
 
08.11.12
17:06
(19) ну тогда селяви, раз не понимаем
21 drcrasher
 
08.11.12
17:07
(19) найми программера. Пять тыщ центов в час - не дорого.
(20)(17) +100500
22 EKO LX
 
08.11.12
17:15
(20) спасибо за попытку
(21) на нашем языке говорят haran a?r?y?r? что в переводе "чего вам надо?"
23 EKO LX
 
09.11.12
14:54
ап
24 EKO LX
 
09.11.12
15:18
(12) только сейчас узнал об этом, спасибо)) сейчас поглядим
25 EKO LX
 
09.11.12
16:07
вот что в регистре ТоварыНаСкладах

Процедура ОбработатьРезультатЗапроса(Выборка,ЕстьСерия,ЕстьРезервыПоДокументуБезСерии)
   Пока Выборка.Следующий() Цикл
       
       Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
           ДокументКоличествоБезСерии = Выборка.ДокументКоличество;
           РезервыПоДокументуБезСерииКоличество   = ?(ЕстьРезервыПоДокументуБезСерии,Выборка.РезервыПоДокументуБезСерииКоличество,Выборка.РезервыПоДокументуКоличество);
           Продолжить;
       КонецЕсли;
       
       ДокументКоличество             = Выборка.ДокументКоличество;
       КоличествоНаСкладе             = Выборка.ОстатокКоличество;
       КоличествоВРезерве             = Выборка.РезервыКоличество;
       КоличествоВРезервеПоСерии      = Выборка.РезервыПоСерииКоличество;
       РезервыПоДокументуКоличество   = Выборка.РезервыПоДокументуКоличество;
       КПередачеКоличество            = Выборка.КПередачеКоличество;
       КПередачеБезСерииКоличество    = ?(ЕстьСерия,Выборка.КПередачеБезСерииКоличество,КПередачеКоличество);
       КПередачеПоДокументуКоличество = Выборка.КПередачеПоДокументуКоличество;
       КПередачеПоДокументуБезСерииКоличество = ?(ЕстьСерия,Выборка.КПередачеПоДокументуБезСерииКоличество,Выборка.КПередачеПоДокументуКоличество);
       КПолучениюКоличество           = Выборка.КПолучению;
       КПолучениюПоДокументуКоличество = Выборка.КПолучениюПоДокументуКоличество;


       НедоступноНаСкладе = Макс(КоличествоВРезерве - РезервыПоДокументуБезСерииКоличество,0) + Макс(КПередачеБезСерииКоличество - КПередачеПоДокументуБезСерииКоличество,0) + Макс(КПолучениюКоличество-КПолучениюПоДокументуКоличество,0);
       
       // Сначала проверяем остаток товара на складе с учетом серий,
       // потом свободный остаток товара (без учета серий)
       Если ЕстьСерия Тогда
           КоличествоБезРезерва = КоличествоНаСкладе;
           мКоличествоВРезерве = 0;
           //если серия не заполнена - уменьшать свободный остаток на количество резерва и товаров к передаче нельзя,
           //    т.к. может попасть резервирование или товары к передаче, выполненные без учета серии
           Если  ЗначениеЗаполнено(Выборка.СерияНоменклатуры) Тогда
               Если ИспользоватьУказаниеСерийНоменклатурыПриРезервировании Тогда
                   //может иметься резерв в разрезе серий - его надо убрать из свободного остатка
                   мКоличествоВРезерве = Макс(КоличествоВРезервеПоСерии - РезервыПоДокументуКоличество,0);
                   КоличествоБезРезерва = КоличествоНаСкладе - мКоличествоВРезерве;
               КонецЕсли;
               КоличествоБезРезерва = КоличествоБезРезерва - КПередачеКОличество + КПередачеПоДокументуКоличество;
           КонецЕсли;
   
           Если КоличествоБезРезерва < ДокументКоличество Тогда
               УправлениеЗапасами.СообщитьОНедостаткеТовара(ДокументКоличество                  // Требуемое количество товара
               , КоличествоБезРезерва                                      // Свободное количество товара
               , мКоличествоВРезерве                                        // Количество в резерве
               , Макс(КПередачеКоличество - КПередачеПоДокументуКоличество,0)
               , Макс(КПолучениюКоличество-КПолучениюПоДокументуКоличество,0)
               , Отказ, Заголовок
               , СокрЛП(Выборка.Склад)                                   // Склад (представление)
               ,                                                         // Заказ поставщику (представление)
               , Выборка.НоменклатураПредставление                       // Номенклатура (представление)
               , Выборка.НоменклатураПредставление.Код                   // Эко Номенклатура.Код (представление)
               , " "+Выборка.ХарактеристикаНоменклатурыПредставление        // Характеристика (представление)
               , " "+Выборка.СерияНоменклатурыПредставление                // Серия номенклатуры (представление)
               , СокрЛП(Выборка.Качество)                                // Качество товара (представление)
               , Выборка.ЕдиницаХраненияОстатковПредставление            // Единица хранения остатков (представление)
               );
                   
               Продолжить;
           КонецЕсли;
           КоличествоНаСкладе = Выборка.ОстатокБезСерииКоличество;
           ДокументКоличество = ДокументКоличествоБезСерии;
       КонецЕсли;
       Если КоличествоНаСкладе - НедоступноНаСкладе < ДокументКоличество Тогда
           УправлениеЗапасами.СообщитьОНедостаткеТовара(ДокументКоличество                  // Требуемое количество товара
           , КоличествоНаСкладе - НедоступноНаСкладе                 // Свободное количество товара
           , КоличествоВРезерве - РезервыПоДокументуБезСерииКоличество       // Количество товара в резерве
           , Макс(КПередачеБезСерииКоличество - КПередачеПоДокументуБезСерииКоличество,0)     // Количество товара к передаче
           , Макс(КПолучениюКоличество-КПолучениюПоДокументуКоличество,0)
           , Отказ, Заголовок
           , СокрЛП(Выборка.Склад)                         // Склад (представление)
           ,                                               // Заказ поставщику (представление)
           , Выборка.НоменклатураПредставление             // Номенклатура (представление)
           , Выборка.ХарактеристикаНоменклатурыПредставление // Характеристика (представление)
           ,                                               // Серия номенклатуры (представление)
           ,                       // Качество товара (представление)
           , Выборка.ЕдиницаХраненияОстатковПредставление  // Единица хранения остатков (представление)
           );
           
           ДокументКоличествоБезСерии = 0;
           
       КонецЕсли;
       
   КонецЦикла;
   
КонецПроцедуры
26 samozvanec
 
09.11.12
16:12
СтрокаСообщения = СтрокаСообщения + Справочники.Номенклатура.НайтиПоНайменованию(Номенклатура).Код + Номенклатура + Характеристика + Серия;
2
27 samozvanec
 
09.11.12
16:13
никогда бы не подумал, что такое напишу
28 samozvanec
 
09.11.12
16:17
(26) двойку в конце не надо переписывать
29 del123
 
09.11.12
16:17
(26) (14) смотрел?)
30 samozvanec
 
09.11.12
16:18
(29) не смотрел
31 EKO LX
 
09.11.12
16:23
(26) не получается((
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.УправлениеЗапасами(3059)}: Метод объекта не обнаружен (НайтиПоНайменованию)
32 Serg_1960
 
09.11.12
16:29
"Найменование" - наименование
33 del123
 
09.11.12
16:30
да не взлетит у него это..)
34 EKO LX
 
09.11.12
16:39
(30) ОГРОМНОЕ ВАМ СПАСИБО!
(32) Спасибо, вернее НайтиПоНаименованию)
35 НЕА123
 
09.11.12
16:46
(34)
эй! товарищ!
а как же (14)?
36 НЕА123
 
09.11.12
16:47
(26)
преступник.
37 del123
 
09.11.12
16:49
(35) Недолго будет счастье его :D
38 samozvanec
 
09.11.12
16:50
(36) я не хотел, честно
(34) если (14), тогда тебе такой вариант не подходит
39 EKO LX
 
09.11.12
17:12
(38) мда, действительно((
40 EKO LX
 
09.11.12
17:32
думаю вот что нужно отредактировать, а именно добавить малюсенький код "Код"

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


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

       ТекстЗапросаРеквизитыДокумента = "
       |    (ВЫБРАТЬ
       //строки ТЧ Товары которые не являются набором
       |        Ссылка,
       |        Номенклатура,
       |        %ПОЛЕ_Склад%,
       |        %ПОЛЕ_СпособСписанияОстаткаТоваров% КАК СпособСписанияОстаткаТоваров,  
       |        %ПОЛЕ_Качество% КАК Качество,                      
       |        ХарактеристикаНоменклатуры,
       |        СерияНоменклатуры,
       |        Коэффициент,
       |        %ПОЛЕ_ЗаказПокупателя% КАК ЗаказПокупателя,
       |        Количество
       |        ИЗ
       |            Документ." + ИмяТаблицы + "
       |        ГДЕ
       |            Ссылка = &ДокументСсылка
       |            И НЕ Номенклатура.Комплект
       |
       //строки ТЧ СоставНабора
       |        ОБЪЕДИНИТЬ ВСЕ
       |
       |        ВЫБРАТЬ
       |        Ссылка,
       |        Номенклатура,
       |        Склад,
       |        СпособСписанияОстаткаТоваров,
       |        Качество,
       |        ХарактеристикаНоменклатуры,
       |        СерияНоменклатуры,
       |        Коэффициент,
       |        ЗаказПокупателя,
       |        Количество
       |        ИЗ
       |            (ВЫБРАТЬ
       |                ДокНаб.Ссылка,
       |                ДокНаб.Номенклатура,
       |               %ПОЛЕ_Набор_Склад% КАК Склад,
       |                %ПОЛЕ_Набор_СпособСписанияОстаткаТоваров% КАК СпособСписанияОстаткаТоваров,  
       |                %ПОЛЕ_Набор_Качество% КАК Качество,                      
       |                ДокНаб.ХарактеристикаНоменклатуры,
       |                ДокНаб.СерияНоменклатуры,
       |                ДокНаб.ЕдиницаИзмерения.Коэффициент КАК Коэффициент,
       |                %ПОЛЕ_Набор_ЗаказПокупателя% КАК ЗаказПокупателя,
       |                ДокНаб.Количество * ДокТов.Количество * ДокТов.Коэффициент КАК Количество
       |            ИЗ
       |                Документ." + ИмяДокумента + ".СоставНабора   КАК ДокНаб
       |                ЛЕВОЕ СОЕДИНЕНИЕ Документ." + ИмяТаблицы + " КАК ДокТов
       |                    ПО ДокТов.КлючСтроки = ДокНаб.КлючСтроки
       |                     И ДокТов.Ссылка     = &ДокументСсылка
       |            ГДЕ
       |                ДокНаб.Ссылка = &ДокументСсылка
       |            ) КАК Набор
       |
       |        )
       |";
       
       //есть состав набора - склады берутся из двух табличных частей
       ЗапросСклады = новый Запрос;
       ЗапросСклады.Текст = "Выбрать РАЗЛИЧНЫЕ Склад
       |ИЗ Документ."+ИмяТаблицы+"
       |ГДЕ Ссылка=&ДокументСсылка
       |ОБЪЕДИНИТЬ
       |ВЫБРАТЬ Склад ИЗ
       |Документ." + ИмяДокумента + ".СоставНабора
       |ГДЕ Ссылка=&ДокументСсылка И Склад<>&ПустойСклад
       |";
       ЗапросСклады.УстановитьПараметр("ДокументСсылка",СтруктураШапкиДокумента.Ссылка);
       ЗапросСклады.УстановитьПараметр("ПустойСклад",Справочники.Склады.ПустаяСсылка());
   Иначе //Если ЕстьСоставНабора Тогда

       ТекстЗапросаСписокНоменклатуры = "
       |ВЫБРАТЬ РАЗЛИЧНЫЕ
       |    Номенклатура
       |ИЗ
       |    Документ." + ИмяТаблицы +"
       |ГДЕ  Ссылка = &ДокументСсылка
       |";

       ТекстЗапросаРеквизитыДокумента = "
       |    Документ." + ИмяТаблицы + "
       |";

       //нет набора - склады берутся из одной табличной части
       ЗапросСклады = новый Запрос;
       ЗапросСклады.Текст = "Выбрать различные Склад ИЗ Документ."+ИмяТаблицы+"
       |ГДЕ Ссылка=&ДокументСсылка";
       ЗапросСклады.УстановитьПараметр("ДокументСсылка",СтруктураШапкиДокумента.Ссылка);

   КонецЕсли; //Если ЕстьСоставНабора Тогда

   Запрос = Новый Запрос;

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

   ТекстЗапроса = "
   |ВЫБРАТЬ // Запрос, контролирующий остатки на складах
   |    Док.Номенклатура                                              КАК Номенклатура,
   |    Док.Номенклатура.Представление                                КАК НоменклатураПредставление,
   |    Док.Номенклатура.ЕдиницаХраненияОстатков.Представление        КАК ЕдиницаХраненияОстатковПредставление,
   |   Док.ХарактеристикаНоменклатуры                                КАК ХарактеристикаНоменклатуры,
   |    ПРЕДСТАВЛЕНИЕ(Док.ХарактеристикаНоменклатуры)                КАК ХарактеристикаНоменклатурыПредставление,
   |   Док.СерияНоменклатуры                                        КАК СерияНоменклатуры,
   |    ПРЕДСТАВЛЕНИЕ(Док.СерияНоменклатуры)                        КАК СерияНоменклатурыПредставление,
   |   %ПОЛЕ_Док_Склад%                                            КАК Склад,
   |   %ПОЛЕ_Док_Качество%                                        КАК Качество,
   |   СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент /Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15,3)))
   |                                                                КАК ДокументКоличество,
   |    ЕстьNull(МАКСИМУМ(ОстаткиБезСерии.КоличествоОстаток),0)     КАК ОстатокБезСерииКоличество,
   |    ЕстьNull(МАКСИМУМ(Остатки.КоличествоОстаток),0)             КАК ОстатокКоличество,
   |    ЕстьNull(МАКСИМУМ(Резервы.КоличествоОстаток),0)             КАК РезервыКоличество,
   |    %ПОЛЕ_РезервыПоСерииКоличество%                              КАК РезервыПоСерииКоличество,
   |    ЕстьNull(МАКСИМУМ(ТоварыКПередаче.КоличествоОстаток),0)     КАК КПередачеКоличество,
   |    ЕстьNull(МАКСИМУМ(ТоварыКПередачеБезСерии.КоличествоОстаток),0) КАК КПередачеБезСерииКоличество,
   |    %ПОЛЕ_РезервыПоДокументуКоличество%                        КАК РезервыПоДокументуКоличество,
   |    %ПОЛЕ_РезервыПоДокументуБезСерии_Количество%                КАК РезервыПоДокументуБезСерииКоличество,
   |    0                                                            КАК КПолучению,
   |    0                                                            КАК КПолучениюПоДокументуКоличество,
   |    0                                                            КАК КПередачеПоДокументуКоличество,
   |    0                                                              КАК КПередачеПоДокументуБезСерииКоличество

   |ИЗ
   |    "+ ТекстЗапросаРеквизитыДокумента + " КАК Док
   |
   //таблица остатков товаров с учетом серий
   |ЛЕВОЕ СОЕДИНЕНИЕ
   |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад в (&СписокСкладов) И
   |        %ВыборкаПоНоменклатуре%  
   |        //УСЛОВИЕ_Качество
   |    ) КАК Остатки
   |ПО
   |    Док.Номенклатура                = Остатки.Номенклатура
   | И Док.ХарактеристикаНоменклатуры  = Остатки.ХарактеристикаНоменклатуры
   | И Док.СерияНоменклатуры            = Остатки.СерияНоменклатуры
   | //СОЕДИНЕНИЕ_Качество_Остатки
   | //СОЕДИНЕНИЕ_Склад_Остатки
   //таблица остатков товаров без учета серий
   |ЛЕВОЕ СОЕДИНЕНИЕ
   |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад в (&СписокСкладов) И
   |        %ВыборкаПоНоменклатуре%
   |        //УСЛОВИЕ_Качество
   |    ) КАК ОстаткиБезСерии
   |ПО
   |    Док.Номенклатура                = ОстаткиБезСерии.Номенклатура
   | И Док.ХарактеристикаНоменклатуры    = ОстаткиБезСерии.ХарактеристикаНоменклатуры
   | //СОЕДИНЕНИЕ_Качество_ОстаткиБезСерии
   | //СОЕДИНЕНИЕ_Склад_ОстаткиБезСерии
   |
   //таблица товаров в резерве на складе без учета серий номенклатуры (определяется для строк, которые списываются за счет свободного остатка)

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

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

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

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

   

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

       ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_СпособСписанияОстаткаТоваров%",            " СпособСписанияОстаткаТоваров");
   Иначе
       ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_СпособСписанияОстаткаТоваров%",            " &ПустойСпособСписания");
       ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%ПОЛЕ_Набор_СпособСписанияОстаткаТоваров%",    "&ПустойСпособСписания");
   КонецЕсли;

   ДополнитьТекстЗапроса(ТекстЗапроса,ложь,,ложь,,ложь,ЕстьКачество,ЕстьСкладВТабЧасти,ТекстЗапросаСписокНоменклатуры);

   Запрос.Текст = ТекстЗапроса;

   РезультатЗапроса = Запрос.Выполнить();
   Выборка = РезультатЗапроса.Выбрать();
   
   ОбработатьРезультатЗапроса(Выборка,истина,ТекстЗапросаРезервыПоДокументуБезСерии<>"");

КонецПроцедуры //КонтрольОстатков_Реализация_ОтчетОРознПродажах()
41 singlych
 
09.11.12
17:37
(25) попробуйте в процедуре ОбработатьРезультатЗапроса
вместо Выборка.НоменклатураПредставление
написать Выборка.НоменклатураПредставление + " код " + Выборка.Номенклатура.Код
42 EKO LX
 
09.11.12
17:56
(41) singlych, Вы гений! Очень Вам благодарен!