Как в 1С создать на основании программно
Рассмотрим простой пример программного ввода документа в 1С на основании. Допустим необходимо после проведения приходного документа «Приход» создать расходный документ «Расход» на основании данных полученных из приходного документа.
Простое создание на основании стандартным способом платформы 1С
В документе «Расход» или «Приход» нужно настроить связь на вкладке «Ввод на основании»:
Где указать с кем он связан:
Должна получиться следующая картина:
Далее в модуле документа «Расход» нужно создать процедуру «Обработка заполнения» с помощью клика в верхнем меню:
Если в документе уже существуют данная процедура — нужно не создавать новую, а добавлять код в существующую процедуру.
И прописать программный код заполнения. Пример кода:
Программный код можно также создать автоматически для этого нужно воспользоваться «Конструктором ввода на основания».
Конструктор ввода на основании
Чтобы в 1С автоматически создать процедуру, нужно нажать на кнопку «Конструктор ввода на основании»:
Где с помощью функции «Заполнить выражения» можно автоматически сопоставить название реквизитов:
Если реквизиты различаются по названию, их можно сопоставить вручную. Например, в одной табличной части у вас реквизит «Номенклатура», а в другой «Товар».
После нажатия на «Ок», 1С сама сформирует готовый программный код:
Внимание! Конструктор нельзя использовать, если процедура заполнения уже существует — вы потеряете существующий программный код.
Создание документа после записи первого документа с последующей записью созданного
Для реализации такой задачи можно использовать метод объекта Заполнить(), в параметры которого необходимо будет передать данные заполнения из документа прихода. Метод инициирует событие ОбработкаЗаполнения() и вызов процедуры-обработчика в модуле объекта документа «Расход».
Создание объекта после записи с открытием управляемой формы
Для программного создания документа в 1С с открытием управляемой формы пользователю можно использовать функцию ОткрытьФорму(), в параметры которой можно передавать данные для заполнения.
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Ввод на основании
Ввод на основании используется в случаях, когда при создании нового объекта могут быть использованы данные уже существующего объекта. Ввод на основании может быть реализован для справочников, документов, планов видов характеристик, планов счетов, планов видов расчета и бизнес-процессов. В общем случае объект может быть создан на основании любого объекта из перечисленных выше, например, документ может быть создан на основании справочника.
Рассмотрим работу механизма ввода на основании на следующем примере: Организация оказывает услуги пассажирского такси. Заказы покупателей регистрируются в документе «Заказ». Заказ может быть формируется диспетчером. Документ «Заказ» содержит следующую информацию:
Создание объектов конфигурации
Реализация
В свойствах документа «Заказ» перейдем на закладку «Ввод на основании»:
Нажмем кнопку «Редактировать элемент списка» и выберем из списка справочник «Клиенты»:
Далее запустим конструктор ввода на основании нажатием на кнопку «Конструктор ввода на основании»:
В открывшемся окне нужно сопоставить поля справочника с реквизитами документа заказа. Это можно сделать, нажав кнопку «Заполнить выражения» и тогда система попытается сама определить, какие поля необходимо скопировать:
Поле адреса нужно сопоставлять вручную, выбрав поле «АдресОткуда» в нижней части, а затем двойным щелчком на реквизите «Адрес» в реквизитах объекта обоснования:
По нажатию «ОК» система генерирует следующий код в модуле документа «Заказ» в процедуре ОбработкаЗаполнения:
Процедура ОбработкаЗаполнения вызывается в ряде случаев, таких как ввод нового документа интерактивно и ввод на основании. В данном случае, если переменная ДанныеЗаполнения является ссылкой на справочник клиентов, выполняется заполнение реквизитов документа. Код обработчика можно модифицировать. Предположим, что клиенты чаще всего хотят подачу такси в течение 15-20 минут. Тогда в код обработчика можно добавить инициализацию реквизита «ВремяПодачи». Также удалим комментарии, созданные конструктором:
Запустим приложение в режиме отладки и проверим, как работает ввод на основании. Добавим пару записей в справочник клиентов:
Откроем одну из них. В окне будет доступна кнопка «Создать на основании», по нажатию которой откроется список с опцией выбора «Заказ»:
При выборе «Заказ» система создает пустой документ и заполняет поля в процедуре ОбработкаЗаполнения:
Сохраним документ и убедимся, что документ был успешно создан, открыв его из спиcка документов заказа:
Теперь предположим, что у клиентов могут быть опции, которые всегда присутствуют в заказе данного клиента. Например, «Некурящий водитель». Тогда их можно задавать в справочнике клиентов и копировать в документ заказа. Расширим справочник «Клиенты» табличной частью «Опции»:
Теперь необходимо модифицировать процедуру ОбработкаЗаполнения документа. Это можно было бы сделать через конструктор, но тогда процедура обработки будет перезаписана, поэтому добавим код копирования табличной части вручную:
Запустим конфигурацию в режиме отладки и посмотрим, что получилось. Добавим опции клиенту:
Сохраним данные и создадим заказ на основании записи справочника:
Таким образом, данные табличной части были успешно скопированы в заказ. Для этого простого примера реализацию ввода на основании можно считать законченной.
Управляемые формы, программное создание на основании
Продемонстрируйте код, где вы это делаете, пожалуйста. На упр. формах.
А пока, мой вариант решения: создание параметра на форме.
Далее, для команды:
ОткрытьФорму(«Документ.ИмяДокумента.ФормаОбъекта», Новый Структура(«Ключ», ДанныеЗаполнения));
На форме, в при создании на сервере:
Если Не Параметры.Ключ.Пустая() Тогда
// Сюда помещаем вызов процедуры заполнения
А надо мне это сделать, потому что мне надо вызвать эту команду не из формы основания, а из другой, передав основание вручную.
Если вызов Заполнить() не обязательно, то можно сразу сформировать структуру заполнения и передать.
Еще можно попробовать (сам не побывал, скорее и не будет работать с объектом) после Заполнить() вызвать ОткрытьЗначение(МойОбъект);
только я там не учел, что открывать форму можно только с клиента, а создавать объект на сервере. Ну при желании разбросайте сами, выделите функцию на сервере которая будет возвращать СтруктураЗаполнения
и в этом случае ОткрытьЗначение() смысла не имеет, так как с сервера на клиент объект вы не передадите
Не хотелось бы создавать новую тему. Есть вопрос:
Создаем документ «Регистрация события» на основании РТУ, создаем Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), определяем, что стандартная обработка = Ложь.
Необходимо сначала проверить не создан ли уже документ Регистрация на основании этого РТУ.
Проверка срабатывает, но форма Регистрации (не заполненная) создается.
Странно, но я не могу попасть в отладке в процедуры ПриСозданииНаСервере(Отказ, СтандартнаяОбработка), ПриОткрытии(Отказ), ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты), чтобы указать, что Отказ = истина.
Раньше (обычные формы) это решелось в Процедуре ПередОткрытием (Отказ, СтандартнаяОбработка), а в 8.2 такой процедуры нет.
Как это можно реализовать?
Чем вас не устраивает следующий вариант?
На форме обработки пишите.
В модуле объекта (тот который создается на основании) должно быть что-то в духе
Если создание на основании отличается от типового и типовой код никак нельзя менять то.
Ввод на основании (программно)
создаю Документ:
Док = Документы.ПлатежноеПоручение.СоздатьДокумент();
записываю его
затем необходимо создать на основании этого документа списание:
НовыйДокументСписания = Документы.СписаниеСРасчетногоСчета.СоздатьДокумент();
НовыйДокументСписания.Заполнить(Док);
но записывается пустой документ и механизм обработказаполнения не срабатывает,
подскажите а как правильно сделать?
Эта функция должна присутствовать в модуле, иначе при попытке ввода на основании будет ошибка.
Эта функция должна присутствовать в модуле, иначе при попытке ввода на основании будет ошибка.
Но в принципе ее можно обойти полностью прописав создание документа.
Я бы не стал записывать документ, а только открыл бы его на просмотр пользователю
Обычно, в большинстве случаев когда объект вводится на основании, нужно открыть пользователю форму нового объекта, который введен на основании какого-то объекта.
В этом случае достаточно просто передать параметр Основание в процедуру открытия формы:
При этом отработает процедура ОбработкаЗаполнения в модуле объекта и, соответственно, те алгоритмы заполнения, которые в ней описаны.
Если же объект, который вводится на основании, нужно сразу записать в базу данных не показывая его форму пользователю, то тогда можно использовать метод объекта Заполнить().
Создать новый объект, и вызвать у него метод Заполнить(), в который передать значение, на основании которого должен быть создан этот объект.
Ввод на основании в 1С 8.3
Ввод на основании
Механизм ввода на основании позволяет автоматически заполнять реквизиты объекта при его создании на основании другого объекта.
Например, есть документ Приход товара. На его основании можно создать документ оплаты и автоматически заполнить в нем контрагента и сумму из прихода товара.
Настройки ввода на основании выполняются на закладке Ввод на основании. В верхней части указывается какие объекты могут являться основанием для заполнения текущего объекта:
В нижней части какие объекты могут создаваться на основании текущего:
В нашем примере на основании документа Приход товара можно создать документ Оплата.
Теперь в пользовательском режиме в форме документа и в форме списка появится подменю Создать на основании, в котором будут созданы команды ввода на основании для всех объектов, которые создаются на основании текущего объекта:
После нажатия на кнопку «Оплата» будет открыта форма нового документа Оплата:
При этом хотелось бы, чтобы реквизиты документа оплаты автоматически заполнялись из документа прихода товара. Процедура, которая вызывается при вводе на основании называется ОбработкаЗаполнения и находится в модуле объекта.
ОбработкаЗаполнения
Обработчик ОбработкаЗаполнения нужно создавать у того объекта, который создается на основании. В нашем примере это будет документ Оплата. В параметре ДанныеЗаполнения передается ссылка на объект-основание. Алгоритм заполнения нужно реализовать самим: