Имя: Пароль:
1C
1С v8
получить дополнительное СВОЙСТВО заказа клиента в конкретной ситуации УТ 11.4
0 mad
 
08.04.22
00:12
1С УТ 11.4
Конфигураторатор-Документы-Заказ клиента. правой кнопкой-модуль менеджера
Функция ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги(МассивОбъектов, ПараметрыПечати) Экспорт

там выбираются данные для заполнения печатной формы заказа
с недостающими реквизитами проблем нет

Но как добавить в формируемый массив значения из ДОПОЛНИТЕЛЬНЫХ СВОЙСТВ (не доп.реквизитов) заказа?
понятно что надо постучать в Регистр Сведений-Дополнительные сведения.
Но как?

Начало функции вот такое (чтоб получить доп.реквизит ВремяДоставкиС  было достаточно добавить всего одну строку)

Функция ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги(МассивОбъектов, ПараметрыПечати) Экспорт
    
    Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("ОтображатьСкидки") Тогда
        ОтображатьСкидки = ПараметрыПечати.ОтображатьСкидки;
    Иначе
        ОтображатьСкидки = (Константы.ОтображениеСкидокВПечатныхФормахДокументовПродажи.Получить()
            <> Перечисления.ВариантыВыводаСкидокВПечатныхФормах.НеВыводитьСкидки);
    КонецЕсли;
    
      
    Запрос = Новый Запрос;
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Документы.Ссылка                                        КАК Ссылка,    
    |    Документы.Номер                                            КАК Номер,
    |    Документы.Дата                                            КАК Дата,
    |    Документы.АдресДоставки                                    КАК АдресДоставки,
    |    Документы.Организация                                    КАК Организация,
    |    Документы.Организация                                    КАК Исполнитель,
    |    Документы.ЖелаемаяДатаОтгрузки                КАК ЖелаемаяДатаОтгрузки,
    |    Документы.ВремяДоставкиС                    КАК ВремяДоставкиС,

<......>
|ИЗ
    |    Документ.ЗаказКлиента КАК Документы
    |ГДЕ
    |    Документы.Ссылка В(&МассивОбъектов)

Для получения дополнитльеных СВОЙСТВ
попробовал добавить отдельный блок
ВЫБРАТЬ, но не работает вообще

ВЫБРАТЬ
                    |    ДополнительныеСведения.Свойство.Ссылка,
                    |    ДополнительныеСведения.Свойство.Наименование КАК Наименование,
                    |    ДополнительныеСведения.Значение КАК МетодОплаты
                    |ИЗ
                    |    РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
                    |ГДЕ
                    |    ДополнительныеСведения.Объект = &МетодОплаты
                    |    И ДополнительныеСведения.Свойство.Наименование ПОДОБНО &Наименование

В целом, проблему можно, видимо решить в другом месте, куда прилетают все данный из этой функции
обработки- ПечатьЗаказовНаТоварыУслуги - правая кнопка- модуль менеджера

в Процедура ЗаполнитьТабличныйДокументЗаказаНаТоварыУслуги(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати, ИмяМакета)

идем в "область макета" - например, Шапка

можно было бы добавить код типа
ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ДопСвойство");
Значение=СсылкаНаОбъект.ДополнительныеРеквизиты.Найти(ДопСвойство);

или может вот так, т.к. речь идет именно о доп.свойстве

Значение=СсылкаНаОбъект.ДополнительныеСведения.Свойство.Наименование.Найти(ДопСвойство);

вопрос как получить ссылку на объект. и правильно ли все остальное.

Если кто-то решит помочь, то для примера было бы здорово использовать сразу МетодОплаты

Спасибо
1 Смотрящий
 
08.04.22
05:54
|    ДопСвойство1.Значение КАК ЗначениеДопСвойство1
|    ДопСвойство2.Значение КАК ЗначениеДопСвойство2
|ИЗ
|    Документ.ЗаказКлиента КАК Документы
|
|    ЛЕВОЕ СОЕДИНЕНИЕ Документы.ЗаказКлиента.ДополнительныеСведения КАК ДопСвойство1
|    ПО Документы.Ссылка = ДополнительныеСведения.Ссылка
|    И ДополнительныеСведения.Свойство = &ДопСвойство1
|
|    ЛЕВОЕ СОЕДИНЕНИЕ Документы.ЗаказКлиента.ДополнительныеСведения КАК ДопСвойство2
|    ПО Документы.Ссылка = ДополнительныеСведения.Ссылка
|    И ДополнительныеСведения.Свойство = &ДопСвойство2

