Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как построчно заполнить колонку ТЗ?

Как построчно заполнить колонку ТЗ?

Добавлено через 1 минуту
Есть ТЗ и надо в цикле заполнить по индексам элементы в колонке
Ответ:
1C
1
2
НовСтр = ТЗ1.Добавить();
            НовСтр["Представление"]=ТЗ[ТекущийИндекс]["Представление"];
Все прошу прошения,сделал)

Добавлено через 23 секунды
не издеваюсь,просто учусь
Вопрос: Программное добавление значения в программно добавленную колонку

Доброго дня.
Дабы не портить конфу программно добавила колонку в ТЧ документа.
Теперь надо в эту колонку программо забить значения, но! я не хочу это делать в процедурах потипу "при выводе строки", т.к. это будет тормозить программу, значения для каждой строки вычисляемые.
Хочу один раз заполнить, например, при Изменении другой колонки или вообще отдельно по кнопке, типа пусть по всем срокам ТЧ пробежит и заполнит.
Уже голову сломала, как это сделать
Ответ:
Чтобы обратится к колонкам, не связанных с данными, я предлагаю такой вариант
Код:
 ЯчейкиСтроки = Элемент.ОформлениеСтроки(Элемент.ТекущаяСтрока).Ячейки;
Далее в коллекции будут доступны все ячейки. А у них есть свойства "Значение" и "Текст". Можно так попробывать, я так получаю тексты из ячеек, на запись правда не пробовал, может и получится
ПС: Элемент - это само табличное поле. И если грамотно сделать запрос, т.е. поля в условии проиндексированы, то тормозить ничего не должно в "ПриВыводеСтроки"
Вопрос: Заполнить количество в табличной части документа

Доброго времени суток.
  • Задача - заполнить табличную часть документа "Акт списания ЕГАИС" (далее - док) из данных таблицы значений (далее - ТЗ).
  • Проблема - не заполняется столбец "Количество" (остальные заполняются).
В ТЗ для колонки Количество прописано ОписаниеТипов с квалификаторами числа: длина 15, точность 3. Параметры совпадает с этими же параметрами колонки Количество дока, на отладке у значений колонки Количество в ТЗ эти параметры присутствуют.

ТЗ заполняется по данным документа "остатки ЕГАИС" (далее - док2). В док2 параметры колонки "Количество": длина 10, точность 0. Грешу на то, что количества попадают в ТЗ изначально без дробной части.

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

Доброго времени суток. Как в макете скд скрыть колонку, чтобы при открытие отчета ее не было видно. У меня готовый отчет я добавил в него колонки, в нем каким-то способом настроены колонки, они не отображаются при формирование отчета. Не судите строго только учусь.
Ответ: такому параметру нельзя задать условие?дело в том, что в макете колонки видно, когда запускаешь, если они не заполнены их нет, если заполнены то есть.
Вопрос: Как на УФ на форме заполнить существующее дерево значений?

Что-то я совсем запутался. Обыскался по интернету - везде один и тот же пример по программному созданию элемента формы вида дерева значений. А мне нужно поработать с существующим (созданным в конфигураторе) деревом значений на форме. Например, добавить колонки, строки, заполнить их.

Вот в конфигураторе на управляемой форме создал реквизит "ОборудованиеКонтрагента" с типом Дерево значений, перенёс его в левую часть панели, обозвал ОборудованиеКонтрагентаФорма.

Как на клиенте добавить колонку и строки на форме?
Ответ: () потому что нужно не РеквизитФормыВЗначение/ЗначениеВРеквизитФормы делать, а вот так:

Колонка = Новый РеквизитФормы("ИмяКолонки", Новый ОписаниеТипов("Число"), "ИмяДереваЗначений");
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Колонка);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

+ после этого еще поле на форму добавить
Вопрос: Вывод колонок в табличное поле

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

Кто-нибудь знает как можно скрыть колонку в отчете (Сама колонка нужна, по ней идет сортировка. но ее не нужно выводить пользователям)?
Ответ: все нормально. сортируется. спасибо. не знаете, когда отчет формируем с типом группировки Иерархия: там короче дублирование строк идет, у которых есть подчиненные элементы (справ иерархия элементов). Дубляжи я научился убирать. Но проблема в том, что убираемая мной строка, содержит нужную информацию (там другие колонки есть заполненные), а строка которая в отчете - родитель, она не заполняет эти колонки.

Добавлено через 12 часов 41 минуту
Как думаете, если я в запросе получаю ссылку. А в настройке СКД: поля вытаскиваю из этой ссылки - это очень плохо?
Просто по другому (если запросом сразу все получать), то в случае Иерархии - родительские строки остаются незаполнеными (за исключением поля Ссылка).
Вопрос: Ввод на основании, сообщение поле в ТЧ не заполнено

Коллеги хелп

Не типовой ввод на основании дока в ЗУП 2.5,  сообщение - поле  в ТЧ не заполнено, хотя оно заполнено - тип Дата.  Код в ОбработкеЗаполнения.
Если через форму перебить реквизит то проводит...
Ответ: ОМГ он ругался на другое поле - просто эта колонка была скрыта)  она при заполнении  в интерфейсе копирутся из поля дата начала
Вопрос: Таблица значений с циклическим заполнением колонок

Всем доброго.
Задача - вывести таблицу прихода/расхода товаров за выбранный период с понедельной разбивкой. Решил реализовать как ТаблицуЗначений (сначала думал сделать отчетом, но не нашел, как). Поскольку количество столбцов заранее неизвестно, таблица генерируется программно:
Код:
   
//*** описание ТЗ как реквизита формы
    массивТипаВыбора = новый массив;
    массивТипаВыбора.Добавить(тип("таблицаЗначений"));
    описаниеТипаВыбора = новый описаниеТипов(массивТипаВыбора);
    массивРеквизитов = новый массив;
    массивРеквизитов.Добавить(новый реквизитФормы("ТЗФорма", описаниеТипаВыбора, "", "ТЗформа"));
   
    //*** описание типов
    КЧ = новый КвалификаторыЧисла(10,2);
    КС = новый КвалификаторыСтроки(100);

    мас = новый массив;
    мас.Добавить(тип("Строка"));
    ТипСтрока = новый ОписаниеТипов(мас,,, КС);
    мас.Очистить();

    мас = новый массив;
    мас.Добавить(тип("Число"));
    ТипЧисло = новый ОписаниеТипов(мас,, КЧ);
    мас.Очистить();
    // ***

   //создаем временную таблицу значений
    ТЗ = новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("товар", ТипСтрока, "товар");   
   
    для н=1 по КолвоНедель цикл
        ТЗ.Колонки.Добавить("приход" + н, ТипЧисло, "приход" + н);
        ТЗ.Колонки.Добавить("расход" + н, ТипЧисло, "расход" + н);
    КонецЦикла;
   
    для каждого колонка из тз.Колонки цикл
        массивРеквизитов.Добавить(новый РеквизитФормы(колонка.Имя, колонка.ТипЗначения, "ТЗФорма"));
    КонецЦикла;   
   
    изменитьРеквизиты(массивРеквизитов);
    таблицаПолейВыбора = Элементы.Добавить("ТЗФорма", тип("ТаблицаФормы"));
    таблицаПолейВыбора.ПутьКДанным = "ТЗФорма";
    таблицаПолейВыбора.Отображение = отображениеТаблицы.Список;
   
    для каждого колонка из ТЗ.колонки цикл
        новыйЭлемент = элементы.Добавить(колонка.Имя, тип("ПолеФормы"), таблицаПолейВыбора);
        новыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        новыйЭлемент.ПутьКДанным = "ТЗФорма." + Колонка.Имя;
        новыйЭлемент.Ширина = 10;
    КонецЦикла;
Потом заполняется колонка наименований:
Код:
    запрНом = новый запрос;
    запрНом.Текст = "выбрать ТоварыНаСкладахОбороты.Номенклатура КАК номенклатура
    | из РегистрНакопления.ТоварыНаСкладах.Обороты() КАК ТоварыНаСкладахОбороты";
    ТЗНом = запрНом.Выполнить().Выгрузить();   
       
    для каждого стрНом из ТЗНом цикл
        стрНом = стрНом.номенклатура;
       
        //добавить данную номенклатуру во временную ТЗ
        СтрТЗ = ТЗ.Добавить();
        СтрТЗ.товар = стрНом;
    КонецЦикла;
Наконец, выгружаем товар из временной ТЗ в ТЗ формы:
Код:
ЗначениеВРеквизитФормы(ТЗ, "ТЗФорма");
Проблема - циклическое заполнение приходов и расходов. Если я правильно понимаю, каждая строка этих данных заполняется циклом, вложенным в цикл заполнения колонки товаров. То есть на каждой итерации по заполнению строки с товаром делаем запрос на приход и расход, в который передаем наименование товара, даты начала и конца периода. Результат запроса выгружаем в таблицу значений, которая в итоге имеет одну строку. Это работает, когда показываются данные за весь период, то есть когда есть три колонки: товар, приход, расход.

Но в данном случае требуется по две колонки на каждую неделю. Пусть имена этих колонок будут отличаться номером недели, то есть приход1, расход1, приход2, расход2 и тд. Понятно, что при этом организуется цикл, в котором в запросе на приход и расход вместо конца периода передается дата, бывшая на начало итерации + неделя.

Вопрос возникает при передаче сумм прихода и расхода из таблицы значений по результатам запроса во временную таблицу. Как описать, что в каждой итерации при выгрузке данных из таблицы результата запроса во временную ТЗ цифра в имени колонок прихода и расхода увеличивается на 1? Ведь в целом процесс выгрузки выглядит так:
Код:
        
        ТЗПрихРасхОбор = ЗапрПрихРасхОбор.Выполнить().выгрузить();
        для каждого стрПрихРасхОбор из ТЗПрихРасхОбор цикл
                стрТЗ.приход = стрПрихоРасхОбор.приход;
               стрТЗ.расход = стрПрихоРасхОбор.расход;
                стрТЗ.оборот = стрПрихоРасхОбор.оборот;
         КонецЦикла;
Ответ:
наконец добрался до кода. спасибо, помогло. получилось так:
Код:
ТЗ = ЗапросНоменклатуры();

для н=1 по колвоНедель цикл              
        ТЗ.колонки.добавить("приход" + н, типЧисло, "приход" + н);      
        ТЗ.колонки.добавить("расход" + н, типЧисло, "расход" + н);
    КонецЦикла;
  
    для н = 1 по колвоНедель цикл  
        КолонкаПрих = ТЗ.колонки.найти("приход" + н);
        КолонкаРасх = ТЗ.колонки.найти("расход" + н);
      
        КонецПериода = началоПериода + неделя;
        ТЗПР = ЗапросОборотов(НачалоПериода, КонецПериода);
      
        МПрих = ТЗПР.выгрузитьКолонку(0);
        МРасх = ТЗПР.выгрузитьКолонку(1);          
        ТЗ.загрузитьКолонку(МПрих, КолонкаПрих);
        ТЗ.загрузитьКолонку(Мрасх, КолонкаРасх);
      
        НачалоПериода = КонецПериода;
 КонецЦикла;
оптимизировать не стал (например, по поводу запроса в цикле), так как итоговый вид таблицы изначально не устраивал в плане наглядности, хотелось другого решения. вспомнил про макет и табличный документ, пробую через него
Вопрос: Типизация колонок Таблицы значения

Приветствую, есть ТЗ с кучей колонок, как можно быстро их все типизировать, чтобы потом запихать в запрос? Или нужно создать ТЗ, создать каждую колонку и типизировать, а потом только в запрос?

Либо необязательно в запрос, просто нужен отбор "В Иерархии" по этой ТЗ.
Ответ: Из подсистемы ИР (ОбщийМодуль.ирОбщий)

// Получает копию таблицы значений с минимальными типами колонок для содержания всех данных.
// Параметры:

//   ТаблицаДанных - ТаблицаЗначений
//   СужатьТолькоПроизвольныеКолонки - Булево - обрабатывать только колонки с пустым (произвольным) типом

//   ИмяКолонки - Строка - нужна только эта колонка
//

Функция ПолучитьТаблицуСМинимальнымиТипамиКолонокЛкс(Знач ТаблицаДанных, СужатьТолькоПроизвольныеКолонки = Ложь, ИмяКолонки = "") Экспорт
    
    #Если Сервер И Не Сервер Тогда
        ТаблицаДанных = Новый ТаблицаЗначений;
    #КонецЕсли

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

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

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