Имя: Пароль:
1C
1С v8
Перечисление номеров документов в сводном отчете (внешняя обработка)
,
0 Ната48
 
02.12.16
23:19
Доброго всем вечера! Вопрос уже поднимала, но комменты в нем отключили уже. Есть внешняя обработка, которая собирает данные из документов МенюРаскладка за день сводно. Подскажите, пожалуйста, как в заголовке перечислить номера документов, которые вошли в эту сводную накладную? через запятую))
Перем Таб,ТабличныйДокумент,ТабДаты,ТабДанных,ТабПоставщики,ТабНоменклатура,ТабИтогНоменклатура;
Перем КолДат,Макет,ТабИтогПоставщик;
// Вызывается из тела процедуры "Сформировать"
// осуществляет проверку значений "НачалоПериода" и "КонецПериода"
// введенных пользователем.
Функция ПроверкаПериода()
    
    ПроверкаПройдена=Истина;
    
    Если НачалоПериода > КонецПериода Тогда
        
        Предупреждение("Неправильно задан период формирования отчета!"+Символы.ПС+
                       "Дата начала больше даты окончания периода.");
                      
        ПроверкаПройдена=Ложь;
        
    ИначеЕсли НачалоПериода='00010101' Тогда
        
        Предупреждение("Не указана дата начала отчета");
                      
        ПроверкаПройдена=Ложь;
        
    ИначеЕсли КонецПериода='00010101' Тогда
        
        Предупреждение("Не указана дата конца отчета");
                      
        ПроверкаПройдена=Ложь;
    
    КонецЕсли;
        
    Возврат ПроверкаПройдена;
    
КонецФункции // ПроверкаПериода()

Процедура ВыбПериодНажатие(Элемент)
    РаботаСДиалогами.ОбработчикНастройкаПериодаНажатие(НачалоПериода, КонецПериода);
КонецПроцедуры

Процедура ПриОткрытии()
    
    НачалоПериода = НачалоМесяца(РабочаяДата);
    КонецПериода = КонецМесяца(РабочаяДата);

    // Проверка ведения однофирменности
    Организация = глЗначениеПеременной("ОсновнаяОрганизация");
    УчетПоВсемОрганизациям = глЗначениеПеременной("УчетПоВсемОрганизациям");
    ЭлементыФормы.Организация.ТолькоПросмотр = НЕ УчетПоВсемОрганизациям;

КонецПроцедуры

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

//******************************************************************
//
Процедура ДобавитьКолонки(НачЗн,КонЗн,ГорСек,ВерСек)
    Если НачЗн < КонЗн Тогда
        ДобавитьКол = КонЗн - НачЗн;

        Для к = 1 по ДобавитьКол Цикл
            Секция = Макет.ПолучитьОбласть("Секция_" + ГорСек + "|Секция_" + ВерСек);
            ТабличныйДокумент.Присоединить(Секция);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры // ДобавитьКолонки()

//******************************************************************
//
Процедура ГоризонтальныйРазворотПоДатам(ГорСек,ВерСек)
    Для Каждого ТекущаяСтрока Из ТабДаты Цикл
        
         Секция = Макет.ПолучитьОбласть("Секция_" + ГорСек + "|Секция_" + ВерСек);
         Секция.Параметры.пТекДата = ТекущаяСтрока.Дата;
         ТабличныйДокумент.Присоединить(Секция);
    КонецЦикла;

    //ДобавитьКолонки(КолДат,5,ГорСек,ВерСек + 1);
КонецПроцедуры // ГоризонтальныйРазворотПоДатам()

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

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

        ТекДата  = ТекущаяСтрока.Дата;
        ТекСумма = ТекущаяСтрока.Сумма;
        ТекКол   = ТекущаяСтрока.Количество;
        Поз = 0;
        Стр=ТабДаты.Найти(ТекДата,"Дата");
        Поз=ТабДаты.Индекс(Стр)+1;

        ДобавитьКолонки(ПредКол + 1,Поз,7,5);
        ПредКол     = Поз;
        
        Секция = Макет.ПолучитьОбласть("Секция_7|Секция_4");
        Секция.Параметры.пСумма      = ТекСумма;
        Секция.Параметры.пКоличество = ТекКол;
        ТабличныйДокумент.Присоединить(Секция);
        
        ИтогНоменклатура    = ИтогНоменклатура + ТекСумма;
        ИтогНоменклатураКол = ИтогНоменклатураКол + ТекКол;
        ПредНоменклатура    = ТекНоменклатура;
    КонецЦикла;

    // Формируем строку итогов
    СуммаВсегоМат = ТабД.Итог("Сумма");
    пСуммаИтогоМ = СуммаВсегоМат;
    Секция = Макет.ПолучитьОбласть("Секция_" + СекИтогов + "|Секция_2");
    Секция.Параметры.пСуммаИтогоМ = СуммаВсегоМат;
    ТабличныйДокумент.Вывести(Секция);
    
    //Если СуммаВсегоМат<>0 Тогда
    // //ДобавитьКолонки(КолДат-1,5,СекИтогов,5);
    //КонецЕсли;
КонецПроцедуры // ЗаполнитьРазделТаблицы()

Процедура КоманднаяПанельСформировать(Кнопка)
    
    Если НЕ ЗначениеЗаполнено(Организация) Тогда
        Предупреждение("Не указана организация.");
        Возврат;
    КонецЕсли;
    
    Если НЕ ЗначениеЗаполнено(Склад) Тогда
        Предупреждение("Не указан склад.");
        Возврат;
    КонецЕсли;

    
    Если НЕ ПроверкаПериода() Тогда
        Возврат;
    КонецЕсли;
    
    ТабДокумент = ЭлементыФормы.ТабличныйДокумент;    
    ТабДокумент.Очистить();
    Макет = ПолучитьМакет("Требование");
    // Вывод шапки
    
    
    Если СформироватьТабДанных(ТабДанных) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    //Для Каждого ТекущаяСтрока Из ТабНоменклатура Цикл
    //    Если ТекущаяСтрока.ВидМеню.Код=1 Тогда
    //         ТекущаяСтрока.Количество=0;
    //         ТекущаяСтрока.Сумма=0;
    //    Иначе    
    //         //Колво=?(ТекущаяСтрока.Номенклатура.БазоваяЕдиницаИзмерения.ОкругНаЦело=Истина,Окр(ТекущаяСтрока.Количество,0,1),ТекущаяСтрока.Количество);
    //         //ТекущаяСтрока.Количество=ТекущаяСтрока.Количество;
    //    КонецЕсли;
    //КонецЦикла;
    
    ТабНоменклатура.Свернуть("Номенклатура","Количество,Сумма");
    ТабНоменклатура.Сортировать("Номенклатура");
    
    // Вывод заголовка
    Область = Макет.ПолучитьОбласть("Заголовок");
    Область.Параметры.ТекстЗаголовка = "Требование-накладная ";
    Область.Параметры.НачалоПериода = Формат(НачалоПериода, "ДФ=dd.MM.yyyy");
    Область.Параметры.КонецПериода = Формат(КонецПериода, "ДФ=dd.MM.yyyy");
    Область.Параметры.НазваниеОрганизации = Организация.НаименованиеПолное;
    Область.Параметры.МОЛ                 = Склад;
    Область.Параметры.НазваниеКатегории   = ?(НЕ ЗначениеЗаполнено(Категория),"По всем категориям ",Категория);
    Область.Параметры.НазваниеВидМеню     = ?(НЕ ЗначениеЗаполнено(ВидМеню),"По всем меню (без возврата)",ВидМеню);
    

    ТабДокумент.Вывести(Область);

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

    
    // Вывод подвала
    Область = Макет.ПолучитьОбласть("Подписи");
    ТабДокумент.Вывести(Область);

    // Возврат ТабличныйДокумент;

КонецПроцедуры // Сформировать()
1 Ната48
 
02.12.16
23:20
бп 8.2
2 Garykom
 
гуру
02.12.16
23:31
Это "//|   МенюРаскладка_Л.Номер КАК НОМЕР" вполне правильно.

Суть тебе нужен список номеров документов, можно или выполнить отдельный запрос (с теми же параметрами) который вернет только номера доков.

Или дополнительная обработка результатов одного "полного" запроса.

"ТабНоменклатура.Свернуть("Номер","");" это и будет список, который в цикле обходим и складываем
Номера = Номера + ТекСтр.Номер;
Не забыть в отдельную ТЗ скопировать, чтобы для номенклатуры исходная осталась.
3 Garykom
 
гуру
02.12.16
23:33
Но код кривущий до ужаса кста... Никакие "Перем" в начале нафик не нужны, ибо функция умеет возвращать результат.

Функциональное программирование это:

ТабНоменклатура = СформироватьТабДанных(Параметры);
4 Serg_1960
 
02.12.16
23:34
(2) Поправка (учитывая, что запрос к ТЧ документа):

"ВЫБРАТЬ
    |    МенюРаскладка_Л.Количество КАК КОЛИЧЕСТВО,
    |    МенюРаскладка_Л.Сумма КАК СУММА,
    |   МенюРаскладка_Л.Номенклатура КАК НОМЕНКЛАТУРА,
    |   МенюРаскладка_Л.Ссылка.Номер КАК НОМЕР
5 Garykom
 
гуру
02.12.16
23:36
(3)+ Если нуна проверить и вернуть результат то возвращаем вместо таблицы просто "Неопределено" и проверяем не равно ли.

Или возвращаем "составной результат", где в структуре есть "Описание" и "Данные"
6 Garykom
 
гуру
02.12.16
23:37
(4) ага, спать уже пора
7 Ната48
 
02.12.16
23:41
Спасибо вам всем огромное!!! Пошла работать)))
8 Serg_1960
 
02.12.16
23:53
Когда поработаешь, загляни на форум :)

...
    РезультатЗапроса = ЗапросПоДокументам.Выполнить();
    ТабДанных        = РезультатЗапроса.Выгрузить();
    ТабДанных.Сортировать("Номенклатура");
    ТабНоменклатура    = ТабДанных.Скопировать();

    // формируем строку с номерами:

    ТабНомеров   = РезультатЗапроса.Выгрузить();
    ТабНомеров.Свернуть("НОМЕР");
    ТабНомеров.Сортировать("НОМЕР");
    СтрокаНомеров = "Сводный отчет составлен на основании документов с номерами";
    Для х=0 По ТабНомеров.Количество()-1 Цикл
       СтрокаНомеров = СтрокаНомеров + ?(х=0," ",",") + ТабНомеров[х];
    КонецЦикла;
...
9 Garykom
 
гуру
03.12.16
14:25
(8) >СтрокаНомеров = СтрокаНомеров + ?(х=0," ",",") + ТабНомеров[х];
Норошая, красивая запись.

Но неужели в 1С до сих пор нету функций типа Split и Join (по типу https://learn.javascript.ru/array-methods) или я отстал от жизни?
Про СтрЗаменить(ИсхСтрока, Разделитель, Символы.ПС) в курсе но это такой легкий костыль.
10 Garykom
 
гуру
03.12.16
14:25
(9) *Хорошая, красивая
11 Ната48
 
04.12.16
00:14
А как результат запроса вывести в макет? я создала область СтрокаНомеров и параметр СтрокаНомеров.
Область = Макет.ПолучитьОбласть("СтрокаНомеров");
//Область.Параметры.СтрокаНомеров=Заполнить();
ТабДокумент.Вывести(Область);
12 quest
 
04.12.16
00:55
(9)
СтрСоединить (StrConcat)
13 Garykom
 
гуру
04.12.16
00:57
(12) оу а я то все проспал... но сча стока новых технологий ежедневно уже что начинаешь изучать новое только когда приспичит = старые знакомые проверенные методы не помогли
14 Garykom
 
гуру
04.12.16
00:58
Функции работы со строками СтрРазделить(), СтрСоединить()
15 Garykom
 
гуру
04.12.16
00:59
(14)+ офигеть это же было 2 года назад http://v8.1c.ru/o7/201408str/index.htm, точно проспал или увидел и выкинул из головы.
16 Ната48
 
04.12.16
23:22
(12) СтрСоединить на платформе 8.3.9.1818 не работает, бп 2.0 к тому ж. А еще как можно?
17 Ната48
 
04.12.16
23:50
вот так пробую     Область.Параметры.СтрокаНомеров.Заполнить(Новый Структура("",));    
не соображу что собрать в структуру
18 Torquader
 
05.12.16
01:06
Чего там заполнять - делаешь поле, в которое выводишь данные, параметром, а далее Область.Параметры.ИмяПараметра=Значение ну или прочитать про ЗаполнитьЗначенияСвойств, если хочется красиво и без ошибки, если кто-то из макета поле номера уберёт.
19 Garykom
 
гуру
05.12.16
01:51
(16) Режим совместимости жеж