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

22.06.12

Разработка - Универсальные функции

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

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

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

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

 

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

 

 



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

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

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

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

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

//--------тех ФУНКЦИИ ----------------------------
функция ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ)
   
//--------------------------------------------
    // Создаём новую ТЗ с описанием типов
    //--------------------------------------------
   
ТЗ_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, где это всё реализовано

 

См. также

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4312    atdonya    22    

41

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3881    ke.92@mail.ru    16    

60

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8557    YA_418728146    6    

139

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2020    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16011    131    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7197    quazare    8    

108
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Serj1C 483 22.06.12 07:40 Сейчас в теме
Непреодолимое желание влепить минус за орфографию и пунктуацию (што, созданые, нетакто, замучаешся, автомотически ). Противно читать ваш олбанский.
dbachinsky; a_plastinin; WarAn; Boog; Поручик; fishca; Sherlock_kmw; Famza; +8 1 Ответить
24. sashapere 157 22.06.12 20:38 Сейчас в теме
(1) Serj1C, Извени Сергей но сайт посвящен 1с
2. Famza 84 22.06.12 07:50 Сейчас в теме
Походу автор очень торопился выложить обработку. За оформление - минус
3. anton.fly7 173 22.06.12 08:05 Сейчас в теме
если ТЗ будет на 10000 строк, мне кажется замучаешься ждать
sashapere; +1 Ответить
25. sashapere 157 22.06.12 20:44 Сейчас в теме
(3) anton.fly7, Думаю 10000 прокатит нормально, просто перебрать разок нужно будет штобы все типы определить.
4. DimaP 63 22.06.12 09:11 Сейчас в теме
Авансом плюс!
Часто сталкиваюсь с таким.
С оформлением, конечно, лажа :)
51. RustIG 1301 02.07.12 00:08 Сейчас в теме
(4), (8), (21) коллеги, помогите с примерами к вопросу (45)
52. alexk-is 6533 02.07.12 06:56 Сейчас в теме
(51) Если есть необходимость в дальнейшем использовать в запросе таблицу значений, то её необходимо поместить во временную таблицу.

Может быть, вопрос об использовании менеджера временных таблиц?
5. Поручик 4670 22.06.12 09:58 Сейчас в теме
(0) Полный атас. Тебя из какого класса церковно - приходской школы вытурили за полную безграмотность?
9. AlexO 135 22.06.12 11:34 Сейчас в теме
(5) Поручик,
это россиянский студент после ЕГЭ.
Вы еще россиянских школьников не видели...
Al-X; Поручик; +2 Ответить
26. sashapere 157 22.06.12 20:45 Сейчас в теме
(5) Поручик, Слушайте умники здесь не русский язык изучаем.
28. Поручик 4670 22.06.12 20:52 Сейчас в теме
6. Поручик 4670 22.06.12 10:02 Сейчас в теме
(0) Смотреть противно, как на бомжа, жрущего из помойки.
7. Поручик 4670 22.06.12 10:12 Сейчас в теме
(0) Передо мной интереснейший бытовой материал: четыре больших тетради под общим заглавием "Дневник земского начальника".
Автор дневника -- земский начальник одной из южных губерний -- вел его за свою службу с 1902 по 1909 год, записывая ежедневно перлы и адаманты поступающих бумаг.
...................
Невольно вспоминается одно ходившее по рукам в половине прошлого столетия письмо бурмистра к своему барину в Петербург, где также не было ни одного знака препинания. Письмо таково:
-- ...Батюшка барин сивый жеребец Михалла Петрович помер шкуру вашу барскую содрали продали на вырученные деньги куплен хомут для вашей милости на ярмарке свиней вашей породы было много прошли хорошо жаль только что небыло самих вашей милости самолично потому соседи просили хряка на племя староста Антип.
Далеко ли мы ушли от того времени?!
for-elenak; +1 Ответить
10. AlexO 135 22.06.12 11:36 Сейчас в теме
(7) Поручик,
Далеко ли мы ушли от того времени?!

деградации нет предела - до полного вымирания нации.
8. comol 5046 22.06.12 11:26 Сейчас в теме
Мне лично всё равно до офрмления. за публикацию большой "+". Любую загрузку чего-либо пишу обычно преобразовывая ТЗ в ВТ (собственно как и все уже думаю) и каждый раз "убивает" очень "полезное" занятие с преобразованием типов. Автор реально помог, а вам нет чтобы "спасибо" написать...
asu2; sashapere; +2 1 Ответить
11. Поручик 4670 22.06.12 11:45 Сейчас в теме
(8) Превратим инфостарт в полную помойку, чо уж там.
13. AlexO 135 22.06.12 11:56 Сейчас в теме
(11) Поручик,
страну же превращаем - чем инфостарт хуже? :(
15. comol 5046 22.06.12 12:14 Сейчас в теме
(11) Поручик, А давайте будем лучше ничего не делать всех обсирать? "что так плохо пишите". Такие личности иногда тоже раздражают...
12. AlexO 135 22.06.12 11:54 Сейчас в теме
(8) comol,
я, может, и отстал от продвинутых тру-1снигов, но всегда пользуюсь:

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

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

Из ТЗ - в ВТ, потом снова в ТЗ. Кому нравится - могут и через МВТ сделать.
Только зачем нужна ВТ из МВТ, когда есть уже готовая ТЗ??
for-elenak; GusevNA; BorisMor; ksnik; +4 Ответить
14. comol 5046 22.06.12 12:11 Сейчас в теме
29. sashapere 157 22.06.12 21:00 Сейчас в теме
(12) AlexO, Если было былобы всё так просто то ваш код


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


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





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

    РезультатЗапроса = Запрос.Выполнить().Выгрузить(); 
Показать
27. sashapere 157 22.06.12 20:50 Сейчас в теме
(8) comol, Просто когда тоже столкнулся с очень увлекательным описанием типов, то понял что это дело лутше автоматизировать чем каждый раз мучатся
16. tolyan_ekb 104 22.06.12 12:44 Сейчас в теме
Орфо рулит. )) Я когда увидел оформление, чуть не упал. Как модерацию прошла публикация?
Поручик; +1 Ответить
19. Поручик 4670 22.06.12 14:07 Сейчас в теме
(16) Да так и прошла. Увидели, что есть новая, не глядя тупо нажали одобрить или разрешить.
17. Angeros 22.06.12 13:45 Сейчас в теме
Ну вообще плевое дело создать любой тип программно хоть составной хоть не составной. Есть в конфигураторе специальный конструктор. Который называется - конструктор описания типов. Изучайте мат часть, а не лепите огород на пустом месте. :)
for-elenak; AlexO; +2 Ответить
18. AlexO 135 22.06.12 14:06 Сейчас в теме
(17) Angeros,
я вообще не понял задачи. Так как её описания здесь нет.
Одни восторги.
30. sashapere 157 22.06.12 21:02 Сейчас в теме
(17) Angeros, Можно примерчик с конструктором описания типов???
20. AlexO 135 22.06.12 14:12 Сейчас в теме
да, еще оцените название - "Из ТЗ в ВТ", и описание-скрин: "таблицаЗначений из ВременнойТаблицы".
Повторюсь, может я что-то упустил.
21. alexk-is 6533 22.06.12 15:45 Сейчас в теме
22. i132 122 22.06.12 17:00 Сейчас в теме
(21), Мне кажется мой код будет быстрее работать и его легче читать:
   ТипизированнаяТЗ = Новый ТаблицаЗначений;
	Для й=1 По Тз.Количество() Цикл ТипизированнаяТЗ.Добавить(); //Создаем строки
	КонецЦикла;	
	
	ДЗТипов = Новый ДеревоЗначений;
	ДЗТипов.Колонки.Добавить("ИмяКолонки");
	ДЗТипов.Колонки.Добавить("ТипЗначений");
	
	Для Каждого Колонка из Тз.Колонки Цикл
		СтрокаКолонки = ДЗТипов.Строки.Добавить();
		СтрокаКолонки.ИмяКолонки = Колонка.Имя;
		
		ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
		ТекСТрокаТипа.ИмяКолонки = Колонка.Имя; //Заполняется для красоты
		ТекСТрокаТипа.ТипЗначений = ТипЗнч(тз[0][Колонка.Имя]);
		Для Каждого СтокаТЗ из Тз Цикл
			ТекТип = ТипЗнч(СтокаТЗ[Колонка.Имя]);
			Если НЕ ТекТип = ТекСТрокаТипа.ТипЗначений Тогда
				Если СтрокаКолонки.Строки.Найти(ТекТип, "ТипЗначений")=Неопределено Тогда
					ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
					ТекСТрокаТипа.ИмяКолонки = Колонка.Имя;//Заполняется для красоты
					ТекСТрокаТипа.ТипЗначений = ТекТип;
				КонецЕслИ;
			КонецЕслИ;
		КонецЦикла;
		
		МассивТипов = СтрокаКолонки.Строки.ВыгрузитьКолонку("ТипЗначений");
		ТипизированнаяТЗ.Колонки.Добавить(Колонка.Имя, Новый ОписаниеТипов(МассивТипов),Колонка.Заголовок);
		ТипизированнаяТЗ.ЗагрузитьКолонку(Тз.ВыгрузитьКолонку(Колонка),Колонка.Имя);
	КонецЦикла;
Показать


-зачем давать имена со смешанными англоРусскими буквами? (процедура ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ) - ТЗ_tmp2) - это не уважение к тому кто будет перерабатывать код.
орфографических ошибок не заметил.
DrAku1a; comol; sashapere; +3 1 Ответить
23. Поручик 4670 22.06.12 17:08 Сейчас в теме
(22) Модератор за него отредактировал. Первоначальный текст здесь, под датой 22.06.2012 07:12
32. sashapere 157 22.06.12 21:18 Сейчас в теме
(22) i132, ПРОВЕРИЛ!!!!, спасибо за пример, реально получилось, и в запрос таблица загналась, Буду разбираться как вы это сделали.
38. Модератор раздела 23.06.12 16:07 Сейчас в теме
(22) Твой код вручную перебирает всю таблицу, а код из (21) выполняет массовые операции за один проход.
Сгенери таблицу побольше и проверь время обоих алгоритмов
41. alexk-is 6533 25.06.12 10:29 Сейчас в теме
(22) Добавил в заметочки Пример 10. Теперь можно поиграть вариантами заполнения, объемами данных и сравнить результаты на цифрах. :)
Шёпот теней; +1 Ответить
44. sashapere 157 26.06.12 02:40 Сейчас в теме
(41) alexk-is, Спасибо за заметочки! чувствуется что не зря делал
33. sashapere 157 22.06.12 21:19 Сейчас в теме
34. Поручик 4670 22.06.12 22:01 Сейчас в теме
35. sashapere 157 22.06.12 23:30 Сейчас в теме
(34) Поручик, Ладно впринцыпе согласен, с русским у меня косяк, даже на работе проблемы с этим, но я лучше попрограмирую на 1с вечерок чем буду сидеть и пить пиво в беседке.
37. пользователь 23.06.12 13:47
Сообщение было скрыто модератором.
...
39. Модератор раздела 23.06.12 16:08 Сейчас в теме
(0) Тема нужная, но вот орфография хромает.
поэтому пока плюсовать не буду.
ЗЫ можешь попросить кого-нибудь пограмотнее поправить тему на более правильный русский :)
40. Шёпот теней 1779 25.06.12 09:20 Сейчас в теме
... при составления запроса из ТЗ - в конструкторе при изменении временной таблицы выскакивает форма, у которой можно, якобы, указывать ТИП колонки ВТ, но установленные типы при сохранении запроса не сохраняются и никак не запоминаются ...

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

... вот ...

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

... хмВОТхм ...
42. alexk-is 6533 25.06.12 10:32 Сейчас в теме
(40) Это используется только в текущей сессии Конструктора. Помогает конструктору разбираться с типами данных и предлагать контекстно зависимые варианты разыменования, условий соединения и т.д.
Шёпот теней; +1 Ответить
43. пользователь 25.06.12 15:26
Сообщение было скрыто модератором.
...
45. RustIG 1301 30.06.12 23:50 Сейчас в теме
(0)напишите, пожалуйста, несколько примеров, когда ТЗ надо засунуть в ВТ?
у меня на практике пару раз возникало такое желание, но я его обходил как-то... а вот примеры из жизни уже вспомнить не могу.
по поводу орфографии :) - попробуйте перед публикацией писать в Word'е - чтоб другие не злились...
46. sashapere 157 01.07.12 14:05 Сейчас в теме
(45) Rustig, Был реальный пример когда, есть регистр сведений со списком всех загруженных файлов в базу и есть таблица с именами файлов на фтп которые нужно обработать причём там их много и старые и новые,так перегонял эту таблицу во временную и уже в запросе по этой таблице и регистру сведений отфильтровывал что загружалось а что нет.
47. RustIG 1301 01.07.12 15:25 Сейчас в теме
(46) а чем способ использовать запросы лучше перебора ТЗ в цикле?
вообще, те файлы которые уже загружались в базу, надо перемещать в новую папку.
пусть эта папка будет там же на фтп-шнике, можно назвать как угодно, например "Загруженные".
метод в 1С для этого есть: Переместить(<Имя файла источника>, <Имя файла приемника>)
а если структуру папок и файлов нельзя менять, непонятно зачем еще в 1С загружать?
и что получается: что ваш запрос ежедневно обрабатывает все больше и больше записей? и через год система зависнет, дойдя до "критической массы"?
48. sashapere 157 01.07.12 19:38 Сейчас в теме
(47) Rustig, Там были свои особенности, ftp был открыт толко для чтения и периодически подчищался сам независимо от меня, проверить по отдельности каждый файл можно-былобы но скорость не та (пробовал так тоже)(список файлов большой порядка 50000 а список в регистре сведений ещё больше около пару милионов), поэтому и стал копать в сторону запроса чтобы за один проход сразу всё отсеять.
49. RustIG 1301 01.07.12 23:12 Сейчас в теме
(48) Нагромождение на пустом месте... или пока на пустом месте? чем обусловлено "ftp был открыт только для чтения"?
для программиста такие ограничения подобны ограничениям для бухгалтера: "вы все проводки делайте Операцией, введенной вручную, я блокирую остальные документы на запись". то есть пока это не реальные требования.
а если уже реализовано, что "ftp периодически подчищался сам независимо от меня", тогда надо этих админов (или программистов) попросить периодически переносить часть файлов, чтобы они наверняка не попадали в твой запрос.
И самое главное, ты не ответил,
"и что получается: что ваш запрос ежедневно обрабатывает все больше и больше записей? и через год система зависнет, дойдя до "критической массы"?"
и на всякий случай, хочу узнать какого формата файлы?
50. sashapere 157 01.07.12 23:25 Сейчас в теме
(49) Rustig, короче чувак, я тебе объяснил как было, работает до сих пор, критической массы не возникло, хотя заметно медленне немного работает, но в целом всё нормально переваривается.
53. jobkostya1c_ERP 100 04.07.12 08:26 Сейчас в теме
Я считаю вполне приличная идея для разработки средств контроля (и быстрой проверки результата), т.к. часто сталкиваюсь с задачами загрузки в ТЗ при переносе баз из разчиных АИС в 1С 8.2. Одно плохо, достаточно трудно создать универсальную функцию, которая еще бы правильно писала квалификаторы в ОписанииТипов. Поскольку у меня во входных файлах содержатся кучи ошибок пользователей "простому" автоматическому (как-бы назвать) подбору типа я не доверяю.
54. alex_shkut 62 07.02.14 14:25 Сейчас в теме
Многие задают вопрос: а зачем Вам это нужно?
Нужно это затем, когда данные, полученные из БД запросом нужно обработать несколько раз.
В моем случае. в таблицу-выборку добавлено еще 13 колонок. Это показатели, которые рассчитываются на основании друг-друга и данных исходной ТЗ.
Например, средневзвешенные значения и производные. Короче говоря. посчитать такое в Одном вычисляемом поле нереально.
Попробуйте подсчитать запросом трудодни при постоянной текучке...
(Это я пример более понятный написал, в моем случае - кормодни в животноводстве)
Или рассчитать формулу "Пока остаток больше нуля идем назад по событиям и подсчитываем те-же трудо- кормодни между событиями до нулевого остатка но не более месяца назад"
Создайте пожалуйста мне в 1С такой запрос... уж мне проще циклами.

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

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

// Типизированная таблица значений
//	Создаёт и возвращает копию ТаблицыЗначений с заполненным Типом Колонок
// Параметры:
//  Таблица	 - ТаблицаЗначений 
// 
// Возвращаемое значение:
//  ТаблицаЗначений 
//
Функция ТипизированнаяТаблицаЗначений(Таблица) Экспорт
	Результат = Новый ТаблицаЗначений;
	Для Каждого Колонка Из Таблица.Колонки Цикл
		ИмяКолонки = Колонка.Имя;
		СвернутаяТаблица = Таблица.Скопировать(, ИмяКолонки);
		СвернутаяТаблица.Свернуть(ИмяКолонки);
		МассивТипов = Новый Массив;
		Для Каждого СтрокаСвернутойТаблицы из СвернутаяТаблица Цикл
			ТипЗначения = ТипЗнч(СтрокаСвернутойТаблицы[ИмяКолонки]);
			Если МассивТипов.Найти(ТипЗначения) = Неопределено Тогда
				МассивТипов.Добавить(ТипЗначения);
			КонецЕсли;
		КонецЦикла;
		Результат.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов(МассивТипов), Колонка.Заголовок, Колонка.Ширина);
		ЗагрузитьКолонку(Результат, Таблица.ВыгрузитьКолонку(ИмяКолонки), ИмяКолонки, Ложь);
	КонецЦикла;
	Возврат Таблица;
КонецФункции

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