На основании документа

Ввод на основании в 1С программно

На основании документа

Рассмотрим простой пример программного ввода документа в 1С на основании. Допустим необходимо после проведения приходного документа «Приход» создать расходный документ «Расход» на основании данных полученных из приходного документа.

Простое создание на основании стандартным способом платформы 1С

В документе «Расход» или «Приход» нужно настроить связь на вкладке «Ввод на основании»:

Где указать с кем он связан:

Должна получиться следующая картина:

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания – попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

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

Если в документе уже существуют данная процедура — нужно не создавать новую, а добавлять код в существующую процедуру.

И прописать программный код заполнения. Пример кода:

//Код из модуля объекта документа “Расход”. Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)                       Если ТипЗнч(ДанныеЗаполнения) = Тип(“ДокументСсылка.Приход”) Тогда                                               Склад = ДанныеЗаполнения.Склад;                         Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл                                    НоваяСтрока = Товары.Добавить();                                    НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;                                    //… заполняем другие реквизиты табличной части                         КонецЦикла;                                   КонецЕсли; КонецПроцедуры

Программный код можно также создать автоматически для этого нужно воспользоваться «Конструктором ввода на основания».

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

Чтобы в 1С автоматически создать процедуру, нужно нажать на кнопку «Конструктор ввода на основании»:

Где с помощью функции «Заполнить выражения» можно автоматически сопоставить название реквизитов:

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

После нажатия на «Ок», 1С сама сформирует готовый программный код:

Внимание! Конструктор нельзя использовать, если процедура заполнения уже существует — вы потеряете существующий программный код.

Создание документа после записи первого документа с последующей записью созданного

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

Пример кода:

//Код из модуля формы документа “Приход”. &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)                   //Создаём новый документ             НовДокумент = Документы.Расход.СоздатьДокумент();             //Заполняем созданный документ (реквизиты документа заполняются значениями, которые совпадают по именам реквизитов)             НовДокумент.Заполнить(ТекущийОбъект.Ссылка);             //Записываем созданный документ             НовДокумент.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);           КонецПроцедуры //Код из модуля объекта документа “Расход”. Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)                       Если ТипЗнч(ДанныеЗаполнения) = Тип(“ДокументСсылка.Приход”) Тогда                                               Склад = ДанныеЗаполнения.Склад;                         Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл                                    НоваяСтрока = Товары.Добавить();                                    НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;                                    //… заполняем другие реквизиты табличной части                         КонецЦикла;                                   КонецЕсли; КонецПроцедуры

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

Для программного создания документа в 1С с открытием управляемой формы пользователю можно использовать функцию ОткрытьФорму(), в параметры которой можно передавать данные для заполнения.

Пример кода:

//Код из модуля формы документа “Приход”. &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) //Создаём структуру для передачи в виде параметра при открытии формы. ПараметрыФормы = Новый Структура(“Основание”, Объект.Ссылка); //Открываем форму документа расход с передачей данных для заполнения ОткрытьФорму(“Документ.Расход.ФормаОбъекта”, ПараметрыФормы); КонецПроцедуры //Код из модуля объекта документа “Расход”. Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип(“ДокументСсылка.Приход”) Тогда Склад = ДанныеЗаполнения.Склад; Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл НоваяСтрока = Товары.Добавить(); НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура; // … заполняем другие реквизиты табличной части КонецЦикла; КонецЕсли; КонецПроцедуры

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник: https://programmist1s.ru/sozdat-na-osnovanii-programmno/

Ввод на основании

На основании документа

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

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

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

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

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

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

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

Справочник “Клиенты”:

Документ «Заказ»:

Реализация

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

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

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

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

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

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

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

Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании.

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

Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Клиенты”) Тогда АдресОткуда = ДанныеЗаполнения.Адрес; Клиент = ДанныеЗаполнения.Ссылка; Телефон = ДанныеЗаполнения.Телефон; ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд КонецЕсли; КонецПроцедуры

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

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

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

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

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

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Клиенты”) Тогда // Заполнение шапки АдресОткуда = ДанныеЗаполнения.Адрес; Клиент = ДанныеЗаполнения.Ссылка; Телефон = ДанныеЗаполнения.Телефон; ВремяПодачи = ТекущаяДата() + 900; // 15 * 60 секунд Для Каждого ТекСтрока Из ДанныеЗаполнения.Опции Цикл НоваяЗапись = Опции.Добавить(); НоваяЗапись.Опция = ТекСтрока.Опция; НоваяЗапись.Количество = ТекСтрока.Количество; КонецЦикла; КонецЕсли; КонецПроцедуры

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

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

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

Источник: https://infostart.ru/1c/articles/333200/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.