Имя: Пароль:
1C
1С v8
Почему пустая коллекция ПараметрыМакетаТабличногоДокумента?
,
0 korchak
 
20.02.13
17:49
Есть табличный документ - ТабДокумент. Хочу перебрать коллекцию  ПараметрыМакетаТабличногоДокумента - ТабДокумент.Параметры, а в итоге ТабДокумент.Параметры.Количество() = 0, хотя на печать по
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент,... выводиться табличный документ с заполеннными параметрами. Подскажите как добыть параметры в данном случае.
1 korchak
 
20.02.13
17:52
Кстати ТабДокумент.Параметры.Области() тоже = 0... странно
2 korchak
 
20.02.13
17:53
Прошу прощения, ТабДокумент.Области.Количество()
3 korchak
 
20.02.13
18:10
Подскажите хоть в какую сторону копать?
4 vicof
 
20.02.13
18:12
Давай весь код
5 Утконос
 
20.02.13
18:12
(3) попробуй ОТЛАДЧИК откапать
6 korchak
 
20.02.13
18:22
так отладчиком все это и выловил
7 korchak
 
20.02.13
18:46
(4) весь код большой... (
8 vicof
 
20.02.13
18:47
(7) Ну извини, я не телепат.
9 korchak
 
20.02.13
18:53
ТабДокумент = ПечатьСводногоНарядаПослеОтгрузки(Перечисления.Т_ЯзыкиПеревода.Русский, Истина);
10 korchak
 
20.02.13
18:57
// Процедура печатает сводный наряд после отгрузки с передаваемым языком печати (переводится весь макет).
//
// Параметры:
//  ЯзыкПечати - перечисление "Языки перевода", один из вариантов языка печати макета.
//  Непроведенный - булево, признак нажатой кнопки "СводныйНарядНепроведенный" (Истина) или "СводныйНаряд" (Ложь).
//
Функция ПечатьСводногоНарядаПослеОтгрузки(ЯзыкПечати, Непроведенный = Ложь)
   
   // Присвоим значение заголовку печати макета.
   Если Непроведенный Тогда
       Заголовок = "Печать макета ""Сводный наряд после отгрузки (новый)"":";
   Иначе
       Заголовок = "Печать макета ""Сводный наряд после отгрузки"":";
   КонецЕсли;
   
   // Если табл. часть не заполнена - ничего сообщать не будем, просто выведем пустой макет.
   Если СписокДокументов.Количество() = 0 Тогда
       Возврат Новый ТабличныйДокумент;
   КонецЕсли;
   
   // Получим список ячеек расхода со всех доступных зон погрузок.
   СписокЯчеекРасхода = ПолучитьСписокЯчеекРасходаЗонПогрузок();
   
   // 1. Создадим новый запрос и сформируем его текст.
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("СписокПомеченныхЗаказов"    , ПолучитьСписокЗаполненныхДокументов("Заказ"));
   Запрос.УстановитьПараметр("СписокПомеченныхНарядов"    , ПолучитьСписокЗаполненныхДокументов("НарядНаОтгрузку"));
   Запрос.УстановитьПараметр("СписокЯчеекРасхода"        , СписокЯчеекРасхода);
   
   Если Непроведенный Тогда
       Запрос.Текст = СформироватьТекстПервогоНепроведенногоЗапроса();
   Иначе
       Запрос.Текст = СформироватьТекстПервогоЗапроса();
   КонецЕсли;
   
   // Выгрузим в массив колонку со значением колонки "Сортировочное поле".
   КэшТаблица          = Запрос.Выполнить().Выгрузить();
   МассивНаправлений = КэшТаблица.ВыгрузитьКолонку("СортировочноеПоле");
   
   // Получим выборку с запроса по шапке и подвале (по общей группировке).
   ВыборкаШапкаИПодвал = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   // Получим макет и табличный документ.              
   Макет         = ПолучитьМакет("СводныйНаряд");
   ТабДокумент     = Новый ТабличныйДокумент;
   
   // Присвоим табличному документов уникальное имя параметров печати.
   ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СводныйНаряд_СводныйНаряд";
   
   // Создадим новую таблицу значений с данными заказов и опишем ее колонки.
   ТаблицаДанныхДокументов = Новый ТаблицаЗначений;
   ТаблицаДанныхДокументов.Колонки.Добавить("Идентификатор"    , Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(40)));
   ТаблицаДанныхДокументов.Колонки.Добавить("Направление"        , Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(10)));
   ТаблицаДанныхДокументов.Колонки.Добавить("КоличествоРул"    , Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
   ТаблицаДанныхДокументов.Колонки.Добавить("КоличествоУпак"    , Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
   
   // Получим все области макета в разрезе горизонтальных и вертикальных группировок.
   ОбластьЗаголовокОбщая      = Макет.ПолучитьОбласть("Заголовок|ОбщиеДанные");
   ОбластьЗаголовокЛевая      = Макет.ПолучитьОбласть("Заголовок|НарядНаОтгрузку");
   ОбластьЗаголовокПравая      = Макет.ПолучитьОбласть("Заголовок|РеализацияТоваров");
   ОбластьШапкаТаблицыОбщая  = Макет.ПолучитьОбласть("ШапкаТаблицы|ОбщиеДанные");
   ОбластьШапкаТаблицыЛевая  = Макет.ПолучитьОбласть("ШапкаТаблицы|НарядНаОтгрузку");
   ОбластьШапкаТаблицыПравая = Макет.ПолучитьОбласть("ШапкаТаблицы|РеализацияТоваров");
   ОбластьСтрокаОбщая          = Макет.ПолучитьОбласть("СтрокаТаблицы|ОбщиеДанные");
   ОбластьСтрокаЛевая          = Макет.ПолучитьОбласть("СтрокаТаблицы|НарядНаОтгрузку");
   ОбластьСтрокаПравая          = Макет.ПолучитьОбласть("СтрокаТаблицы|РеализацияТоваров");
   ОбластьСтрокаИтогоОбщая      = Макет.ПолучитьОбласть("СтрокаТаблицыИтого|ОбщиеДанные");
   ОбластьСтрокаИтогоЛевая      = Макет.ПолучитьОбласть("СтрокаТаблицыИтого|НарядНаОтгрузку");
   ОбластьСтрокаИтогоПравая  = Макет.ПолучитьОбласть("СтрокаТаблицыИтого|РеализацияТоваров");
   ОбластьПодвалаОбщая          = Макет.ПолучитьОбласть("Подвал|ОбщиеДанные");
   ОбластьПодвалаЛевая          = Макет.ПолучитьОбласть("Подвал|НарядНаОтгрузку");
   ОбластьПодвалаПравая      = Макет.ПолучитьОбласть("Подвал|РеализацияТоваров");
   
   // Если есть данные в выборке - обработаем ее и получим количество динамических колонок.
   Если ВыборкаШапкаИПодвал.Следующий() Тогда
       КоличествоКолонок = ВыборкаШапкаИПодвал.Номер;
   Иначе
       КоличествоКолонок = 0;
   КонецЕсли;
   
   // Заполним области заголовка и шапки таблицы макета по текущим данным.
   ЗаполнитьОбластиЗаголовкаИШапкиТаблицыМакета(ТабДокумент, ОбластьЗаголовокОбщая, ОбластьЗаголовокЛевая, ОбластьЗаголовокПравая,
                                                   ОбластьШапкаТаблицыОбщая, КоличествоКолонок, МассивНаправлений, ЯзыкПечати, Заголовок);
                                                   

   // Получим выборку с запроса по шапке и подвале по группировке "Заказы покупателей".
   ЗаказыВыборкиШапкиИПодвала = ВыборкаШапкаИПодвал.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   // Обойдем по циклу выборку с запроса по шапке и подвале по группировке "Заказы покупателей".
   Пока ЗаказыВыборкиШапкиИПодвала.Следующий() Цикл
       
       // Получим выборку с запроса по шапке и подвале без группировок.
       // Эта группировка нужна для того, чтоб все данный с одного заказа были один возле другого.
       ЭлементыВыборкиШапкиИПодвала = ЗаказыВыборкиШапкиИПодвала.Выбрать();
       
       // Обойдем по циклу выборку с запроса по шапке и подвале без группировок.
       Пока ЭлементыВыборкиШапкиИПодвала.Следующий() Цикл
           
           // В зависимости какой тип документа в выборке, такую и область мы получим.
           Если ЭлементыВыборкиШапкиИПодвала.СортировочноеПоле = "Наряд" Тогда
               ОбластьШапкаТаблицы = ОбластьШапкаТаблицыЛевая;
               ТипДокумента        = "Наряд";
           ИначеЕсли ЭлементыВыборкиШапкиИПодвала.СортировочноеПоле = "Реализация" Тогда
               ОбластьШапкаТаблицы = ОбластьШапкаТаблицыПравая;
               ТипДокумента        = "Погрузка";
           Иначе
               Продолжить; // такого не может быть, но все же....
           КонецЕсли;
           
           // Заполним данные области наряда на отгрузку или реализации товаров шапки таблицы макета.
           ОбластьШапкаТаблицы.Параметры.Контрагент = ПеревестиСтроку(ЭлементыВыборкиШапкиИПодвала.Контрагент, ЯзыкПечати, Заголовок, Ложь);
           ОбластьШапкаТаблицы.Параметры.Номер         = ПеревестиСтроку(ТипДокумента, ЯзыкПечати, Заголовок) + " " + ПеревестиСтроку("№", ЯзыкПечати, Заголовок) + ЭлементыВыборкиШапкиИПодвала.Номер;
           ОбластьШапкаТаблицы.Параметры.Единица     = ПеревестиСтроку("од.", ЯзыкПечати, Заголовок);
           ОбластьШапкаТаблицы.Параметры.Упаковка     = ПеревестиСтроку("упак.", ЯзыкПечати, Заголовок);
           
           // Присоединим область наряда на отгрузку или реализации товаров шапки таблицы макета.
           ТабДокумент.Присоединить(ОбластьШапкаТаблицы);
           
           // Добавим новую строку в таблицу данных документов и заполним ее.
           НоваяСтрока = ТаблицаДанныхДокументов.Добавить();
           НоваяСтрока.Идентификатор    = ПолучитьИдентификаторДокументовДвижений(ЭлементыВыборкиШапкиИПодвала);
           НоваяСтрока.Направление        = ТипДокумента;
           НоваяСтрока.КоличествоРул    = 0;
           НоваяСтрока.КоличествоУпак    = 0;
           
       КонецЦикла;
   
   КонецЦикла;
   
   // 2. Создадим новый запрос и сформируем его текст.
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("СписокПомеченныхЗаказов"    , ПолучитьСписокЗаполненныхДокументов("Заказ"));
   Запрос.УстановитьПараметр("СписокПомеченныхНарядов"    , ПолучитьСписокЗаполненныхДокументов("НарядНаОтгрузку"));
   Запрос.УстановитьПараметр("СписокЯчеекРасхода"        , СписокЯчеекРасхода);
   
   //Запрос.Текст = СформироватьТекстВторогоЗапроса();
   Если Непроведенный Тогда
       Запрос.Текст = СформироватьТекстВторогоНепроведенногоЗапроса();
   Иначе
       Запрос.Текст = СформироватьТекстВторогоЗапроса();
   КонецЕсли;
   
   // Подготовим две таблицы значений по данным таблицы данных документов и определим номер строки.
   ТаблицаИтоговПоГруппах    = ТаблицаДанныхДокументов.Скопировать();
   ТаблицаПоНоменклатуре    = ТаблицаДанныхДокументов.Скопировать();
   НомерСтроки                = 0;

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

   // Получим выборку с запроса по шапке и подвале по группировке "Заказы покупателей".
   ЗаказыВыборкиШапкиИПодвала = ВыборкаШапкаИПодвал.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   // Обойдем по циклу выборку с запроса по шапке и подвале по группировке "Заказы покупателей".
   Пока ЗаказыВыборкиШапкиИПодвала.Следующий() Цикл
       
       // Получим выборку с запроса по шапке и подвале без группировок.
       // Эта группировка нужна для того, чтоб все данный с одного заказа были один возле другого.
       ЭлементыВыборкиШапкиИПодвала = ЗаказыВыборкиШапкиИПодвала.Выбрать();
       
       // Обойдем по циклу выборку с запроса по шапке и подвале без группировок.
       Пока ЭлементыВыборкиШапкиИПодвала.Следующий() Цикл
           
           // В зависимости какой тип документа в выборке, такую и область мы получим.
           Если ЭлементыВыборкиШапкиИПодвала.СортировочноеПоле = "Наряд" Тогда
               ОбластьПодвала = ОбластьПодвалаЛевая;
           ИначеЕсли ЭлементыВыборкиШапкиИПодвала.СортировочноеПоле = "Реализация" Тогда
               ОбластьПодвала = ОбластьПодвалаПравая;
           Иначе
               Продолжить; // такого не может быть, но все же....
           КонецЕсли;
           
           // Заполним данные области нарядов на отгрузку или реализации товаров подвала макета.
           ОбластьПодвала.Параметры.Заполнить(ЭлементыВыборкиШапкиИПодвала);
           
           // Присоединим область нарядов на отгрузку или реализации товаров подвала макета.
           ТабДокумент.Присоединить(ОбластьПодвала);
               
       КонецЦикла;        
               
   КонецЦикла;
   
   // Установим ориентацию страницы табличного документа в положение "Ландшафт".
   ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
   
   Возврат ТабДокумент;
   
   
КонецФункции // ПечатьСводногоНарядаПослеОтгрузки()
11 vicof
 
20.02.13
18:59
У тебя в макете нет параметров, перебирай области
12 korchak
 
20.02.13
19:01
(11) Области тоже пустые
13 korchak
 
20.02.13
19:01
ТабДокумент.Области.Количество() = 0
14 vicof
 
20.02.13
19:03
А какие-нибудь данные выводятся?
15 vicof
 
20.02.13
19:03
в отчете
16 korchak
 
21.02.13
10:04
(14) да, все данные в ПФ выводяться
17 ScreamSaw
 
21.02.13
10:17
А в чём тогда проблема?)
18 ScreamSaw
 
21.02.13
10:27
Из СП:

ТабличныйДокумент (SpreadsheetDocument)
Присоединить (Join)

Описание:
Присоединяет табличный документ к результирующему табличному документу, помещая его в следующей колонке правее самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий табличный документ.

Если я правильно понимаю, в твоём ТабДокумент нет ни областей, ни параметров - всё логично. Они есть в макете, заполненные области которого ты присоединяешь к ТабДокумент. А в нём изначально нет ни областей, ни параметров. Откуда им взяться?

Хотя я могу ошибаться.
19 Defender aka LINN
 
21.02.13
10:29
(18) Все правильно
20 korchak
 
21.02.13
10:30
(18) логично, а перебрать области макета можно?
21 Defender aka LINN
 
21.02.13
10:37
(20) Кто ж тебе запретит
22 korchak
 
21.02.13
10:43
всем, спасибо, тема закрыта)