Имя: Пароль:
1C
1C 7.7
v7: Прошу помощи с сортировкой в таблице документа (ТиС)
0 sotnikov
 
30.06.15
12:30
Парни, подскажите, как написать сортировку по реквизиту Артикул в счет-фактуре, которая выводится следующим модулем:

////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
//
Перем Прочерк, КороткийПрочерк;
Перем ПечВалюта;

Перем глДатаПоПриказу147;
Перем глДатаПостановления451;

// глБратьСуммыИзУчета(ДатаОперации)
//
// Параметры:
//     ДатаОперации - дата, дата операции, отражаемой в печатной форме
//
// Возвращаемое значение:
//     Число, 1 - брать суммы из учета, 0 - брать суммы из табличной части
//
// Описание:
//  Возвращает режим формирования печатных форм - по суммам из табличной
//  части и по суммам, отраженным в учете. До начала действия приказа № 147
//  всегда возвращается 0, так как разница в режимах проявляется только
//  для операций, на которые распространяется действие данного приказа
//  (фактически 1 января 2008 года и позднее).
//
Функция глБратьСуммыИзУчета(ДатаОперации, КодОперации = "")
        
    Если ДатаОперации < глДатаПоПриказу147 Тогда
        Возврат 0;
        
    ИначеЕсли (КодОперации = Перечисление.КодыОпераций.ВозвратОтРеализатора)
          ИЛИ (КодОперации = Перечисление.КодыОпераций.ВозвратКомитенту)
          ИЛИ (КодОперации = Перечисление.КодыОпераций.ПриемНаРеализацию)
          ИЛИ (КодОперации = Перечисление.КодыОпераций.ПриемНаРеализациюРозница)
          ИЛИ (КодОперации = Перечисление.КодыОпераций.ПередачаНаРеализацию) Тогда
        Возврат 0;
    
    Иначе
        Возврат Константа.СуммыВПечатныхФормахПоУчету;
        
    КонецЕсли;    
    
КонецФункции // глБратьСуммыИзУчета()

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
//
//******************************************************************************
// ПолучитьИНН(ИННКПП)
//
// Параметры:
//  ИННКПП  - строка, написанные вместе ИНН и КПП юр лица.
//
// Возвращаемое значение:
//  значение ИНН юр лица.
//  
// Описание:
//  Функция возращает ИНН из переданной строки
//
Функция ПолучитьИНН(ИННКПП)
    
    Если Найти(ИННКПП, "\") <> 0 Тогда
        // найден разделитель
        Возврат Лев(ИННКПП, Найти(ИННКПП, "\") - 1);

    Иначе
        Возврат СокрЛП(ИННКПП);

    КонецЕсли;

КонецФункции // ПолучитьИНН()

//******************************************************************************
// ПолучитьКПП(ИННКПП)
//
// Параметры:
//  ИННКПП  - строка, написанные вместе ИНН и КПП юр лица.
//
// Возвращаемое значение:
//  значение КПП юр лица.
//  
// Описание:
//  Функция возращает КПП из переданной строки
//
Функция ПолучитьКПП(ИННКПП)

    Если Найти(ИННКПП, "\") <> 0 Тогда
        // найден разделитель
        Возврат Сред(ИННКПП, Найти(ИННКПП, "\") + 1);

    Иначе
        Возврат "";

    КонецЕсли;

КонецФункции // ПолучитьКПП()

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

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

//******************************************************************************
// СкорректироватьТаблицуОснования(МнЧ)
//
// Параметры:
//  ТаблицаОснования
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Корректирует цену, сумму, сумму НДС и сумму НП по итогам проведения
//  документа основания по регистрам в зависимости от вида документа
//
Процедура СкорректироватьТаблицуОснования(Докум, ТаблицаОснования, ВидОсн)

    Если (ВидОсн = "Реализация") ИЛИ (ВидОсн = "РеализацияПрочее") Тогда

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

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

        ИначеЕсли ВидОсн = "ВводОстатковПокупателя" Тогда
            МнЧ.Номенклатура = ТаблицаОснования.ВидДолга;
            МнЧ.Количество   = 0;
            ТекЕдиница       = "-";
            ТекЕдиницаКод    = "-";
            МнЧ.Цена         = "-";
        Иначе
            МнЧ.Номенклатура = ТаблицаОснования.Номенклатура.ПолнНаименование + ?(Константа.ПоказыватьАртикул = 1, " " + ТаблицаОснования.Номенклатура.Артикул, "");
            МнЧ.Количество   = ТаблицаОснования.Количество;
            ТекЕдиница       = ТаблицаОснования.Единица;
            ТекЕдиницаКод    = ТаблицаОснования.Единица.ОКЕИ.Код;
            ВсегоКол          = ТаблицаОснования.Количество;

            Если (Докум.ДокОснование.УчитыватьНДС = 1)
               и (Докум.ДокОснование.СуммаВклНДС  = 0) Тогда
                МнЧ.Цена = ТаблицаОснования.Цена;     
            Иначе
                МнЧ.Цена = ?(ТаблицаОснования.Количество = 0, 0, ТаблицаОснования.Сумма/ТаблицаОснования.Количество);
            КонецЕсли;

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


        
            ТекТМЦ = ТаблицаОснования.Номенклатура;
            
            Если (ОстКолво > 0)
            и (ОстКолво < ВсегоКол)
            Тогда
                // только часть товара распределилась по ГТД
                РаспредГТД.НоваяСтрока();
                РаспредГТД.Колво  = ОстКолво;
                РаспредГТД.Номер  = "";
                РаспредГТД.Страна = "";
                // Заполним номер ГТД и Страну из Номенклатуры, если там есть...
                Если ПустоеЗначение(ТекТМЦ.НомерГТД) = 0 Тогда
                    РаспредГТД.Номер = СокрЛП(ТекТМЦ.НомерГТД);  
                КонецЕсли;
                
                Если ПустоеЗначение(ТекТМЦ.СтранаПроисхождения) = 0 Тогда
                    РаспредГТД.Страна = ТекТМЦ.СтранаПроисхождения;  
                КонецЕсли;
                
            КонецЕсли;
            
            РаспредГТД.Свернуть("Страна, Номер", "Колво");
            
            КолСтрокГТД = РаспредГТД.КоличествоСтрок();
            
            Если КолСтрокГТД = 0 Тогда
                // нет распределения по ГТД
                // Заполним номер ГТД и Страну из Номенклатуры, если там есть...
                Если ПустоеЗначение(ТекТМЦ.НомерГТД) = 0 Тогда
                    МнЧ.НомерГТД = СокрЛП(ТекТМЦ.НомерГТД);  
                КонецЕсли;
                
                Если ПустоеЗначение(ТекТМЦ.СтранаПроисхождения) = 0 Тогда
                    МнЧ.СтранаН = СокрЛП(ТекТМЦ.СтранаПроисхождения);
                    Если ТипЗначенияСтр(ТекТМЦ.СтранаПроисхождения) = "Справочник" Тогда
                        МнЧ.СтранаК = СокрЛП(ТекТМЦ.СтранаПроисхождения.Код);
                    Иначе
                        МнЧ.СтранаК = "";    
                    КонецЕсли;
                КонецЕсли;    
            ИначеЕсли КолСтрокГТД = 1 Тогда
                РаспредГТД.ВыбратьСтроки();
                РаспредГТД.ПолучитьСтроку();
                // одна строка в таблице. Товара с номером ГТД и страной в одной строке
                МнЧ.НомерГТД    = РаспредГТД.Номер;
                МнЧ.СтранаН     = СокрЛП(РаспредГТД.Страна);
                Если ТипЗначенияСтр(РаспредГТД.Страна) = "Справочник" Тогда
                    МнЧ.СтранаК = РаспредГТД.Страна.Код;
                Иначе
                    МнЧ.СтранаК = "";
                КонецЕсли;    
                
            Иначе
                
                РаспредГТД.ВыбратьСтроки();
                Пока РаспредГТД.ПолучитьСтроку() = 1 Цикл
                    
                    МнЧ.НоваяСтрока();
                    МнЧ.Номенклатура = "     в т.ч.";
                    МнЧ.Цена         = КороткийПрочерк;
                    МнЧ.Сумма         = КороткийПрочерк;
                    МнЧ.СтавкаНДС     = КороткийПрочерк;
                    МнЧ.СуммаНДС    
1 aka AMIGO
 
30.06.15
12:33
Выгрузить ТЧ в ТЗ, сортировать по колонке, записать обратно в ТЧ
2 Ёпрст
 
30.06.15
12:34
МнЧ.Сортировать("ИмяКолонкиКаойНадо");
3 LazyStranger
 
30.06.15
12:35
в МнЧ добавить колонку "артикул", после заполнения сортировать
4 palpetrovich
 
30.06.15
12:49
ставлю дайм что портянку никто из (1)(2)(3)  не читал
а зря, зачетная :)
5 sotnikov
 
30.06.15
12:49
Можете подробнее написать? Что конкретно и в какое место кода вставить?
6 palpetrovich
 
30.06.15
12:56
(5) так примерно
Функция ПодготовитьМнЧосн(Докум, МнЧ, Итоги, ФорматКоличества)
    
    Перем ТаблицаГТД;
    Перем РегПартии;
    
    ТаблицаГТД = СоздатьОбъект("ТаблицаЗначений");
    ТаблицаГТД.НоваяКолонка("Номенклатура");
    ТаблицаГТД.НоваяКолонка("Артикул");

// блаблабла

ТаблицаГТД.НоваяСтрока();
                ТаблицаГТД.Номенклатура        = РегПартии.Номенклатура;
                ТаблицаГТД.Артикул        = ТаблицаГТД.Номенклатура.Артикул;

// блаблабла
// перед выводом на печать:

ТаблицаГТД.Сортировать("Артикул");
7 Mikeware
 
30.06.15
12:57
(4) а что там такого уж зачетного? вроде типовая счет-фактура семерочная (тисовская)...
8 palpetrovich
 
30.06.15
13:07
(7) уж0с :)  ...почему-то не жалею что не знаю русский тис
9 sotnikov
 
30.06.15
13:08
(6) Вставляю ТаблицаГТД.Сортировать("Артикул"); в конец функции ПодготовитьМнЧосн толку ноль
10 Ёпрст
 
30.06.15
13:09
(9) ну ясен пень, смотри (2)
11 Ёпрст
 
30.06.15
13:11
Ежели, в этой табличке, нет колонки "ИмяКолонкиКаойНадо", то её надо туда добавить и заполнить. Потом, отсортировать.

Дальше наслаждаться и кушать печенки.
12 sotnikov
 
30.06.15
13:11
(10) Куда твой код-то пихать? Поясни тупому.
13 sotnikov
 
30.06.15
13:12
(11) Легко сказать добавить и заполнить. КАК?
14 palpetrovich
 
30.06.15
13:12
(9) там-же написано "так примерно", я-эж не знаю  какая именно ТЗ выводится на печать
15 Масянька
 
30.06.15
13:13
(8) Ничего подобного. Даже в первый раз не страшно.
(11) Что у тебя в ПодготовитьМнЧ? Давай еще одну простыню :)
16 sotnikov
 
30.06.15
13:17
(15)
Функция ПодготовитьМнЧосн(Докум, МнЧ, Итоги, ФорматКоличества)
    
    Перем ТаблицаГТД;
    Перем РегПартии;
    
    ТаблицаГТД = СоздатьОбъект("ТаблицаЗначений");
    ТаблицаГТД.НоваяКолонка("Номенклатура");
    ТаблицаГТД.НоваяКолонка("СтранаПроисхождения");
    ТаблицаГТД.НоваяКолонка("ГТД");
    ТаблицаГТД.НоваяКолонка("Количество");  //в базовых единицах
    
    КолвоГТДТов = СоздатьОбъект("СписокЗначений");
    
    // Переберем все партии, которые были списаны документом - основанием.
    // Если в партии были выбраны страна и ГТД, их следует перенести в СФ
    РегПартии = СоздатьОбъект("Регистр.ПартииНаличие");        
    РегПартии.ВыбратьДвиженияДокумента(Докум.ДокОснование);
    
    Пока РегПартии.ПолучитьДвижение() = 1 Цикл
        
        Если (РегПартии.Расход = 1)
        и    (РегПартии.Партия.Выбран()=1)
        Тогда
            ВремСтрана     = РегПартии.Партия.СтранаПроисхождения;
            ВремГТД        = РегПартии.Партия.ГТД;
            
            Если (ПустоеЗначение(ВремСтрана) = 0)
             или (ПустоеЗначение(ВремГТД   ) = 0)
            Тогда
                ТаблицаГТД.НоваяСтрока();
                ТаблицаГТД.Номенклатура        = РегПартии.Номенклатура;
                ТаблицаГТД.СтранаПроисхождения = ВремСтрана;
                ТаблицаГТД.ГТД                 = ВремГТД;
                ТаблицаГТД.Количество          = РегПартии.Количество;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    СоздатьСтруктуру(МнЧ);
    
    // создадим таблицу документа
    ТаблицаОснования = СоздатьОбъект("ТаблицаЗначений");
    Докум.ДокОснование.ВыгрузитьТабличнуюЧасть(ТаблицаОснования);
    
    
    // теперь у нас есть таблица, в которой собраны строки документа - основания в нужной валюте
    // надо проставить ГТД
    
    ВидОсн = Докум.ДокОснование.Вид();
        
    Если ВидОсн = "ВводОстатковПокупателя" Тогда
        ТаблицаОснования.НоваяКолонка("Сумма");
        ТаблицаОснования.НоваяКолонка("Номенклатура");
    Иначе
        Если глЕстьРеквизитМнЧ("СуммаНП", ВидОсн) = 0 Тогда
            ТаблицаОснования.НоваяКолонка("СуммаНП");
            ОснСуммаВклНП = 0;
        Иначе
            ОснСуммаВклНП = Докум.ДокОснование.СуммаВклНП;
        КонецЕсли;
            
        Если глЕстьРеквизитМнЧ("СуммаНДС", ВидОсн) = 0 Тогда
            ТаблицаОснования.НоваяКолонка("СуммаНДС");
            ОснСуммаВклНДС = 0;
        Иначе
            ОснСуммаВклНДС = Докум.ДокОснование.СуммаВклНДС;
        КонецЕсли;
    КонецЕсли;
    
    
        
    Если глЕстьРеквизитШапки("КодОперации", ВидОсн) = 1 Тогда
        БратьСуммыИзУчета = глБратьСуммыИзУчета(Докум.ДатаДок, Докум.ДокОснование.КодОперации);
    Иначе
        БратьСуммыИзУчета = глБратьСуммыИзУчета(Докум.ДатаДок);
    КонецЕсли;
    
    Если БратьСуммыИзУчета = 1 Тогда
        СкорректироватьТаблицуОснования(Докум, ТаблицаОснования, ВидОсн);
    КонецЕсли;
    
    ИтогСумма    = 0;
    ВывелиСтроку = 0;
    
    РаспредГТД = СоздатьОбъект("ТаблицаЗначений");
    РаспредГТД.НоваяКолонка("Колво");
    РаспредГТД.НоваяКолонка("Страна");
    РаспредГТД.НоваяКолонка("Номер");
    
    ТаблицаОснования . ВыбратьСтроки();
    Пока ТаблицаОснования.ПолучитьСтроку()=1 Цикл
        
        Если ВидОсн = "ВводОстатковПокупателя" Тогда
            ТаблицаОснования.Сумма = ТаблицаОснования.СуммаРуб - ТаблицаОснования.СуммаНДС - ТаблицаОснования.СуммаНП;
        Иначе
            Если ОснСуммаВклНП = 1 Тогда
                ТаблицаОснования.Сумма = ТаблицаОснования.Сумма - ТаблицаОснования.СуммаНП;
            КонецЕсли;
            
            Если ОснСуммаВклНДС = 1 Тогда
                ТаблицаОснования.Сумма = ТаблицаОснования.Сумма - ТаблицаОснования.СуммаНДС;
            КонецЕсли;
        
        КонецЕсли;
        
        МнЧ.НоваяСтрока();
        
        МнЧ.СтранаН      = "";
        МнЧ.СтранаК      = "";
        МнЧ.НомерГТД     = "";
        МнЧ.АкцизЦена    = "без акциза";
        
        Если ПустоеЗначение(ТаблицаОснования.Сумма) = 1 Тогда
            МнЧ.Сумма        = КороткийПрочерк;
            МнЧ.СтавкаНДС    = "без НДС";
            МнЧ.СуммаНДС    = КороткийПрочерк;
            МнЧ.СуммаНП        = КороткийПрочерк;
        Иначе
            МнЧ.Сумма        = ТаблицаОснования.Сумма;
            МнЧ.СтавкаНДС    = ?(ТаблицаОснования.СтавкаНДС = Перечисление.СтавкиНДС.безНДС, "Без НДС", Строка(ТаблицаОснования.СтавкаНДС));
            МнЧ.СуммаНДС     = ?(ТаблицаОснования.СтавкаНДС = Перечисление.СтавкиНДС.безНДС, КороткийПрочерк, глФРМ(ТаблицаОснования.СуммаНДС));
            МнЧ.СуммаНП      = глФРМ(ТаблицаОснования.СуммаНП);  
        КонецЕсли;
        
        Если ВидОсн = "РеализацияПрочее" Тогда
            МнЧ.Номенклатура = ТаблицаОснования.Содержание;
            ВсегоКол         = 0;
            МнЧ.Количество   = ТаблицаОснования.Количество;
            ТекЕдиница       = "-";
            ТекЕдиницаКод    = "-";
            
            Если (Докум.ДокОснование.УчитыватьНДС = 1)
               и (Докум.ДокОснование.СуммаВклНДС  = 0) Тогда
                МнЧ.Цена = ТаблицаОснования.Цена;     
            Иначе
                МнЧ.Цена = ?(ТаблицаОснования.Количество = 0, 0, ТаблицаОснования.Сумма/ТаблицаОснования.Количество);
            КонецЕсли;

        ИначеЕсли ВидОсн = "ВводОстатковПокупателя" Тогда
            МнЧ.Номенклатура = ТаблицаОснования.ВидДолга;
            МнЧ.Количество   = 0;
            ТекЕдиница       = "-";
            ТекЕдиницаКод    = "-";
            МнЧ.Цена         = "-";
        Иначе
            МнЧ.Номенклатура = ТаблицаОснования.Номенклатура.ПолнНаименование + ?(Константа.ПоказыватьАртикул = 1, " " + ТаблицаОснования.Номенклатура.Артикул, "");
            МнЧ.Количество   = ТаблицаОснования.Количество;
            ТекЕдиница       = ТаблицаОснования.Единица;
            ТекЕдиницаКод    = ТаблицаОснования.Единица.ОКЕИ.Код;
            ВсегоКол          = ТаблицаОснования.Количество;

            Если (Докум.ДокОснование.УчитыватьНДС = 1)
               и (Докум.ДокОснование.СуммаВклНДС  = 0) Тогда
                МнЧ.Цена = ТаблицаОснования.Цена;     
            Иначе
                МнЧ.Цена = ?(ТаблицаОснования.Количество = 0, 0, ТаблицаОснования.Сумма/ТаблицаОснования.Количество);
            КонецЕсли;

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


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

        
    Если ПустоеЗначение(ФорматКоличества) = 1 Тогда
        ФорматКоличества    = "Ч010.0";
    КонецЕсли;
    
    Итоги = СоздатьОбъект("СписокЗначений");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("Сумма") + ТаблицаОснования.Итог("СуммаНДС"),    "ИтогВсегоСНДС");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("Сумма")    , "ИтогСумма");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("СуммаНДС"), "ИтогСуммаНДС");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("СуммаНП")    , "ИтогСуммаНП");
    

    Возврат "";
КонецФункции // ПодготовитьМнЧосн()
17 Ёпрст
 
30.06.15
13:18
(13)
в процу СоздатьСтруктуру(МнЧ)

воткнуть в конец
Мнч.НоваяКолонка("Вася");,

далее в коде искать, где присваивается значение
Мнч.Номенклатура = ...
добавить Мнч.Вася = ...

Перед выводом, Мнч.Сортировать("Вася"); наслаждаться.
18 Ёпрст
 
30.06.15
13:19
в твоём коде,это будет вот так

Иначе
            МнЧ.Номенклатура = ТаблицаОснования.Номенклатура.ПолнНаименование + ?(Константа.ПоказыватьАртикул = 1, " " + ТаблицаОснования.Номенклатура.Артикул, "");

МнЧ.Вася = ТаблицаОснования.Номенклатура.Артикул;
19 Масянька
 
30.06.15
13:21
(16) Перед "Если ПустоеЗначение(ФорматКоличества) = 1 Тогда" воткни сортировку, только сначала сделай то, что говорит Ёпрст.
20 VladZ
 
30.06.15
13:23
У ж о с! Там работы на 3 минуты.
21 Mikeware
 
30.06.15
13:27
(20) "А поговорить?"©
22 Масянька
 
30.06.15
13:34
(21) Обойдешься :)
23 sotnikov
 
30.06.15
13:37
Не сортируется=(
Функция ПодготовитьМнЧосн(Докум, МнЧ, Итоги, ФорматКоличества)
    
    Перем ТаблицаГТД;
    Перем РегПартии;
    
    ТаблицаГТД = СоздатьОбъект("ТаблицаЗначений");
    ТаблицаГТД.НоваяКолонка("Номенклатура");
    ТаблицаГТД.НоваяКолонка("СтранаПроисхождения");
    ТаблицаГТД.НоваяКолонка("ГТД");
    ТаблицаГТД.НоваяКолонка("Количество");  //в базовых единицах
    
    КолвоГТДТов = СоздатьОбъект("СписокЗначений");
    
    // Переберем все партии, которые были списаны документом - основанием.
    // Если в партии были выбраны страна и ГТД, их следует перенести в СФ
    РегПартии = СоздатьОбъект("Регистр.ПартииНаличие");        
    РегПартии.ВыбратьДвиженияДокумента(Докум.ДокОснование);
    
    Пока РегПартии.ПолучитьДвижение() = 1 Цикл
        
        Если (РегПартии.Расход = 1)
        и    (РегПартии.Партия.Выбран()=1)
        Тогда
            ВремСтрана     = РегПартии.Партия.СтранаПроисхождения;
            ВремГТД        = РегПартии.Партия.ГТД;
            
            Если (ПустоеЗначение(ВремСтрана) = 0)
             или (ПустоеЗначение(ВремГТД   ) = 0)
            Тогда
                ТаблицаГТД.НоваяСтрока();
                ТаблицаГТД.Номенклатура        = РегПартии.Номенклатура;
                ТаблицаГТД.СтранаПроисхождения = ВремСтрана;
                ТаблицаГТД.ГТД                 = ВремГТД;
                ТаблицаГТД.Количество          = РегПартии.Количество;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    СоздатьСтруктуру(МнЧ);
    
    // создадим таблицу документа
    ТаблицаОснования = СоздатьОбъект("ТаблицаЗначений");
    Докум.ДокОснование.ВыгрузитьТабличнуюЧасть(ТаблицаОснования);
    
    
    // теперь у нас есть таблица, в которой собраны строки документа - основания в нужной валюте
    // надо проставить ГТД
    
    ВидОсн = Докум.ДокОснование.Вид();
        
    Если ВидОсн = "ВводОстатковПокупателя" Тогда
        ТаблицаОснования.НоваяКолонка("Сумма");
        ТаблицаОснования.НоваяКолонка("Номенклатура");
    Иначе
        Если глЕстьРеквизитМнЧ("СуммаНП", ВидОсн) = 0 Тогда
            ТаблицаОснования.НоваяКолонка("СуммаНП");
            ОснСуммаВклНП = 0;
        Иначе
            ОснСуммаВклНП = Докум.ДокОснование.СуммаВклНП;
        КонецЕсли;
            
        Если глЕстьРеквизитМнЧ("СуммаНДС", ВидОсн) = 0 Тогда
            ТаблицаОснования.НоваяКолонка("СуммаНДС");
            ОснСуммаВклНДС = 0;
        Иначе
            ОснСуммаВклНДС = Докум.ДокОснование.СуммаВклНДС;
        КонецЕсли;
    КонецЕсли;
    
    
        
    Если глЕстьРеквизитШапки("КодОперации", ВидОсн) = 1 Тогда
        БратьСуммыИзУчета = глБратьСуммыИзУчета(Докум.ДатаДок, Докум.ДокОснование.КодОперации);
    Иначе
        БратьСуммыИзУчета = глБратьСуммыИзУчета(Докум.ДатаДок);
    КонецЕсли;
    
    Если БратьСуммыИзУчета = 1 Тогда
        СкорректироватьТаблицуОснования(Докум, ТаблицаОснования, ВидОсн);
    КонецЕсли;
    
    ИтогСумма    = 0;
    ВывелиСтроку = 0;
    
    РаспредГТД = СоздатьОбъект("ТаблицаЗначений");
    РаспредГТД.НоваяКолонка("Колво");
    РаспредГТД.НоваяКолонка("Страна");
    РаспредГТД.НоваяКолонка("Номер");
    
    ТаблицаОснования . ВыбратьСтроки();
    Пока ТаблицаОснования.ПолучитьСтроку()=1 Цикл
        
        Если ВидОсн = "ВводОстатковПокупателя" Тогда
            ТаблицаОснования.Сумма = ТаблицаОснования.СуммаРуб - ТаблицаОснования.СуммаНДС - ТаблицаОснования.СуммаНП;
        Иначе
            Если ОснСуммаВклНП = 1 Тогда
                ТаблицаОснования.Сумма = ТаблицаОснования.Сумма - ТаблицаОснования.СуммаНП;
            КонецЕсли;
            
            Если ОснСуммаВклНДС = 1 Тогда
                ТаблицаОснования.Сумма = ТаблицаОснования.Сумма - ТаблицаОснования.СуммаНДС;
            КонецЕсли;
        
        КонецЕсли;
        
        МнЧ.НоваяСтрока();
        
        МнЧ.СтранаН      = "";
        МнЧ.СтранаК      = "";
        МнЧ.НомерГТД     = "";
        МнЧ.АкцизЦена    = "без акциза";
        
        Если ПустоеЗначение(ТаблицаОснования.Сумма) = 1 Тогда
            МнЧ.Сумма        = КороткийПрочерк;
            МнЧ.СтавкаНДС    = "без НДС";
            МнЧ.СуммаНДС    = КороткийПрочерк;
            МнЧ.СуммаНП        = КороткийПрочерк;
        Иначе
            МнЧ.Сумма        = ТаблицаОснования.Сумма;
            МнЧ.СтавкаНДС    = ?(ТаблицаОснования.СтавкаНДС = Перечисление.СтавкиНДС.безНДС, "Без НДС", Строка(ТаблицаОснования.СтавкаНДС));
            МнЧ.СуммаНДС     = ?(ТаблицаОснования.СтавкаНДС = Перечисление.СтавкиНДС.безНДС, КороткийПрочерк, глФРМ(ТаблицаОснования.СуммаНДС));
            МнЧ.СуммаНП      = глФРМ(ТаблицаОснования.СуммаНП);  
        КонецЕсли;
        
        Если ВидОсн = "РеализацияПрочее" Тогда
            МнЧ.Номенклатура = ТаблицаОснования.Содержание;
            ВсегоКол         = 0;
            МнЧ.Количество   = ТаблицаОснования.Количество;
            ТекЕдиница       = "-";
            ТекЕдиницаКод    = "-";
            
            Если (Докум.ДокОснование.УчитыватьНДС = 1)
               и (Докум.ДокОснование.СуммаВклНДС  = 0) Тогда
                МнЧ.Цена = ТаблицаОснования.Цена;     
            Иначе
                МнЧ.Цена = ?(ТаблицаОснования.Количество = 0, 0, ТаблицаОснования.Сумма/ТаблицаОснования.Количество);
            КонецЕсли;

        ИначеЕсли ВидОсн = "ВводОстатковПокупателя" Тогда
            МнЧ.Номенклатура = ТаблицаОснования.ВидДолга;
            МнЧ.Количество   = 0;
            ТекЕдиница       = "-";
            ТекЕдиницаКод    = "-";
            МнЧ.Цена         = "-";
        Иначе
            МнЧ.Номенклатура = ТаблицаОснования.Номенклатура.ПолнНаименование + ?(Константа.ПоказыватьАртикул = 1, " " + ТаблицаОснования.Номенклатура.Артикул, "");
            Мнч.Артикул         = ТаблицаОснования.Номенклатура.Артикул;
            МнЧ.Количество   = ТаблицаОснования.Количество;
            ТекЕдиница       = ТаблицаОснования.Единица;
            ТекЕдиницаКод    = ТаблицаОснования.Единица.ОКЕИ.Код;
            ВсегоКол          = ТаблицаОснования.Количество;

            Если (Докум.ДокОснование.УчитыватьНДС = 1)
               и (Докум.ДокОснование.СуммаВклНДС  = 0) Тогда
                МнЧ.Цена = ТаблицаОснования.Цена;     
            Иначе
                МнЧ.Цена = ?(ТаблицаОснования.Количество = 0, 0, ТаблицаОснования.Сумма/ТаблицаОснования.Количество);
            КонецЕсли;

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


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

    Мнч.Сортировать("Артикул");    
    Если ПустоеЗначение(ФорматКоличества) = 1 Тогда
        ФорматКоличества    = "Ч010.0";
    КонецЕсли;
    
    Итоги = СоздатьОбъект("СписокЗначений");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("Сумма") + ТаблицаОснования.Итог("СуммаНДС"),    "ИтогВсегоСНДС");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("Сумма")    , "ИтогСумма");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("СуммаНДС"), "ИтогСуммаНДС");
    Итоги.ДобавитьЗначение(ТаблицаОснования.Итог("СуммаНП")    , "ИтогСуммаНП");
    

    Возврат "";
КонецФункции // ПодготовитьМнЧосн()
24 palpetrovich
 
30.06.15
13:39
(23) а Константа.ПоказыватьАртикул = 1 ?
зы скачал руТиС, прикольный, заполняет себе что-то уже минуты 2  :)
25 sotnikov
 
30.06.15
13:41
МнЧ = СоздатьОбъект("ТаблицаЗначений");
    МнЧ.НоваяКолонка("Цена",);
    МнЧ.НоваяКолонка("Сумма",);
    МнЧ.НоваяКолонка("СтавкаНДС");
    МнЧ.НоваяКолонка("СуммаНДС",);
    МнЧ.НоваяКолонка("СуммаНП",);
    МнЧ.НоваяКолонка("ВсегоСНДС",);
    МнЧ.НоваяКолонка("Номенклатура");
    МнЧ.НоваяКолонка("СтранаН");
    МнЧ.НоваяКолонка("СтранаК");
    МнЧ.НоваяКолонка("НомерГТД");
    МнЧ.НоваяКолонка("Единица");
    МнЧ.НоваяКолонка("ЕдиницаКод");
    МнЧ.НоваяКолонка("Количество");
    МнЧ.НоваяКолонка("АкцизЦена");
    Мнч.НоваяКолонка("Артикул");

//*****

            МнЧ.Номенклатура = ТаблицаОснования.Номенклатура.ПолнНаименование + ?(Константа.ПоказыватьАртикул = 1, " " + ТаблицаОснования.Номенклатура.Артикул, "");
            Мнч.Артикул         = ТаблицаОснования.Номенклатура.Артикул;

//*****
    Мнч.Сортировать("Артикул");    
    Если ПустоеЗначение(ФорматКоличества) = 1 Тогда
26 sotnikov
 
30.06.15
13:42
(24) Да, судя по тому что он выводится в печатной форме перед наименованием.
27 Ёпрст
 
30.06.15
13:47
(25) уже лучше.
Теперь ищи, где есть в коде Мнч.Свернуть
28 Ёпрст
 
30.06.15
13:47
или Мнч.Сортировать
29 Ёпрст
 
30.06.15
13:48
и думай.
30 Масянька
 
30.06.15
13:48
(27) (28) Можно добавлю? Искать нужно в процедуре. где уже происходит печать (вывод).
31 sotnikov
 
30.06.15
13:49
(28) Нет других сортировок.
32 sotnikov
 
30.06.15
13:49
(27) РаспредГТД.Свернуть("Страна, Номер", "Колво");
Только это
33 Ёпрст
 
30.06.15
13:50
(31) тогда ищи, где еще может заполняться номенклатура.
34 Ёпрст
 
30.06.15
13:51
в эту табличку.
35 Ёпрст
 
30.06.15
13:51
и туда пропиши свой артикул.
36 Масянька
 
30.06.15
13:52
(31) У себя в ТОРГ-12 написала:

Процедура ОбработкаМнЧ(ПечДокумент)
    
    МнЧ = СоздатьОбъект("ТаблицаЗначений");
    МнЧ.НоваяКолонка("Номенклатура");
    МнЧ.НоваяКолонка("Единица");
    МнЧ.НоваяКолонка("Количество");
    МнЧ.НоваяКолонка("Коэффициент");
    МнЧ.НоваяКолонка("Сумма");
    МнЧ.НоваяКолонка("Цена");
    МнЧ.НоваяКолонка("СуммаНДС");
    МнЧ.НоваяКолонка("СуммаНП");
    МнЧ.НоваяКолонка("СтавкаНДС");

    ПечДокумент.ВыбратьСтроки();

    Пока ПечДокумент.ПолучитьСтроку() = 1 Цикл
        
        Если ПечДокумент.Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Прочее Тогда
            МнЧ.НоваяСтрока();
            МнЧ.Номенклатура = ПечДокумент.Номенклатура;
            МнЧ.Единица      = ПечДокумент.Единица;
            МнЧ.Количество      = ПечДокумент.Количество;;
            МнЧ.Коэффициент  = ПечДокумент.Коэффициент;
            МнЧ.Сумма          = ПечДокумент.Сумма;
            МнЧ.Цена          = ПечДокумент.Цена;
            МнЧ.СуммаНДС      = ПечДокумент.СуммаНДС;
            МнЧ.СуммаНП      = ПечДокумент.СуммаНП;
            МнЧ.СтавкаНДС      = ПечДокумент.СтавкаНДС;
        КонецЕсли;
    КонецЦикла;

    МнЧ.Сортировать("Номенклатура");    
    
    КоличествоСтрок = МнЧ.КоличествоСтрок();
    
КонецПроцедуры // ОбработкаМнЧ

добавлена строка про сортировку - все арбайтен.
Разбирайся.
37 Mikeware
 
30.06.15
13:52
(35) "не поможет!"© прочитай его первую тему...
а ведь он совсем не изменился...
38 Масянька
 
30.06.15
13:53
(37) Дык, п-п-предупрежадть надо (С)
39 Злопчинский
 
30.06.15
13:56
(8) ага, только сделать что требуется в ТИСе - для удобства и новых фич пользователя - два пальца об асфальт - хоть конфигу поменять, хоть модули проведения переписать. А как заходит речь о чем-то нестандартном - восьмерочников аж курутит как грешников на костре.
40 Масянька
 
30.06.15
13:59
(39) И не говори.
Сделать конфетку из клюшек (хоть с орехами, хоть с коньяком) - легко.
А вот из снеговика получаются только пирожки... Да и те, с котятами. :)))
41 Mikeware
 
30.06.15
14:03
(39) это не самое прикольное...
42 sotnikov
 
30.06.15
14:06
Да ладно вам ребят, если я не программист, то что мне делать с такой мелкой по меркам программера задачей? Не звонить же в франч. Вот и приходится тут спрашивать...
43 Mikeware
 
30.06.15
14:08
(42) а если зуб заболит - чего стоматолога беспокоить?
44 sotnikov
 
30.06.15
14:10
(43) Зуб болит - это очень абстрактно.
Скол на зубе натирает язык - можно подпилить пилочкой и не нужен врач=)
В данном случае имхо более уместное сравнение.
45 palpetrovich
 
30.06.15
14:11
вон оно че Михалыч, вон оно че
Функция ПодготовитьМнЧ1137(МнЧ, Итоги, ФорматКоличества)
//...
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        МнЧ.НоваяСтрока();
        МнЧ.Номенклатура = СокрП(Наименование);  

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

зы: не,я не проив, но нафига так? :)
46 mehfk
 
30.06.15
14:11
(44) А острый аппендицит у директора возьмешься исправить?
47 sotnikov
 
30.06.15
14:13
(46) Одно дело вопрос жизни и здоровья, другое - мелкая неприятность отдельного сотрудника (как в случае необходимости данной доработки)
48 sotnikov
 
30.06.15
14:29
Разобрался. Вставил сортировку в процедуру Печать.
Всем спасибо за объективную критику и советы.
49 Злопчинский
 
30.06.15
16:59
(40) дай пять! ;-) не пирожков, а краба!