Имя: Пароль:
1C
1C 7.7
v7: Проверка по остаткам и добавление строчки
0 msk-07
 
20.04.13
11:26
Подскажите, как в документе инвентаризация тмц добавить кнопку, чтобы та добавляла в табличную часть документа того, что туда не было добавлено. Буду очень признателен просто за ваши идеи и ответы.
1 aka AMIGO
 
20.04.13
11:29
у меня кнопка "Заполнить" на форме.. удаляет строки, заполняет заново по остаткам
всех устраивает

зы. идее лет этак с 10-12 будет..
2 msk-07
 
20.04.13
11:31
ага, вот только моих это не устраивает. Мне просто нужно сделать проверку чтобы в цикле прогнать табличную часть и если каких-то остатков там не будет то добавить строчку, все понимаю, но как в коде написать не знаю
3 msk-07
 
20.04.13
11:38
Пожалуйста помогите, не за просто так...очень хочу разобраться.
4 msk-07
 
20.04.13
11:54
Еще раз напишу, кто мне может помочь по 7.7, не бесплатно, просто нужен совет как это организовать, ни чего большего..дальше напишу сам
5 Ganiev
 
20.04.13
13:35
выгрузи ТЧ в список , сделай прямой запрос с проверкой на остаток и не в списке который ты выгрузил, полученным заполни ТЧ!
6 Эльниньо
 
20.04.13
14:53
(5) Ну прям у нас тут все мегаспецы по прямым.

(0)
Рег.ВыгрузитьИтоги(ТЗ)
и сравнить с ТЧ
7 aka AMIGO
 
20.04.13
15:24
(6) у тс может быть бухия
8 Dolly_EV
 
20.04.13
15:31
Процедура ПолучитьОстатки(СписТоваров, ТолькоОстатки, ОстаткиТМЦ, ОстаткиПартий)
   
   ВремРегистры    = СоздатьОбъект("Регистры");
   РегОстатки        = ВремРегистры.ПартииТоваров;
   РегОстатки.УстановитьЗначениеФильтра("Фирма", Фирма, 1);
   РегОстатки.УстановитьЗначениеФильтра("Склад", МестоХранения, 1);
   
   Если ПустоеЗначение(СписТоваров) = 0 Тогда
       РегОстатки.УстановитьЗначениеФильтра("Товар", СписТоваров, 2);
   КонецЕсли;

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

//******************************************************************************
// ЗаполнениеПоСкладу(ТипЗаполнения)
//
// Параметры:
//  ТипЗаполнения - строка - "Обновить" или "Перезаполнить"
//
// Возвращаемое значение:
//  Пустая строка
//
// Описание:
//  Производит заполнение инвентаризации по складу.
//
Функция ЗаполнениеПоСкладу(ТипЗаполнения)
   
   Перем ТаблСуммы, ТаблОстатков;
   Перем СписТоваров, ВидЗаполнения;
   
   //СписокТЗап = СоздатьОбъект("СписокЗначений");
   //СписокТЗап.ДобавитьЗначение("По виду алкоголя");
   //СписокТЗап.ДобавитьЗначение("По группе товара");
   //Если СписокТЗап.ВыбратьЗначение(ВидЗаполнения, , , 60, 1) <> 1 Тогда
   //    Возврат "";
   //КонецЕсли;
             
   Если ПоГрТоваров=1 Тогда
       Если ГрТоваров.РазмерСписка()=0 Тогда
           Сообщить("Не выбраны группы товаров для заполнения!");
           Возврат "";
       КонецЕсли;    
   КонецЕсли;
   Если ПоВидуАлк=1 Тогда
       Если ПустоеЗначение(ВидАлк) = 1 Тогда
           Сообщить("Не выбран вид алкоголя!");
           Возврат "";
       КонецЕсли;    
   КонецЕсли;

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


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

//*****************************************************************************
// ПоКнопкеЗаполнить()
//
// Параметры:
//  Нет.
//
// Возвращаемое значение:
//  Нет.
//
// Вызывается из формул элементов диалога:
//  Кнопка "Заполнить"
//
// Описание:
//    Вызывается по кнопке "Заполнить".
//    Производит выбор способа заполнения и вызов процедуры заполнения документа
//
Процедура ПоКнопкеЗаполнить()
   
   Перем ТипЗаполнения, ВидЗаполнения;
   
   Если Фирма.Выбран() = 0 Тогда
       Предупреждение("Не указана фирма, заполнение невозможно!", 60);
       Возврат;
   КонецЕсли;
   
   Если МестоХранения.Выбран() = 0 Тогда
       Предупреждение("Не указан склад, заполнение невозможно!", 60);
       Возврат;
   КонецЕсли;

   СписокТипов = СоздатьОбъект("СписокЗначений");
   СписокТипов.ДобавитьЗначение("Перезаполнить");

   Если (КоличествоСтрок() <> 0) Тогда
       СписокТипов.ДобавитьЗначение("Обновить");
   КонецЕсли;
   
   //Если глТерминалВключен() = 1 Тогда
   //    СписокТипов.ДобавитьЗначение("Заполнить из терминала");
   //КонецЕсли;
   
   Если СписокТипов.РазмерСписка() = 1 Тогда
       ТипЗаполнения = СписокТипов.ПолучитьЗначение(1);
   Иначе
       Если СписокТипов.ВыбратьЗначение(ТипЗаполнения, , , 60, 1) <> 1 Тогда
           Возврат;
       КонецЕсли;
   КонецЕсли;
   
   ФактРавноУчет="Нет";
   Если ТипЗаполнения = "Перезаполнить" Тогда
       // Спросим приравнять ли факт к учету
       ФактРавноУчет = Вопрос("Приравнять фактическое количество к учетному?","Да+Нет", 60);
   КонецЕсли;
   
   Результат = ЗаполнениеПоСкладу(ТипЗаполнения);
   
   Если ПустоеЗначение(Результат) = 0 Тогда
       Предупреждение(Результат, 60);
   КонецЕсли;
                         
КонецПроцедуры // ПоКнопкеЗаполнить()
9 Dolly_EV
 
20.04.13
15:32
на форме есть кнопка "Заполнить", на ней висит Процедура ПоКнопкеЗаполнить()
10 Эльниньо
 
20.04.13
15:46
(7) Тогда бухзапрос в ТЗ и сравнить с ТЧ