1С БП Корп. Внешняя обработка выводит значения по столбцу в эксель. Возможно ли получить в ней значение поля Инициатор1 (см.картинку), созданного в Документе РеализацияТоваровУслуг в ФормаПодписиТовары?
Реквизит подтягивается из СправочникСсылка.ФизическиеЛица Пишу на форме вот так:
НовСтр.Инициатор1 = Реализация.Инициатор1;
При запуске обработки пишет, что поле не обнаружено.
Так то оно так, ежели чего.
Но всёж таки тем не менее, однако,
Не что иное как вообще.
Дескать мол конечно, и не надо да ладно,
А то случить что и вот, на тебе пожалуйста!
Необходимо было использовать аналогичный код:
в ФормаДокументаТовары > ПередЗаписьюПосле с
(1) Потому что нужно убедиться что это реквизит ! Зайди в конфигуратор, клик на объект, реквизиты
Если в списке нет Инициатор1 ... означает что это Дополнительные реквизиты и доступ к ним так просто не получишь )
(8) В конфигураторе найти Документы - РеализацияТоваров - Реквизиты
Посмотреть есть ли там Инициатор1
Если нет посмотреть есть ли табличная часть ДополнительныеРеквизиты
Если есть посмотреть какие реквизиты у этой табличной части
Обращаться далее в своей обработке к этой ТабЧасти типа:
Док = Реализация.ПолучитьОбъект();
тчДопРеквизиты = Док.ДополнительныеРквизиты;
Для каждого Стр из тчДопРеквизиты Цикл
Наименование = Стр.Наименование; // "Инициатор1"
Значение = Стр.Значение;
КонецЦикла;
(9) Большое спасибо за подробный ответ.
В моём случае, в вкладке Данные Документа РеализацияТоваровУслуг нет Инициатор1 в Реквизитах и в Табличной части нет ДополнительныеРеквизиты. Значит ли это, что Инициатора невозможно внести без использования расширения?
(5)В документе "РеализацияТоваровУслуг" есть форма "ФормаДокументаОбщая", в этой форме есть процедура "ДекорацияПодписиНажатие", в этой процедуре заполняется структура "ПараметрыФормы"
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр);
....
Вот там должно быть что-то типа такого
ПараметрыФормы.Вставить("Инициатор1", ..........);
(7) Не нужно гадать, нужно знать. Нет у объекта такого реквизита. Он существует, только когда есть форма.
В модуле формы документа ищите, как заполняется Инициатор, и переносите в свою обработку.
(13) Вы просто на форму подписантов добавили реквизит и хотите из него какие-то данные считывать? Так не получится. Вам надо добавить реквизит документа "Инициатор1" и тогда эти данные будут храниться в базе данных и вы сможете к ним обращаться хоть через точку, хоть запросами. реквизит формы существует только пока инициализирована форма, как только форма закроется, то что Вы ввели в поле "Инициатор 1" исчезнет.
(14) Спасибо Возможно добавить данный реквизит в базу данных?
Достаточно того, что я прописал в ФормаДокументаОбщая как Объект.Инициатор1?
Так же обращаюсь во внешней обработке:
НовСтр.Инициатор1 = Объект.Инициатор1;
При этом при открытии через внешнюю обработку пишет, что Поле объекта не обнаружено (Инициатор1)
Опишу все действия, которые я сделал при попытке внести новый реквизит на форму в 1С БП Корп.:
1. В конфигураторе, в доработке в Документе РеализацияТоваровУслуг в ФормаПодписиТовары создал реквизит Инициатор1 с типом данных: СправочникСсылка.ФизическиеЛица (данный справочник также добавлен в расширение, т.к. из него подтягиваются данные)
2. В конфигураторе, в доработке на форме ФормаПодписиТовары создал объект Инициатор1, перенес его на форму (при этом не поле формы Реквизит почему-то не отображалась надпись Объект)
3. В конфигураторе, в доработке в Документы - РеализацияТоваровУслуг - добавил Инициатор1 в Реквизиты (а также в ТЧ Товары)
(- Запустил промежуточную отладку - не активна кнопка ОК в вплывающем окне Подписи.)
4. В конфигураторе, в доработке на форме ПКМ Инициатор1 через Свойства создал:
&НаКлиенте
Процедура ДК1_Инициатор1НачалоВыбораПосле(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
//вписал код Vitaly1C8
Док = РеализацияТоваровУслуг.ПолучитьОбъект();
тчДопРеквизиты = Док.ДополнительныеРеквизиты;
Для каждого Стр из тчДопРеквизиты Цикл
Наименование = Стр.Наименование; // "Инициатор1"
Значение = Стр.Значение;
КонецЦикла;
КонецПроцедуры
Показать
На что при сохранении пишет:
{ДоработкаКорп Документ.РеализацияТоваровУслуг.Форма.ФормаПодписиТовары.Форма(14,9)}: Переменная не определена (РеализацияТоваровУслуг)
Я думаю, это связано с тем, что реквизит не прописался как Объект. Опытные наставники, подскажите пожалуйста, как это можно подправить?
(16)Что за "РеализацияТоваровУслуг"? Скорее всего, тут нужно писать "Объект". Также "ПолучитьОбъект()" не требуется в данной ситуации, да и на клиенте он недоступен. Еще реквизит "Инициатор1" находится в табличной части "Товары", значит и обходить нужно эту табличную часть:
Для Каждого СтрокаТовар Из Объект.Товары Цикл
Инициатор1 = СтрокаТовар.Инициатор1;
//...
КонецЦикла;
Не забывать, что из "Инициатор1" реквизиты достать на клиенте не получится.
(17) Спасибо за подсказку.
На Объект тоже ругается.
Да и тут вроде всё проще, не надо никакого цикла, ведь ФИО вносятся вручную из СправочникСсылка.ФизическиеЛица. Получается и никакого кода в модуле формы не надо, правильно?
Почему же тогда при внесении в пользовательском режиме данные не сохраняются и не активна кнопка ОК в вплывающем окне Подписи?
(19) Цель такая - через расширение в документе РеализацияТоваровУслуг внести дополнительный реквизит Инициатор1 в поле Подписи, который заносится из выпадающего списка вручную.
Возможно, весь этот код на модуле формы и не нужен, просто я понимаю что данные должны выбираться из СправочникСсылка.ФизическиеЛица, а вот где они сохранятся, у меня вопрос. Отсюда и возникла ТабличнаяЧасть.
Проблема в том, что я добавил в расширении реквизит прям в дереве конфигурации и на форме. Поэтому у меня на поле формы Реквизит Объект не присутствует. Возможность создания реквизита в самом документе на закладке Данные в расширении недоступна. Вкладка Данные доступна только в Конфигурации, а я делаю на расширении. Как быть? У меня мало понимания, как это работает.
(20)Да, вы создали реквизит прямо в объекте, а не на форме, но он на форме недоступен не из-за этого. Чтобы на расширяемую форму добавить реквизит объекта, необходимо добавить сам объект в расширение (т.е объект формы. Нужно добавить форму в расширение, открыть ее, найти на закладке "Реквизиты" строку "Объект" (может по другому называться, это реквизит с галкой "Основной реквизит", он выделяется жирным). Да, такое действие надо проделать, даже если вы хотите вынести на форму реквизит, добавленный в расширении.
(21) Большое спасибо за мурзилку.
Вот где оказывается собака зарыта!
Итак, (1) я перенёс в расширение СправочникФизическиеЛица и Документ РеализацияТоваровУслуг, (2) в нём насоздавал реквизитов, в т.ч. и в табличной части Услуги, табличной части Товары.
(3) Далее, в расширении в поле реквизитов ФормыПодписиТовары документа РеализацияТоваровУслуг нажимаю (Alt+Shift+F2) Добавить в расширение.
Но чуда не происходит, поле реквизит из расширения не подхватывается.
(Аналогично я пробовал подхватить реквизиты из справочника, а не из документа - тоже не видит)
1 добавил новый реквизит в расширение:
- Добавил в расширение документ РеализацияТоваровУслуг и справочник ФизическиеЛица
- в Документе РеализацияТоваровУслуг в ФормаПодписиТовары создал реквизит Инициатор1 с типом данных: СправочникСсылка.ФизическиеЛица
2 добавил объект в расширение:
- в дереве конфигурации доработки создавал реквизиты (в т.ч. и в табличной части Услуги, табличной части Товары)
- через Alt+Shift+F2 Добавить в расширение добавил (строка Инициатор 1 стала чёрной).
3 вывел новый реквизит на форму:
- перетащил мышкой объект на форму, запустил отладку
но в режиме пользователя (см. картинку) поле Инициатор 1 заполняется, но не сохраняется.
Я не понимаю, где ошибка.
Возможно, необходимо создать отдельный справочник для поля Инициатор, но тогда он будет просто дублировать справочник ФизическиеЛица. Зачем множить сущности без необходимости.
Возможно, нужно как-то вызвать запись после или перед основным выполнением команды, либо как-то в событии это сделать.
Реквизит "Инициатор1" добавили в объект в расширении?
В дереве конфигурации в расширении РеализацияТоваровУслуг создавал реквизиты, на всякий случай создал те же реквизиты и в табличной части Услуги и табличной части Товары.
Последовательность переноса отметил цифрами на картинке.
Похоже, без кода на форме мне не обойтись.
Пробовал копировать с формы "ФормаПодписиТовары" метод "ПриСозданииНаСервере" и метод "ПриЗакрытии", заполнив реквизиты формы из параметров
В модуле формы переименовал в процедуру ПриСозданииНаСервере1, иначе пишет:
Процедура или функция с указанным именем уже определена (ПриСозданииНаСервере)
В функции прописал только дополнительные реквизиты, чтобы не дублировалось и два раза не выводилось:
Код формы
Процедура ПриСозданииНаСервере1(Отказ, СтандартнаяОбработка)
// Заполним реквизиты формы из параметров.
ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры,
"Инициатор11
|");
ПолноеНаименованиеКонтрагента = "";
Если ЗначениеЗаполнено(Контрагент) Тогда
РеквизитыКонтрагента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Контрагент, "Наименование, НаименованиеПолное");
Если ЗначениеЗаполнено(РеквизитыКонтрагента.НаименованиеПолное) Тогда
ПолноеНаименованиеКонтрагента = РеквизитыКонтрагента.НаименованиеПолное;
Иначе
НаименованиеКонтрагента = РеквизитыКонтрагента.Наименование;
КонецЕсли;
КонецЕсли;
ОбщегоНазначенияБПКлиентСервер.УстановитьПараметрОрганизацияФункциональныхОпцийФормы(ЭтотОбъект, Организация);
// ИнтернетПоддержкаПользователей.Новости.КонтекстныеНовости_ПриСозданииНаСервере
ИдентификаторыСобытийПриОткрытии = "ПриОткрытии";
ОбработкаНовостейПереопределяемый.КонтекстныеНовости_ПриСозданииНаСервере(
ЭтаФорма,
"БП.Документ.РеализацияТоваровУслуг",
"ФормаРеквизитыОрганизацииКонтрагентаУслуги",
НСтр("ru='Новости: Реализация (акт, накладная, УПД)'"),
ИдентификаторыСобытийПриОткрытии
);
// Конец ИнтернетПоддержкаПользователей.Новости.КонтекстныеНовости_ПриСозданииНаСервере
КонецПроцедуры
Процедура ПриЗакрытии1(ЗавершениеРаботы)
Если ПеренестиВДокумент И Модифицированность Тогда
СтруктураРезультат = Новый Структура("
| Инициатор11
|");
ЗаполнитьЗначенияСвойств(СтруктураРезультат, ЭтаФорма);
ОповеститьОВыборе(СтруктураРезультат);
КонецЕсли;
КонецПроцедуры
Показать
При отладке стрелочка встаёт в общем модуле ВерсионированиеОбъектов в функции ДанныеДляХранения(Знач Объект) на:
Итак, начну с начала:
Необходимо через расширение в документе РеализацияТоваровУслуг внести дополнительный реквизит Инициатор1 в поле Подписи, который заносится из выпадающего списка вручную.
Что я сделал:
1 добавил новый реквизит в расширение:
- скопировал в расширение документ РеализацияТоваровУслуг и справочник ФизическиеЛица
- в дереве конфигурации доработки в Документе РеализацияТоваровУслуг создал реквизит Инициатор1 с типом данных: СправочникСсылка.ФизическиеЛица (в т.ч. и в табличной части Услуги, табличной части Товары)
2 добавил объект в расширение:
- в ФормаПодписиТовары через Alt+Shift+F2 Добавить в расширение добавил (строка Инициатор 1 стала чёрной).
3 вывел новый реквизит на форму:
- перетащил мышкой объект на форму
4 в расширении в модуле ФормаПодписиТовары разместил код:
Процедура дор_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Заполним реквизиты формы из параметров.
ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры,
"Инициатор11
|");
ПолноеНаименованиеКонтрагента = "";
КонецПроцедуры
Процедура дор_ПриЗакрытии(ЗавершениеРаботы)
Если ПеренестиВДокумент И Модифицированность Тогда
СтруктураРезультат = Новый Структура("
| Инициатор11
|");
ЗаполнитьЗначенияСвойств(СтруктураРезультат, ЭтаФорма);
//ОповеститьОВыборе(СтруктураРезультат); //закомментировал, т.к. не нашёл в ФормаДокументаТовары
КонецЕсли;
КонецПроцедуры
Показать
При отладке выходит ошибка:
Метод объекта не обнаружен (ПриОпределенииНастроекВерсионированияОбъектов)
{ОбщийМодуль.ВерсионированиеОбъектов.Модуль(3022)}: МенеджерОбъекта.ПриОпределенииНастроекВерсионированияОбъектов(Настройки);
(27) Это конечно не правильно, но я закомментировал строку 3022 и ошибка пропала. Но проблему это не решило.
1С:Предприятие 8.3 (8.3.23.1865) Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.148.41)
Цель - сохранить значение из выпадающего списка. В режиме пользователя поле Инициатор 1 заполняется, но не сохраняется.
Пробовал добавить реквизит на Объект - всё легко добавляется без кода.
Но мой реквизит не на объекте, это реквизит формы, поэтому и пытаюсь добавить его программно.
В предыдущем коде выходит ошибка при вызове метода контекста Добавить (и на Вставить тоже), да и
НовыйЭлемент.ПутьКДанным = Инициатор11
должен быть как-то заполнен и сохранен.
Главное, я нигде не могу найти решение, будто бы никто и никогда этого не делал.
(27) Ошибка в коде была связана с тем, что необходимо было также программно добавить реквизит (формы), примерно вот так:
ДобавляемыеРеквизиты = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Строка"); //Ссылка?
НовыйРеквизит = Новый РеквизитФормы(
"Инициатор11", //Имя реквизита формы
ТипРеквизита, //Тип
"", //Путь (Пусто, "Объект.Инициатор11", ИмяТЧ)
"Инициатор11"); //Заголовок
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Заставляем форму создать новые реквизиты
Показать
Примерно, потому что код проходит, но не срабатывает.
Подскажите, пожалуйста, возможно ли размещение реквизита не на объект, а на форму? Рисунок в посте (29)
Создаю реквизит на форме в дереве конфигурации, но он не отображается (как это происходит с Объектом) на форме во вкладке Реквизиты.
Так то оно так, ежели чего.
Но всёж таки тем не менее, однако,
Не что иное как вообще.
Дескать мол конечно, и не надо да ладно,
А то случить что и вот, на тебе пожалуйста!
Необходимо было использовать аналогичный код:
в ФормаДокументаТовары > ПередЗаписьюПосле с