Конструктор ввода на основании не показывает табличную часть

Обновлено: 02.05.2024

Ввод на основании используется в случаях, когда при создании нового объекта могут быть использованы данные уже существующего объекта. Ввод на основании может быть реализован для справочников, документов, планов видов характеристик, планов счетов, планов видов расчета и бизнес-процессов. В общем случае объект может быть создан на основании любого объекта из перечисленных выше, например, документ может быть создан на основании справочника.

Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:

1. имя клиента
2. адрес клиента
3. адрес откуда
4. адрес куда
5. время подачи
6. желаемый класс автомобиля
7. список желаемых опций

Имя клиента, его адрес и телефон хранятся в справочнике «Клиенты». В данном примере будет реализован ввод документа на основании справочника. С целью упрощения примера справочник будет только один - «Клиенты», вся остальная информация будет вводиться вручную.

Создание объектов конфигурации



В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:


Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:


Далее запустим конструктор ввода на основании нажатием на кнопку "Конструктор ввода на основании":


В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:


Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:


По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:

Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:

Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:


Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:


При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:


Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:


Теперь предположим, что у клиентов могут быть опции, которые всегда присутствуют в заказе данного клиента. Например, «Некурящий водитель». Тогда их можно задавать в справочнике клиентов и копировать в документ заказа. Расширим справочник «Клиенты» табличной частью «Опции»:


Теперь необходимо модифицировать процедуру ОбработкаЗаполнения документа. Это можно было бы сделать через конструктор, но тогда процедура обработки будет перезаписана, поэтому добавим код копирования табличной части вручную:

Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:


Сохраним данные и создадим заказ на основании записи справочника:




Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Ввод на основании используется в случаях, когда при создании нового объекта могут быть использованы данные уже существующего объекта. Ввод на основании может быть реализован для справочников, документов, планов видов характеристик, планов счетов, планов видов расчета и бизнес-процессов. В общем случае объект может быть создан на основании любого объекта из перечисленных выше, например, документ может быть создан на основании справочника.

Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:

  1. имя клиента
  2. адрес клиента
  3. адрес откуда
  4. адрес куда
  5. время подачи
  6. желаемый класс автомобиля
  7. список желаемых опций

Имя клиента, его адрес и телефон хранятся в справочнике «Клиенты». В данном примере будет реализован ввод документа на основании справочника. С целью упрощения примера справочник будет только один - «Клиенты», вся остальная информация будет вводиться вручную.

Создание объектов конфигурации



Реализация

В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:


Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:


Далее запустим конструктор ввода на основании нажатием на кнопку "Конструктор ввода на основании":


В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:


Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:


По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:

Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:

Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:


Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:


При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:


Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:


Теперь предположим, что у клиентов могут быть опции, которые всегда присутствуют в заказе данного клиента. Например, «Некурящий водитель». Тогда их можно задавать в справочнике клиентов и копировать в документ заказа. Расширим справочник «Клиенты» табличной частью «Опции»:


Теперь необходимо модифицировать процедуру ОбработкаЗаполнения документа. Это можно было бы сделать через конструктор, но тогда процедура обработки будет перезаписана, поэтому добавим код копирования табличной части вручную:

Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:


Сохраним данные и создадим заказ на основании записи справочника:


Таким образом, данные табличной части были успешно скопированы в заказ. Для этого простого примера реализацию ввода на основании можно считать законченной.

Я решила переписать процедуру ОбработкаЗаполнения.Неподскажете,как правильно записать,чтобы у меня заполнялась именно табличная часть документа?

Выше я привел типовой код! В нем чтото непонятно?

"В нём всё понятно.Просто у меня в процедуре ОбработкаЗаполнения ДатаВозврата в табличной части не заполняется
ОбработкаЗаполнения(Основание)
// // Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны.
Если ТипЗнч(Основание) = Тип("ДокументСсылка.ОтпускаОрганизаций") Тогда
// Заполнение шапки
ДанныеПрошлойВерсии = Основание.ДанныеПрошлойВерсии;
ДвиженияИсправляемогоДокумента = Основание.ДвиженияИсправляемогоДокумента;
Комментарий = Основание.Комментарий;
КраткийСоставДокумента = Основание.КраткийСоставДокумента;
Организация = Основание.Организация;
Ответственный = Основание.Ответственный;
Для Каждого ТекСтрокаРаботникиОрганизации Из Основание.РаботникиОрганизации Цикл
НоваяСтрока = РаботникиОрганизации.Добавить();
НоваяСтрока.Сотрудник = ТекСтрокаРаботникиОрганизации.Сотрудник;
НоваяСтрока.Сторно = ТекСтрокаРаботникиОрганизации.Сторно;
НоваяСтрока.УдалитьПриказ = ТекСтрокаРаботникиОрганизации.УдалитьПриказ;
НоваяСтрока.ФизЛицо = ТекСтрокаРаботникиОрганизации.ФизЛицо;
КонецЦикла;
ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.КомандировкиОрганизаций") Тогда
// Заполнение шапки
КонецЕсли;
//>>__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры // ОбработкаЗаполнения()
"

"Вот можно это сделать примерно таким образом:
Пока Выборка.Следующий() Цикл
ДокументОбъект=Документы.ВозвратНаРаботуОрганизаций.СоздатьДокумент();
РаботникОрганизации=ДокументОбъект.РаботникиОрганизации.Добавить();


РаботникОрганизации.Сотрудник=Выборка.Сотрудник;
РаботникОрганизации.ДатаВозврата=Выборка.ДатаОкончанияОтпускаПлюсОдинДень;
ДокументОбъект.Дата=ТекущаяДата();
ДокументОбъект.Записать();



//ДокументОбъект.ПолучитьФорму().Открыть();


КонецЦикла;
ну и т.д."

А почему может быть следующая ситуация:в отладике всё правильно,но при этом если открыть документ ВозвратНаРаботуОрганизаций табличная часть всё равно не заполняется?

не знаю, мне по форуму не видно ни вашей базы, не вашей обработки!

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

Запрос.УстановитьПараметр("Работает",Перечисления.СостоянияРаботникаОрганизации.Работает);
//Запрос.УстановитьПараметр("ДатаНачала",);
//Запрос.УстановитьПараметр("ДатаОкончания",ДатаОкончания);

Результат=Запрос.Выполнить();

Выборка=Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ДокументОбъект=Документы.ВозвратНаРаботуОрганизаций.СоздатьДокумент();
ДокументОбъект.Комментарий=Выборка.Комментарий;
ДокументОбъект.Организация=Выборка.Организация;
РаботникОрганизации=ДокументОбъект.РаботникиОрганизации.Добавить();
РаботникОрганизации.Сотрудник=Выборка.Сотрудник;
РаботникОрганизации.ДатаВозврата=Выборка.ДатаОкончанияОтпуска;

ДокументОбъект.Дата=ТекущаяДата();




КонецЦикла;

ДокументОбъект.Записать();
КонецПроцедуры
"

Конструктор ввода на основании предназначен для визуальной настройки правил заполнения реквизитов одного объекта на основе данных других объектов (возможно, даже другого типа). Результатом работы конструктора является создание предопределенной процедуры ОбработкаЗаполнения() в модуле заполняемого объекта. Конструктор ввода на основании работает только для объектов метаданных ссылочного типа (т.е. тех, что генерируют ссылки: справочники, документы, планы видов характеристик и т.п.).

Конструктор можно вызвать двумя способами:

Внимание! Конструктор доступен только для тех объектов метаданных, для которых указаны объекты-основания

Описание конструктора

Конструктор ввода на основании

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

Поле А — список объектов, которые являются основаниями для текущего объекта;
Поле Б — список реквизитов выделенного объекта основания, доступных для выбора;
Поле В — список реквизитов шапки и табличных частей текущего объекта, доступных для заполнения;

При выделении объекта-основания в поле А происходит изменение списка реквизитов в поле Б. Поля Б и В также взаимосвязаны: в списке реквизитов (поле Б) отображаются только те реквизиты, которые подходят для выбора в качестве заполнителя для выделенного реквизита в поле В (по имени, типу или являются ссылкой). Галочкой в поле Б помечаются те реквизиты объекта-основания, которые имеют тот же тип, что и реквизит, выделенный в поле В.

Кнопка «Заполнить выражения» производит автоматическое заполнение реквизитов текущего объекта по совпадению типа. Для тех реквизитов в поле В, где конструктор не увидел совпадений, поля останутся пустыми.

Кнопка «Очистить выражения» — очищает любые изменения.

Кнопка «ОК» завершает работу конструктора с сохранением изменений.

Кнопка «Отмена» завершает работу конструктора без сохранения изменений.

Примечательно то, что в значения в поле В можно вводить и вручную. Однако, конструктор не проверяет синтаксическую верность введенных формул. Кроме того, автоматическое заполнение не всегда работает верно.

Внимание! Проверяйте соответствие реквизитов не только по типу, но и по имени. Может получиться так, что конструктор для поля Сумма укажет Количество и наоборот.

Результатом работы конструктора будет процедура ОбработкаЗаполнения() в модуле текущего объекта. Обратите внимание, что в процедуре присутствуют служебные комментарии конструктора. Таким образом конструктор отделяет свои изменения от кода, введенного вручную:

Внимание! Если впервые вызываете конструктор, а процедура ОбработкаЗаполнения() уже есть в модуле объекта и содержит код, то по окончании работы конструктора она будет полностью замещена. Все изменения, внесенные вручную будут утеряны!

Смотреть на Youtube

Помните, как раньше на платформе 1С:Предприятие 8.2 приходилось кропотливо описывать дружелюбный интерфейс пользователя с подсказками и пояснениями!? Как плодились группы элементов, декорации и прочие украшения, лишь бы форма выглядела пристойно!?

Начиная с релиза 8.3.1 платформы 1С:Предприятие 8.3 все изменилось: для элементов управления появилась расширенная подсказка, а мир засиял новыми красками).

«Что же изменилось с тех пор?» — спросите Вы…

Одним из улучшений, которые облегчают жизнь разработчику и повышают лояльность пользователей, стала расширенная подсказка для элементов:

  • поле ввода
  • таблица
  • группа
  • кнопка
  • декорация (текст)

В палитре свойств, кроме самой подсказки появилось два дополнительных поля:

  • Отображение подсказки, которое управляет способом представления подсказки пользователю;
  • Подсказка ввода, которая отображается непосредственно в пустом поле ввода;

Подсказка ввода

Атрибуты расширенной подсказки в палитре свойств

Давайте посмотрим, как видит эти подсказки пользователь:

Пример использования расширенной подсказки на платформе 1С:Предприятие 8.3

Пример использования расширенной подсказки на платформе 1С:Предприятие 8.3

Заметили маленький знак вопроса справа от заголовка группы «Паспортные данные»? Если нажать его, откроется всплывающая подсказка, привязанная к элементу управления:

Есть и другие способы отображения подсказки:

  • Авто — автоматический режим (показывается обычная всплывающая подсказка);
  • Нет — подсказка не показывается;
  • Всплывающая — подсказка показывается во всплывающем окне (всем до боли знакомая, стандартная подсказка);
  • Кнопка — подсказка показывается в отдельном окне после нажатия кнопки (см. на рисунке выше);
  • Отображение сверху, справа, снизу и т.п. — подсказка выводится в виде текста сверху, справа, снизу и т.п. от элемента управления;

Расширенная подсказка

И это еще не все. Разработчик может задать собственную подсказку с цветным оформлением и гиперссылками. Для этого нужно включить для элемента управления режим отображения расширенной подсказки:

Включение режима отображения расширенной подсказки

Редактирование расширенной подсказки для элемента управления на платформе 1С:Предприятие 8.3

В дереве элементов у выбранного поля появится подчиненный элемент «Расширенная подсказка», а в палитре свойств в поле «Заголовок» Вы сможете указать текст подсказки или отредактировать его в отдельном редакторе текста:

Читайте также: