Имя: Пароль:
1C
1С v8
Добавить колонку из одной таблицы значений к другой
, , ,
0 dft2014
 
28.08.18
17:28
Есть две таблицы значений — «ПерваяТЗ» и «ВтораяТЗ».

ПерваяТЗ (колонки):
ФИО               Остаток на 31.07.18
Иванов            10
Петров            15


ВтораяТЗ (колонки):
ФИО               Остаток на 30.06.18
Иванов            8
Сидоров           3


Необходимо получить третью таблицу или добавить колонку с остатками, чтобы получилась таблица в виде:
ФИО            Остатки на 30.06.2018            Остатки на 31.07.2018
1 ejikbeznojek
 
28.08.18
17:30
(0) Покажи код, как пытаешься.
2 ejikbeznojek
 
28.08.18
17:32
(1) А так я бы передал параметром обе таблицы в запрос и сделал бы полное соединение.
3 Cyberhawk
 
28.08.18
17:37
(1) С чего ты взял, что пытается?
4 ejikbeznojek
 
28.08.18
17:38
(3) Ну надо же думать о человеке хорошо, пока он не дал повод думать обратное)
5 dft2014
 
28.08.18
18:01
(1)

//собираем данные на отчетную дату
    ДатаРасчетаОстатковОтпусков       = КонецДня(Объект.ДатаОтчета);
    ПерваяТЗ = тзСотрудникиСОстаткамиНаДату(ДатаРасчетаОстатковОтпусков);
    
    //собираем данные на отчетную дату минус месяц
    ДатаРасчетаОстатковОтпусковМинусМесяц       = КонецДня(ДобавитьМесяц(Объект.ДатаОтчета,-1));
    ВтораяТЗ = тзСотрудникиСОстаткамиНаДату(ДатаРасчетаОстатковОтпусковМинусМесяц);
    
    //собираем все в одну ТЗ
    тзВсеВместе = ЗаполнимИтоговуюТЗДанными(ПерваяТЗ,ВтораяТЗ);  //вот здесь у меня стопор!!!
6 dft2014
 
28.08.18
18:05
+(5) Обе ТЗ - идентичные, отличаются только "остатком", и вот только этот "остаток" надо присоединить из второй ТЗ.

Структура обеих ТЗ:


тзОстатки = Новый ТаблицаЗначений;
    тзОстатки.Колонки.Добавить("ФИО",Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
    тзОстатки.Колонки.Добавить("Остаток",Новый ОписаниеТипов("Число"));
    тзОстатки.Колонки.Добавить("Подразделение",Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций"));
    тзОстатки.Колонки.Добавить("Должность",Новый ОписаниеТипов("СправочникСсылка.Должности"));
    тзОстатки.Колонки.Добавить("Состояние",Новый ОписаниеТипов("ПеречислениеСсылка.СостоянияСотрудника"));
7 dft2014
 
28.08.18
18:48
Ап!
8 МихаилМ
 
28.08.18
18:58
из сп:

ТаблицаЗначений (ValueTable)
ВыгрузитьКолонку (UnloadColumn)
Синтаксис:

ВыгрузитьКолонку(<Колонка>)
Параметры:

<Колонка> (обязательный)

Тип: Число; Строка; КолонкаТаблицыЗначений.
Колонка, значения которой необходимо выгрузить. В качестве значения параметра может выступать индекс колонки, имя колонки, сама колонка.
Возвращаемое значение:

Тип: Массив.



Описание:

Создает массив и копирует в него значения, содержащиеся в колонке таблицы значений.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:

ТаблицаЗначений.Свернуть("Номенклатура");
Запрос.УстановитьПараметр("МассивНоменклатуры", ТаблицаЗначений.ВыгрузитьКолонку("Номенклатура"));


ТаблицаЗначений (ValueTable)
ЗагрузитьКолонку (LoadColumn)
Синтаксис:

ЗагрузитьКолонку(<Массив>, <Колонка>)
Параметры:

<Массив> (обязательный)

Тип: Массив.
Массив значений, который выступает в качестве источника данных для колонки.
<Колонка> (обязательный)

Тип: Число; Строка; КолонкаТаблицыЗначений.
Колонка, в которую будут загружены значения из массива. В качестве значения параметра может выступать индекс колонки, имя колонки, сама колонка.
Описание:

Загружает колонку таблицы значений из массива значений.

Доступность:

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

Значения из массива загружаются в колонку в порядке индексов.
Пример:

ТаблицаРезультат = Новый ТаблицаЗначений;
Для каждого ИмяКолонки Из МассивИменКолонок Цикл
    ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);
КонецЦикла;

// Создадим пустые строки таблицы

Для Н=1 По СтрокиДереваЗначений.Количество() Цикл
    ТаблицаРезультат.Добавить();
КонецЦикла;

// Скопируем значения колонок

Для каждого ИмяКолонки Из МассивИменКолонок Цикл
    ЗначенияКолонки = СтрокиДереваЗначений.ВыгрузитьКолонку(ИмяКолонки);
    ТаблицаРезультат.ЗагрузитьКолонку(ЗначенияКолонки, ИмяКолонки);
КонецЦикла;
9 МихаилМ
 
28.08.18
19:02
извините.

дополните  обе таблицы нужными колонками

объедините таблицы, сверните.
10 Chameleon1980
 
28.08.18
19:36
запросом
11 catena
 
29.08.18
05:02
(8)Ничего, что у него состав строк может быть разный?)))
12 dft2014
 
29.08.18
10:43
Запрос = Новый Запрос;
Запрос.Текст = "Выбрать * ПОМЕСТИТЬ ВремТабл Из &ТабЗнач1 как ТабЗнач1;
| Выбрать * ПОМЕСТИТЬ ВремТабл1 Из &ТабЗнач как ТабЗнач;
| Выбрать * ИЗ ВремТабл ОБЪЕДИНИТЬ ВСЕ Выбрать * ИЗ ВремТабл1";

Запрос.УстановитьПараметр("ТабЗнач",ПерваяТЗ);
Запрос.УстановитьПараметр("ТабЗнач1",ВтораяТЗ);
ИтоговаяТаблица = Запрос.Выполнить().Выгрузить();


В результате получаю не то, что надо: обе таблицы объединяются, а мне надо добавить одну колонку из ВторойТЗ в ПервуюТЗ.
13 catena
 
29.08.18
10:48
(12)Так сказали же СОЕДИНИТЬ, а не объединить.
14 dft2014
 
29.08.18
10:53
(13) Поподробнее, плиз... Я не поняла...
15 catena
 
29.08.18
10:56
(14)из тз1 полное соединение тз2 по тз1.фио=тз2.фио

и не забыть про естьNULL
16 dft2014
 
29.08.18
11:02
(15) Т.е. ТЗ1 и ТЗ2 надо поместить в запрос? Каким образом?!
17 Zmich
 
29.08.18
11:06
(12). Если хочешь через ОБЪЕДИНИТЬ ВСЕ, придется иначе обозвать поля с остатками. Примерно так:
Запрос.Текст = "Выбрать * ПОМЕСТИТЬ ВремТабл Из &ТабЗнач1 как ТабЗнач1;
| Выбрать * ПОМЕСТИТЬ ВремТабл1 Из &ТабЗнач как ТабЗнач;
| Выбрать ВложенныйЗапрос.ФИО КАК ФИО,
|         СУММА(ВложенныйЗапрос.Остаток1) КАК Остаток1,
|         СУММА(ВложенныйЗапрос.Остаток2) КАК Остаток2
| ИЗ
| (
| Выбрать ВремТабл.ФИО КАК ФИО
|         ВремТабл.Остаток КАК Остаток1,
|         0 КАК Остаток2
| ИЗ ВремТабл КАК ВремТабл
|ОБЪЕДИНИТЬ ВСЕ
|Выбрать ВремТабл1.ФИО КАК ФИО,
|        0 КАК Остаток1,
|        ВремТабл1.Остаток КАК Остаток2
| ИЗ ВремТабл1 КАК ВремТабл1
| ) КАК ВложенныйЗапрос
|СГРУППИРОВАТЬ ПО ВложенныйЗапрос.ФИО";

Но лучше способ с полным соединением.
18 catena
 
29.08.18
11:09
(16)эээ... а в (12) вы, простите, их в запрос не помещаете?
19 dft2014
 
29.08.18
11:12
(18) Если я вместо:
| Выбрать * ИЗ ВремТабл ОБЪЕДИНИТЬ ВСЕ Выбрать * ИЗ ВремТабл1";

напишу:
| Выбрать * ИЗ ВремТабл СОЕДИНИТЬ ВСЕ Выбрать * ИЗ ВремТабл1";
то выдает ошибку: "Синтаксическая ошибка "ВСЕ""
20 dchumak
 
29.08.18
11:14
(16) как параметр запроса
А в запросе уже пишешь
Выбрать... Из &ТабЗнач как ТабЗнач
21 catena
 
29.08.18
11:15
(19)Почему вы так выборочно читаете? Покажите хоть одно сообщение в теме, где советовали СОЕДИНИТЬ ВСЕ. Это же не сочинение, нельзя писать примерно подходящее по смыслу.
22 dchumak
 
29.08.18
11:15
(19) надо писать ОБЪЕДИНИТЬ ВСЕ
23 dft2014
 
29.08.18
11:17
(22) я так и написала в (12), в результате обе таблицы объединяются, а мне надо добавить одну колонку из ВторойТЗ в ПервуюТЗ.
24 catena
 
29.08.18
11:18
(23)И опять же, вы пропустили в теме корректный пример с объединить.
25 dft2014
 
29.08.18
11:19
(24) где этот пример? я не увидела...
26 catena
 
29.08.18
11:22
(25)Тема не такая уж длинная, советую перечитать и думать.
27 dft2014
 
29.08.18
11:29
(26) Читаю, думаю.
Не получается!!!
28 ПегийЛунь
 
29.08.18
11:33
читайте еще

Запрос.Текст = "Выбрать * ПОМЕСТИТЬ ВремТабл Из &ТабЗнач как ТабЗнач;
| ВЫБРАТЬ * ПОМЕСТИТЬ ВремТабл1 Из &ТабЗнач1 как ТабЗнач1;
| ВЫБРАТЬ
|    ЕСТЬNULL(ВремТабл.ФИО, ВремТабл1.ФИО) КАК ФИО
|    ВремТабл.Остаток,
|    ВремТабл1.ОстатокСледМесяца
| ИЗ
|    ВремТабл КАК ВремТабл
|        ПОЛНОЕ СОЕДИНЕНИЕ ВремТабл1 КАК ВремТабл1
|        ПО ВремТабл.ФИО = ВремТабл1.ФИО";
29 ПегийЛунь
 
29.08.18
11:34
Запрос примерно такой (в 28 намерено сделаны ошибки).
30 dft2014
 
29.08.18
11:45
(26), (28), (29) что же вы за люди-то такие!!!

(28) ошибку выдает: Синтаксическая ошибка "ВремТабл.Остаток,"
31 Лефмихалыч
 
29.08.18
11:51
(30) значит в таблице значений, которую та передаешь в параметре &ТабЗнач, нет колонки с именем "Остаток"
32 dft2014
 
29.08.18
11:54
(31) есть колонка "Остаток" - см. (6)
33 Лефмихалыч
 
29.08.18
11:58
(32) нет колонки Остаток, см (30)
34 ПегийЛунь
 
29.08.18
11:59
(30) Угу. Видишь не хватает запятой в предыдущей строке.
35 Лефмихалыч
 
29.08.18
11:59
а, стоп, это СИНТАКСИЧЕСКИЙ контроль.
Замени "ВЫБРАТЬ *" на "ВЫБРАТЬ <перечисление, всех, полей, таблицы>"
36 catena
 
29.08.18
12:06
"что же вы за люди-то такие!!! "

В смысле? Вы не то что учебник или справку, даже советы целиком прочитать не хотите, синтаксис самостоятельно проверить ленитесь, а мы люди "такие"...
37 dft2014
 
29.08.18
14:11
Вот такой запрос ниже у меня получился. Посмотрите пож-та, все ли верно? Вроде данные выгружаются так, как мне надо...

Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ТЗ.ФИО КАК ФИО,
    |    ТЗ.Подразделение КАК Подразделение,
    |    ТЗ.Должность КАК Должность,
    |    ТЗ.ОстатокТекДата КАК ОстатокТекДата
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    |    &ТЗ КАК ТЗ
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТЗПредДата.ФИО КАК ФИО,
    |    ТЗПредДата.ОстатокПредДата КАК ОстатокПредДата
    |ПОМЕСТИТЬ ВТПредДата
    |ИЗ
    |    &ТЗПредДата КАК ТЗПредДата
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТ.ФИО КАК ФИО,
    |    ВТ.Подразделение КАК Подразделение,
    |    ВТ.Должность КАК Должность,
    |    ВТ.ОстатокТекДата КАК ОстатокТекДата,
    |    ВТПредДата.ОстатокПредДата КАК ОстатокПредДата
    |ИЗ
    |    ВТ КАК ВТ
    |        ПОЛНОЕ СОЕДИНЕНИЕ ВТПредДата КАК ВТПредДата
    |        ПО ВТ.ФИО = ВТПредДата.ФИО";
    
    Запрос.УстановитьПараметр("ТЗ",тзОстатки_ДатаОтчета);
    Запрос.УстановитьПараметр("ТЗПредДата",тзОстатки_ДатаОтчетаМинусМесяц);
    ИтоговаяТаблица = Запрос.Выполнить().Выгрузить();
    
    ИтоговаяТаблица = Запрос.Выполнить().Выгрузить();
38 ПегийЛунь
 
29.08.18
14:42
(37) Не все нормально. Может оказаться так, что в таблице ВТПредДата есть ФИО которых нет в таблице ВТ.
39 dft2014
 
29.08.18
14:52
(38) А как это обойти?
40 ejikbeznojek
 
29.08.18
15:35
(39)    
|ВЫБРАТЬ
|    естьNull(ВТ.ФИО,ВТПредДата.ФИО) КАК ФИО,

Что-нибудь вроде этого в последнем запросе
Закон Брукера: Даже маленькая практика стоит большой теории.