Однако иногда бывают ситуации, когда необходимо программно сформировать набор подчиненных документов. Вот тут и начинаются проблемы.
Первая проблема состоит в том, что во встроенном языке 1С всего одна процедура, которая инициирует выполнение предопределенной процедуры <ВводНаОсновании>, прописанной в модуле формы документа.
Речь идет о процедуре <ОткрытьФорму> ввода нового документа, последним параметром этой процедуры является документ-основание.
Вторая проблема носит более глобальный характер и связана с ориентацией встроенного языка 1С не на объектно-ориентированную, а на процедурную технологию программирования. Если говорить конкретно, то стандартными способами нельзя вызывать методы, написанные разработчиком в модуле формы объекта, в других местах, лежащих вне контекста данного объекта.
Короче говоря, нельзя расширить стандартный набор методов объекта.
Отсюда напрямую вытекает проблема повторного использования кода. Сколько раз приходилось иметь дело (особенно в типовых конфигурациях) с тем, что некая процедура, гармонично работающая в конфигурации, должна быть использована где-то еще, но увы...
Хорошо конечно, если автор(ы) конфигурации позаботился о возможности повторного использования кода и написал в Глобальном модуле процедуры или функции с волшебным словом "Экспорт". Однако так бывает достаточно редко.
Итак, вернемся к проблеме группового ввода документов на основании.
Допустим, каким-то образом мы идем по выборке документов одного вида и вводим подчиненные документы, например:
ДокРеализация = СоздатьОбъект("Документ.Реализация"); ДокРеализация.ВыбратьДокументы(НачДата,КонДата); Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл ОткрытьФорму("Документ.СчетФактура",,ДокРеализация); КонецЦикла;
Но, при выполнении данного кода откроется форма заполненного на основании "Реализации" документа "СчетФактура" и при сохранении запишется только первый "СчетФактура". Для остальных даже не откроются формы.
Для того, чтобы избежать этого, в модуле формы документа "СчетФактура" в процедуре <ПриОткрытии> можно написать следующий код:
Процедура ПриОткрытии() //... Если Форма.Параметр = "ВводНаОсновании" Тогда Попытка Записать(); Исключение Сообщить("Ошибка записи документа " + Вид() + " № " + НомерДок + " от " + ДатаДок); КонецПопытки; СтатусВозврата(0); Возврат; КонецЕсли; //... КонецПроцедуры
Также необходимо исправить и обхода документов в цикле:
ДокРеализация = СоздатьОбъект("Документ.Реализация"); ДокРеализация.ВыбратьДокументы(НачДата,КонДата); Пока ДокРеализация.ПолучитьДокумент() = 1 Цикл Конт = "ВводНаОсновании"; ОткрытьФорму("Документ.СчетФактура",Конт,ДокРеализация); КонецЦикла;
При таком подходе сначала будет выполняться процедура "ВводНаОсновании" модуля формы документа "СчетФактура", а затем процедура "ПриОткрытии", в которой анализируется переданный в форму параметр, и при его соответствующем значении осуществляется запись документа и отмена открытия его формы.
Вот и все.
Следует отметить, что место вставки кода в процедуру <ПриОткрытии> зависит от того, какие действия в ней осуществляются. Если присваиваются значения реквизитов, то код вставляется после этих действий.