В современных конфигурациях, таких как 1С:Комплексная автоматизация 2 или 1С:ERP, часто возникает задача программно инициировать ввод на основании. Основная сложность заключается в том, чтобы не просто создать объект в памяти, но и открыть его форму пользователю для редактирования, при этом обеспечив корректное заполнение всех реквизитов по правилам системы. Рассмотрим, как это сделать правильно, используя механизмы платформы и Библиотеки стандартных подсистем (БСП).
Когда мы нажимаем кнопку «Создать на основании» в интерфейсе, платформа выполняет ряд последовательных действий. Проанализируем этот процесс: сначала вызывается команда, затем создается новый объект, и в его модуле выполняется процедура ОбработкаЗаполнения. Если нам нужно сделать это программно, мы должны «сообщить» открываемой форме, какой объект является источником данных.
Для реализации задачи нам не обязательно вручную прописывать заполнение каждого поля. Достаточно передать ссылку на документ-основание в параметрах открытия формы. Платформа самостоятельно перехватит этот параметр и запустит стандартный алгоритм заполнения.
Если нам нужно открыть форму Приходного кассового ордера (ПКО) на основании Реализации товаров и услуг (РТУ), мы можем использовать метод ОткрытьФорму. Это самый быстрый способ, который подходит для большинства задач автоматизации.
Рассмотрим пример кода:
// Определим ссылку на документ-основание (например, Реализация товаров и услуг)
РеалСсылка = Параметры.Источник;
// Подготовим структуру параметров для новой формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Основание", РеалСсылка);
// Открываем форму документа ПКО
ОткрытьФорму("Документ.ПриходныйКассовыйОрдер.ФормаОбъекта", ПараметрыФормы);
Почему это работает? В управляемом приложении при передаче параметра с ключом Основание платформа понимает, что создается новый документ на базе существующего. В этот момент в модуле объекта ПКО срабатывает событие ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка), где в переменную ДанныеЗаполнения попадает наша ссылка.
В более свежих версиях платформы 8.3 рекомендуется использовать системный параметр ЗначениеЗаполнения. Он более универсален, так как позволяет передавать не только ссылку на один документ, но и структуру (например, если вы хотите заполнить документ данными сразу из нескольких источников или передать специфические настройки).
Посмотрим на пример реализации:
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Основание", ДокументИсточник);
ПараметрыЗаполнения.Вставить("СтатьяДвиженияДенежныхСредств", Справочники.СтатьиДвиженияДенежныхСредств.ОплатаОтПокупателя);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначениеЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("Документ.ПриходныйКассовыйОрдер.ФормаОбъекта", ПараметрыФормы);
Этот метод позволяет более гибко управлять процессом. Проанализируем ситуацию: если в ПКО по умолчанию не подставляется нужная статья ДДС, мы можем передать её через этот параметр, и в ОбработкаЗаполнения извлечь её из структуры.
Важно понимать, что вся логика «перекладывания» данных из РТУ в ПКО находится внутри модуля объекта документа, который мы создаем. В КА 2 и ERP эти процедуры часто вызывают общие модули казначейства или денежных средств.
Процедура выглядит примерно так:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
// Здесь вызывается типовой механизм заполнения
ДенежныеСредстваСервер.ЗаполнитьПКОПоРеализации(ЭтотОбъект, ДанныеЗаполнения);
КонецЕсли;
КонецПроцедуры
Если вы открываете форму программно, как было показано выше, этот код выполнится автоматически. Вам не нужно заботиться о заполнении табличных частей или сумм вручную.
В конфигурациях на базе БСП (как КА 2) ввод на основании обычно регистрируется в модуле менеджера объекта в процедуре ДобавитьКомандыСозданияНаОсновании. Выясним, как это устроено. Когда система строит меню «Создать на основании», она собирает данные о командах. Если вы хотите программно вызвать именно штатную команду (чтобы сработали все проверки прав доступа и функциональных опций), следует обращаться к общему модулю ПодключаемыеКомандыКлиент.
Типовой вызов внутри системы выглядит так:
// Пример логики из БСП
ПараметрыВыполнения = ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды();
ПараметрыВыполнения.Форма = ЭтаФорма;
ПараметрыВыполнения.Источник = ЭтаФорма;
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ОписаниеКоманды, ПараметрКоманды);
Однако для простой задачи программного открытия формы из произвольного места кода первый способ (через ОткрытьФорму) является наиболее предпочтительным и стабильным.
ОткрытьФорму эти проверки могут не сработать визуально, но документ не запишется или заполнится некорректно.ОткрытьФорму только показывает окно. Документ не будет записан в базу данных, пока пользователь не нажмет кнопку «Провести и закрыть». Если же вам нужно создать и записать документ без участия пользователя, используйте метод Заполнить() объекта на сервере.Выясним, как выглядит программное создание без формы:
НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
// Вызов ОбработкаЗаполнения программно
НовыйДокумент.Заполнить(СсылкаНаРТУ);
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Подводя итог: для программного ввода на основании с показом формы используйте ОткрытьФорму с передачей структуры Основание. Это гарантирует, что отработает вся типовая логика заполнения, заложенная разработчиками 1С, и обеспечит корректность ведения учета в сложных конфигурациях.