Запрос.УстановитьПараметр("ДопСовйство1", ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ДопСвойство1"));
Запрос.УстановитьПараметр("ДопСовйство2", ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ДопСвойство2"));

как то так ...
2 DEVIce
 
08.04.22
05:59
Сдается мне что в этом куске что-т не так: "ДополнительныеСведения.Объект = &МетодОплаты"
В качестве объекта должна быть все-таки ссылка на заказ, а не на метод оплаты.
3 mad
 
08.04.22
15:18
Спасибо, что откликнулись

Смотрящий
в параметрах
видимо надо вот так? Иначе ругается на  переменная не определена "ДопСвойство"
Запрос.УстановитьПараметр("ДопСвойство1", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ДопСвойство1"));

В итоге конфигуратор перестает ругаться. но в тонком клиенте при попытке открыть форму печатную ошибка

{(7, 22)}: Таблица не найдена "Документы.ЗаказКлиента.ДополнительныеСведения" ЛЕВОЕ СОЕДИНЕНИЕ <<?>>Документы.ЗаказКлиента.ДополнительныеСведения КАК ДопСвойство1
                    []
4 Смотрящий
 
08.04.22
15:21
Ну да, ошибся малясь при копировании.
В 11.4 вроде как в доптаблице объекта хрантся свойства
Нет под рукой базы - поиграйся сам в конструкторе
5 mad
 
08.04.22
15:34
Если б я умел играться ))

я подумал, что во ошибке причина в том что таблица "Документы." не существует ,т.к. видимо она появляется после запроса вот того, который в оригинале присутствует.
поставил ваш код после того запроса, новым блоком ВЫБРАТЬ.
Но это не помогло.
т.е. таблица Документы.ЗаказКлиента.ДополнительныеСведения где-то потеряна или вообще не сформирована
или ваш ко надо как-то встроить вот в изначальный блок ВЫБРАТЬ?
6 Смотрящий
 
08.04.22
15:38
Встраивается через левое соединение
Попробуй ЛЕВОЕ СОЕДИНЕНИЕ Документы.ЗаказКлиента.ДополнительныеРеквизиты КАК ...
7 Смотрящий
 
08.04.22
15:38
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ...
8 Kassern
 
08.04.22
15:39
(7) речь же не о доп реквизитах, а о доп свойствах. Это разные сущности
9 Смотрящий
 
08.04.22
15:40
Хранятся в одной таблице вроде как и реквизиты и сведения
10 Kassern
 
08.04.22
15:41
(9) нет, дополнительные сведения это РС, а дополнительные реквизиты  - это ТЧ объекта
11 mad
 
08.04.22
15:44
я правильно понимаю, что доп.сведения, (в отличие от ДополнительныхРекзвизитов) хранятся в РегистрыСведений-ДополнительныеСведения ?
12 Kassern
 
08.04.22
15:45
(11) правильно
13 Kassern
 
08.04.22
15:45
тот же диадок хранит идентификаторы для документов как раз в дополнительных сведениях, так как это удобно, не нужно проводить документ, чтобы присвоить идентификатор
14 mad
 
08.04.22
15:48
я тут нагуглил еще вот такое
ЗначениеСвойства
Возвращает значение дополнительного свойства объекта.
Синтаксис

Функция ЗначениеСвойства(Объект, Свойство, КодЯзыка = "") Экспорт
Параметры

  Объект   - ЛюбаяСсылка - ссылка на объект, например, СправочникСсылка.Номенклатура,
                           ДокументСсылка.ЗаказПокупателя, ...
  Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на
                           дополнительный реквизит, значение которого нужно получить.
           - Строка - имя дополнительного свойства.
  КодЯзыка - Строка - если указано, то вместо значения дополнительного свойства будет
                      возвращено его представление на указанном языке.
Возвращаемое значение

  Произвольный - любое значение, допустимое для свойства.
Пример вызова

Результат = УправлениеСвойствами.ЗначениеСвойства(Объект, Свойство, КодЯзыка)
Доступность

Сервер, Толстый клиент, Внешнее соединение
15 Kassern
 
08.04.22
15:50
(14) Блин у вас есть массив объектов в менеджере. В чем проблема, в текущем запросе, левым соединением прикрутить регистр сведений со свойствами и по объекту и и нужному свойству соединить?
16 Kassern
 
08.04.22
15:51
А если у вас будет 100 документов на печать, будете в цикле  100 раз эту функцию запускать?
17 Смотрящий
 
08.04.22
15:52
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство1
|    ПО Документ.Объект = ДопСвойство1.Ссылка
|    И ДопСвойство1.Свойство = &ДопСвойство1

Так попробуй
18 mad
 
08.04.22
16:00
так
Поле не найдено "Документ.Объект" ПО <<?>> Документ.Объект = ДопСвойство1.Ссылка
19 Смотрящий
 
08.04.22
16:02
Документ.Ссылка = ДопСвойство1.Объект
Вот так попробуй
20 Kassern
 
08.04.22
16:05
есть же такой замечательный инструмент, называется конструктор запросов, с помощью которого можно легким движением руки соединить как надо 2 таблички...
21 mad
 
08.04.22
16:09
(19) Поле не найдено "Документ.Ссылка"<<?>>Документ.Ссылка = ДопСвойство1.Объект
22 mad
 
08.04.22
17:14
изменил кое-что в основном коде - вроде перестало ругаться.
Встроил предлагаемый Смотрящим код в основной запрос по Заказу.
теперь заработала часть
    |ИЗ
    |    Документ.ЗаказКлиента КАК Документы
    |
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство1
    |    ПО Документы.Ссылка = ДопСвойство1.Объект
    |    И ДопСвойство1.Свойство = &ДопСвойство1
    |
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство2
    |    ПО Документы.Ссылка = ДопСвойство2.Объект
    |    И ДопСвойство1.Свойство = &ДопСвойство2


теперь проблема с частью УстановитьПараметр
пока вот тут было РегистрСведений.ДополнительныеСведения (без Ы) ругалось на то, что переменная РегистрСведений не определена.
Посмотрел как в дереве конфигурации раздел называется - видимо надо РегистрЫСведений. переименовал.
теперь стало
Запрос.УстановитьПараметр("ДопСвойство1", РегистрыСведений.ДополнительныеСведения.НайтиПоНаименованию("МетодОплаты"));

теперь ошибка МетодОбъекта не обнаружен НайтиПоНаименованию
так же пробовал
    Запрос.УстановитьПараметр("ДопСвойство1", РегистрыСведений.ДополнительныеСведения.Найти("МетодОплаты"));
    Запрос.УстановитьПараметр("ДопСвойство1", РегистрыСведений.ДополнительныеСведения.Свойство.Найти("МетодОплаты"));

видимо как-то иначе надо искать название свойства?
И если тут ругалось на РегистрСведений
не надо ли исправить в
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство1
    |    ПО Документы.Ссылка = ДопСвойство1.Объект
    |    И ДопСвойство1.Свойство = &ДопСвойство1

тоже с Ы?
23 Kassern
 
08.04.22
17:47
(22) умеете пользоваться конструктором запросов?
24 mad
 
08.04.22
17:59
(23) я посмотрел туда, благодаря ему (спасибо!) удалось прямо в конфигураторе отловить ошибки в запросе без запуска 1С и вот вроде запрос ок (причем часть кода ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство1  - -  без Ы работает исключительно, а в параметрах - только с Ы Регистры. странно как-то )

В нем светятся эти два параметра (допсвойство1 и допсвойство2), в каждом есть объект ,свойство, значение.

что с ними елать в конструкторе пока не очень понятно
25 mad
 
08.04.22
18:01
Я так понимаю параметр должен получить ссылку на свойство, найдя его по имени свойства
26 Михаил Козлов
 
08.04.22
18:38
Если не ошибаюсь, свойство нужно искать в планах видов характеристик ДополнительныеРеквизитыИСведения.
27 mad
 
09.04.22
01:38
если использовать
|    ЛЕВОЕ СОЕДИНЕНИЕ ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДопСвойство1
    |    ПО Документы.Ссылка = ДопСвойство1.Объект
    |    И ДопСвойство1.Свойство = &ДопСвойство1
и внизу параметр
    Запрос.УстановитьПараметр("ДопСвойство1", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("МетодОплаты"));

то ошибка Таблица не найдена
ЛЕВОЕ СОЕДИНЕНИЕ <<?>> ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения

Если же оставить так

"ВЫБРАТЬ
    |    Документы.Ссылка                                        КАК Ссылка,    
.
.
    |    Документы.ЖелаемаяДатаОтгрузки                КАК ЖелаемаяДатаОтгрузки,
    |    Документы.ВремяДоставкиС                    КАК ВремяДоставкиС,
    |    Документы.ВремяДоставкиПо                    КАК ВремяДоставкиПо,
    |     ДопСвойство1.Значение КАК МетодОплаты,
    |     ДопСвойство2.Значение КАК КомментарииПокупателя,
.
.
                    
    |ИЗ
    |    Документ.ЗаказКлиента КАК Документы
    |
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство1
    |    ПО Документы.Ссылка = ДопСвойство1.Объект
    |    И ДопСвойство1.Свойство = &ДопСвойство1
    |
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство2
    |    ПО Документы.Ссылка = ДопСвойство2.Объект
    |    И ДопСвойство1.Свойство = &ДопСвойство2
    |
    |ГДЕ
    |    Документы.Ссылка В(&МассивОбъектов)

то ошибок нет, но значений так же нет
28 hhhh
 
09.04.22
04:11
(27)    ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения. без Ы.

В запросе пишите без Ы, а в тексте программы с Ы.
29 DimG
 
09.04.22
07:11
Не нужно велосипед изобретать. Есть БСП и общий модуль УправлениеСвойствами, там все.
30 mad
 
09.04.22
16:03
(28) т.е. должно быть вот так?

|    ЛЕВОЕ СОЕДИНЕНИЕ ПланыВидовХарактеристик.ДополнительныеРеквизитИСведения КАК ДопСвойство1
    |    ПО Документы.Ссылка = ДопСвойство1.Объект
    |    И ДопСвойство1.Свойство = &ДопСвойство1
и внизу параметр
    Запрос.УстановитьПараметр("ДопСвойство1", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("МетодОплаты"));
31 mad
 
09.04.22
17:12
(29) я погуглил, должно быть что-то типа
| УправлениеСвойствами.ЗначениеСвойства(ДокОбъект???, "МетодОплаты") КАК МетодОплаты,

можно ли это просто встроить в запрос
"ВЫБРАТЬ
    |    Документы.Ссылка                                        КАК Ссылка,
        | УправлениеСвойствами.ЗначениеСвойства(ДокОбъект???, "МетодОплаты") КАК МетодОплаты,    
...
    |ИЗ
    |    Документ.ЗаказКлиента КАК Документы
    |
    |ГДЕ
    |    Документы.Ссылка В(&МассивОбъектов)
    |
    |УПОРЯДОЧИТЬ ПО
    |    Документы.МоментВремени

на месте ДокОбъект??? должна быть ссылка же
ее надо в параметре получить? или как
32 mad
 
09.04.22
17:23
нет, как         | УправлениеСвойствами.ЗначениеСвойства(ДокОбъект???, "МетодОплаты") КАК МетодОплаты,
это в запрос нельзя вставить.
надо в параметрах видимо получить значение
Запрос.УстановитьПараметр("ДопСвойство1",УправлениеСвойствами.ЗначениеСвойства(???ДокументСсылка.ЗаказПокупателя???, "МетодОплаты"));

осталось понять что вписать на место ссылки
33 Смотрящий
 
09.04.22
18:15
(32) (30) не работает ? что пищет ?
34 mad
 
09.04.22
19:30
заработало! пишу результат, т.к. часто оч помогает что кто-то все же описывает найденное решение и не с этим вот ПолучитьЗначение(объект, свойство) где Объект - ссылка и т.д. еще поди угадай как получить ссылку на объект.
(я до сих пор не могу понять, так что буду очень благодарен, если кто-то расскажет как правильно будет получить ссылку на заказ покупателя
Запрос.УстановитьПараметр("ДопСвойство1",УправлениеСвойствами.ЗначениеСвойства(???ДокументСсылка.ЗаказПокупателя???, "МетодОплаты"));
Я так понимаю это можно использовать еще прямее и проще

итак, я искал МетодОплаты - это название из "значение для формул", обычно используется это значение. Оказывается ,тут реально ищется по Наименованию, так что Искать надо было "Метод Оплаты" плюс видимо я в итоге натыкал в конструкторе запросов правильный вариант, буквально наобум (я реально оч примерно ориентируюсь в запросах ,функциях и прочем глубоком)

итого
чтобы вывести в макет печатной формы заказа Дополнительные СВОЙСТВА (реквизиты делаются гораздо проще) у меня заработал этот вариант (тут свойство "Сайт" т.к. я решил проверить с свойством с одним словом, чтоб исключить ошибку)

функция ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги(МассивОбъектов, ПараметрыПечати) Экспорт

прямо в первый же запрос добавляем
        |    ДопСвойство1.Объект.Ссылка КАК ОбъектСсылка,
    |    ДопСвойство1.Свойство.Имя КАК СвойствоИмя,
    |    ДопСвойство1.Значение КАК Сайт
    |ИЗ
    |    Документ.ЗаказКлиента КАК Документы      <----< Это уже было
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСвойство1
    |        ПО Документы.Ссылка = ДопСвойство1.Объект
    |            И (ДопСвойство1.Свойство = &ДопСвойство1)

и после запроса добавляем параметр
    Запрос.УстановитьПараметр("ДопСвойство1", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Сайт"));

дальше уже остается "КАК Сайт"  в обработке ПечатьЗаказовНаТоварыУслуги  воткнуть в нужную часть макета как
УстановитьПараметр(ОбластьМакета, "Сайт", ДанныеПечати.Сайт);

И в макете добавить параметр <Cайт> в нужное место.


ВСЕМ БОЛЬШОЕ СПАСИБО
В итоге я с вашими подсказками доковырялся до результата
Ошибка? Это не ошибка, это системная функция.