![]() |
|
Вытянуть значение из Регистра в строку табличной части документа | ☑ | ||
---|---|---|---|---|
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) надо было привыкать к прямым - проблем бы не было
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |