Конструктор ввода на основании не показывает табличную часть
Ввод на основании используется в случаях, когда при создании нового объекта могут быть использованы данные уже существующего объекта. Ввод на основании может быть реализован для справочников, документов, планов видов характеристик, планов счетов, планов видов расчета и бизнес-процессов. В общем случае объект может быть создан на основании любого объекта из перечисленных выше, например, документ может быть создан на основании справочника.
Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:
1. имя клиента
2. адрес клиента
3. адрес откуда
4. адрес куда
5. время подачи
6. желаемый класс автомобиля
7. список желаемых опций
Имя клиента, его адрес и телефон хранятся в справочнике «Клиенты». В данном примере будет реализован ввод документа на основании справочника. С целью упрощения примера справочник будет только один - «Клиенты», вся остальная информация будет вводиться вручную.
Создание объектов конфигурации
В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:
Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:
Далее запустим конструктор ввода на основании нажатием на кнопку "Конструктор ввода на основании":
В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:
Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:
По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:
Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:
Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:
Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:
При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:
Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:
Теперь предположим, что у клиентов могут быть опции, которые всегда присутствуют в заказе данного клиента. Например, «Некурящий водитель». Тогда их можно задавать в справочнике клиентов и копировать в документ заказа. Расширим справочник «Клиенты» табличной частью «Опции»:
Теперь необходимо модифицировать процедуру ОбработкаЗаполнения документа. Это можно было бы сделать через конструктор, но тогда процедура обработки будет перезаписана, поэтому добавим код копирования табличной части вручную:
Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:
Сохраним данные и создадим заказ на основании записи справочника:
Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, нидерландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки
Ввод на основании используется в случаях, когда при создании нового объекта могут быть использованы данные уже существующего объекта. Ввод на основании может быть реализован для справочников, документов, планов видов характеристик, планов счетов, планов видов расчета и бизнес-процессов. В общем случае объект может быть создан на основании любого объекта из перечисленных выше, например, документ может быть создан на основании справочника.
Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:
- имя клиента
- адрес клиента
- адрес откуда
- адрес куда
- время подачи
- желаемый класс автомобиля
- список желаемых опций
Имя клиента, его адрес и телефон хранятся в справочнике «Клиенты». В данном примере будет реализован ввод документа на основании справочника. С целью упрощения примера справочник будет только один - «Клиенты», вся остальная информация будет вводиться вручную.
Создание объектов конфигурации
Реализация
В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:
Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:
Далее запустим конструктор ввода на основании нажатием на кнопку "Конструктор ввода на основании":
В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:
Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:
По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:
Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:
Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:
Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:
При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:
Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:
Теперь предположим, что у клиентов могут быть опции, которые всегда присутствуют в заказе данного клиента. Например, «Некурящий водитель». Тогда их можно задавать в справочнике клиентов и копировать в документ заказа. Расширим справочник «Клиенты» табличной частью «Опции»:
Теперь необходимо модифицировать процедуру ОбработкаЗаполнения документа. Это можно было бы сделать через конструктор, но тогда процедура обработки будет перезаписана, поэтому добавим код копирования табличной части вручную:
Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:
Сохраним данные и создадим заказ на основании записи справочника:
Таким образом, данные табличной части были успешно скопированы в заказ. Для этого простого примера реализацию ввода на основании можно считать законченной.
Я решила переписать процедуру ОбработкаЗаполнения.Неподскажете,как правильно записать,чтобы у меня заполнялась именно табличная часть документа?
Выше я привел типовой код! В нем чтото непонятно?
"В нём всё понятно.Просто у меня в процедуре ОбработкаЗаполнения ДатаВозврата в табличной части не заполняется
ОбработкаЗаполнения(Основание)
// // Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны.
Если ТипЗнч(Основание) = Тип("ДокументСсылка.ОтпускаОрганизаций") Тогда
// Заполнение шапки
ДанныеПрошлойВерсии = Основание.ДанныеПрошлойВерсии;
ДвиженияИсправляемогоДокумента = Основание.ДвиженияИсправляемогоДокумента;
Комментарий = Основание.Комментарий;
КраткийСоставДокумента = Основание.КраткийСоставДокумента;
Организация = Основание.Организация;
Ответственный = Основание.Ответственный;
Для Каждого ТекСтрокаРаботникиОрганизации Из Основание.РаботникиОрганизации Цикл
НоваяСтрока = РаботникиОрганизации.Добавить();
НоваяСтрока.Сотрудник = ТекСтрокаРаботникиОрганизации.Сотрудник;
НоваяСтрока.Сторно = ТекСтрокаРаботникиОрганизации.Сторно;
НоваяСтрока.УдалитьПриказ = ТекСтрокаРаботникиОрганизации.УдалитьПриказ;
НоваяСтрока.ФизЛицо = ТекСтрокаРаботникиОрганизации.ФизЛицо;
КонецЦикла;
ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.КомандировкиОрганизаций") Тогда
// Заполнение шапки
КонецЕсли;
//>>__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры // ОбработкаЗаполнения()
"
"Вот можно это сделать примерно таким образом:
Пока Выборка.Следующий() Цикл
ДокументОбъект=Документы.ВозвратНаРаботуОрганизаций.СоздатьДокумент();
РаботникОрганизации=ДокументОбъект.РаботникиОрганизации.Добавить();
РаботникОрганизации.Сотрудник=Выборка.Сотрудник;
РаботникОрганизации.ДатаВозврата=Выборка.ДатаОкончанияОтпускаПлюсОдинДень;
ДокументОбъект.Дата=ТекущаяДата();
ДокументОбъект.Записать();
//ДокументОбъект.ПолучитьФорму().Открыть();
КонецЦикла;
ну и т.д."
А почему может быть следующая ситуация:в отладике всё правильно,но при этом если открыть документ ВозвратНаРаботуОрганизаций табличная часть всё равно не заполняется?
не знаю, мне по форуму не видно ни вашей базы, не вашей обработки!
"Запрос=Новый Запрос("ВЫБРАТЬ
| СостояниеПоДокументуОтпускаОрганизаций.Организация,
| СостояниеПоДокументуОтпускаОрганизаций.Сотрудник,
| СостояниеПоДокументуОтпускаОрганизаций.Состояние КАК ВидОтпуска,
| СостояниеПоДокументуОтпускаОрганизаций.Период КАК ДатаНачалаОтпуска,
| СостояниеПоДокументуОтпускаОрганизаций.ПериодЗавершения КАК ДатаОкончанияОтпуска,
| ДОБАВИТЬКДАТЕ(СостояниеПоДокументуОтпускаОрганизаций.ПериодЗавершения, ДЕНЬ, 1) КАК ДатаОкончанияОтпускаПлюсОдинДень,
| СостояниеРаботниковОрганизаций.Период КАК ДатаНачалаСостоянияПослеОтпуска,
| СостояниеРаботниковОрганизаций.ПериодЗавершения КАК ДатаЗавершенияСостоянияПослеОтпуска,
| СостояниеРаботниковОрганизаций.Состояние,
| СостояниеРаботниковОрганизаций.СостояниеЗавершения,
| СостояниеРаботниковОрганизаций.Регистратор КАК Ссылка,
| СостояниеРаботниковОрганизаций.Регистратор.Комментарий
|ИЗ
| РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеПоДокументуОтпускаОрганизаций
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
| ПО СостояниеПоДокументуОтпускаОрганизаций.Организация = СостояниеРаботниковОрганизаций.Организация
| И СостояниеПоДокументуОтпускаОрганизаций.Сотрудник = СостояниеРаботниковОрганизаций.Сотрудник
| И (СостояниеРаботниковОрганизаций.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Работает))
| И (ДОБАВИТЬКДАТЕ(СостояниеПоДокументуОтпускаОрганизаций.ПериодЗавершения, ДЕНЬ, 1) |ГДЕ
| СостояниеПоДокументуОтпускаОрганизаций.Регистратор ССЫЛКА Документ.ОтпускаОрганизаций
| И СостояниеПоДокументуОтпускаОрганизаций.Регистратор.Проведен
|ИТОГИ ПО
| Ссылка");
Запрос.УстановитьПараметр("Работает",Перечисления.СостоянияРаботникаОрганизации.Работает);
//Запрос.УстановитьПараметр("ДатаНачала",);
//Запрос.УстановитьПараметр("ДатаОкончания",ДатаОкончания);
Результат=Запрос.Выполнить();
Выборка=Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ДокументОбъект=Документы.ВозвратНаРаботуОрганизаций.СоздатьДокумент();
ДокументОбъект.Комментарий=Выборка.Комментарий;
ДокументОбъект.Организация=Выборка.Организация;
РаботникОрганизации=ДокументОбъект.РаботникиОрганизации.Добавить();
РаботникОрганизации.Сотрудник=Выборка.Сотрудник;
РаботникОрганизации.ДатаВозврата=Выборка.ДатаОкончанияОтпуска;
ДокументОбъект.Дата=ТекущаяДата();
КонецЦикла;
ДокументОбъект.Записать();
КонецПроцедуры
"
Конструктор ввода на основании предназначен для визуальной настройки правил заполнения реквизитов одного объекта на основе данных других объектов (возможно, даже другого типа). Результатом работы конструктора является создание предопределенной процедуры ОбработкаЗаполнения() в модуле заполняемого объекта. Конструктор ввода на основании работает только для объектов метаданных ссылочного типа (т.е. тех, что генерируют ссылки: справочники, документы, планы видов характеристик и т.п.).
Конструктор можно вызвать двумя способами:
Внимание! Конструктор доступен только для тех объектов метаданных, для которых указаны объекты-основания
Описание конструктора
Сам конструктор состоит из одной единственной формы с тремя табличными полями и набором кнопок:
Поле А — список объектов, которые являются основаниями для текущего объекта;
Поле Б — список реквизитов выделенного объекта основания, доступных для выбора;
Поле В — список реквизитов шапки и табличных частей текущего объекта, доступных для заполнения;
При выделении объекта-основания в поле А происходит изменение списка реквизитов в поле Б. Поля Б и В также взаимосвязаны: в списке реквизитов (поле Б) отображаются только те реквизиты, которые подходят для выбора в качестве заполнителя для выделенного реквизита в поле В (по имени, типу или являются ссылкой). Галочкой в поле Б помечаются те реквизиты объекта-основания, которые имеют тот же тип, что и реквизит, выделенный в поле В.
Кнопка «Заполнить выражения» производит автоматическое заполнение реквизитов текущего объекта по совпадению типа. Для тех реквизитов в поле В, где конструктор не увидел совпадений, поля останутся пустыми.
Кнопка «Очистить выражения» — очищает любые изменения.
Кнопка «ОК» завершает работу конструктора с сохранением изменений.
Кнопка «Отмена» завершает работу конструктора без сохранения изменений.
Примечательно то, что в значения в поле В можно вводить и вручную. Однако, конструктор не проверяет синтаксическую верность введенных формул. Кроме того, автоматическое заполнение не всегда работает верно.
Внимание! Проверяйте соответствие реквизитов не только по типу, но и по имени. Может получиться так, что конструктор для поля Сумма укажет Количество и наоборот.
Результатом работы конструктора будет процедура ОбработкаЗаполнения() в модуле текущего объекта. Обратите внимание, что в процедуре присутствуют служебные комментарии конструктора. Таким образом конструктор отделяет свои изменения от кода, введенного вручную:
Внимание! Если впервые вызываете конструктор, а процедура ОбработкаЗаполнения() уже есть в модуле объекта и содержит код, то по окончании работы конструктора она будет полностью замещена. Все изменения, внесенные вручную будут утеряны!
Смотреть на Youtube
Помните, как раньше на платформе 1С:Предприятие 8.2 приходилось кропотливо описывать дружелюбный интерфейс пользователя с подсказками и пояснениями!? Как плодились группы элементов, декорации и прочие украшения, лишь бы форма выглядела пристойно!?
Начиная с релиза 8.3.1 платформы 1С:Предприятие 8.3 все изменилось: для элементов управления появилась расширенная подсказка, а мир засиял новыми красками).
«Что же изменилось с тех пор?» — спросите Вы…
Одним из улучшений, которые облегчают жизнь разработчику и повышают лояльность пользователей, стала расширенная подсказка для элементов:
- поле ввода
- таблица
- группа
- кнопка
- декорация (текст)
В палитре свойств, кроме самой подсказки появилось два дополнительных поля:
- Отображение подсказки, которое управляет способом представления подсказки пользователю;
- Подсказка ввода, которая отображается непосредственно в пустом поле ввода;
Подсказка ввода
Давайте посмотрим, как видит эти подсказки пользователь:
Заметили маленький знак вопроса справа от заголовка группы «Паспортные данные»? Если нажать его, откроется всплывающая подсказка, привязанная к элементу управления:
Есть и другие способы отображения подсказки:
- Авто — автоматический режим (показывается обычная всплывающая подсказка);
- Нет — подсказка не показывается;
- Всплывающая — подсказка показывается во всплывающем окне (всем до боли знакомая, стандартная подсказка);
- Кнопка — подсказка показывается в отдельном окне после нажатия кнопки (см. на рисунке выше);
- Отображение сверху, справа, снизу и т.п. — подсказка выводится в виде текста сверху, справа, снизу и т.п. от элемента управления;
Расширенная подсказка
И это еще не все. Разработчик может задать собственную подсказку с цветным оформлением и гиперссылками. Для этого нужно включить для элемента управления режим отображения расширенной подсказки:
В дереве элементов у выбранного поля появится подчиненный элемент «Расширенная подсказка», а в палитре свойств в поле «Заголовок» Вы сможете указать текст подсказки или отредактировать его в отдельном редакторе текста:
Читайте также: