Имя: Пароль:
1C
1С v8
Вытянуть значение из Регистра в строку табличной части документа
0 anagk
 
16.06.22
14:40
и вновь зупутался. Помогайте. Есть (периодический) Регистр куда записывается Фирма, Склад, Номенклатура и Значение.
1 Ryzeman
 
16.06.22
14:42
И?... Можно запросом, можно менеджером. Вопрос в чём?
2 anagk
 
16.06.22
14:43
Нужно вытянуть в Документе в Строку Табличной части это значение на последнюю дату, для этой номенклатуры, для этого Склада
&НаСервере
Процедура ЗапросКол_Т ()
//****160622
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РегистрПоказателиСрезПоследних.Период КАК Период,
        |    РегистрПоказателиСрезПоследних.Номенклатура КАК Номенклатура,
        |    РегистрПоказателиСрезПоследних.Кво_П КАК Кво_П
        |ИЗ
        |    РегистрСведений.РегистрПоказатели.СрезПоследних КАК РегистрПоказателиСрезПоследних";
    
        Результат = Запрос.Выполнить();
    Выборка = ЭтотОбъект.Продукция;
    ВыборкаКол = Результат.Выбрать();
    Пока ВыборкаКол.Следующий() Цикл
        //Пока Выборка.Сле() Цикл
            Если ВыборкаКол.Номенклатура = Выборка Тогда
                Выборка.Кол_Р = ВыборкаКол.Кол_П;
            иначе
                Сообщить("Нет значения");
            КонецЕсли;
        //КонецЦикла;
    КонецЦикла;
            
КонецПроцедуры
3 anagk
 
16.06.22
14:43
пока мне только Сообщает)
4 Ёпрст
 
гуру
16.06.22
14:44
(0) Следующий
5 Ёпрст
 
гуру
16.06.22
14:45
Если ВыборкаКол.Номенклатура = Выборка.Вася Тогда
6 Ёпрст
 
гуру
16.06.22
14:45
Подумай над этим
7 anagk
 
16.06.22
14:46
Пока ВыборкаКол.Следующий() Цикл
        Пока Выборка.Следующий() Цикл
            Если ВыборкаКол.Номенклатура = Выборка.Номенклатура итд и тп(не получается) Тогда
                Выборка.Кол_Р = ВыборкаКол.Кол_П;
            иначе
                Сообщить("Нет значения");
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
8 Ryzeman
 
16.06.22
14:48
|ИЗ
|    РегистрСведений.РегистрПоказатели.СрезПоследних(, Номенклатура = &МояНоменклатура И Склад = &МойСклад) КАК РегистрПоказателиСрезПоследних";

Запрос.УстановитьПараметр("МойСклад", ТвойСклад);
Запрос.УстановитьПараметр("МояНоменклатура ", ТвояНоменклатура);

З.Ы. Семёрочник?
9 anagk
 
16.06.22
14:49
ругаеться на
Выборка = ЭтотОбъект.Продукция;
нет такого объекта
10 anagk
 
16.06.22
14:49
(8) закоренелый)))
11 Ryzeman
 
16.06.22
14:51
(10) ясно. Покури запросы, любой учебник по SQL годится, а так же виртуальные таблицы. Это всё намного быстрее и лучше работает чем попытка выбрать и обойти всё нахрен)
12 Ёпрст
 
гуру
16.06.22
14:57
(7)

Если ВыборкаКол.Номенклатура = Выборка Тогда //вот этим бредовым условием, что хотел проверить ?
13 Ryzeman
 
16.06.22
14:58
(12) Да не ругайся, человек к чёрным запросам привык)
14 anagk
 
16.06.22
15:06
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РегистрПоказателиСрезПоследних.Период КАК Период,
        |    РегистрПоказателиСрезПоследних.Номенклатура КАК Номенклатура,
        |    РегистрПоказателиСрезПоследних.Кво_П КАК Кво_П
        |ИЗ
        |    РегистрСведений.РегистрПоказатели.СрезПоследних(, Номенклатура = &МояНоменклатура И Склад = &МойСклад) КАК РегистрПоказателиСрезПоследних";

        Запрос.УстановитьПараметр("МойСклад", Объект.СтруктурнаяЕдиница);
        Запрос.УстановитьПараметр("МояНоменклатура ", Объект.Продукция);

        Результат = Запрос.Выполнить();
    Выборка = ЭтотОбъект.Продукция;
    ВыборкаКол = Результат.Выбрать();
    Пока ВыборкаКол.Следующий() Цикл
        Пока Выборка.Следующий() Цикл
            Если ВыборкаКол.Номенклатура = Выборка.Номенклатура Тогда
                Выборка.Кол_Р = ВыборкаКол.Кво_П;
            иначе
                Сообщить("Нет значения");
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
15 anagk
 
16.06.22
15:08
все равно пришел к тому же. Не задано значения параметру "МояНоменклатура"
16 Ryzeman
 
16.06.22
15:10
у тебя пробел после МояНоменклатура...
17 Ryzeman
 
16.06.22
15:11
Что такое Объект.Продукция? Табличная часть? У тебя это не будет работать
18 anagk
 
16.06.22
15:13
с пробелом разобрался)))
19 anagk
 
16.06.22
15:13
(17) так я ж за это и прошу помощи...не знаю как обратиться к ТЧ
20 Ryzeman
 
16.06.22
15:14
|    РегистрСведений.РегистрПоказатели.СрезПоследних(, Номенклатура В (&СписокНоменклатуры) И Склад = &МойСклад) КАК РегистрПоказателиСрезПоследних";
        Запрос.УстановитьПараметр("СписокНоменклатуры", Объект.Продукция.ВыгрузитьКолонку("Номенклатура"));
21 Ryzeman
 
16.06.22
15:14
А вообще чует моё сердце всё это через задницу и тебе на самом деле достаточно внутреннее соединение в запросе сделать)
22 Мультук
 
гуру
16.06.22
15:18
(19) >> так я ж за это и прошу помощи...не знаю как обратиться к ТЧ


Набрал в яндексе волшебные слова:

1C УФ обойти табличную часть цикл

Получил ответ:

Для Каждого СтрокаТЧ Из Объект.Товары Цикл

КонецЦикла;
23 anagk
 
16.06.22
15:58
а воз и ныне там(
&НаСервере
Процедура ЗапросКол_Т ()
//****160622
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РегистрПоказателиСрезПоследних.Период КАК Период,
        |    РегистрПоказателиСрезПоследних.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
        |    РегистрПоказателиСрезПоследних.Номенклатура КАК Номенклатура,
        |    РегистрПоказателиСрезПоследних.Кво_П КАК Кво_П
        |ИЗ
        |    РегистрСведений.РегистрПоказатели.СрезПоследних КАК РегистрПоказателиСрезПоследних";

        Запрос.УстановитьПараметр("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
        Запрос.УстановитьПараметр("Номенклатура", Объект.Продукция);

        Результат = Запрос.Выполнить();
    Выборка = Документы.СборкаЗапасов.Выбрать();
    ВыборкаКол = Результат.Выбрать();
    Пока ВыборкаКол.Следующий() Цикл
        Пока Выборка.Следующий() Цикл
            Если ВыборкаКол.Номенклатура = Выборка Тогда
                Выборка.Кол_Р = ВыборкаКол.Кво_П;
            иначе
                Сообщить("Нет значения");
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
            
КонецПроцедуры
*****нет значения**
24 anagk
 
16.06.22
15:59
Надеюсь поможите. Всегда здесь помогают.
25 Ryzeman
 
16.06.22
16:11
Ну ты даже не пытаешься а по сути откатился к (0) ><
"ВЫБРАТЬ
        |    РегистрПоказателиСрезПоследних.Номенклатура КАК Номенклатура,
        |    РегистрПоказателиСрезПоследних.Кво_П КАК Кво_П
        |ИЗ
        |    РегистрСведений.РегистрПоказатели.СрезПоследних(, Номенклатура В (&СписокНоменклатуры) И Склад = &МойСклад) КАК РегистрПоказателиСрезПоследних";

        Запрос.УстановитьПараметр("Склад", Объект.СтруктурнаяЕдиница);
        Запрос.УстановитьПараметр("СписокНоменклатуры", Объект.Продукция.ВыгрузитьКолонку("Номенклатура"));

ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
Для Каждого СтрокаПродукция Из Объект.Продукция Цикла
    СтрокаИзЗапроса = ТаблицаРезультата.Найти(СтрокаПродукция.Номенклатура, "Номенклатура");
    Если СтрокаИзЗапроса = Неопределено Тогда
        Сообщить("Для товара " + СтрокаПродукция.Номенклатура.Наимименование +" нет записи в регистре показателей");  
    Иначе
        СтрокаПродукция.Кол_Р = СтрокаИзЗапроса.Кво_П;
    КонецЕсли;
КонецЦикла;


И только это один из десятка вариантов как решить твою задачу, не самый изящный...
26 rudnitskij
 
16.06.22
17:42
ВЫБРАТЬ
            РегистрПоказателиСрезПоследних.Номенклатура КАК Номенклатура,
            РегистрПоказателиСрезПоследних.Кво_П КАК Кво_П
        ИЗ
            РегистрСведений.РегистрПоказатели.СрезПоследних(, Склад = &МойСклад) КАК РегистрПоказателиСрезПоследних
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Документы.НужныйДокумент.Продукция КАК Продукция
ПО
      РегистрПоказателиСрезПоследних.Номенклатура = Продукция.Номенклатура
ГДЕ
      Продукция.Ссылка = &СсылкаНаДокумент

--------------------------------------
Запрос.УстановитьПараметр("Склад", Объект.СтруктурнаяЕдиница);
Запрос.УстановитьПараметр("СсылкаНаДокумент", Объект.Ссылка);


И не надо ничего выгружать, оно в запросе все делает намного быстрее
27 Ryzeman
 
16.06.22
17:45
(26) Ну ему табличную часть надо поменять, так что выгрузить-загрузить всё равно придётся. Это классический олдскульный 1сный стиль. Современный 1сный - через заполнитьзначениесвойств. Семёрочный - через вложенный цикл двух коллекций. Можно в запросе найти дифференциал и заполнить только его, логически это наверное самое правильное.
28 rudnitskij
 
16.06.22
17:47
(27) "выгрузить-загрузить всё равно придётся" - выгружать как раз не приходится. Ссылку в запрос передали, он сам из базы получит список товаров. Он там уже есть, не надо его дополнительно в какие-то массивы сохранять
29 Ryzeman
 
16.06.22
17:49
(28) ну да, выгрузить-загрузить если через ВЫБОР сразу подставить значения из регистра как КВО где есть
30 anagk
 
17.06.22
07:47
сейчас буду продолжать, продолжать)
31 anagk
 
17.06.22
08:17
пока ничего не получается. В обеих кодах, ошибка на ошибке. И везде то чего я и не понимаю - как обратиться к табличной части. Как сопоставить полученое значение из Регистра в Табличную часть при выборе Номенклатуры. Добавлю инфо. Процедуру эту я вызываю НаКлиенте в Процедуре ПродукцияНоменклатураПриИзменении(Элемент) в конце.
32 anagk
 
17.06.22
08:28
ну такое вот по такому коду сейчас работает, но без результата
Процедура ЗапросКол_Т ()
    //****160622
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РегистрПоказателиСрезПоследних.Номенклатура КАК Номенклатура,
    |    РегистрПоказателиСрезПоследних.Кво_П КАК Кво_П
    |ИЗ
    |    РегистрСведений.РегистрПоказатели.СрезПоследних(, СтруктурнаяЕдиница = &СтруктурнаяЕдиница) КАК РегистрПоказателиСрезПоследних
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    |Документ.СборкаЗапасов.Продукция КАК Продукция
    |ПО
    |РегистрПоказателиСрезПоследних.Номенклатура = Продукция.Номенклатура
    |ГДЕ
    |Продукция.Ссылка = &СсылкаНаДокумент";
    Запрос.УстановитьПараметр("СтруктурнаяЕдиница", Объект.СтруктурнаяЕдиница);
    Запрос.УстановитьПараметр("СсылкаНаДокумент", Объект.Ссылка);
    
    ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
    Для Каждого СтрокаПродукция Из Объект.Продукция Цикл
        СтрокаИзЗапроса = ТаблицаРезультата.Найти(СтрокаПродукция.Номенклатура, "Номенклатура");
        Если СтрокаИзЗапроса = Неопределено Тогда
            Сообщить("Для товара " + СтрокаПродукция.Номенклатура.Наименование +" нет записи в регистре показателей");  
        Иначе
            СтрокаПродукция.Кол_Р = СтрокаИзЗапроса.Кво_П;
        КонецЕсли;
    КонецЦикла;    
КонецПроцедуры
33 anagk
 
17.06.22
08:30
в регситре есть число
34 anagk
 
17.06.22
08:31
думаю с Периодом нужно еще играться, но не понимаю точно ли
35 anagk
 
17.06.22
08:47
Содержимое Регистра:
Период: 06.06.2022
Реестратор: Производство...
НомерСтроки: 1
Организация: ****
Структурная Единица: главсклад
Номенклатура: такая-то
Кво П: 2
36 anagk
 
17.06.22
08:48
где то не видит
37 anagk
 
17.06.22
09:07
СтрокаПродукция - верно?)
38 anagk
 
17.06.22
09:11
Для Строки "..." - нет записи в Регистре...ну помогайте) плиз)
39 anagk
 
17.06.22
09:19
пообщался))) что создавать новую тему?
40 Ryzeman
 
17.06.22
09:37
(34) Не надо

(36) Где ты это всё вызываешь?  Поставь точку останова и посмотри что у тебя за объект, что есть в табличной части и что в ссылке.
Посмотри не пустой ли результат запроса вообще.

(37) ?? Это название переменной для элемента. Название не может быть верным, оно должно быть понятным

(38) у тебя пустые ссылки в табличной части или номенклатура без наименования? Вообще поле "наименование" есть и заполнено?)

(31) какие ошибки и что не понятного? У тебя и таблица и табличная часть это коллекции. Элементы коллекций - строки. У табличной части есть методы Загрузить() и Выгрузить() можно работать через них. Можно через обход заполнять строки построчно, как ты хочешь и как это показал я в (25)

>>Процедуру эту я вызываю НаКлиенте в Процедуре ПродукцияНоменклатураПриИзменении(Элемент) в конце.
То есть ты пытаешься этот код на форме выполнить?... >>Поставь точку останова и посмотри что у тебя за объект
41 hhhh
 
17.06.22
09:42
(30) здесь запятая не нужна.
42 anagk
 
17.06.22
09:46
(40) В Документе "Производство" при нажатии на "Добавить" в ТЧ выбираю из Справочника Номенклатур позицию - и вот после выбора этой Номеклатуры, нужно чтобы в Поле Кол_Р взялось число из Регистра, для даной номеклатуры, по данному складу (структурнойЕдинице)
43 Ryzeman
 
17.06.22
10:14
&НаКлиенте

Процедура ПродукцияНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
ТекущаяСтрока.Кол_Р = РасчитатьКоличествоНаСервере(ТекущаяСтрока.Номенклатура, Объект.СтруктурнаяЕдиница);
КонецПроцедуры

&НаСервере
Функция РасчитатьКоличествоНаСервере(Номенклатура, Склад)
СтруктураОтбор = Новый Струтура();
СтруктураОтбор .Вставить("Номенклатура", Номенклатура);
СтруктураОтбор .Вставить("Склад", Склад);
ТаблицаПоРегистру = РегистрыСведений.РегистрПоказатели.СрезПоследних(, СтруктураОтбор);
Возврат ТаблицаПоРегистру.Кво_П;
КонецФункции
44 anagk
 
17.06.22
10:54
ругалось на Параметр 2, я чуток подправил, теперь Поле объекта Кво_П не видит

&НаСервере
Функция РасчитатьКоличествоНаСервере(Номенклатура, СтруктурнаяЕдиница)
СтруктураОтбор = Новый Структура();
СтруктураОтбор.Вставить("Номенклатура", Номенклатура);
СтруктураОтбор.Вставить("СтруктурнаяЕдиница", СтруктурнаяЕдиница);
ТаблицаПоРегистру = РегистрыСведений.РегистрПоказатели.СрезПоследних(, СтруктураОтбор);
Возврат ТаблицаПоРегистру.Кво_П;
КонецФункции
45 Ryzeman
 
17.06.22
10:57
(44) потому что возвращается таблицазначений) Ну ты сам чуточку то можешь подумать, отладчиком посмотреть?..


&НаСервере
Функция РасчитатьКоличествоНаСервере(Номенклатура, СтруктурнаяЕдиница)
СтруктураОтбор = Новый Структура();
СтруктураОтбор.Вставить("Номенклатура", Номенклатура);
СтруктураОтбор.Вставить("СтруктурнаяЕдиница", СтруктурнаяЕдиница);
ТаблицаПоРегистру = РегистрыСведений.РегистрПоказатели.СрезПоследних(, СтруктураОтбор);
РезультатФункции = 0;
Если ТаблицаПоРегистру.Количество() > 0 Тогда
    РезультатФункции = ТаблицаПоРегистру[0].Кво_П;
КонецЕсли;  
Возврат РезультатФункции;
КонецФункции
46 anagk
 
17.06.22
11:02
(45) немного в панике...вроде елементарное, а взбесило, и вообще отключил понятие
47 anagk
 
17.06.22
11:05
блин работает!) ОГРОМНЕЙШЕЕ СПАСИБО!
48 yopQua
 
17.06.22
11:40
(21) во во

Выбрать ТЧ.Номенклатура, ТЧ.Количество Поместить ВТ Из &ТЧ Как ТЧ;
Выбрать ВТ.Номенклатура, ВТ.Количество, Регистр.Цена Из ВТ Внутреннее Соединение РегистрСведений.ЦеныНоменклатуры.СрезПоследних Как Регистр По ВТ.Номенклатура =  Регистр.Номенклатура
Запрос.УстановитьПараметр("ТЧ", ТЧПродукция);

ТЧПродукция.Загрузить(Запрос.Выполнить().Выгрузить());
49 АгентБезопасной Нацио
 
17.06.22
11:42
(13) надо было привыкать к прямым - проблем бы не было
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн