gifts2017

Преобразование ТаблицыЗначений во Временную таблицу

Опубликовал Александр Перевислый (sashapere) в раздел Программирование - Практика программирования

Преобразование таблицы значений во временную таблицу.

      Столкнулся с такой проблемой, что произвольно созданные таблицы значений не так-то легко преобразовать во временную таблицу, чтобы её можно было использовать в запросе, т.к. для преобразования требуется создать описание типов, а если тип составной, то тут совсем замучаешься. Поэтому возникла идея немного автоматизировать этот процесс.   Описание типов данных формирую в промежуточных запросах, т.к.  к данным, которые выгрузились из запроса, автоматически формируется и описание типов.

 

Вот сами функции....

 

 



//------------------------------------------------
процедура ПреобразоватьТЗвВТ(ТЗ,МВТ,имяВТ)

   
ТЗнов = ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ);

   
запрос = новый запрос;
   
запрос.МенеджерВременныхТаблиц = МВТ;
   
запрос.Текст = "ВЫБРАТЬ
                    | *
                    |ПОМЕСТИТЬ "
+ имяВТ+"
                    | ИЗ &ТЗнов КАК ТЗнов"
;
   
запрос.УстановитьПараметр("ТЗнов",ТЗнов);
   
запрос.Выполнить();

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

Функция
ПолучитьТЗизВТ(МВТ,имяВТ)
   
//---------------------------------
    // Выгружаем значение Временной таблицы(ВТ)
    // в ТаблицуЗначений (ТЗ)
    //---------------------------------
   
запрос = новый запрос;
   
запрос.МенеджерВременныхТаблиц = МВТ;
   
запрос.Текст = "ВЫБРАТЬ * из "+имяВТ+" КАК ТЗ";
   
ТЗ = Запрос.Выполнить().Выгрузить();
   
//---------------------------------
   
возврат ТЗ;
КонецФункции
//------------------------------------------------

//--------тех ФУНКЦИИ ----------------------------
функция ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ)
   
//--------------------------------------------
    // Создаём новую ТЗ с описанием типов
    //--------------------------------------------
   
ТЗ_tmp2 = новый ТаблицаЗначений;
    для каждого
кол из ТЗ.Колонки Цикл
       
ОпТипов = ОпределитьОписаниеТиповПоляТЗ(ТЗ,кол.Имя);
       
ТЗ_tmp2.Колонки.Добавить(кол.Имя,ОпТипов);
    КонецЦикла;
   
//--------------------------------------------

   
для каждого стр_t из ТЗ Цикл
       
стр_нов_t = ТЗ_tmp2.Добавить();
       
ЗаполнитьЗначенияСвойств(стр_нов_t,стр_t);
    КонецЦикла;
    возврат 
ТЗ_tmp2;
КонецФункции

функция
ПолучитьТипы(мас)
   
//-----------------------------------------
    // Определяет все различные типы элементов
    //   встречающиеся  в массиве
    //-----------------------------------------
   
ТЗтипы = новый ТаблицаЗначений;
   
ТЗтипы.Колонки.Добавить("Тип");
   
ТЗтипы.Колонки.Добавить("Индекс");

   
колво = мас.Количество();


    Если
колво>0 тогда
       
стрТип = ТЗтипы.Добавить();
       
стрТип.Тип    = ТипЗнч(мас[0]);
       
стрТип.индекс = 0; // номер элемента в ТЗ с этим типом
       
предыдущ_тип  = стрТип.Тип; // предыдущее значение типа
   
КонецЕсли;


    для
н = (0+1) по (колво-1) Цикл
       
эл = мас[н];
       
типЭл = ТипЗнч(эл);
       
// Чтобы каждый раз не проверять тип по всему ТЗ, делаем проверку
        //   только когда он меняется
       
Если типЭл <> предыдущ_тип тогда
           
//-------------------
            // теперь проверяем, есть ли у нас такой тип
           
ЦиклПрерван = 0;
            для каждого
стрТип из ТЗтипы Цикл
                Если 
стрТип.Тип = типЭл тогда
                   
ЦиклПрерван = 1;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
           
//-------------------
            // перебрали все наши типы и такого не нашли
           
Если ЦиклПрерван = 0 тогда
               
// добавляем в наш список
               
стрТип = ТЗтипы.Добавить();
               
стрТип.Тип    = типЭл;
               
стрТип.индекс = н; // номер элемента в ТЗ с этим типом
           
КонецЕсли;
           
//-------------------
           
предыдущ_тип = типЭл;
        КонецЕсли;

    КонецЦикла;

    возврат 
ТЗтипы;
конецФункции

функция
ОпределитьОписаниеТиповПоляТЗ(ТЗ,имяКолонки)
   
мас1    = ТЗ.ВыгрузитьКолонку(имяКолонки);
   
тзТипов = ПолучитьТипы(мас1);

   
//----------------------------------------
    // Собираем все типы в одином запросе
    //  для того чтобы получить составной тип
    //----------------------------------------
   
запрос= новый запрос;
   
н = 0;
    Если
тзТипов.Количество()>0 тогда
       
Запрос.Текст = "ВЫБРАТЬ &поле"+н+" как поле";
       
запрос.УстановитьПараметр("поле"+н, мас1[тзТипов[н].Индекс]);
    КонецЕсли;
   
колво = тзТипов.Количество();
    для
н = 0+1 по (колво-1) Цикл
       
Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ
                        |ВЫБРАТЬ &поле"
+н+" как поле";
       
запрос.УстановитьПараметр("поле"+н, мас1[тзТипов[н].Индекс]);
    КонецЦикла;

   
ТЗ_tmp = запрос.Выполнить().Выгрузить();
   
//-------------------------------
   
возврат ТЗ_tmp.Колонки.поле.ТипЗначения;
КонецФункции

//------------------------------------------------


// Пример!!!
Процедура КнопкаВыполнитьНажатие(Кнопка)

   
//----------------------------------------------
    // Составляем произвольную ТЗ для проверки
    //----------------------------------------------
   
ТЗ2 = новый ТаблицаЗначений;
   
ТЗ2.Колонки.Добавить("поле1");
   
ТЗ2.Колонки.Добавить("поле2");
   
ТЗ2.Колонки.Добавить("поле3");
   
ТЗ2.Колонки.Добавить("поле4");
   
стр = ТЗ2.Добавить();
   
стр.поле1 = 10.3434;
   
стр = ТЗ2.Добавить();
   
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
   
стр = ТЗ2.Добавить();
   
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
   
стр = ТЗ2.Добавить();
   
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
   
стр = ТЗ2.Добавить();
   
стр.поле1 = Справочники.Номенклатура.ПустаяСсылка();
   
стр = ТЗ2.Добавить();
   
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
   
стр.поле2 = 45.12;
   
стр.поле3 = 1;
   
стр.поле4 = 3;



   
МВТ = новый МенеджерВременныхТаблиц;

   
//--------------------------------------------------------
    //Преобразование таблицы значений во временную таблицу
    //--------------------------------------------------------
    //ПреобразоватьТЗвВТ(,,);
   
ПреобразоватьТЗвВТ(ТЗ2,МВТ,"ТЗЯху");

   
ТЗ_рез = ПолучитьТЗизВТ(МВТ,"ТЗЯху");

   
ТЗ_рез.ВыбратьСтроку();
КонецПроцедуры

 

 В качестве примера выложил обработку для 8.1, где это всё реализовано

 

Скачать файлы

Наименование Файл Версия Размер
ТЗ_в_МВТ.epf 71
.epf 7,19Kb
21.06.12
71
.epf 7,19Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Serj (Serj1C) 22.06.12 07:40
Непреодолимое желание влепить минус за орфографию и пунктуацию (што, созданые, нетакто, замучаешся, автомотически ). Противно читать ваш олбанский.
Boog; Поручик; fishca; Sherlock_kmw; Famza; +5 1 Ответить 1
2. Иван Иванов (Famza) 22.06.12 07:50
Походу автор очень торопился выложить обработку. За оформление - минус
3. Антон (anton.fly7) 22.06.12 08:05
если ТЗ будет на 10000 строк, мне кажется замучаешься ждать
4. Дмитрий Павлик (DimaP) 22.06.12 09:11
Авансом плюс!
Часто сталкиваюсь с таким.
С оформлением, конечно, лажа :)
5. Сергей Ожерельев (Поручик) 22.06.12 09:58
(0) Полный атас. Тебя из какого класса церковно - приходской школы вытурили за полную безграмотность?
6. Сергей Ожерельев (Поручик) 22.06.12 10:02
(0) Смотреть противно, как на бомжа, жрущего из помойки.
7. Сергей Ожерельев (Поручик) 22.06.12 10:12
(0) Передо мной интереснейший бытовой материал: четыре больших тетради под общим заглавием "Дневник земского начальника".
Автор дневника -- земский начальник одной из южных губерний -- вел его за свою службу с 1902 по 1909 год, записывая ежедневно перлы и адаманты поступающих бумаг.
...................
Невольно вспоминается одно ходившее по рукам в половине прошлого столетия письмо бурмистра к своему барину в Петербург, где также не было ни одного знака препинания. Письмо таково:
-- ...Батюшка барин сивый жеребец Михалла Петрович помер шкуру вашу барскую содрали продали на вырученные деньги куплен хомут для вашей милости на ярмарке свиней вашей породы было много прошли хорошо жаль только что небыло самих вашей милости самолично потому соседи просили хряка на племя староста Антип.
Далеко ли мы ушли от того времени?!
for-elenak; +1 Ответить 1
8. Олег Филиппов (comol) 22.06.12 11:26
Мне лично всё равно до офрмления. за публикацию большой "+". Любую загрузку чего-либо пишу обычно преобразовывая ТЗ в ВТ (собственно как и все уже думаю) и каждый раз "убивает" очень "полезное" занятие с преобразованием типов. Автор реально помог, а вам нет чтобы "спасибо" написать...
asu2; sashapere; +2 1 Ответить 4
9. Алекс Ю (AlexO) 22.06.12 11:34
(5) Поручик,
это россиянский студент после ЕГЭ.
Вы еще россиянских школьников не видели...
Al-X; Поручик; +2 Ответить
10. Алекс Ю (AlexO) 22.06.12 11:36
(7) Поручик,
Далеко ли мы ушли от того времени?!

деградации нет предела - до полного вымирания нации.
11. Сергей Ожерельев (Поручик) 22.06.12 11:45
(8) Превратим инфостарт в полную помойку, чо уж там.
12. Алекс Ю (AlexO) 22.06.12 11:54
(8) comol,
я, может, и отстал от продвинутых тру-1снигов, но всегда пользуюсь:

  Запрос.УстановитьПараметр("ТЗ", ТЗ);
     Запрос.Текст =
    "ВЫБРАТЬ * из &ТЗ
    |ПОМЕСТИТЬ
    |    ВТ " ;
    |ВЫБРАТЬ *
    |ИЗ
    | &ВТ КАК ВТ
    |АВТОУПОРЯДОЧИВАНИЕ";

    РезультатЗапроса = Запрос.Выполнить().Выгрузить(); 
...Показать Скрыть

Из ТЗ - в ВТ, потом снова в ТЗ. Кому нравится - могут и через МВТ сделать.
Только зачем нужна ВТ из МВТ, когда есть уже готовая ТЗ??
for-elenak; GusevNA; BorisMor; ksnik; +4 Ответить 3
13. Алекс Ю (AlexO) 22.06.12 11:56
(11) Поручик,
страну же превращаем - чем инфостарт хуже? :(
14. Олег Филиппов (comol) 22.06.12 12:11
15. Олег Филиппов (comol) 22.06.12 12:14
(11) Поручик, А давайте будем лучше ничего не делать всех обсирать? "что так плохо пишите". Такие личности иногда тоже раздражают...
16. Анатолий Бычин (tolyan_ekb) 22.06.12 12:44
Орфо рулит. )) Я когда увидел оформление, чуть не упал. Как модерацию прошла публикация?
Поручик; +1 Ответить 1
17. Доржи Балбаров (Angeros) 22.06.12 13:45
Ну вообще плевое дело создать любой тип программно хоть составной хоть не составной. Есть в конфигураторе специальный конструктор. Который называется - конструктор описания типов. Изучайте мат часть, а не лепите огород на пустом месте. :)
for-elenak; AlexO; +2 Ответить 2
18. Алекс Ю (AlexO) 22.06.12 14:06
(17) Angeros,
я вообще не понял задачи. Так как её описания здесь нет.
Одни восторги.
19. Сергей Ожерельев (Поручик) 22.06.12 14:07
(16) Да так и прошла. Увидели, что есть новая, не глядя тупо нажали одобрить или разрешить.
20. Алекс Ю (AlexO) 22.06.12 14:12
да, еще оцените название - "Из ТЗ в ВТ", и описание-скрин: "таблицаЗначений из ВременнойТаблицы".
Повторюсь, может я что-то упустил.
21. Алексей Константинов (alexk-is) 22.06.12 15:45
22. Илья (i132) 22.06.12 17:00
(21), Мне кажется мой код будет быстрее работать и его легче читать:
   ТипизированнаяТЗ = Новый ТаблицаЗначений;
	Для й=1 По Тз.Количество() Цикл ТипизированнаяТЗ.Добавить(); //Создаем строки
	КонецЦикла;	
	
	ДЗТипов = Новый ДеревоЗначений;
	ДЗТипов.Колонки.Добавить("ИмяКолонки");
	ДЗТипов.Колонки.Добавить("ТипЗначений");
	
	Для Каждого Колонка из Тз.Колонки Цикл
		СтрокаКолонки = ДЗТипов.Строки.Добавить();
		СтрокаКолонки.ИмяКолонки = Колонка.Имя;
		
		ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
		ТекСТрокаТипа.ИмяКолонки = Колонка.Имя; //Заполняется для красоты
		ТекСТрокаТипа.ТипЗначений = ТипЗнч(тз[0][Колонка.Имя]);
		Для Каждого СтокаТЗ из Тз Цикл
			ТекТип = ТипЗнч(СтокаТЗ[Колонка.Имя]);
			Если НЕ ТекТип = ТекСТрокаТипа.ТипЗначений Тогда
				Если СтрокаКолонки.Строки.Найти(ТекТип, "ТипЗначений")=Неопределено Тогда
					ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
					ТекСТрокаТипа.ИмяКолонки = Колонка.Имя;//Заполняется для красоты
					ТекСТрокаТипа.ТипЗначений = ТекТип;
				КонецЕслИ;
			КонецЕслИ;
		КонецЦикла;
		
		МассивТипов = СтрокаКолонки.Строки.ВыгрузитьКолонку("ТипЗначений");
		ТипизированнаяТЗ.Колонки.Добавить(Колонка.Имя, Новый ОписаниеТипов(МассивТипов),Колонка.Заголовок);
		ТипизированнаяТЗ.ЗагрузитьКолонку(Тз.ВыгрузитьКолонку(Колонка),Колонка.Имя);
	КонецЦикла;
...Показать Скрыть


-зачем давать имена со смешанными англоРусскими буквами? (процедура ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ) - ТЗ_tmp2) - это не уважение к тому кто будет перерабатывать код.
орфографических ошибок не заметил.
DrAku1a; comol; sashapere; +3 1 Ответить 4
23. Сергей Ожерельев (Поручик) 22.06.12 17:08
(22) Модератор за него отредактировал. Первоначальный текст здесь, под датой 22.06.2012 07:12
24. Александр Перевислый (sashapere) 22.06.12 20:38
(1) Serj1C, Извени Сергей но сайт посвящен 1с
25. Александр Перевислый (sashapere) 22.06.12 20:44
(3) anton.fly7, Думаю 10000 прокатит нормально, просто перебрать разок нужно будет штобы все типы определить.
26. Александр Перевислый (sashapere) 22.06.12 20:45
(5) Поручик, Слушайте умники здесь не русский язык изучаем.
27. Александр Перевислый (sashapere) 22.06.12 20:50
(8) comol, Просто когда тоже столкнулся с очень увлекательным описанием типов, то понял что это дело лутше автоматизировать чем каждый раз мучатся
28. Сергей Ожерельев (Поручик) 22.06.12 20:52
29. Александр Перевислый (sashapere) 22.06.12 21:00
(12) AlexO, Если было былобы всё так просто то ваш код


"ВЫБРАТЬ *
|ПОМЕСТИТЬ ВТ
|из &ТЗ КАК таблТЗ " ;


ужебы давно работал, но втом-то !!!! вся и фишка , што вродебы должно работать но выдаёт следующюю ощибку:





{Форма.Форма(221)}: Ошибка при вызове метода контекста (Выполнить): {(3, 4)}: Тип не может быть выбран в запросе
из <<?>>&ТЗ КАК таблТЗ
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
по причине:
{(3, 4)}: Тип не может быть выбран в запросе
из <<?>>&ТЗ КАК таблТЗ
30. Александр Перевислый (sashapere) 22.06.12 21:02
(17) Angeros, Можно примерчик с конструктором описания типов???
31. Сергей Ожерельев (Поручик) 22.06.12 21:07
(29) Ты гордишься своей безграмотностью? Это сейчас модно. Привет, Фурсенко!
32. Александр Перевислый (sashapere) 22.06.12 21:18
(22) i132, ПРОВЕРИЛ!!!!, спасибо за пример, реально получилось, и в запрос таблица загналась, Буду разбираться как вы это сделали.
33. Александр Перевислый (sashapere) 22.06.12 21:19
34. Сергей Ожерельев (Поручик) 22.06.12 22:01
35. Александр Перевислый (sashapere) 22.06.12 23:30
(34) Поручик, Ладно впринцыпе согласен, с русским у меня косяк, даже на работе проблемы с этим, но я лучше попрограмирую на 1с вечерок чем буду сидеть и пить пиво в беседке.
36. Сергей Космачев (ksnik) 23.06.12 05:35
(12) AlexO, хорошее решение, а я сразу не догадался(
 Запрос.УстановитьПараметр("ТЗ", ТЗ);
     Запрос.Текст =
    "ВЫБРАТЬ * из &ТЗ
    |ПОМЕСТИТЬ
    |    ВТ " ;
    |ВЫБРАТЬ *
    |ИЗ
    | &ВТ КАК ВТ
    |АВТОУПОРЯДОЧИВАНИЕ";

    РезультатЗапроса = Запрос.Выполнить().Выгрузить(); 
...Показать Скрыть
38. Модератор раздела Артур Аюханов (artbear) 23.06.12 16:07
(22) Твой код вручную перебирает всю таблицу, а код из (21) выполняет массовые операции за один проход.
Сгенери таблицу побольше и проверь время обоих алгоритмов
39. Модератор раздела Артур Аюханов (artbear) 23.06.12 16:08
(0) Тема нужная, но вот орфография хромает.
поэтому пока плюсовать не буду.
ЗЫ можешь попросить кого-нибудь пограмотнее поправить тему на более правильный русский :)
40. Александр Шишкин (Шёпот теней) 25.06.12 09:20
... при составления запроса из ТЗ - в конструкторе при изменении временной таблицы выскакивает форма, у которой можно, якобы, указывать ТИП колонки ВТ, но установленные типы при сохранении запроса не сохраняются и никак не запоминаются ...

... кто знает: просвятите - как этим пользоваться где и как ? ... или для чего это существует ? ...

... вот ...

кстати: http://www.nastroy-ka.ru/mgeneral/12--1.html ...

... хмВОТхм ...
41. Алексей Константинов (alexk-is) 25.06.12 10:29
(22) Добавил в заметочки Пример 10. Теперь можно поиграть вариантами заполнения, объемами данных и сравнить результаты на цифрах. :)
Шёпот теней; +1 Ответить 1
42. Алексей Константинов (alexk-is) 25.06.12 10:32
(40) Это используется только в текущей сессии Конструктора. Помогает конструктору разбираться с типами данных и предлагать контекстно зависимые варианты разыменования, условий соединения и т.д.
Шёпот теней; +1 Ответить
44. Александр Перевислый (sashapere) 26.06.12 02:40
(41) alexk-is, Спасибо за заметочки! чувствуется что не зря делал
45. г. Казань Рустем Гумеров (Rustig) 30.06.12 23:50
(0)напишите, пожалуйста, несколько примеров, когда ТЗ надо засунуть в ВТ?
у меня на практике пару раз возникало такое желание, но я его обходил как-то... а вот примеры из жизни уже вспомнить не могу.
по поводу орфографии :) - попробуйте перед публикацией писать в Word'е - чтоб другие не злились...
46. Александр Перевислый (sashapere) 01.07.12 14:05
(45) Rustig, Был реальный пример когда, есть регистр сведений со списком всех загруженных файлов в базу и есть таблица с именами файлов на фтп которые нужно обработать причём там их много и старые и новые,так перегонял эту таблицу во временную и уже в запросе по этой таблице и регистру сведений отфильтровывал что загружалось а что нет.
47. г. Казань Рустем Гумеров (Rustig) 01.07.12 15:25
(46) а чем способ использовать запросы лучше перебора ТЗ в цикле?
вообще, те файлы которые уже загружались в базу, надо перемещать в новую папку.
пусть эта папка будет там же на фтп-шнике, можно назвать как угодно, например "Загруженные".
метод в 1С для этого есть: Переместить(<Имя файла источника>, <Имя файла приемника>)
а если структуру папок и файлов нельзя менять, непонятно зачем еще в 1С загружать?
и что получается: что ваш запрос ежедневно обрабатывает все больше и больше записей? и через год система зависнет, дойдя до "критической массы"?
48. Александр Перевислый (sashapere) 01.07.12 19:38
(47) Rustig, Там были свои особенности, ftp был открыт толко для чтения и периодически подчищался сам независимо от меня, проверить по отдельности каждый файл можно-былобы но скорость не та (пробовал так тоже)(список файлов большой порядка 50000 а список в регистре сведений ещё больше около пару милионов), поэтому и стал копать в сторону запроса чтобы за один проход сразу всё отсеять.
49. г. Казань Рустем Гумеров (Rustig) 01.07.12 23:12
(48) Нагромождение на пустом месте... или пока на пустом месте? чем обусловлено "ftp был открыт только для чтения"?
для программиста такие ограничения подобны ограничениям для бухгалтера: "вы все проводки делайте Операцией, введенной вручную, я блокирую остальные документы на запись". то есть пока это не реальные требования.
а если уже реализовано, что "ftp периодически подчищался сам независимо от меня", тогда надо этих админов (или программистов) попросить периодически переносить часть файлов, чтобы они наверняка не попадали в твой запрос.
И самое главное, ты не ответил,
"и что получается: что ваш запрос ежедневно обрабатывает все больше и больше записей? и через год система зависнет, дойдя до "критической массы"?"
и на всякий случай, хочу узнать какого формата файлы?
50. Александр Перевислый (sashapere) 01.07.12 23:25
(49) Rustig, короче чувак, я тебе объяснил как было, работает до сих пор, критической массы не возникло, хотя заметно медленне немного работает, но в целом всё нормально переваривается.
51. г. Казань Рустем Гумеров (Rustig) 02.07.12 00:08
(4), (8), (21) коллеги, помогите с примерами к вопросу (45)
52. Алексей Константинов (alexk-is) 02.07.12 06:56
(51) Если есть необходимость в дальнейшем использовать в запросе таблицу значений, то её необходимо поместить во временную таблицу.

Может быть, вопрос об использовании менеджера временных таблиц?
53. Константин Юрин (kostyaomsk) 04.07.12 08:26
Я считаю вполне приличная идея для разработки средств контроля (и быстрой проверки результата), т.к. часто сталкиваюсь с задачами загрузки в ТЗ при переносе баз из разчиных АИС в 1С 8.2. Одно плохо, достаточно трудно создать универсальную функцию, которая еще бы правильно писала квалификаторы в ОписанииТипов. Поскольку у меня во входных файлах содержатся кучи ошибок пользователей "простому" автоматическому (как-бы назвать) подбору типа я не доверяю.
54. Александр Шкут (alex_shkut) 07.02.14 14:25
Многие задают вопрос: а зачем Вам это нужно?
Нужно это затем, когда данные, полученные из БД запросом нужно обработать несколько раз.
В моем случае. в таблицу-выборку добавлено еще 13 колонок. Это показатели, которые рассчитываются на основании друг-друга и данных исходной ТЗ.
Например, средневзвешенные значения и производные. Короче говоря. посчитать такое в Одном вычисляемом поле нереально.
Попробуйте подсчитать запросом трудодни при постоянной текучке...
(Это я пример более понятный написал, в моем случае - кормодни в животноводстве)
Или рассчитать формулу "Пока остаток больше нуля идем назад по событиям и подсчитываем те-же трудо- кормодни между событиями до нулевого остатка но не более месяца назад"
Создайте пожалуйста мне в 1С такой запрос... уж мне проще циклами.

А потом передать это все в СКД объектом.

Если пытаться все это в СКД выполнить то:
Во втором вычисляемом поле получится формула, образованная от первой + вычисления второго показателя. Представили? Получается неслабое нагромождение функций ВычислитьВыражение() и им подобных.
А что будет в 10-м вычисляемом поле? Вот поэтому я все вычисления произвожу с ТЗ.
А запрос к ТЗ позволяет также отсортировать ТЗ по нужному мне для дальнейших вычислений полю.
Выполнять расчеты, сворачивать ТЗ. снова сортировать запросом и снова обрабатывать.
55. Александр Шкут (alex_shkut) 07.02.14 14:27
56. Andrey Smirnov (dusha0020) 30.09.15 10:26
У меня не взлетело. Проверка на тип, чтобы не повторяться обрезает длины. В итоге у меня для всех строковых типов устанавливается длина последнего строкового реквизита, что обрезает данные во временной таблице и работать в запросе как нужно она уже не может. Придется писать преобразователь самому... :(
57. niko (n_spb) 06.10.16 16:47
Спасибо, статья здорово помогла.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа