Имя: Пароль:
1C
 
Сохранение ТЧ в регистр
,
0 myr4ik07
 
29.10.14
12:09
Добрый. По мотивам Двойная запись по регистру в цикле движения
так и не смог разболятся, будьте добры пример ибо не знаю на правильном пути...
Сделал
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПоступлениеТоваровУслуг.СерийныеНомера.(
        |        Ссылка,
        |        НомерСтроки,
        |        КлючСвязи,
        |        СерийныйНомер
        |    )
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг";

и не могу понять, что делать с КлючСвязи.
Вы же понимаете как тяжело новичку думать не зная на правильно ли пути...
1 Looser-1c
 
29.10.14
12:10
Если посмотришь в ТЧ Товары, там тоже увидьш поле КлючСвязи....
Продолжать?
2 Ёпрст
 
29.10.14
12:11
Ё...
Ключ связи одинаков в ТЧ товары и в ТЧ серийные номера, по нему ставится в соответствие Номенклатура и серийный нумер.
Усё.
3 myr4ik07
 
29.10.14
12:11
или это нужно соеденить соединением в запросе две ТЧ Товары и Серийные номера, связать по Номенклатура-КлючСвязи, а потом условием добавить, что ТЧ.Товары.Номенклатура=ТЧ.СерийныеНомера.КлючСвязи?
4 myr4ik07
 
29.10.14
12:11
(1) да ) будьте добры "разжевать" я бы дуже был бы благодарен
5 myr4ik07
 
29.10.14
12:12
(2) я вот понимаю вас ) только не понимаю это сначала запрос а потом если тогда или можно сразу если тогда без запроса к ТЧ?
6 Looser-1c
 
29.10.14
12:13
(5) один запрос с внутренним соединением к обоим ТЧ - рулит не по-дестки
7 myr4ik07
 
29.10.14
12:13
Не могу понять, то правильно ли я сделал, что выгрузил колону СерийныеНомера с ТЧ Сер.Номера?
8 myr4ik07
 
29.10.14
12:17
(6) вот не знаю поняли бы вы что вы написали когда были новичокм в этом деле
9 myr4ik07
 
29.10.14
12:18
типа так
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПТиУСерийныеНомера.КлючСвязи,
        |    ПТиУТовары.КлючСвязи КАК КлючСвязи1
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПТиУТовары,
        |    Документ.ПоступлениеТоваровУслуг.СерийныеНомера КАК ПТиУСерийныеНомера";
10 myr4ik07
 
29.10.14
12:19
ну
ВЫБРАТЬ
        |    ПТиУСерийныеНомера.КлючСвязи,
        |    ПТиУТовары.КлючСвязи КАК КлючСвязи1
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПТиУТовары
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.СерийныеНомера КАК ПТиУСерийныеНомера
        |        ПО ПТиУТовары.КлючСвязи = ПТиУСерийныеНомера.КлючСвязи
11 myr4ik07
 
29.10.14
12:23
есть пример в интернетах? Можете "тыкнуть" носом?
12 Ёпрст
 
29.10.14
12:24
тип того, только нужно выбирать номенклатуру и серийный номер
13 Ёпрст
 
29.10.14
12:24
а не ключ связи
14 myr4ik07
 
29.10.14
12:26
(13) почему не ключи? Раньше же мне за ключи говорили, почему теперь ключи не то?
15 Enders
 
29.10.14
12:26
(9) Типо, не совсем:

Пишу на временных, что бы было понятнее.
Выбрать
ПТиУТовары.Ссылка,
ПТиУТовары.Номенклатура,
ПТиУТовары.КлючСвязи,
ПТиУТовары.Количество //и кто его знает какие ещё поля тебе нужны
Поместить Товары
ИЗ  
Документ.ПоступлениеТоваровУслуг.Товары как ПТиУТовары
Где ПТиУТовары.Ссылка = &Ссылка

;
Выбрать
ПТиУСерийныеНомера.Ссылка,
ПТиУСерийныеНомера.КлючСвязи,
ПТиУСерийныеНомера.СерийныйНомер
Поместить Серийники
ИЗ  
Документ.ПоступлениеТоваровУслуг.СерийныеНомера как ПТиУСерийныеНомера
Где ПТиУСерийныеНомера.Ссылка = &Ссылка
;
ВЫБРАТЬ
Товары.Ссылка,
Товары.Номенклатура,
Товары.КлючСвязи,
Товары.Количество, //и кто его знает какие ещё поля тебе нужны
Серийники.СерийныйНомер
Из
Товары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Серийники
ПО Товары.Ссылка = Серийники.Ссылка
И Товары.КлючСвязи = Серийники.КлючСвязи
16 myr4ik07
 
29.10.14
12:30
(15) ох емае, а думалось так легко, а зачем МенеджерыВТ? Можно было бы это в одном запросе сделать?
17 myr4ik07
 
29.10.14
12:33
(15) я постараюсь не задать еще 10 вопросов по поводу ВТ ))) и почему, зачем, для чего ) очень надеюсь, что разберусь, благодарю
18 Ёпрст
 
29.10.14
12:33
(14) Завязывай ужо с травой.
Тебе нужно в запросе выбрать Номенклатуру с одной таблички и серийный номер с другой, объединив таблички соединением по ключу связи.
19 myr4ik07
 
29.10.14
12:37
:) как бы шо то получается ) не успел написать )
20 myr4ik07
 
29.10.14
12:37
пример очень хороший выше привели, с примером легче
21 myr4ik07
 
29.10.14
12:40
о, как бы так?

    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПоступлениеТоваровУслугТовары.Ссылка,
        |    ПоступлениеТоваровУслугТовары.Номенклатура,
        |    ПоступлениеТоваровУслугТовары.КлючСвязи,
        |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка КАК Ссылка1,
        |    ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи КАК КлючСвязи1,
        |    ПоступлениеТоваровУслугСерийныеНомера.СерийныйНомер
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.СерийныеНомера КАК ПоступлениеТоваровУслугСерийныеНомера
        |        ПО ПоступлениеТоваровУслугТовары.КлючСвязи = ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи
        |ГДЕ
        |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка = &Ссылка
        |    И ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка";
22 Enders
 
29.10.14
12:42
(21) Уже лучше, но соединение тоже надо делать по ссылке.
ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслугСерийныеНомера.Ссылка
И
ПоступлениеТоваровУслугТовары.КлючСвязи = ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи

И в ГДЕ оставить только  ПоступлениеТоваровУслугСерийныеНомера.Ссылка = &Ссылка
23 Ёпрст
 
29.10.14
12:42
(21) типа того, только достаточно
      "ВЫБРАТЬ
        |    ПоступлениеТоваровУслугТовары.Номенклатура,
        |    ПоступлениеТоваровУслугСерийныеНомера.СерийныйНомер
        |ИЗ  ....

Остальные поля то тебе зачем ?
24 Enders
 
29.10.14
12:44
(23) Судя по (0), там ещё кол-во надо, что бы можно было обходить результат запроса и записывать его в движения и не искать нужные данные ещё раз в ТЧ товары.
25 Ёпрст
 
29.10.14
12:45
(24) да хрен его мама знает, зачем там вообще регистр сдался
:)
26 myr4ik07
 
29.10.14
12:47
(25) та хочу учет по серийным номерам вести, вот и добавляю в новый регистр измерения Номенклатура, СерийныеНомера, а ресурс Количество
Вот движение для регистра будет
        Для Каждого СтрокаТЧ Из Товары Цикл            
            Движение = Движения.УчетСерийныхНомеров.Добавить();
            Движение.Период = Дата;
            Движение.Склад = СкладОрдер;
            Движение.Номенклатура = СтрокаТЧ.Номенклатура;
            Движение.Количество = СтрокаТЧ.Количество;
        КонецЦикла;
27 Ёпрст
 
29.10.14
12:49
(25) тогда в запрос добавляй
ВЫБРАТЬ
        |    ПоступлениеТоваровУслугТовары.Количество*ПоступлениеТоваровУслугТовары.Коэффициент,
28 Enders
 
29.10.14
12:49
(26) это я видел в прошлой теме.
Вот и выбирай сразу все нужные данные в запросе
И вместо Для Каждого СтрокаТЧ Из Товары Цикл
У тебя будет


РезультатЗапроса = Запрос.выполнить().Выгрузить();
Для Каждого СтрокаТЧ Из РезультатЗапроса Цикл
29 myr4ik07
 
29.10.14
12:49
(27) а зачем?
30 Enders
 
29.10.14
12:50
(29) Зачем что? выбирать количество или умножать на коэффициент?
31 myr4ik07
 
29.10.14
12:51
(28) типа то ?

    Движения.УчетСерийныхНомеров.Записывать = Истина;
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПоступлениеТоваровУслугТовары.Ссылка,
        |    ПоступлениеТоваровУслугТовары.Номенклатура,
        |    ПоступлениеТоваровУслугТовары.КлючСвязи,
        |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка КАК Ссылка1,
        |    ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи КАК КлючСвязи1,
        |    ПоступлениеТоваровУслугСерийныеНомера.СерийныйНомер
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.СерийныеНомера КАК ПоступлениеТоваровУслугСерийныеНомера
        |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслугСерийныеНомера.Ссылка
        |            И ПоступлениеТоваровУслугТовары.КлючСвязи = ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи
        |ГДЕ
        |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка = &Ссылка";
        
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Результат = Запрос.Выполнить().Выгрузить(;
    Для Каждого СтрокаТЧ Из Результат Цикл            
            Движение = Движения.УчетСерийныхНомеров.Добавить();
            Движение.Период = Дата;
            Движение.Склад = СкладОрдер;
            Движение.Номенклатура = СтрокаТЧ.Номенклатура;
            Движение.Количество = СтрокаТЧ.Количество;
        КонецЦикла;
    КонецЦикла;
32 myr4ik07
 
29.10.14
12:51
(30) да умножение на кооф.для чего это применять?
33 Enders
 
29.10.14
12:55
(31) Количество в запросе не выбрал
Движение.Количество = СтрокаТЧ.Количество
(32) Например по товару А, у вас учет ведётся в штуках. А к вам приехали упаковки. одна упаковка = 100 шт.
Вот коэффициент у тебя будет = 100 и учетное кол-во соответственно тоже 100.
34 Enders
 
29.10.14
12:55
+(33) Ну это если у вас правильно настроены единицы измерения)
35 myr4ik07
 
29.10.14
12:57
(33) ааа ) ну у нас "переводим" в шт.

и кооф. мы не используем )
36 myr4ik07
 
29.10.14
12:58
(33) есть, выбрал ) (28) а вот тут
РезультатЗапроса = Запрос.выполнить().Выгрузить();
то значит

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
это уже не нужно?
37 Enders
 
29.10.14
13:01
(36)
Ну это уже от того как нравится. Можна результат запроса выгрузить в ТЗ и обойти ТЗ циклом

РезультатЗапроса = Запрос.выполнить().Выгрузить();
Для Каждого СтрокаТЧ Из РезультатЗапроса Цикл


А можно Результат запроса запихнуть в выборку и выборку обходить циклом
ВыборкаДетальныеЗаписи = Запрос.выполнить().Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл


В чем разница этих двух методов можно найти в инете.
Но для данной задачи, однох..всё равно)
38 myr4ik07
 
29.10.14
13:47
(37) благодарю тебя ) очень благодарю, спасибо за примеры, спасибо за разъяснения, увы без них не могу понять смысл )
39 myr4ik07
 
29.10.14
13:58
Будьте добры, гляньте "одним оком"
    Движения.УчетСерийныхНомеров.Записывать = Истина;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПоступлениеТоваровУслугТовары.Ссылка,
    |    ПоступлениеТоваровУслугТовары.Номенклатура,
    |    ПоступлениеТоваровУслугТовары.КлючСвязи,
    |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка КАК Ссылка1,
    |    ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи КАК КлючСвязи1,
    |    ПоступлениеТоваровУслугСерийныеНомера.СерийныйНомер,
    |    ПоступлениеТоваровУслугТовары.Количество
    |ИЗ
    |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.СерийныеНомера КАК ПоступлениеТоваровУслугСерийныеНомера
    |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслугСерийныеНомера.Ссылка
    |            И ПоступлениеТоваровУслугТовары.КлючСвязи = ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи
    |ГДЕ
    |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для Каждого СтрокаТЧ Из Результат Цикл            
        Движение = Движения.УчетСерийныхНомеров.Добавить();
        Движение.Период = Дата;
        Движение.Склад = СкладОрдер;
        Движение.Номенклатура = СтрокаТЧ.Номенклатура;
        Движение.Количество = СтрокаТЧ.Количество;
        Если СтрокаТЧ.КлючСвязи = СтрокаТЧ.КлючСвязи1 Тогда
            Движение.СерийныеНомера = СтрокаТЧ.СерийныйНомер;
        КонецЕсли;
    КонецЦикла;
в итоге получаю в регистр
http://gigaline.no-ip.biz/owncloud/public.php?service=files&t=efbb0ec518ac20c639389a7e6bbc21a6
не могу понять, количество разве не по 1шт должно быть?
(У меня одна номенклатура только с двумя СН провожу)
40 Enders
 
29.10.14
14:04
(39) Всё верно)
А почему по 1шт, почему не 0.5 и 1.5?)

Если у вас на 1 товар бывает несколько серийников, и вам надо разбить кол-во по этим серийникам, то это уже другая задача. И вам надо знать правило по какому разбивать кол-во)

П.с.   Если СтрокаТЧ.КлючСвязи = СтрокаТЧ.КлючСвязи1 Тогда
       КонецЕсли;
Лишнее. Это условие у тебя выполняется всегда, так как в запросе у тебя связь по-этому полю.
41 myr4ik07
 
29.10.14
14:30
(40) благодарю ) все понятно, ну в итоге количество в отчете будет же 2шт из этого движения?)
42 myr4ik07
 
29.10.14
14:33
(40) типа ты имеешь ввиду
ПоступлениеТоваровУслугТовары.КлючСвязи = ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи

вот тут связь? И значит условие уже не нужно?
43 Enders
 
29.10.14
14:34
(41) Если отчет по этому регистру, то по каждому серийнику 2 штуки, в итоге 4ри)
44 Enders
 
29.10.14
14:35
(42) ага, эту) Да, не нужно, оно всегда выполняется
45 myr4ik07
 
29.10.14
14:40
(43) ану "глянь" на мои мысли )) в итоге я хочу получить отчет по движением (а это Документы ПТиУ, Перемещение Товаров и может быть подключу Реализация товаров) серийных номеров т.е., что бы смотреть где и какой серийный номер находиться (у нас 7 магазинов)
46 myr4ik07
 
29.10.14
14:41
(44) шо ты за книги читаешь ) что так свободно владеешь информацией в этом русле )) Поделись пожалуйста )
47 hhhh
 
29.10.14
14:48
(46) куда программиста дели? Бухгалтера программы пишут. Какой-то сюрреализм.
48 myr4ik07
 
29.10.14
14:51
(47) по вашим словами я должен только заниматься бухгалтерией? Мне нравится разработка в этом русле 1С, мне нравится разбираться почему я должен это оставлять? Мне интересно это и не собираюсь останавливаться, что за мнение такое глупое?!
49 hhhh
 
29.10.14
14:54
(48) да, нет, конечно. Если нравится, не останавливайтесь.
50 myr4ik07
 
29.10.14
14:55
(47) вы прожили жизнь и такие выводы делаете, печаль, почему человеку не делать то, что интересно, почему не развиваться?! Странно ... откуда такие выводы
51 myr4ik07
 
29.10.14
14:55
(49) спасибо, буду стараться
52 Enders
 
29.10.14
15:10
(45)Если надо просто видеть какие серийники куда приходили, то кол-во не надо.
Если надо видеть по какому серийнику сколько пришло и сколько ушло, то надо разработать правило разбивки кол-ва по серийникам, когда в одно поступлении один товар с разными серийниками. Самый простой - это делить на кол-во серийников. Если надо, тоже могу накидать пример.

(46) Может удивлю, но не читал книг по 1С.
В самом начале посмотрел бесплатные курсы Чистова. Остальное - на работе+форумы. За два года успел уже кое-что выучить.
53 myr4ik07
 
29.10.14
15:18
(52) та да ) мне колич-ство как бы пока не нужно, нужно только знать типа "ану глянь по серийному где такая мобилка находиться". Ну если не тяжело можешь пример привести потому как очень интересно как это по логике реализовать, авось по остаткам будет мало и коли-ство нужно учитывать )

Ты молодец. И объясняешь понятно, исчерпано ) можна коль чо "стырю" твой ел. адрес почты ) да понадоедать тебе )?!
54 myr4ik07
 
29.10.14
15:19
(52) у нас на мисте тяжело бывает понять, что рекомендуют ) ну наверное не всем тяжело но мне пока тяжело, а так конечно всем спасибо отвечащим, помогают норм добыть результат )
55 Enders
 
29.10.14
15:34
(53) Надеюсь в профиле твой адрес, написал туда)

По поводу примера:

Вариант без изменения запроса:

Движения.УчетСерийныхНомеров.Записывать = Истина;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПоступлениеТоваровУслугТовары.Ссылка,
    |    ПоступлениеТоваровУслугТовары.Номенклатура,
    |    ПоступлениеТоваровУслугТовары.КлючСвязи,
    |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка КАК Ссылка1,
    |    ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи КАК КлючСвязи1,
    |    ПоступлениеТоваровУслугСерийныеНомера.СерийныйНомер,
    |    ПоступлениеТоваровУслугТовары.Количество
    |ИЗ
    |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.СерийныеНомера КАК ПоступлениеТоваровУслугСерийныеНомера
    |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслугСерийныеНомера.Ссылка
    |            И ПоступлениеТоваровУслугТовары.КлючСвязи = ПоступлениеТоваровУслугСерийныеНомера.КлючСвязи
    |ГДЕ
    |    ПоступлениеТоваровУслугСерийныеНомера.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для Каждого СтрокаТЧ Из Результат Цикл            
//Ищем количество серийников по номенклатуре
Струк=Новый Структура;
Струк.Вставить("Номенклатура",СтрокаТЧ.Номенклатура);
НайденныеСтроки = ТоварыВзаказ.НайтиСтроки(Струк);
КолВоНайденныхСтрок = НайденныеСтроки.Количество();
//
Движение = Движения.УчетСерийныхНомеров.Добавить();
        Движение.Период = Дата;
        Движение.Склад = СкладОрдер;
        Движение.Номенклатура = СтрокаТЧ.Номенклатура;
        Движение.Количество = СтрокаТЧ.Количество/КолВоНайденныхСтрок;
        Движение.СерийныеНомера = СтрокаТЧ.СерийныйНомер;

    КонецЦикла;


Что плохо в данном случае:
1. Тратится время на поиск количества серийников в каждом проходе в цикле.
2. Не учитывается дробное деление. То есть, пришел товар А с кол-вом 1шт., а серийника - 3. Тогда в регистр попадёт три записи с кол-вом 0,33, что в сумме = 0,99, а не единица.
3. Разбивка количества идёт наугад. По факту ты не знаешь сколько и каких приехало.

Соответственно лучше это посчитать в запросе и делать через выборку и обход результата запроса по группировкам. Тогда ты сможешь избежать первой и второй проблемы. А вот третья, всё равно, останется.
56 myr4ik07
 
29.10.14
15:42
(55) отправил ответ )

ок, буду знать, возьму на вооружение