как получить значение реквизита
Автор mashencev_anton, 29 мая 2015, 15:33
0 Пользователей и 2 гостей просматривают эту тему.
в модуле объекта(внешняя обработка) программно вывожу отчет СКД. в качестве параметра СКД необходимо использовать значение реквизита формы. как мне его получить в модуле объекта?
его можно туда передать из модуля формы
Помогли — Скажи спасибо! Решил сам — поделись решением!
Цитата: Rasty от 29 мая 2015, 15:54
его можно туда передать из модуля формы
делаю вот так
в модуле формы:
&НаСервере
Процедура ТипЦенНаСервере()
ТипЦены=Объект.ТипЦен;
ОбъектОбъекта = РеквизитФормыВЗначение("Объект");
ОбъектОбъекта.ТипЦен(ТипЦены);
КонецПроцедуры
потом в модуле объекта
Перем пТипЦен;
Функция ТипЦен(ТипЦены) Экспорт
пТипЦен=ТипЦены;
КонецФункции
но не срабатывает
А что у вас в переменной ТипЦены? И почему бы ее не сделать Объектом Формы?
Помогли — Скажи спасибо! Решил сам — поделись решением!
вы сможете его получить из модуля объект обратившись по имени «ТипЦены» и из ссылки на документ
Помогли — Скажи спасибо! Решил сам — поделись решением!
да хоть отчет, сути не меняет
Помогли — Скажи спасибо! Решил сам — поделись решением!
и еще разок
сделайте ТипЦены не реквизитом формы, а реквизитом обработки, и вы сможете получить к ней прямой доступ!!!!!!!!!!!!!!!
Помогли — Скажи спасибо! Решил сам — поделись решением!
Установка значения в модуле формы и получение его в модуле объекта |
Я |
15.09.21 — 09:04
Внешний отчет. Устанавливаю значение в модуле формы, и значение реквизита формы и значение реквизита объекта.
Но потом в модуле объекта, в этом реквизите нет значения. Как правильно его там получить?
Установка в модуле формы:
ЭтотОбъект.ИмяМакетаРеквФ = РезультатВыбора.Значение;
//
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.ИмяМакетаРеквОб = РезультатВыбора.Значение;
Получение в модуле объекта:
Как получить эти значения в модуле объекта внешнего отчета?
1 — 15.09.21 — 09:05
В модуле объекта,
ЭтотОбъект.ИмяМакетаРеквОб
пусто, хотя устанавливалось в модуле формы.
2 — 15.09.21 — 09:11
ЭтотОбъект.Отчет.ИмяМакетаРеквФ = РезультатВыбора.Значение;
//
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ПолучаемоеЗначение = ВнешнийОтчет.ИмяМакетаРеквОб;
3 — 15.09.21 — 09:20
(2) ИмяМакетаРеквФ, ИмяМакетаРеквОб — какая, в сущности, разница. Сейчас мы его взорвем =)
В форме на сервере:
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.МоеЗначение = РезультатВыбора.Значение;
ВнешнийОтчет.МойМетод();
В модуле отчета:
Перем МоеЗначение Экспорт
Процедура МойМетод()
Сообщить(МоеЗначение);
КонецПроцедуры
4 — 15.09.21 — 09:25
(2) В модуле объекта там пусто.
То есть при открытии формы. В модуле формы там устанавливается значение. А потом при нажатии кнопки в открытой уже форме,
в модуле объекта, в этом значении пусто.
5 — 15.09.21 — 09:35
(4) короче, надо заполнять реквизит именно объекта
(3) не заметил, что у него они называются по разному
6 — 15.09.21 — 09:37
7 — 15.09.21 — 09:46
вот, провожу тест.
При открытии внешнего отчета, в модуле формы, —
http://joxi.ru/KAx3R4VTvwYQL2
потом в модуле объекта, внешнего отчета там пусто (((
http://joxi.ru/YmEbex8CBLezg2
8 — 15.09.21 — 09:48
(7) ну то есть ЭтотОбъект.ИмяМакетаРеквФ — там не доступен, а в ЭтотОбъект.ИмяМакетаРеквОб — пусто
9 — 15.09.21 — 09:50
Если тут все заполнилось
http://joxi.ru/KAx3R4VTvwYQL2
Как это получить в модуле объекта?
10 — 15.09.21 — 09:52
(9) Об этом тебе расскажут в части «Взаимодействие модуля формы с модулями объектов и менеджеров» курса.
11 — 15.09.21 — 09:52
Вот смотри. Ты реквизитФормыВЗначение() сделал, данные написал. А обратно объект кто будет пихать? Откуда взял, туда и положи, раз уж так перанусно ходишь…
12 — 15.09.21 — 09:53
(2) ЭтотОбъект.Отчет — тут вообще нет никаких реквизитов
13 — 15.09.21 — 09:54
(11) Рк, сейчас попробую.
14 — 15.09.21 — 09:56
(11) Так ли будет?
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.ИмяМакетаРеквОб = РезультатВыбора.Значение;
ЗначениеВРеквизитФормы(ВнешнийОтчет.ИмяМакетаРеквОб, «ИмяМакетаРеквОб»);
15 — 15.09.21 — 09:58
(11) Ну все, Денис. Взялся — возись =]
16 — 15.09.21 — 09:59
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.ИмяМакетаРеквОб = РезультатВыбора.Значение;
ЗначениеВРеквизитФормы(ВнешнийОтчет, «Отчет»);
//ЗначениеВРеквизитФормы(ВнешнийОтчет.ИмяМакетаРеквОб, «ИмяМакетаРеквОб»);
ошибку выдает
по причине:
Недопустимое значение параметра (параметр номер ‘2’)
вроде же все правильно!
17 — 15.09.21 — 10:01
Андрей, у тебя ж в этом году юбилей — 30 лет. Сколько из них ты уже с 1С мучаешся?
Может, пока не поздно, ну его, а?
18 — 15.09.21 — 10:06
не надо там РеквизитФормыВЗначение
сразу в форме заполняй реквизит объекта:
ЭтотОбъект.Отчет.ИмяМакетаРеквОб = …
19 — 15.09.21 — 10:16
Я бы вообще дополнительные свойства настроек компоновщика использовал. Они, собственно, для этого и предназначены.
20 — 15.09.21 — 10:19
(0) РеквизитФормыВЗначение(«Отчет») — этот код создаёт из Данных формы Новый экземпляр Объекта. Ты или должен его обратно превратить Объект в Данные формы, либо тут же, в этой же процедуре использовать этот экземпляр объекта. По-твоему коду непонятно — что ты дальше делаешь с этим экземпляром.
21 — 15.09.21 — 10:31
(18) тут нет никаких реквизитов http://joxi.ru/DrlGP4NfGdevLA
22 — 15.09.21 — 10:33
(20) Я задал реквизиту значение, затем хочу сохранить его
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.ИмяМакетаРеквОб = РезультатВыбора.Значение;
ЗначениеВРеквизитФормы(ВнешнийОтчет, «Отчет»);
что не так в этой инструкции
ЗначениеВРеквизитФормы(ВнешнийОтчет, «Отчет»);
23 — 15.09.21 — 10:34
(20) как будет правильно превратить, Объект в данные формы?
24 — 15.09.21 — 10:42
Поколдовать, епта
25 — 15.09.21 — 10:44
(20) я же так и делаю, но идет ошибка
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.ИмяМакетаРеквОб = РезультатВыбора.Значение;
ЗначениеВРеквизитФормы(ВнешнийОтчет, «Отчет»);
по причине:
Недопустимое значение параметра (параметр номер ‘2’)
26 — 15.09.21 — 10:47
(11) я вот делаю в (25), как правильно?
27 — 15.09.21 — 10:49
(25) Какие типы значений у ВнешнийОтчет.ИмяМакетаРеквОб и РезультатВыбора.Значение ? Посмотри в отладчике.
28 — 15.09.21 — 10:50
(0) ответ в (19)
29 — 15.09.21 — 10:55
(27) строка, это название макета
http://joxi.ru/BA08ePMCvqdXYA
30 — 15.09.21 — 10:56
(28) Мне они не известны, делаю пока по найденному примеру, но столкнулся что в нем не все работает.
Пробую разрешить это.
А (19) вообще не знакомо.
31 — 15.09.21 — 11:01
(30) структура Отчет.КомпоновщикНастроек.ДополнительныеСвойства
32 — 15.09.21 — 11:20
(31) пустая структура, или даже 3 структуры, что с ними делать?
http://joxi.ru/RmznO4eijV71Xm
я хочу просто передать значение и получить его, из реквизиты формы или объекта.
33 — 15.09.21 — 11:23
вот есть пример, он работает http://joxi.ru/bmo5Q4kU7lwa0A
почему мой код не работает ?
34 — 15.09.21 — 11:25
(33) в этом примере реквизиты не присваиваются.
35 — 15.09.21 — 11:57
(34) вот это не работает
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.ИмяМакетаРеквОб = РезультатВыбора.Значение;
ЗначениеВРеквизитФормы(ВнешнийОтчет, «Отчет»);
как последнюю строку задать что бы работала?
Там задается значение реквизита. Как мне сделать что бы увидеть результат?
36 — 15.09.21 — 12:01
Отчет.КомпоновщикНастроек.ДополнительныеСвойства.Вставить(«ИмяМакетаРеквОб», «ФакинЧикенШит»);
37 — 15.09.21 — 12:05
(36) Так, так , так …. сойчас испробую. Спасибо вам. За продвижение вопроса!!!! Буду испытывать!
38 — 15.09.21 — 12:08
(36) Один момент, — такого нет Отчет.КомпоновщикНастроек.ДополнительныеСвойства
Есть
Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства
Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства
Отчет.КомпоновщикНастроек.ФиксированныеНастройки.ДополнительныеСвойства
прав ли я что ваш пример вызовет ошибку?
39 — 15.09.21 — 12:08
(36) в какую структуру все же вставлять?
40 — 15.09.21 — 12:10
(39) ну возьми первую
41 — 15.09.21 — 12:10
(40) пробую!
42 — 15.09.21 — 13:03
При открытии отчета, в структуру значение прописалось
http://joxi.ru/eAObaQlC6GqRQ2
но при формировании, в модуле объекта, нет этого значения ((((
http://joxi.ru/n2Yl73nC70dKRm
43 — 15.09.21 — 13:11
(42) нда…Только что спецом даже проверил. Все работает!
Скорее всего у тебя в коде при компановке настройки сбрасываются или переопределяются.
44 — 15.09.21 — 13:15
(43) понятно, как бы это определить!
45 — 15.09.21 — 13:17
46 — 15.09.21 — 13:18
(43) Спасибо, да это работает. В самый конец перенес строку
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресВремХран);
Отчет.КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
//
Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить(«ИмяМакета», РезультатВыбора.Значение);
КонецПроцедуры
47 — 15.09.21 — 13:18
(44) ну так встань ты точкой останова в начале процедуры и посмотри передается или нет)
48 — 15.09.21 — 13:18
(46) ну вот
49 — 15.09.21 — 13:37
(48) да они там перетирались видимо у меня.
Да это работает.
То есть выявилось. что создаешь хоть реквизит формы, хоть реквизит объекта, в модуле объекта его не увидеть?
50 — 15.09.21 — 13:44
(49) ну так всегда и было, реквизиты формы доступны лишь на форме. Модуль объекта о них ни слухом ни духом.
А по поводу реквизита объекта — все нормально передается без всяких проблем.
Создаешь реквизит, на форме Отчет.ТвойРеквизит=»Бла бла бла»;
Потом в модуле объекта просто обращаешься ТвойРеквизит, он будет твое значение содержать.
51 — 15.09.21 — 13:45
(50) реквизит создаешь у объекта, а не на форме, чтобы так работало.
52 — 15.09.21 — 13:45
(49) в итоге выяснилось, что у вас большие проблемы с УФ)
53 — 15.09.21 — 14:19
(51) не работает так. там реально пусто в процедуре ПриКомпоновкеРезультата. Потому что это 2 разных объекта.
54 — 15.09.21 — 14:25
(53) я только что проверял, все работает
55 — 15.09.21 — 14:29
56 — 15.09.21 — 14:43
(54) Тогда что не так у тс? Родился под несчастливой звездой?
57 — 15.09.21 — 14:53
(56) да хз что там у него. Значит как то не так заполняет либо плавает в понятиях.
58 — 15.09.21 — 15:39
59 — 15.09.21 — 15:43
(58) сравни свое обращение к реквизиту объекта и мое и найди различие
60 — 15.09.21 — 15:57
(59)
задавать я смог только так
ВнешнийОтчет = РеквизитФормыВЗначение(«Отчет»);
ВнешнийОтчет.ИмяМакетаРеквОб = РезультатВыбора.Значение;
и потом его нет в при компоновке результата в модуле объекта
а вы просто задаете Отчет.Тестовый =
у меня в Отчет. нет реквизита моего, хлотя он есть у объекта http://joxi.ru/BA08ePMCvqXJYA
61 — 15.09.21 — 15:59
(60) по кнопке на форме на сервере ты же можешь тупо написать Отчет.ИмяМакетаРеквОб =»Бла бла» ?
А дальше при компоновке просто обратиться к ИмяМакетаРеквОб
62 — 15.09.21 — 16:01
(60) в твоем случае основной реквизит формы это отчет? Он жирным выделен в реквизитах формы. Для внешнего отчета у него тип ВнешнийОтчет.ИмяОтчета.
63 — 15.09.21 — 16:02
вот к нему и обращаешься на форме чтобы заполнить реквизит объекта. А в модуле объекта на прямую обращаешься к реквизитам объекта.
64 — 15.09.21 — 16:18
(61) нет там в Отчет. реквизитов
65 — 15.09.21 — 16:21
(62) ну да http://joxi.ru/8AnQDeGsoKk4K2
Только Отчет как у вас не содержит реквизитов там
66 — 15.09.21 — 16:25
http://joxi.ru/krDbeX8CgdXVJ2
тестовый , как у вас Отчет.Тестовый =
тут не присвоится.
67 — 15.09.21 — 16:29
(66) у него форма своя, а не общая.. для общей не работает..
68 — 15.09.21 — 16:30
(67) а он общую форму ковырял?) Я думал вообще у него своя форма со своим блекджеком и….
69 — 15.09.21 — 16:31
(67) Ясно.
(68) По примеру делаю. Там нужно было взять общую форму БСП.
NIGHTHUNTER
70 — 15.09.21 — 16:33
Ну тогда в общей форме решается через,
Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить(«ИмяМакета», РезультатВыбора.Значение)
Если отчёт является внешним, то к его объекту нельзя обратиться методом «Отчеты.ИмяОтчёта». Также нет возможности использовать реквизит ОтчетОбъект, который применяется в неуправляемых формах.
Однако возможность обратиться к объекту есть. Для этого необходимо в настройках формы посмотреть, существует ли реквизит «Объект» для внешней обработки или «Отчет» для внешнего отчета. Этот реквизит создается автоматически при создании новой формы с типом «Форма отчета» или «Форма обработки» (выбирать следует один из этих вариантов, а не «Произвольная форма»).
Далее применяем такую конструкцию:
В модуле формы внешнего отчёта:
ОтчетОбъект= РеквизитФормыВЗначение("Отчет");
В модуле формы внешней обработки:
ОтчетОбъект= РеквизитФормыВЗначение("Объект").ЭтотОбъект;
В дальнейшем, применительно к внешнему отчёту, мы можем через установленную нами переменную ОтчетОбъект получить макет Системы компоновки данных:
Макет = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
«ОсновнаяСхемаКомпоновкиДанных» – это имя макета СКД.
- Информация о материале
- Категория: Программирование 1С
-
Опубликовано: 21 мая 2016
Привет. 1) Создаем внешний отчет. 2) Добавляем отчету реквизит «Рекв1» 3) Создаем основную форму ОсновнаяФорма 3.1) Добавляем поле Рекв, которое отображает «Рекв1» 3.2) Добавляем кнопку «Настр», которая открывает форму ФормаНастроек. 3.3) В методе событии ПриОткрытии пишу: &НаКлиенте 4) Создаем форму настроек ФормаНастроек 4.1) Добавляем поле Рекв, которое отображает «Рекв1» 5) Запускаем конфигурацию в пользовательском режиме. И открываем внешний отчет. Видим нашу ОсновнаяФорма со значением реквизита «Новое значение» 6) Открываем форму настроек. В форме настроек поле Рекв пустое, хотя я ожидаю увидеть «Новое значение» (поля обоих форм все-таки связаны с одним и тем же реквизитом отчета). Вопрос: что не так? Что у упустил из виду или не знаю?
Ты не заметил, что у тебя объектов там нет в реквизитах де, м?
Нет, не заметил. А какие должны быть объекты?
Хоть паршивенькие, но объекты. А у тебя есть данные формы. Которые ты в одной заполняешь и ожидаешь, что благодаря квантовой связи или еще чему они у тебя и в другой форме изменятся.
Defender aka LINN Если я смог открыть отчет в режиме пользователя и увидеть в нем свои поля формы, то это значит что они связаны с реквизитами формы, а также с реквизитами отчета…
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Содержание:
1. Реквизиты объекта и реквизиты формы в 1С
2. Как получить значения из элементов формы 1С
1. Реквизиты объекта и реквизиты формы в 1С
В обычном приложении у элемента формы 1С 8.3 было свойство «Значение», доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?
Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.
Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.
Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».
Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:
Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя.
2. Как получить значения из элементов формы 1С
Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:
Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:
…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:
Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.
Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.
Еще хочется разобрать момент, когда нам возможно увидеть состояние различающихся значений в элементе форме 1С и в объекте. Это возможно в событии элемента ОбработкаВыбора.
Например, при значении поля Контрагент — Ассоль, мы выбрали контрагента Бакалея:
Новое значение доступно как параметр процедуры ВыбранноеЗначение.
Система дает шанс что-то сделать в этой ситуации.
Специалист компании ООО «Кодерлайн»
Добрыгин Михаил
Как получить доступ к реквизитам формы?
Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы, который содержит коллекцию элементов формы, сканируя ее в цикле:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму(); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Сообщить(Элемент); КонецЦикла;
Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.
Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.
Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Сообщить(Элемент.Имя); Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда Сообщить(" Это табличное поле! " + Элемент.Имя ); Для Каждого Колонка Из Элемент.Колонки Цикл ИмяКолонки = Колонка.Имя; Сообщить(ИмяКолонки); КонецЦикла; КонецЕсли; КонецЦикла;
Как получить значение отдельного реквизита формы?
Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.
Пример:
ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента"); Поставщик = ФормаОбъекта.ЭлементыФормы.Поставщик; Поставщик = ФормаОбъекта.ЭлементыФормы.Получатель; Сообщить(ФормаОбъекта.ЭлементыФормы.ТаблПоле.Колонки.Количество());
Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.
Как получить значение элементов табличной части формы?
Доступ к табличной части формы через объект
Доступ к табличной части формы (например: Товары) можно получить через объект:
ДокОбъект = Док.ПолучитьОбъект(); //здесь Док - ссылка на объект //просканируем построчно таб часть документа Для Каждого Стр из ДокОбъект.Товары Цикл Номенклатура = Стр.Номенклатура; Стр.Коэффициент = 1; КонецЦикла;
Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:
Номенклатура = Стр.Номенклатура;
Доступ к табличной части формы через ЭлементыФормы
Табличная часть объекта и табличная часть формы объекта — это не одно и то же!
Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.
То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы:
Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму(); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда //элемент формы - табличное поле Если Элемент.Имя = "Товары" Тогда Сообщить("Это табличное поле!! " + Элемент.Имя ); //ТабПоле = ФормаОбъекта.ЭлементыФормы.Товары.Значение; ТабПоле = Элемент.Значение; Колво = ТабПоле.Количество(); Сообщить("Количество строк: " + Колво); Для Каждого ТекущаяСтрока Из ТабПоле Цикл Имя = ТекущаяСтрока.Номенклатура; Сообщить(Имя); КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки
Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл:
Во внешнем цикле сканируются строки, во внутреннем — колонки:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента"); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда Если Элемент.Имя = "ВыданныеАвансы" Тогда //таб часть объекта Сообщить(" Это табличное поле!! " + Элемент.Имя ); ТабПоле = Элемент.Значение; Индекс = 0; Для Каждого ТекущаяСтрока Из ТабПоле Цикл Сообщить("======================="); Для Каждого Колонка Из Элемент.Колонки Цикл ИмяКолонки = Строка(Колонка.Имя); Сообщить(ИмяКолонки); Имя = ТекущаяСтрока[ИмяКолонки];//сработает только если есть такое поле таб части объекта Сообщить("=== " + Имя); КонецЦикла; Индекс = Индекс + 1; Если Индекс > 0 Тогда break КонецЕсли; //только первая строка КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174
Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку.
Рассмотрим создание внешнего отчета в 1с 8 без использования системы компоновки данных. Для создания внешнего отчета будем использовать конфигурацию Бухгалтерия 2.0, исходные данные: “Написать отчет по 62 счету бухгалтерского учета в который будут выводится обороты за указанный период в разрезе Контрагентов и Договоров контрагентов.
1. Создание отчета
В первую очередь создадим файл внешнего отчета, для этого зайдем в 1с 8 в режиме Конфигуратор, перейдем в меню Файл -> Новый, либо нажмем на пиктограмму Новый документ.
В списке выберем пункт Внешний отчет. После создания внешнего отчета зададим ему Имя(например ПростейшийОтчет) и сохраним его на диск. Также добавим два реквизита: НачалоПериода и КонецПериодатипа Дата, они понадобятся нам для ограничения временного интервала выборки данных при формировании отчета.
Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!
2. Создание макета внешнего отчета
Для формирования отчета в 1с 8 нужен макет, это шаблон для вывода данных в котором задаются все нужные параметры, рисуются таблицы и т.д. Добавим новый макет, для этого в дереве метаданных отчета выберем пункт Макеты и нажмем кнопку Добавить, при создании выберем для макета тип Табличный документ.
В нашем макете будет 4 области:
- Шапка — в эту область мы будем выводить наименование отчета, период за который он сформирован и шапку таблицы;
- ДанныеКонтрагент — в эту область мы будем выводит в таблицу данные по контрагенту;
- ДанныеДоговорКонтрагента — в эту область мы будем выводит в таблицу данные по договору контрагента;
- Подвал — в эту область мы будем выводить итоговые значения по всему отчету для полей Приход и Расход.
Приступим к созданию областей макета. Для того что бы создать область в макете выделите нужное количество строк и нажмите Меню Таблица -> Имена -> Назначить имя(Либо Ctrl + Shift + N). В область Шапканапишем наименование отчета: Обороты 62 счета, нарисуем при помощи инструмента Границы шапку отчета, а так же зададим параметры НачалоПериода и КонецПериода. При помощи параметров в отчет можно выводить нужные данные, мы будем заниматься эти на следующем этапе разработки, а именно при написании программного кода отчета. Что бы создать параметр в макете выберите нужную ячейку, напишите в ней наименование параметра(без пробелов), щелкните по ней правой кнопкой мыши, в открывшемся меню выберите пункт Свойства. В свойствах ячейки на закладке Макет выберите заполнение Параметр.
После этого, в ячейке имя параметра будет заключено в угловые скобки(”<>“). В итоге область Шапкадолжна выглядеть так:
В области ДанныеКонтрагент создадим параметры для вывода наименования контрагента, а так же для прихода и расхода по 62 счету, при помощи инструмента Границы оформим область в виде строки таблицы.
В области ДанныеДоговорКонтрагента создадим параметры для вывода наименования договора, а так же для прихода и расхода по 62 счету, при помощи инструмента Границы оформим область в виде строки таблицы. Сделаем небольшой отступ перед параметром ДоговорКонтрагента(это можно сделать при помощи разбиения и объединения ячеек. Правой кнопкой мыши по ячейке -> Объединить или Разбить ячейку), он нужен для того что бы в отчете было видно, что строка по договору находится ниже по иерархии чем строка по контрагенту.
В области Подвал создадим параметры для итогов по приходу и расходу.
В итоге мы должны получить такой макет:
3. Создание формы отчета
Для вывода данных, задания периода формирования и кнопки Сформировать нашему отчету потребуется форма. Для создания формы найдите в дереве метаданных внешнего отчета пункт Формы и нажмите кнопку Добавить. На первой странице конструктора формы не нужно вносить никаких изменений, следует просто нажать кнопку Далее.
На следующей странице конструктора выберем оба доступных реквизита(НачалоПериода, КонецПериода) для расположения на форме.
В итоге у нас получится вот такая форма:
Но в таком виде она нас не устраивает, внесем в нее некоторые изменения:
- Перетащим кнопку Сформировать из нижней панели отчета на верхнюю(так будет удобнее для пользователя);
- Растянем форму по вертикали и горизонтали;
- Расположим поля НачалоПериода и КонецПериода по горизонтали;
- Добавим на форму элемент управления Поле табличного документа(в него и будет выводиться наш отчет), зададим ему имя ТабДок;
- Создадим кнопку выбора периода(при ее нажатии будет выводиться диалог с удобным выбором нужного периода). Программный код для нее мы писать пока не будем, поэтому просто расположим кнопку рядом с полями периода.
В итоге наша форма будет иметь такой вид:
4. Программирование
После создания формы отчета приступим к программированию. Для начала создадим процедуру вывода диалога выбора периода(кнопку для этого мы уже создали на предыдущем этапе). Щелкнем правой кнопкой мыши на кнопке и выберем пункт меню Свойства, в свойствах кнопки перейдем на закладку События, где при помощи кнопки со значком лупы создадим процедуру Кнопка1Нажатие в модуле формы.
Переключатся между формой и ее модулем можно при помощи закладок внизу формы
Для вызова формы выбора периода воспользуемся типовой процедурой Бухгалтерии 2.0 из общего модуля РаботаСДиалогами — ОбработчикНастройкаПериодаНажатие, в нее в качестве параметров нужно передать реквизиты отчета НачалоПериода и КонецПериода.
Процедура Кнопка1Нажатие(Элемент)
РаботаСДиалогами.ОбработчикНастройкаПериодаНажатие(НачалоПериода,КонецПериода);
КонецПроцедуры
Теперь перейдем к написанию кода, который будет формировать и выводить наш отчет. В модуле формы уже есть процедура КнопкаСформироватьНажатие, которая будет выполняться при нажатии кнопки Сформировать, там то мы и будем писать наш код. Начнем с инициализации нужных переменных. В первую очередь создадим переменную для поля табличного документа в которое мы будем выводить данные, это не обязательно, просто запись обращений к нему станет короче, а значит программный код будет более понятен для чтения.
ТабДок = ЭлементыФормы.ТабДок;
Получим макет внешнего отчета воспользовавшись функцией ПолучитьМакет(<ИмяМакета>), в параметр ему передадим имя макета, и если такой макет существует, то функция его найдет.
Макет = ПолучитьМакет("Макет");
После того как макет получен, создадим переменные для каждой из его областей, воспользуемся для этого методом макета ПолучитьОбласть(<ИмяОбласти>).
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьДанныеКонтрагент = Макет.ПолучитьОбласть("ДанныеКонтрагент");
ОбластьДанныеДоговор = Макет.ПолучитьОбласть("ДанныеДоговор");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Очистим поле табличного документа. Это нужно для того что бы при каждом новом формировании отчета старые данные удалялись.
ТабДок.Очистить();
Теперь, когда инициализация переменных закончена, перейдем к поочередному заполнению и выводу областей макета. Начнем с шапки. Если вы помните мы создали в этой области два параметра НачалоПериода и КонецПериода, передадим туда значения периода формирования отчета, для этого воспользуемcя свойством Параметры области макета.
ОбластьШапка.Параметры.НачалоПериода = НачалоПериода;
ОбластьШапка.Параметры.КонецПериода = КонецПериода;
Больше никаких действий с областью Шапка производитель не надо, поэтому выведем ее поле в табличного документа.
ТабДок.Вывести(ОбластьШапка);
Далее займемся написанием запроса к базе данных, при помощи которого возьмем обороты по счету 62 из регистра бухгалтерии Хозрасчетный. Определим переменную, в которой будет находиться наш запрос.
Запрос = новый Запрос;
Перед тем как приступить к написанию текста запроса передадим в него нужные параметры. Так как мы пишем запрос по счету 62 бухгалтерского учета, то в первую очередь создадим параметр для него
Запрос.УстановитьПараметр("Счет62",ПланыСчетов.Хозрасчетный.НайтиПоКоду("62"));
Так же в запрос необходимо передать период формирования отчета. Не забываем, что для периода формирования у нас есть специальные реквизиты отчета, их и передаем в качестве параметров.
Запрос.УстановитьПараметр("НачалоПериода",НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода",КонецПериода);
Приступим к написанию текста запроса, делать это будем при помощи конструктора запросов. Во многих учебных пособиях пишут, что нужно уметь писать запрос и вручную и используя конструктор, но на практике это не так. В задачах, которые постоянно встречаются перед программистом 1С, приоритетом является быстрое и качественное написание кода, а при составлении запроса к базе в ручную этого достичь практически невозможно, вы будете тратить кучу драгоценного времени на то, что бы правильно воспроизвести все конструкции запроса, найти опечатки которые вы сделали при написании и т.п.. Поэтому не тратьте зря время на попытки писать запросы вручную, а пользуйтесь конструктором запросом. Он сэкономит ваше время и позволит без особых усилий писать сложные запросы. Что бы начать писать текст запроса напишем в коде:
Запрос.Текст = "";
После этого поставим курсор между кавычками, нажмем правую кнопку мыши и выберем пункт Конструктор запроса. Откроется окно конструктора запроса.
Теперь необходимо выбрать нужную нам таблицу базы данных 1С 8. Нам необходима виртуальная таблица Обороты регистра бухгалтерии Хозрасчетный. Найдем ее в левой части окна конструктора
Переместим ее в область Таблицы и займемся заполнением параметров. Для всех виртуальных таблиц запроса есть специальный набор параметров, позволяющих выбирать нужные данные из основной таблицы(в нашем случае основная таблица Регистр бухгалтерии Хозрасчетный). Откроем окно параметров виртуальной таблицы.
Заполним параметры, периода которые мы передали в запрос. Что бы в тексте запроса использовать параметр следует перед его именем писать символ амперсанда(&)
Осталось заполнить условие по счету бух. учета. Для этого найдем в параметрах виртуальной таблицы строку УсловиеСчета и напишем там
Счет В ИЕРАРХИИ (&Счет62)
Также можно воспользоваться конструктором составления условий нажав на кнопку с тремя точками.
Больше никаких условий на виртуальную таблицу налагать не требуется, поэтому нажмем кнопку ОК в окне параметров виртуальной таблицы. Далее необходимо выбрать нужные нам поля из таблицы Хозрасчетной.Обороты(а именно: Контрагент, Договор контрагента, Приход и Расход). Что бы посмотреть список полей доступных в выбранной нами таблице нажмет символ ”+“ возле ее названия. После этого перетащим нужные поля в самую правую область конструктора запросов, которая так и называется: Поля. Если открыть план счетов бухгалтерского учета, то мы увидим, что для счета 62 аналитика по Контрагенту — это Субконто1, а по ДоговоруКонтрагента — Субконто2.
Поэтому из полей виртуальной таблицы выбираем Субконто1 и Субконто2. Так как нам необходим приход и расход по сумме, то выбираем также поля СуммаОборотДт и СуммаОборотКт
Заполним псевдонимы выбранных нами полей, для этого перейдем на закладку Объединения/Псевдонимы и зададим нужные имена полей.
Так как в нашем отчете данные будут выводиться иерархично(Контрагент на первом уровне, а все его договоры на втором), то настроим вывод данных в иерархии при помощи Итогов. Перейдем в конструкторе на закладку Итоги. В группировочные поля перетащим последовательно Контрагент и ДоговорКонтрагента, а в итоговые Приход и Расход.
На этом работа в конструкторе запроса завершена, нажимаем кнопку ОК и видим, что текст нашего запроса появился в программном коде.
Запрос.Текст = "ВЫБРАТЬ
| ХозрасчетныйОбороты.Субконто1 КАК Контрагент,
| ХозрасчетныйОбороты.Субконто2 КАК ДоговорКонтрагента,
| ХозрасчетныйОбороты.СуммаОборотДт КАК Приход,
| ХозрасчетныйОбороты.СуммаОборотКт КАК Расход
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, , Счет В ИЕРАРХИИ (&Счет62), , , , ) КАК ХозрасчетныйОбороты
|ИТОГИ
| СУММА(Приход),
| СУММА(Расход)
|ПО
| Контрагент,
| ДоговорКонтрагента";
После того как мы закончили написание запроса, приступим к заполнению областей ДанныеКонтрагент, ДанныеДоговорКонтрагент и Подвал. Все эти области мы заполним данными полученными при выполнении запроса. Так как наш запрос содержит группировки(Контрагент и ДоговорКонтрагента) выберем из него данные следующим образом:
ВыборкаКонтрагент = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Таким образом мы получим записи с итогами по всем контрагентам.
Перед тем как обходить данные выборки при помощи цикла инициализируем переменные предназначенные для подсчета общих итогов по отчету:
ИтогоПриход = 0;
ИтогоРасход = 0;
Для того чтобы данные отчета выводились с иерархией(и разворотами по ”+“) зададим начало автогруппировки строк табличного документа:
ТабДок.НачатьАвтогруппировкуСтрок();
Все приготовления закончены, теперь приступим к обходу результатов запроса. Обход будем осуществлять при помощи цикла Пока
Пока ВыборкаКонтрагент.Следующий() Цикл
КонецЦикла;
В начале цикла обнулим параметры Приход и Расход области ДанныеКонтрагент. Для чего это нужно? Представим ситуацию, что по контрагенту Дядя Вася, приход 10, а расход 5, а для за ним следующего контрагента Дядя Петя нет ни прихода ни расхода, в таком случае если мы не обнулим параметры Приход и Расход, то по в строке по контрагенту Дядя Петя попадет приход 5 и расход 10.
ОбластьДанныеКонтрагент.Параметры.Приход = 0;
ОбластьДанныеКонтрагент.Параметры.Расход = 0;
После этого заполняем область ДанныеКонтрагент данными элемента выборки
ЗаполнитьЗначенияСвойств(ОбластьДанныеКонтрагент.Параметры,ВыборкаКонтрагент);
После заполнения данным можно выводить область в Табличный документ, Так как мы используем автогруппировку строк, то нужно указать уровень строки в группировке(в нашем отчете будет два уровня, для контрагентов первый для договоров второй).
ТабДок.Вывести(ОбластьДанныеКонтрагент,1);
Теперь для данного контрагента сделаем выборку по его договорам.
ВыборкаДоговорКонтрагента = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Обход будем осуществлять при помощи цикла Пока.
Пока ВыборкаДоговорКонтрагента.Следующий() Цикл
КонецЦикла;
В цикле по договорам контрагентов обнулим параметры Приход и Расход, заполним область ДанныеДоговориз выборки и выведем ее в табличный документ на второй уровень записей.
ОбластьДанныеДоговор.Параметры.Приход = 0;
ОбластьДанныеДоговор.Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств(ОбластьДанныеДоговор.Параметры,ВыборкаДоговорКонтрагента);
ТабДок.Вывести(ОбластьДанныеДоговор,2);
Также в этом цикле к переменным расчета итоговых значений по приходу и расходу прибавим текущие значения.
ИтогоПриход = ИтогоПриход + ВыборкаДоговорКонтрагента.Приход;
ИтогоРасход = ИтогоРасход + ВыборкаДоговорКонтрагента.Расход;
На этом вывод данных в области ДанныеКонтрагент, ДанныеДоговорКонтрагент завершен, осталось завершить автогруппировку строк табличного документа.
ТабДок.ЗакончитьАвтогруппировкуСтрок();
Полностью циклы отвечающие за вывод данных в области ДанныеКонтрагент и ДанныеДоговорКонтрагент выглядят так:
ТабДок.НачатьАвтогруппировкуСтрок();
Пока ВыборкаКонтрагент.Следующий() Цикл
ОбластьДанныеКонтрагент.Параметры.Приход = 0;
ОбластьДанныеКонтрагент.Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств(ОбластьДанныеКонтрагент.Параметры,ВыборкаКонтрагент);
ТабДок.Вывести(ОбластьДанныеКонтрагент,1);
ВыборкаДоговорКонтрагента = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДоговорКонтрагента.Следующий() Цикл
ОбластьДанныеДоговор.Параметры.Приход = 0;
ОбластьДанныеДоговор.Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств(ОбластьДанныеДоговор.Параметры,ВыборкаДоговорКонтрагента);
ТабДок.Вывести(ОбластьДанныеДоговор,2);
ИтогоПриход = ИтогоПриход + ВыборкаДоговорКонтрагента.Приход;
ИтогоРасход = ИтогоРасход + ВыборкаДоговорКонтрагента.Расход;
КонецЦикла;
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
Осталось вывести итоговые данные в область Подвал и вывести саму область в Табличный документ.
ОбластьПодвал.Параметры.ИтогоПриход = ИтогоПриход;
ОбластьПодвал.Параметры.ИтогоРасход = ИтогоРасход;
ТабДок.Вывести(ОбластьПодвал);
На этом процесс написания внешнего отчета для 1С 8 без использования СКД завершен. Теперь его можно сформировать в режиме 1С:Предприятие 8 и добавить в справочник ВнешниеОбработки Файл отчета рассмотренного в статье вы можете скачать по ссылке.
Смотрите видео по созданию внешней печатной формы для управляемого приложения: