Имя: Пароль:
1C
 
Создание новой ТЗ или удаление строк из существующей
,
0 LivingStar
 
20.01.15
11:05
Есть одна таблица значений. Формирую другую. Потом перебором первой произвожу поиск во второй. Если строка не найдена, то её нужно перенести в новую тз, или если найдена удалить из первой. Что бы на выходе получить ТЗ где только записи которых нет во второй. Поиск во второй произвожу по одноименному полю что есть в первой. Подскажите как правильнее в этом случае все сделать? Понял что в ТЗ нет функции добавления каждой строки, нужно прописывать добавление каждого поля.
|
Функция ИсключитьОплаченныеСчета(Тз)
    ИсклОплСчТз  = Новый ТаблицаЗначений;
    Запрос       = Новый Запрос;
    Запрос.Текст = "
        |ВЫБРАТЬ
        |    ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетНаОплату КАК СчетНаОплату,
        |    ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.Ссылка       КАК Ссылка
        |ИЗ
        |    Документ.ПоступлениеНаРасчетныйСчет.РасшифровкаПлатежа КАК ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа
        |ГДЕ
        |    НЕ ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетНаОплату = ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка)
        |
        |УПОРЯДОЧИТЬ ПО
        |    Ссылка";
    ТзОплСч = Запрос.Выполнить().Выгрузить();
    Для Каждого СтрТз Из Тз Цикл
        ОплСч = ТзОплСч.Найти(СтрТз.СчетСсылка, "СчетНаОплату");
        Если ОплСч = Неопределено Тогда
            ИсклОплСчТз.Добавить();            
        КонецЕсли;
    КонецЦикла;
    Возврат ИсклОплСчТз;
КонецФункции

|
1 Ненавижу 1С
 
гуру
20.01.15
11:07
есть ЗаполнитьЗначенияСвойств
2 DCKiller
 
20.01.15
11:07
Запросом внутреннее соединение сделать - не?
3 Peltzer
 
20.01.15
11:08
(2) Только не внутреннее, а полное.
4 DCKiller
 
20.01.15
11:12
(3) нет, лучше левое с условием ГДЕ... ЕСТЬ NULL
5 LivingStar
 
20.01.15
11:12
(2)(3) Как запросом. подскажете? То есть есть одна тз передается в функцию, делаю запрос и выгружаю в ещё одну Тз. Из за неудобной структуры данных, запросом понял что не получится. Второй запрос что получает вторую ТЗ никак не связан с первым. Там отбор по одному документу в котором может не быть Счета. А в первом запросе отбор другого документа где должен быть счет. То есть по счету никак не связать эти 2 запроса.
6 LivingStar
 
20.01.15
11:13
(4) Ну и как первый запрос будет связан со вторым???? Так как он может быть только и связан по этому полю которое вы предлагаете задать в NULL.
7 XLife
 
20.01.15
11:14
(5) понос...
8 palpetrovich
 
20.01.15
11:17
(6) тебе там предложили загрузить твои ТЗ в ВТ и уже их соединять в запросе
но, судя по (5) есть подозрение что,  скорее всего, надо делать все запросом изначально
9 LivingStar
 
20.01.15
11:18
не сделать запросом на сколько я понял вообще

эти запросы не связанны!!! Не правильная структура
10 yukon
 
20.01.15
11:20
Функция ИсключитьОплаченныеСчета(Тз)
    
    Запрос       = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка) КАК СчетСсылка
    |ПОМЕСТИТЬ Тз
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    Тз.СчетСсылка
    |ИЗ
    |    &Тз КАК Тз
    |;
    |
    |ВЫБРАТЬ
    |    ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетНаОплату КАК СчетНаОплату,
    |    ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.Ссылка       КАК Ссылка
    |ИЗ
    |    Документ.ПоступлениеНаРасчетныйСчет.РасшифровкаПлатежа КАК ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа
    |ГДЕ
    |    НЕ ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетНаОплату В (ВЫБРАТЬ РАЗЛИЧНЫЕ СчетСсылка из Тз)";
    Запрос.УстановитьПараметр("Тз",Тз);
    Возврат Запрос.Выполнить().Выгрузить();
    
КонецФункции
11 yukon
 
20.01.15
11:23
+ (10) Надо пересматривать твой подход к названиям переменных, черт ногу сломит в ОплСч, ТзОплСч, СтрТз. Ресурс клавиатуры бережешь?
12 palpetrovich
 
20.01.15
11:25
(10) хрень какая-то :)
13 LivingStar
 
20.01.15
11:32
(1) Как работают эти заполнить значения свойств? Я попробовал но в таблицу ничего не занеслось, нужно обязательно типизировать колонки?
|
Функция ИсключитьОплаченныеСчета(Тз)
    ИсклОплСчТз  = Новый ТаблицаЗначений;
    ИсклОплСчТз.Колонки.Добавить("ЗаказСсылка");
    ИсклОплСчТз.Колонки.Добавить("ЗаказОрганизация");
    ИсклОплСчТз.Колонки.Добавить("ЗаказНомер");
    ИсклОплСчТз.Колонки.Добавить("СчетСсылка");             
    ИсклОплСчТз.Колонки.Добавить("СчетДата");
    ИсклОплСчТз.Колонки.Добавить("СчетНомер");
    ИсклОплСчТз.Колонки.Добавить("ЗаказИсполнитель");
    ИсклОплСчТз.Колонки.Добавить("ЗаказИсполнительИНН");
    ИсклОплСчТз.Колонки.Добавить("ЗаказДатаВремяПодачиТранспорта");
    ИсклОплСчТз.Колонки.Добавить("НомерВидаРасхода");
    ИсклОплСчТз.Колонки.Добавить("ОстатокКОплате");
    ИсклОплСчТз.Колонки.Добавить("ОдобреноРанее");
    ИсклОплСчТз.Колонки.Добавить("ОдобрениеВТекущемФП");
    ИсклОплСчТз.Колонки.Добавить("Примечание");
    ИсклОплСчТз.Колонки.Добавить("Просрочен");
    ИсклОплСчТз.Колонки.Добавить("ЮрЛицо");
    ИсклОплСчТз.Колонки.Добавить("ЮрЛицоИНН");
    ИсклОплСчТз.Колонки.Добавить("ЗаказСуммаИсполнитель");
    Запрос       = Новый Запрос;
    Запрос.Текст = "
        |ВЫБРАТЬ
        |    ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетНаОплату КАК СчетНаОплату,
        |    ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.Ссылка       КАК Ссылка
        |ИЗ
        |    Документ.ПоступлениеНаРасчетныйСчет.РасшифровкаПлатежа КАК ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа
        |ГДЕ
        |    НЕ ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетНаОплату = ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка)
        |
        |УПОРЯДОЧИТЬ ПО
        |    Ссылка";
    ТзОплСч = Запрос.Выполнить().Выгрузить();
    Для Каждого СтрТз Из Тз Цикл
        ОплСч = ТзОплСч.Найти(СтрТз.СчетСсылка, "СчетНаОплату");
        Если ОплСч = Неопределено Тогда
            ЗаполнитьЗначенияСвойств(ИсклОплСчТз,СтрТз);            
        КонецЕсли;
    КонецЦикла;
    Возврат ИсклОплСчТз;
КонецФункции
14 LivingStar
 
20.01.15
11:33
(10) что то ухитренное, возможно и сработающее, но нужно доделывать, пока не понимаю как
15 Fish
 
20.01.15
11:34
(13) Это надо СП читать:
"Глобальный контекст (Global context)
ЗаполнитьЗначенияСвойств (FillPropertyValues)
Синтаксис:

ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>, <ИсключаяСвойства>)
Параметры:

<Приемник> (обязательный)

Тип: Произвольный.
Значение, чьи свойства будут заполнены значениями соответствующих свойств <Источника>.
<Источник> (обязательный)

Тип: Произвольный.
Значения свойств данного объекта будут установлены в соответствующие свойства <Приемника>.
<СписокСвойств> (необязательный)

Тип: Строка.
Список имен свойств, разделенный запятыми, которые необходимо заполнить.
Если свойства не указаны, то копируются только те, которые представлены и в <Источнике> и в <Приемнике>.
Если свойства указаны, то они обязательно должны присутствовать в обоих объектах.
Если в <Источнике> или <Приемнике> заданное свойство отсутствует, то будет вызвано исключение.
<ИсключаяСвойства> (необязательный)

Тип: Строка.
Список имен свойств, разделенный запятыми, которые необходимо исключить из заполнения.
Описание:

Копирует значения свойств <Источника> в свойства <Приемника>. Сопоставление производится по именам свойств.
Если указаны копируемые свойства, то в заполнении участвуют только они, параметр <ИсключаяСвойства> игнорируется.
В противном случае, если указан параметр <ИсключаяСвойства>, то свойства перечисленные в нем, исключаются из обработки.

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

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. "
16 LivingStar
 
20.01.15
11:36
(10) дело в том что из второго запроса нужно выбрать строки по идее которых там нет! Идет выборка по платежным поручениям, которых нет у счета. Говорю запросом не выйдет. Во тором запросе счета по которым нет платежных поручений, соответственно и запросы быть не может, так как нет связи. Не правильная структура данных. Приходится обходить её, не совсем верными методами.
17 LivingStar
 
20.01.15
11:38
(15) я просто делаю копирование в новую таблицу строку, хочу так в цикле собрать строки, но не копирует, нужно тип задавать колонок обязательно?
18 Fish
 
20.01.15
11:42
(17) Емнип, необязательно. Только зачем ты во второй таблице колонки руками создаёшь? Для этого же есть метод СкопироватьКолонки()
19 vicof
 
20.01.15
11:43
(17) Клювом не щелкай,
"Если ОплСч = Неопределено Тогда
            ЗаполнитьЗначенияСвойств(ИсклОплСчТз,СтрТз);            
        КонецЕсли;"
ИсклОплСчТз - это у тебя таблица значений, а не строка таблицы.
20 Drac0
 
20.01.15
11:43
"Идет выборка по платежным поручениям, которых нет у счета."

В чем проблема такой выборки запроса?

"Во тором запросе счета по которым нет платежных поручений, соответственно и запросы быть не может, так как нет связи."

В чем проблема такой выборки запроса?

Ты про NULL слышал?
21 LivingStar
 
20.01.15
12:01
(20) во втором запросе выборка NULL у которого есть счет? Такого не пойму
22 LivingStar
 
20.01.15
12:02
(20) null можно выбирать у чего то, а не NULL с чем то
23 LivingStar
 
20.01.15
12:04
(19) и как в этом случае???? добавить строку у ИсклОплСчТз а ей переносить значения строк?
24 vicof
 
20.01.15
12:04
(22) надо запомнить)))
25 vicof
 
20.01.15
12:04
(23) Ты гений)))
26 yukon
 
20.01.15
12:07
(16) И в чем проблема-то?

Ты вот лучше посмотри, что у тебя в запросе из (0) делается - выбираются ВСЕ документы из базы с заполненным реквизитом СчетНаОплату. Такая реализация гарантированно ведет к деградации производительности.

Подумай какие условия дополнительно (из Тз к примеру) ты можешь добавить в запрос. Возможно это поможет решить твою задачу оптимальным образом.
27 LivingStar
 
20.01.15
12:10
(25) спасибо!

    ТзОплСч = Запрос.Выполнить().Выгрузить();
    Для Каждого СтрТз Из Тз Цикл
        ОплСч = ТзОплСч.Найти(СтрТз.СчетСсылка, "СчетНаОплату");
        Если ОплСч = Неопределено Тогда
            НоваяСтр = ИсклОплСчТз.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтр,СтрТз);            
        КонецЕсли;
    КонецЦикла;
    Возврат ИсклОплСчТз;
КонецФункции
28 LivingStar
 
20.01.15
12:12
(26) согласен стоит подумать
29 Ненавижу 1С
 
гуру
20.01.15
12:12
(22) считаю гениально
30 Drac0
 
20.01.15
12:35
(29) Я над этой фразой уже 10 минут медитирую. Думаю, скоро постигну дзен.
31 vicof
 
20.01.15
12:39
(29) Кличко-стайл
32 DrZombi
 
гуру
20.01.15
12:43
(13) А кто будет Строку в ТЗ дописывать?
33 LivingStar
 
20.01.15
12:45
(32) в (27)
34 Бертыш
 
20.01.15
12:49
(22) Это у Вас что то с чем то получилось
35 LivingStar
 
20.01.15
12:51
(34) это как я понимаю структуру данный, завороченная она
36 Бертыш
 
20.01.15
12:53
(35) А я тупой одинэсник. Я ничего не понимаю. Просто тупо пишу работающий код.
37 Drac0
 
20.01.15
13:00
(36) Ты, похоже, не имеешь представления о том, кто такой топикстартер? :) Знаменитый кадр на мисте )))
38 LivingStar
 
20.01.15
13:11
(36) Надо было быстро сделать то что просили. Подстроиться построиться под имеющуюся структуру. А так нужно день посвятить её анализу, начертить блок схему. Что имеется, и как это должно было бы было правильно. На следующие дни править, писать обработки для перенося данных. И ещё возможно много чего. Пока вот так на данный момент.
39 Drac0
 
20.01.15
13:12
(38) Надо было просто за 10 минут написать корректный запрос. Просто ты этого не умеешь.
40 LivingStar
 
20.01.15
13:15
(39) возможно, но я буду учиться
41 Drac0
 
20.01.15
13:18
(40) Не, не будешь. 10 лет на форуме, а вопросы как у новичка. Причем повторяются порой :)
42 LivingStar
 
20.01.15
20:20
(41) Буду!

В задаче в (0) есть Док1, у него есть ссылка на Док2
Док2 является ссылкой в Док3, но Док3 никак не связан с Док1

Нужно выбрать Док1 соответственно и Док2, где Док2 отсутствует в Док3

я думал это не возможно, но если можно хочу узнать как, пока не понял вижу что
43 LivingStar
 
20.01.15
20:30
(42+) и сам Док2 никак не связан с Док3, он просто является ссылкой в Док3
45 XLife
 
20.01.15
20:46
(42) есть Док1, у него есть ссылка на Док2. Док2 является ссылкой в Док3, но Док3 никак не связан с Док1

закусывай...
46 LivingStar
 
21.01.15
07:36
(45) ну по Док2 связан да, все равно не доходит, надо подумать ещё
47 LivingStar
 
21.01.15
07:37
(45) ну намекните что за выборка в таком случае? пока голова загружена другими задачами
48 Бертыш
 
21.01.15
14:52
(38) 80 процентов моей работы на работе это анализ, процентов 5 кодирование, 15 процентов административные вопросы

(40) Вот зачем Вам учиться? Выучитесь и будете решать задачи быстрее недоученных, зарабатывая меньше чем они. Оплата то у нас почасовая.
49 Drac0
 
21.01.15
15:18
(47) Я тебе уже про NULL намекал.
50 palpetrovich
 
21.01.15
18:14
Если я правильно понял и есть Док1.Док2 и Док3.Док2, то можно примерно так:

ВЫБРАТЬ
    Док1.Ссылка,
    Док1.Док2
ИЗ
    Документ.Док1 КАК Док1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Док3 КАК Док3
        ПО (НЕ Док1.Док2 В
                    (ВЫБРАТЬ
                        Док3.Док2
                    ИЗ
                        Документ.Док3 КАК Док3
                    ГДЕ
                        НЕ Док3.Док2 = ЗНАЧЕНИЕ(Документ.Док2.ПустаяСсылка)))

СГРУППИРОВАТЬ ПО
    Док1.Ссылка,
    Док1.Док2

зы: на оптимальность не претендую, но работать будет :)
51 LivingStar
 
22.01.15
11:51
(50) Спасибо! Нужно будет попробовать!!! Что то сильно закручено!!!

Пока не совсем понял конечно.

(48) Почасовая на словах. На деле же по факту. И я в таких местах давно не работаю. Только Фиксированный оклад!
52 LivingStar
 
22.01.15
11:52
(51+) Почасовая если, то оцениваться она может в 3 часа, а выполняться день.